From 2c533d4693b2f6cd5c3265ee5837013000e225c2 Mon Sep 17 00:00:00 2001 From: Adrien Chardon Date: Mon, 3 Jul 2017 11:54:39 +0200 Subject: [PATCH 1/9] Initial support for PSoC 6. --- .../TARGET_PSoC6_CY8C/PeripheralNames.h | 90 + .../TARGET_PSoC6_CY8C/PeripheralPins.h | 84 + .../TARGET_PSoC6_CY8C/PinNamesTypes.h | 67 + .../TARGET_PSoC6_CY8C/PortNames.h | 61 + .../TARGET_PSoC6_CY8C_CM0p/PeripheralPins.c | 131 + .../TARGET_PSoC6_CY8C_CM0p/PinNames.h | 251 ++ .../TARGET_PSoC6_CY8C_CM0p/device.h | 39 + .../TOOLCHAIN_GCC_ARM/cy8c6x7_cm0plus.ld | 328 ++ .../device/TOOLCHAIN_GCC_ARM/cy_syslib_gcc.S | 101 + .../startup_psoc6ble_cm0plus.S | 423 +++ .../TARGET_PSoC6_CY8C_CM0p/device/cmsis.h | 38 + .../device/cy8c637bzi_bld74.h | 1030 ++++++ .../device/cy_device_headers.h | 85 + .../device/gpio_psoc6ble_116_bga_ble.h | 1611 ++++++++++ .../device/psoc6ble_config.h | 2289 ++++++++++++++ .../device/system_psoc6ble_cm0plus.c | 667 ++++ .../device/system_psoc6ble_cm0plus.h | 185 ++ .../device/cy_crypto_config.h | 92 + .../TARGET_PSoC6_CY8C/device/cyapicallbacks.h | 28 + .../device/cydisabledsheets.h | 5 + .../TARGET_PSoC6_CY8C/device/cyfitter.h | 6 + .../TARGET_PSoC6_CY8C/device/cyfitter_cfg.c | 271 ++ .../TARGET_PSoC6_CY8C/device/cyfitter_cfg.h | 29 + .../TARGET_PSoC6_CY8C/device/cyfitter_gpio.h | 6 + .../TARGET_PSoC6_CY8C/device/cymetadata.c | 48 + .../device/driver_periph/crypto/cy_crypto.c | 1809 +++++++++++ .../device/driver_periph/crypto/cy_crypto.h | 450 +++ .../driver_periph/crypto/cy_crypto_common.h | 504 +++ .../driver_periph/crypto/cy_crypto_core_aes.c | 405 +++ .../driver_periph/crypto/cy_crypto_core_aes.h | 77 + .../crypto/cy_crypto_core_cmac.c | 272 ++ .../crypto/cy_crypto_core_cmac.h | 72 + .../driver_periph/crypto/cy_crypto_core_crc.c | 117 + .../driver_periph/crypto/cy_crypto_core_crc.h | 41 + .../driver_periph/crypto/cy_crypto_core_des.c | 208 ++ .../driver_periph/crypto/cy_crypto_core_des.h | 48 + .../crypto/cy_crypto_core_hmac.c | 244 ++ .../crypto/cy_crypto_core_hmac.h | 37 + .../crypto/cy_crypto_core_instructions.h | 180 ++ .../crypto/cy_crypto_core_prng.c | 99 + .../crypto/cy_crypto_core_prng.h | 39 + .../driver_periph/crypto/cy_crypto_core_rsa.c | 993 ++++++ .../driver_periph/crypto/cy_crypto_core_rsa.h | 62 + .../driver_periph/crypto/cy_crypto_core_sha.c | 442 +++ .../driver_periph/crypto/cy_crypto_core_sha.h | 115 + .../driver_periph/crypto/cy_crypto_core_str.c | 194 ++ .../driver_periph/crypto/cy_crypto_core_str.h | 43 + .../crypto/cy_crypto_core_trng.c | 93 + .../crypto/cy_crypto_core_trng.h | 37 + .../crypto/cy_crypto_core_trng_config.h | 239 ++ .../crypto/cy_crypto_core_util.c | 485 +++ .../crypto/cy_crypto_core_util.h | 132 + .../driver_periph/crypto/cy_crypto_core_vu.c | 66 + .../driver_periph/crypto/cy_crypto_core_vu.h | 136 + .../crypto/cy_crypto_core_vu_hw.h | 380 +++ .../driver_periph/crypto/cy_crypto_server.c | 409 +++ .../driver_periph/crypto/cy_crypto_server.h | 51 + .../device/driver_periph/flash/cy_flash.c | 470 +++ .../device/driver_periph/flash/cy_flash.h | 283 ++ .../device/driver_periph/gpio/cy_gpio.c | 137 + .../device/driver_periph/gpio/cy_gpio.h | 1719 ++++++++++ .../device/driver_periph/ipc/cy_ipc_drv.c | 464 +++ .../device/driver_periph/ipc/cy_ipc_drv.h | 288 ++ .../device/driver_periph/ipc/cy_ipc_lock.c | 268 ++ .../device/driver_periph/ipc/cy_ipc_lock.h | 84 + .../device/driver_periph/ipc/cy_ipc_pipe.c | 345 ++ .../device/driver_periph/ipc/cy_ipc_pipe.h | 191 ++ .../device/driver_periph/profile/cy_profile.c | 374 +++ .../device/driver_periph/profile/cy_profile.h | 540 ++++ .../device/driver_periph/prot/cy_prot.c | 1587 ++++++++++ .../device/driver_periph/prot/cy_prot.h | 558 ++++ .../device/driver_periph/scb/cy_scb_common.c | 412 +++ .../device/driver_periph/scb/cy_scb_common.h | 1617 ++++++++++ .../device/driver_periph/scb/cy_scb_ezi2c.c | 1058 +++++++ .../device/driver_periph/scb/cy_scb_ezi2c.h | 424 +++ .../device/driver_periph/scb/cy_scb_i2c.c | 2791 +++++++++++++++++ .../device/driver_periph/scb/cy_scb_i2c.h | 1112 +++++++ .../device/driver_periph/scb/cy_scb_spi.c | 766 +++++ .../device/driver_periph/scb/cy_scb_spi.h | 1233 ++++++++ .../device/driver_periph/scb/cy_scb_uart.c | 1181 +++++++ .../device/driver_periph/scb/cy_scb_uart.h | 1282 ++++++++ .../device/driver_periph/sysclk/cy_sysclk.c | 1285 ++++++++ .../device/driver_periph/sysclk/cy_sysclk.h | 2165 +++++++++++++ .../device/driver_periph/sysint/cy_sysint.c | 369 +++ .../device/driver_periph/sysint/cy_sysint.h | 343 ++ .../device/driver_periph/syslib/cy_syslib.c | 654 ++++ .../device/driver_periph/syslib/cy_syslib.h | 800 +++++ .../device/driver_periph/syspm/cy_syspm.c | 1879 +++++++++++ .../device/driver_periph/syspm/cy_syspm.h | 820 +++++ .../device/driver_periph/systick/cy_systick.c | 335 ++ .../device/driver_periph/systick/cy_systick.h | 170 + .../device/driver_periph/tcpwm/cy_tcpwm.h | 591 ++++ .../driver_periph/tcpwm/cy_tcpwm_counter.c | 137 + .../driver_periph/tcpwm/cy_tcpwm_counter.h | 484 +++ .../device/driver_periph/tcpwm/cy_tcpwm_pwm.c | 153 + .../device/driver_periph/tcpwm/cy_tcpwm_pwm.h | 576 ++++ .../driver_periph/tcpwm/cy_tcpwm_quaddec.c | 116 + .../driver_periph/tcpwm/cy_tcpwm_quaddec.h | 281 ++ .../device/driver_periph/trigmux/cy_trigmux.c | 112 + .../device/driver_periph/trigmux/cy_trigmux.h | 199 ++ .../device/driver_periph/wdt/cy_wdt.c | 303 ++ .../device/driver_periph/wdt/cy_wdt.h | 261 ++ .../TARGET_PSoC6_CY8C/device/ip/cyip_backup.h | 221 ++ .../TARGET_PSoC6_CY8C/device/ip/cyip_ble.h | 2219 +++++++++++++ .../TARGET_PSoC6_CY8C/device/ip/cyip_cpuss.h | 346 ++ .../TARGET_PSoC6_CY8C/device/ip/cyip_crypto.h | 375 +++ .../TARGET_PSoC6_CY8C/device/ip/cyip_csd.h | 473 +++ .../TARGET_PSoC6_CY8C/device/ip/cyip_ctbm.h | 287 ++ .../TARGET_PSoC6_CY8C/device/ip/cyip_ctdac.h | 110 + .../TARGET_PSoC6_CY8C/device/ip/cyip_dw.h | 230 ++ .../TARGET_PSoC6_CY8C/device/ip/cyip_efuse.h | 318 ++ .../TARGET_PSoC6_CY8C/device/ip/cyip_fault.h | 113 + .../TARGET_PSoC6_CY8C/device/ip/cyip_flashc.h | 518 +++ .../TARGET_PSoC6_CY8C/device/ip/cyip_gpio.h | 468 +++ .../device/ip/cyip_headers.h | 31 + .../TARGET_PSoC6_CY8C/device/ip/cyip_hsiom.h | 88 + .../TARGET_PSoC6_CY8C/device/ip/cyip_i2s.h | 280 ++ .../TARGET_PSoC6_CY8C/device/ip/cyip_ipc.h | 123 + .../TARGET_PSoC6_CY8C/device/ip/cyip_lcd.h | 92 + .../TARGET_PSoC6_CY8C/device/ip/cyip_lpcomp.h | 171 + .../TARGET_PSoC6_CY8C/device/ip/cyip_pass.h | 130 + .../TARGET_PSoC6_CY8C/device/ip/cyip_pdm.h | 169 + .../TARGET_PSoC6_CY8C/device/ip/cyip_peri.h | 482 +++ .../device/ip/cyip_profile.h | 105 + .../TARGET_PSoC6_CY8C/device/ip/cyip_prot.h | 374 +++ .../TARGET_PSoC6_CY8C/device/ip/cyip_sar.h | 627 ++++ .../TARGET_PSoC6_CY8C/device/ip/cyip_scb.h | 755 +++++ .../TARGET_PSoC6_CY8C/device/ip/cyip_sflash.h | 186 ++ .../device/ip/cyip_smartio.h | 109 + .../TARGET_PSoC6_CY8C/device/ip/cyip_smif.h | 404 +++ .../TARGET_PSoC6_CY8C/device/ip/cyip_srss.h | 655 ++++ .../TARGET_PSoC6_CY8C/device/ip/cyip_tcpwm.h | 191 ++ .../TARGET_PSoC6_CY8C/device/ip/cyip_udb.h | 2052 ++++++++++++ .../device/middleware/ble/cy_ble_clk.c | 491 +++ .../device/middleware/ble/cy_ble_clk.h | 220 ++ .../TARGET_PSoC6_CY8C/device/project.h | 99 + .../TARGET_PSoC6_CY8C/gpio_api.c | 153 + .../TARGET_PSoC6_CY8C/objects.h | 120 + .../TARGET_PSoC6_CY8C/serial_api.c | 219 ++ .../TARGET_PSoC6_CY8C/us_ticker.c | 129 + targets/TARGET_Cypress/mbed_rtx.h | 32 + 141 files changed, 61826 insertions(+) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralNames.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralPins.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PinNamesTypes.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PortNames.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PeripheralPins.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PinNames.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy8c6x7_cm0plus.ld create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy_syslib_gcc.S create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/startup_psoc6ble_cm0plus.S create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cmsis.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cy8c637bzi_bld74.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cy_device_headers.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/gpio_psoc6ble_116_bga_ble.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/psoc6ble_config.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/system_psoc6ble_cm0plus.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/system_psoc6ble_cm0plus.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cy_crypto_config.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyapicallbacks.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cydisabledsheets.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_cfg.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_cfg.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_gpio.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cymetadata.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_common.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_aes.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_aes.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_cmac.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_cmac.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_crc.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_crc.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_des.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_des.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_hmac.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_hmac.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_instructions.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_prng.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_prng.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_rsa.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_rsa.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_sha.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_sha.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_str.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_str.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng_config.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_util.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_util.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu_hw.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_server.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_server.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_drv.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_drv.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_lock.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_lock.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_pipe.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_pipe.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/profile/cy_profile.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/profile/cy_profile.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/prot/cy_prot.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/prot/cy_prot.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_common.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_common.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_ezi2c.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_ezi2c.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_i2c.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_i2c.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_spi.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_spi.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_uart.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_uart.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysclk/cy_sysclk.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysclk/cy_sysclk.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysint/cy_sysint.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysint/cy_sysint.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syslib/cy_syslib.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syslib/cy_syslib.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syspm/cy_syspm.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syspm/cy_syspm.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/systick/cy_systick.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/systick/cy_systick.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_counter.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_counter.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_pwm.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_pwm.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_quaddec.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_quaddec.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/trigmux/cy_trigmux.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/trigmux/cy_trigmux.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/wdt/cy_wdt.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/wdt/cy_wdt.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_backup.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ble.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_cpuss.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_crypto.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_csd.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ctbm.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ctdac.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_dw.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_efuse.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_fault.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_flashc.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_gpio.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_headers.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_hsiom.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_i2s.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ipc.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_lcd.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_lpcomp.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_pass.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_pdm.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_peri.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_profile.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_prot.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_sar.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_scb.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_sflash.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_smartio.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_smif.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_srss.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_tcpwm.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_udb.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/middleware/ble/cy_ble_clk.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/middleware/ble/cy_ble_clk.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/project.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/gpio_api.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/objects.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/serial_api.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/us_ticker.c create mode 100644 targets/TARGET_Cypress/mbed_rtx.h diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralNames.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralNames.h new file mode 100644 index 0000000000..7ab3dc1d8c --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralNames.h @@ -0,0 +1,90 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) XXX + * 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 ARM Limited nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef MBED_PERIPHERALNAMES_H +#define MBED_PERIPHERALNAMES_H + +#include "cmsis.h" +#include "PinNames.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// typedef enum { +// ADC_1 = (int)ADC1_BASE, +// ADC_2 = (int)ADC2_BASE, +// ADC_3 = (int)ADC3_BASE, +// } ADCName; + +// typedef enum { +// DAC_1 = (int)DAC_BASE, +// } DACName; + +// typedef enum { +// UART_1 = (int)USART1_BASE, +// UART_2 = (int)USART2_BASE, +// UART_3 = (int)USART3_BASE, +// } UARTName; + +#define STDIO_UART_TX CY_UART_TX +#define STDIO_UART_RX CY_UART_RX + +// typedef enum { +// SPI_1 = (int)SPI1_BASE, +// SPI_2 = (int)SPI2_BASE, +// SPI_3 = (int)SPI3_BASE, +// } SPIName; + +// typedef enum { +// I2C_0 = (int)I2C0_BASE, +// I2C_1 = (int)I2C1_BASE, +// } I2CName; + +// typedef enum { +// PWM_0 = (int)PWM_CH0_BASE, +// PWM_1 = (int)PWM_CH1_BASE, +// PWM_2 = (int)PWM_CH2_BASE, +// PWM_3 = (int)PWM_CH3_BASE, +// PWM_4 = (int)PWM_CH4_BASE, +// PWM_5 = (int)PWM_CH5_BASE, +// PWM_6 = (int)PWM_CH6_BASE, +// PWM_7 = (int)PWM_CH7_BASE, +// } PWMName; + +// typedef enum { +// CAN_1 = (int)CAN1_BASE, +// } CANName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralPins.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralPins.h new file mode 100644 index 0000000000..a24ce8e001 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralPins.h @@ -0,0 +1,84 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) XXX + * 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 ARM Limited nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef MBED_PERIPHERALPINS_H +#define MBED_PERIPHERALPINS_H + +#include "pinmap.h" +#include "PeripheralNames.h" + +// //*** ADC *** +// #ifdef DEVICE_ANALOGIN +// extern const PinMap PinMap_ADC[]; +// #endif + +// //*** DAC *** +// #ifdef DEVICE_ANALOGOUT +// extern const PinMap PinMap_DAC[]; +// #endif + +// //*** I2C *** +// #if DEVICE_I2C +// extern const PinMap PinMap_I2C_SDA[]; +// extern const PinMap PinMap_I2C_SCL[]; +// #endif + +// //*** PWM *** +// #if DEVICE_PWMOUT +// extern const PinMap PinMap_PWM[]; +// #endif + +// //*** SERIAL *** +// #ifdef DEVICE_SERIAL +// extern const PinMap PinMap_UART_TX[]; +// extern const PinMap PinMap_UART_RX[]; +// #endif + +// //*** I2C *** +// #ifdef DEVICE_I2C +// extern const PinMap PinMap_I2C_SDA[]; +// extern const PinMap PinMap_I2C_SCL[]; +// #endif + +// //*** SPI *** +// #ifdef DEVICE_SPI +// extern const PinMap PinMap_SPI_MOSI[]; +// extern const PinMap PinMap_SPI_MISO[]; +// extern const PinMap PinMap_SPI_SCLK[]; +// extern const PinMap PinMap_SPI_SSEL[]; +// #endif + +// //*** CAN *** +// #ifdef DEVICE_CAN +// extern const PinMap PinMap_CAN_RD[]; +// extern const PinMap PinMap_CAN_TD[]; +// #endif + +#endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PinNamesTypes.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PinNamesTypes.h new file mode 100644 index 0000000000..bda1000b2f --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PinNamesTypes.h @@ -0,0 +1,67 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2016, 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 ARM nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef MBED_PINNAMESTYPES_H +#define MBED_PINNAMESTYPES_H + +#include "cmsis.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// PinName[15-0] = Port[15-8] + Pin[7-0] +#define CYPRESS_PIN(pinname) ((pinname) & 0xFF) +#define CYPRESS_PORT(pinname) (((pinname) >> 8) & 0xFF) + +typedef enum { + PIN_INPUT = 0, + PIN_OUTPUT +} PinDirection; + +typedef enum { + PullNone = 0, + PullUp = 1, + PullDown = 2, + OpenDrainPullUp = 3, + OpenDrainNoPull = 4, + OpenDrainPullDown = 5, + PushPullNoPull = PullNone, + PushPullPullUp = PullUp, + PushPullPullDown = PullDown, + OpenDrain = OpenDrainPullUp, + PullDefault = PullNone +} PinMode; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PortNames.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PortNames.h new file mode 100644 index 0000000000..3f2e76232b --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PortNames.h @@ -0,0 +1,61 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) XXX + * 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 ARM Limited nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef MBED_PORTNAMES_H +#define MBED_PORTNAMES_H + +#ifdef __cplusplus +extern "C" { +#endif + +// Port[7-0] +typedef enum { + Port0 = 0x0, + Port1 = 0x1, + Port2 = 0x2, + Port3 = 0x3, + Port4 = 0x4, + Port5 = 0x5, + Port6 = 0x6, + Port7 = 0x7, + Port8 = 0x8, + Port9 = 0x9, + Port10 = 0xA, + Port11 = 0xB, + Port12 = 0xC, + Port13 = 0xD, + Port14 = 0xE, + Port15 = 0xF +} PortName; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PeripheralPins.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PeripheralPins.c new file mode 100644 index 0000000000..451cf138c9 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PeripheralPins.c @@ -0,0 +1,131 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) XXX + * 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 ARM Limited nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#include "PeripheralNames.h" +#include "PeripheralPins.h" +#include "pinmap.h" + +// //*** ADC *** +// const PinMap PinMap_ADC[] = { +// {PC_15, ADC_0, STM_PIN_DATA_EXT(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN0 +// {PC_14, ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN1 +// {PC_13, ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN2 +// {PC_12, ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN3 +// {PC_11, ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN4 +// {PC_10, ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN5 +// {PC_9 , ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN6 +// {PC_8 , ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN7 +// {NC, NC, 0} +// }; + +// //*** DAC *** +// const PinMap PinMap_DAC[] = { +// {PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // OUT1 +// {PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // OUT2 (Warning: LED1 is also on this pin) +// {NC, NC, 0} +// }; + +// //*** SERIAL *** +// const PinMap PinMap_UART_TX[] = { +// {PA_13, UART_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {PC_2, UART_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {PC_10, UART_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {NC, NC, 0} +// }; +// const PinMap PinMap_UART_RX[] = { +// {PA_14, UART_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {PC_3, UART_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {PC_11, UART_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {NC, NC, 0} +// }; + +// //*** I2C *** +// const PinMap PinMap_I2C_SDA[] = { +// {PA_10, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_9, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_5, I2C_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PA_6, I2C_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC, NC, 0} +// }; +// const PinMap PinMap_I2C_SCL[] = { +// {PA_9, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_8, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_4, I2C_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PA_5, I2C_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC, NC, 0} +// }; + +// //*** SPI *** +// const PinMap PinMap_SPI_SCLK[] = { +// {PA_6 , SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PB_1 , SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_13, SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_12, SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC , NC , 0} +// }; +// const PinMap PinMap_SPI_MOSI[] = { +// {PA_8 , SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PB_3 , SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_15, SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_14, SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC , NC , 0} +// }; +// const PinMap PinMap_SPI_MISO[] = { +// {PA_7 , SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PB_2 , SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_14, SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_13, SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC , NC , 0} +// }; +// const PinMap PinMap_SPI_SSEL[] = { +// {PA_5 , SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PB_0 , SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_12, SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_11, SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC , NC , 0} +// }; + +// //*** PWM *** +// const PinMap PinMap_PWM[] = { +// {PA_0 , PWM_6, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_1 , PWM_7, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_5 , PWM_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, +// {PA_7 , PWM_4, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, +// {PA_8 , PWM_5, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, +// {PA_9 , PWM_6, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, +// {PA_10, PWM_7, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, +// {PC_0 , PWM_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_2 , PWM_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_4 , PWM_4, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_5 , PWM_5, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_8 , PWM_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_10, PWM_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC , NC , WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)} +// }; diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PinNames.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PinNames.h new file mode 100644 index 0000000000..23ab89eee5 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PinNames.h @@ -0,0 +1,251 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) XXX + * 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 ARM Limited nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef MBED_PINNAMES_H +#define MBED_PINNAMES_H + +#include "cmsis.h" +#include "PinNamesTypes.h" +#include "PortNames.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define CY_UART_RX P5_0 +#define CY_UART_TX P5_1 + +// PinName[15-0] = Port[15-8] + Pin[7-0] +typedef enum { + P0_0 = (Port0 << 8) + 0x00, + P0_1 = (Port0 << 8) + 0x01, + P0_2 = (Port0 << 8) + 0x02, + P0_3 = (Port0 << 8) + 0x03, + P0_4 = (Port0 << 8) + 0x04, + P0_5 = (Port0 << 8) + 0x05, + P0_6 = (Port0 << 8) + 0x06, + P0_7 = (Port0 << 8) + 0x07, + + P1_0 = (Port1 << 8) + 0x00, + P1_1 = (Port1 << 8) + 0x01, + P1_2 = (Port1 << 8) + 0x02, + P1_3 = (Port1 << 8) + 0x03, + P1_4 = (Port1 << 8) + 0x04, + P1_5 = (Port1 << 8) + 0x05, + P1_6 = (Port1 << 8) + 0x06, + P1_7 = (Port1 << 8) + 0x07, + + P2_0 = (Port2 << 8) + 0x00, + P2_1 = (Port2 << 8) + 0x01, + P2_2 = (Port2 << 8) + 0x02, + P2_3 = (Port2 << 8) + 0x03, + P2_4 = (Port2 << 8) + 0x04, + P2_5 = (Port2 << 8) + 0x05, + P2_6 = (Port2 << 8) + 0x06, + P2_7 = (Port2 << 8) + 0x07, + + P3_0 = (Port3 << 8) + 0x00, + P3_1 = (Port3 << 8) + 0x01, + P3_2 = (Port3 << 8) + 0x02, + P3_3 = (Port3 << 8) + 0x03, + P3_4 = (Port3 << 8) + 0x04, + P3_5 = (Port3 << 8) + 0x05, + P3_6 = (Port3 << 8) + 0x06, + P3_7 = (Port3 << 8) + 0x07, + + P4_0 = (Port4 << 8) + 0x00, + P4_1 = (Port4 << 8) + 0x01, + P4_2 = (Port4 << 8) + 0x02, + P4_3 = (Port4 << 8) + 0x03, + P4_4 = (Port4 << 8) + 0x04, + P4_5 = (Port4 << 8) + 0x05, + P4_6 = (Port4 << 8) + 0x06, + P4_7 = (Port4 << 8) + 0x07, + + P5_0 = (Port5 << 8) + 0x00, + P5_1 = (Port5 << 8) + 0x01, + P5_2 = (Port5 << 8) + 0x02, + P5_3 = (Port5 << 8) + 0x03, + P5_4 = (Port5 << 8) + 0x04, + P5_5 = (Port5 << 8) + 0x05, + P5_6 = (Port5 << 8) + 0x06, + P5_7 = (Port5 << 8) + 0x07, + + P6_0 = (Port6 << 8) + 0x00, + P6_1 = (Port6 << 8) + 0x01, + P6_2 = (Port6 << 8) + 0x02, + P6_3 = (Port6 << 8) + 0x03, + P6_4 = (Port6 << 8) + 0x04, + P6_5 = (Port6 << 8) + 0x05, + P6_6 = (Port6 << 8) + 0x06, + P6_7 = (Port6 << 8) + 0x07, + + P7_0 = (Port7 << 8) + 0x00, + P7_1 = (Port7 << 8) + 0x01, + P7_2 = (Port7 << 8) + 0x02, + P7_3 = (Port7 << 8) + 0x03, + P7_4 = (Port7 << 8) + 0x04, + P7_5 = (Port7 << 8) + 0x05, + P7_6 = (Port7 << 8) + 0x06, + P7_7 = (Port7 << 8) + 0x07, + + P8_0 = (Port8 << 8) + 0x00, + P8_1 = (Port8 << 8) + 0x01, + P8_2 = (Port8 << 8) + 0x02, + P8_3 = (Port8 << 8) + 0x03, + P8_4 = (Port8 << 8) + 0x04, + P8_5 = (Port8 << 8) + 0x05, + P8_6 = (Port8 << 8) + 0x06, + P8_7 = (Port8 << 8) + 0x07, + + P9_0 = (Port9 << 8) + 0x00, + P9_1 = (Port9 << 8) + 0x01, + P9_2 = (Port9 << 8) + 0x02, + P9_3 = (Port9 << 8) + 0x03, + P9_4 = (Port9 << 8) + 0x04, + P9_5 = (Port9 << 8) + 0x05, + P9_6 = (Port9 << 8) + 0x06, + P9_7 = (Port9 << 8) + 0x07, + + P10_0 = (Port10 << 8) + 0x00, + P10_1 = (Port10 << 8) + 0x01, + P10_2 = (Port10 << 8) + 0x02, + P10_3 = (Port10 << 8) + 0x03, + P10_4 = (Port10 << 8) + 0x04, + P10_5 = (Port10 << 8) + 0x05, + P10_6 = (Port10 << 8) + 0x06, + P10_7 = (Port10 << 8) + 0x07, + + P11_0 = (Port11 << 8) + 0x00, + P11_1 = (Port11 << 8) + 0x01, + P11_2 = (Port11 << 8) + 0x02, + P11_3 = (Port11 << 8) + 0x03, + P11_4 = (Port11 << 8) + 0x04, + P11_5 = (Port11 << 8) + 0x05, + P11_6 = (Port11 << 8) + 0x06, + P11_7 = (Port11 << 8) + 0x07, + + P12_0 = (Port12 << 8) + 0x00, + P12_1 = (Port12 << 8) + 0x01, + P12_2 = (Port12 << 8) + 0x02, + P12_3 = (Port12 << 8) + 0x03, + P12_4 = (Port12 << 8) + 0x04, + P12_5 = (Port12 << 8) + 0x05, + P12_6 = (Port12 << 8) + 0x06, + P12_7 = (Port12 << 8) + 0x07, + + P13_0 = (Port13 << 8) + 0x00, + P13_1 = (Port13 << 8) + 0x01, + P13_2 = (Port13 << 8) + 0x02, + P13_3 = (Port13 << 8) + 0x03, + P13_4 = (Port13 << 8) + 0x04, + P13_5 = (Port13 << 8) + 0x05, + P13_6 = (Port13 << 8) + 0x06, + P13_7 = (Port13 << 8) + 0x07, + + P14_0 = (Port14 << 8) + 0x00, + P14_1 = (Port14 << 8) + 0x01, + P14_2 = (Port14 << 8) + 0x02, + P14_3 = (Port14 << 8) + 0x03, + P14_4 = (Port14 << 8) + 0x04, + P14_5 = (Port14 << 8) + 0x05, + P14_6 = (Port14 << 8) + 0x06, + P14_7 = (Port14 << 8) + 0x07, + + P15_0 = (Port15 << 8) + 0x00, + P15_1 = (Port15 << 8) + 0x01, + P15_2 = (Port15 << 8) + 0x02, + P15_3 = (Port15 << 8) + 0x03, + P15_4 = (Port15 << 8) + 0x04, + P15_5 = (Port15 << 8) + 0x05, + P15_6 = (Port15 << 8) + 0x06, + P15_7 = (Port15 << 8) + 0x07, + + // Arduino connector namings + A0 = P10_0, + A1 = P10_1, + A2 = P10_2, + A3 = P10_3, + A4 = P10_4, + A5 = P10_5, + + D0 = P5_0, + D1 = P5_1, + D2 = P5_2, + D3 = P5_3, + D4 = P5_4, + D5 = P5_5, + D6 = P5_6, + D7 = P0_2, + D8 = P13_0, + D9 = P13_1, + D10 = P12_3, + D11 = P12_0, + D12 = P12_1, + D13 = P12_2, + + // Generic signals namings + + LED_RED = P0_3, + LED_GREEN = P1_1, + LED_BLUE = P11_1, + + SWITCH2 = P0_4, + + LED1 = LED_RED, + LED2 = LED_GREEN, + LED3 = LED_BLUE, + LED4 = LED_RED, + + USER_BUTTON = SWITCH2, + BUTTON1 = USER_BUTTON, + + // Standardized interfaces names + SERIAL_TX = CY_UART_TX, + SERIAL_RX = CY_UART_RX, + USBTX = CY_UART_TX, + USBRX = CY_UART_RX, + // I2C_SCL = PB_8, + // I2C_SDA = PB_9, + // SPI_MOSI = PA_7, + // SPI_MISO = PA_6, + // SPI_SCK = PA_5, + // SPI_CS = PB_6, + // PWM_OUT = PB_3, + + // Not connected + NC = (int)0xFFFFFFFF +} PinName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device.h new file mode 100644 index 0000000000..fa47e5377a --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device.h @@ -0,0 +1,39 @@ +// The 'features' section in 'target.json' is now used to create the device's hardware preprocessor switches. +// Check the 'features' section of the target description in 'targets.json' for more details. +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) XXX + * 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 ARM Limited nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef MBED_DEVICE_H +#define MBED_DEVICE_H + +#include "objects.h" +#include "project.h" + +#endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy8c6x7_cm0plus.ld b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy8c6x7_cm0plus.ld new file mode 100644 index 0000000000..c181e96892 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy8c6x7_cm0plus.ld @@ -0,0 +1,328 @@ +/***************************************************************************//** +* \file cy8c6x7_cm0plus.ld +* \version 1.0 +* +* \brief Linker file for the GNU C compiler. +* +* \note The entry point location is fixed and starts at 0x10000000. The valid +* application image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* Force symbol to be entered in the output file as an undefined symbol. Doing +* this may, for example, trigger linking of additional modules from standard +* libraries. You may list several symbols for each EXTERN, and you may use +* EXTERN multiple times. This command has the same effect as the -u command-line +* option. +*/ +EXTERN(Reset_Handler) +EXTERN(vectors) +EXTERN(ram_vectors) +EXTERN(cychipprotect) +EXTERN(cymeta) + +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Working Flash */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* XIP */ +__cy_memory_2_start = 0x18000000; +__cy_memory_2_length = 0x08000000; +__cy_memory_2_row_size = 0x200; + + +/* Linker script to configure memory regions. */ +MEMORY +{ + rom (rx) : ORIGIN = 0x10000000, LENGTH = 0x00080000 + wrom (rx) : ORIGIN = 0x14000000, LENGTH = 0x8000 + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x08000000 + ram_cm0p (rwx) : ORIGIN = 0x08000000, LENGTH = 0x00024000 +} + + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* 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 + * __Vectors_End + * __Vectors_Size + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + /* Cortex-M0+ ROM vector table */ + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > rom + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > rom + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > rom + __exidx_end = .; + + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_psoc6ble_cm0plus.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > rom + + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc6ble_cm0plus.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > rom + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram_cm0p + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram_cm0p + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram_cm0p + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells linker that .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes linker to A) not allocate section in memory, and + * A) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get PROGBITS type. + * This makes linker to A) allocate zeroed section in memory, and B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram_cm0p + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram_cm0p + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram_cm0p + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram_cm0p) + LENGTH(ram_cm0p); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* The section is used for BLE bonding data storage. */ + ble_bond_data 0x14000000 : + { + __ble_bond_data_start = . ; + KEEP(*(.ble_bond_data)) + __ble_bond_data_end = . ; + } > wrom + + + /* Places the code in the Execute in Place (XIP) section. See the smif driver + * documentation for details. + */ + .xip 0x18000000 : + { + . = ALIGN(4); + __xip_data_start = . ; + KEEP(*(.xip)) + __xip_data_end = . ; + } > xip + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE + .cychipprotect 0x90600000 : { KEEP(*(.cychipprotect)) } :NONE +} + + +/* EOF */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy_syslib_gcc.S b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy_syslib_gcc.S new file mode 100644 index 0000000000..131fc910da --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy_syslib_gcc.S @@ -0,0 +1,101 @@ +/***************************************************************************//** +* \file cy_syslib_core_armcc.s +* \version 1.0 +* +* \brief Assembly routines for GNU as. +* +******************************************************************************** +* \copyright +* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +.syntax unified +.text +.thumb + + +/******************************************************************************* +* Function Name: Cy_SysLib_DelayCycles +****************************************************************************//** +* +* Delays for the specified number of cycles. +* +* \param uint32_t cycles: The number of cycles to delay. +* +*******************************************************************************/ +/* void Cy_SysLib_DelayCycles(uint32_t cycles) */ +.align 3 /* Align to 8 byte boundary (2^n) */ +.global Cy_SysLib_DelayCycles +.func Cy_SysLib_DelayCycles, Cy_SysLib_DelayCycles +.type Cy_SysLib_DelayCycles, %function +.thumb_func +Cy_SysLib_DelayCycles: /* cycles bytes */ + ADDS r0, r0, #2 /* 1 2 Round to nearest multiple of 4 */ + LSRS r0, r0, #2 /* 1 2 Divide by 4 and set flags */ + BEQ Cy_DelayCycles_done /* 2 2 Skip if 0 */ +Cy_DelayCycles_loop: +/* For CM0+ branch instruction takes 2 CPU cycles */ + ADDS r0, r0, #1 /* 1 2 Increment counter */ + SUBS r0, r0, #2 /* 1 2 Decrement counter by 2 */ + BNE Cy_DelayCycles_loop /* 2 2 2 CPU cycles (if branch is taken)*/ + NOP /* 1 2 Loop alignment padding */ +Cy_DelayCycles_done: + NOP /* 1 2 Loop alignment padding */ + BX lr /* 3 2 */ +.endfunc + + +/******************************************************************************* +* Function Name: Cy_SysLib_EnterCriticalSection +****************************************************************************//** +* +* Cy_SysLib_EnterCriticalSection disables interrupts and returns a value +* indicating whether interrupts were previously enabled. +* +* Note Implementation of Cy_SysLib_EnterCriticalSection manipulates the IRQ +* enable bit with interrupts still enabled. +* +* \return Returns 0 if interrupts were previously enabled or 1 if interrupts +* were previously disabled. +* +*******************************************************************************/ +/* uint8_t Cy_SysLib_EnterCriticalSection(void) */ +.global Cy_SysLib_EnterCriticalSection +.func Cy_SysLib_EnterCriticalSection, Cy_SysLib_EnterCriticalSection +.type Cy_SysLib_EnterCriticalSection, %function +.thumb_func +Cy_SysLib_EnterCriticalSection: + MRS r0, PRIMASK /* Save and return interrupt state */ + CPSID I /* Disable interrupts */ + BX lr +.endfunc + + +/******************************************************************************* +* Function Name: Cy_SysLib_ExitCriticalSection +****************************************************************************//** +* +* Re-enables interrupts if they were enabled before +* Cy_SysLib_EnterCriticalSection() was called. The argument should be the value +* returned from \ref Cy_SysLib_EnterCriticalSection(). +* +* \param uint8_t savedIntrStatus: +* Saved interrupt status returned by the \ref Cy_SysLib_EnterCriticalSection(). +* +*******************************************************************************/ +/* void Cy_SysLib_ExitCriticalSection(uint8_t savedIntrStatus) */ +.global Cy_SysLib_ExitCriticalSection +.func Cy_SysLib_ExitCriticalSection, Cy_SysLib_ExitCriticalSection +.type Cy_SysLib_ExitCriticalSection, %function +.thumb_func +Cy_SysLib_ExitCriticalSection: + MSR PRIMASK, r0 /* Restore interrupt state */ + BX lr +.endfunc + +.end + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/startup_psoc6ble_cm0plus.S b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/startup_psoc6ble_cm0plus.S new file mode 100644 index 0000000000..7cb88f5e8f --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/startup_psoc6ble_cm0plus.S @@ -0,0 +1,423 @@ +/**************************************************************************//** + * @file startup_psoc6ble_cm0plus.s + * @brief CMSIS Core Device Startup File for + * ARMCM0plus Device Series + * @version V5.00 + * @date 02. March 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* Address of the NMI handler */ + #define CY_NMI_HANLDER_ADDR 0x0000000D + + /* The Cortex-M4 VTOR register */ + #define CY_CORTEX_M4_VTOR_ADDR 0x402102C0 + + /* The CPU VTOR register */ + #define CY_CPU_VTOR_ADDR 0xE000ED08 + + /* Copy flash vectors and data section to RAM */ + #define __STARTUP_COPY_MULTIPLE + + /* Clear single BSS section */ + #define __STARTUP_CLEAR_BSS + + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00001000 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000400 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long CY_NMI_HANLDER_ADDR /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts Power Mode Description */ + .long ioss_interrupts_gpio_0_IRQHandler /* DeepSleep GPIO Port Interrupt #0 */ + .long ioss_interrupts_gpio_1_IRQHandler /* DeepSleep GPIO Port Interrupt #1 */ + .long ioss_interrupts_gpio_2_IRQHandler /* DeepSleep GPIO Port Interrupt #2 */ + .long ioss_interrupts_gpio_3_IRQHandler /* DeepSleep GPIO Port Interrupt #3 */ + .long ioss_interrupts_gpio_4_IRQHandler /* DeepSleep GPIO Port Interrupt #4 */ + .long ioss_interrupts_gpio_5_IRQHandler /* DeepSleep GPIO Port Interrupt #5 */ + .long ioss_interrupts_gpio_6_IRQHandler /* DeepSleep GPIO Port Interrupt #6 */ + .long ioss_interrupts_gpio_7_IRQHandler /* DeepSleep GPIO Port Interrupt #7 */ + .long ioss_interrupts_gpio_8_IRQHandler /* DeepSleep GPIO Port Interrupt #8 */ + .long ioss_interrupts_gpio_9_IRQHandler /* DeepSleep GPIO Port Interrupt #9 */ + .long ioss_interrupts_gpio_10_IRQHandler /* DeepSleep GPIO Port Interrupt #10 */ + .long ioss_interrupts_gpio_11_IRQHandler /* DeepSleep GPIO Port Interrupt #11 */ + .long ioss_interrupts_gpio_12_IRQHandler /* DeepSleep GPIO Port Interrupt #12 */ + .long ioss_interrupts_gpio_13_IRQHandler /* DeepSleep GPIO Port Interrupt #13 */ + .long ioss_interrupts_gpio_14_IRQHandler /* DeepSleep GPIO Port Interrupt #14 */ + .long ioss_interrupt_gpio_IRQHandler /* DeepSleep GPIO All Ports */ + .long ioss_interrupt_vdd_IRQHandler /* DeepSleep GPIO Supply Detect Interrupt */ + .long lpcomp_interrupt_IRQHandler /* DeepSleep Low Power Comparator Interrupt */ + .long scb_8_interrupt_IRQHandler /* DeepSleep Serial Communication Block #8 (DeepSleep capable) */ + .long srss_interrupt_mcwdt_0_IRQHandler /* DeepSleep Multi Counter Watchdog Timer interrupt */ + .long srss_interrupt_mcwdt_1_IRQHandler /* DeepSleep Multi Counter Watchdog Timer interrupt */ + .long srss_interrupt_backup_IRQHandler /* DeepSleep Backup domain interrupt */ + .long srss_interrupt_IRQHandler /* DeepSleep Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + .long pass_interrupt_ctbs_IRQHandler /* DeepSleep CTBm Interrupt (all CTBms) */ + .long bless_interrupt_IRQHandler /* DeepSleep Bluetooth Radio interrupt */ + .long cpuss_interrupts_ipc_0_IRQHandler /* DeepSleep CPUSS Inter Process Communication Interrupt #0 */ + .long cpuss_interrupts_ipc_1_IRQHandler /* DeepSleep CPUSS Inter Process Communication Interrupt #1 */ + .long cpuss_interrupts_ipc_2_IRQHandler /* DeepSleep CPUSS Inter Process Communication Interrupt #2 */ + .long cpuss_interrupts_ipc_3_IRQHandler /* DeepSleep CPUSS Inter Process Communication Interrupt #3 */ + .long cpuss_interrupts_ipc_4_IRQHandler /* DeepSleep CPUSS Inter Process Communication Interrupt #4 */ + .long cpuss_interrupts_ipc_5_IRQHandler /* DeepSleep CPUSS Inter Process Communication Interrupt #5 */ + .long cpuss_interrupts_ipc_6_IRQHandler /* DeepSleep CPUSS Inter Process Communication Interrupt #6 */ + + .size __Vectors, . - __Vectors + .equ __VectorsSize, . - __Vectors + + .section .ram_vectors + .align 2 + .globl __ramVectors +__ramVectors: + .space __VectorsSize + .size __ramVectors, . - __ramVectors + + + .text + .thumb + .thumb_func + .align 2 + + /* Device startup customization */ + .weak Cy_OnResetUser + .func Cy_OnResetUser, Cy_OnResetUser + .type Cy_OnResetUser, %function +Cy_OnResetUser: + + bx lr + .size Cy_OnResetUser, . - Cy_OnResetUser + .endfunc + + /* Saves and disables the interrupts */ + .global Cy_SaveIRQ + .func Cy_SaveIRQ, Cy_SaveIRQ + .type Cy_SaveIRQ, %function +Cy_SaveIRQ: + mrs r0, PRIMASK + cpsid i + bx lr + .size Cy_SaveIRQ, . - Cy_SaveIRQ + .endfunc + + /* Restores the interrupts */ + .global Cy_RestoreIRQ + .func Cy_RestoreIRQ, Cy_RestoreIRQ + .type Cy_RestoreIRQ, %function +Cy_RestoreIRQ: + msr PRIMASK, r0 + bx lr + .size Cy_RestoreIRQ, . - Cy_RestoreIRQ + .endfunc + + /* Reset handler */ + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + + bl Cy_OnResetUser + cpsid i + +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + blt .L_loop0_0_done + ldr r0, [r1, r3] + str r0, [r2, r3] + b .L_loop0_0 + +.L_loop0_0_done: + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .L_loop1_done + +.L_loop1: + subs r3, #4 + ldr r0, [r1,r3] + str r0, [r2,r3] + bgt .L_loop1 + +.L_loop1_done: +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + blt .L_loop2_0_done + str r0, [r1, r2] + b .L_loop2_0 +.L_loop2_0_done: + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 + + subs r2, r1 + ble .L_loop3_done + +.L_loop3: + subs r2, #4 + str r0, [r1, r2] + bgt .L_loop3 +.L_loop3_done: +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + + /* Update Vector Table Offset Register. */ + ldr r0, =__ramVectors + ldr r1, =CY_CPU_VTOR_ADDR + str r0, [r1] + dsb 0xF + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + + bl _start + + /* Should never get here */ + b . + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + + + .weak Cy_SysLib_FaultHandler + .type Cy_SysLib_FaultHandler, %function +Cy_SysLib_FaultHandler: + b . + .size Cy_SysLib_FaultHandler, . - Cy_SysLib_FaultHandler + + + .type Fault_Handler, %function +Fault_Handler: + /* Storing LR content for Creator call stack trace */ + push {LR} + movs r0, #4 + mov r1, LR + tst r0, r1 + beq .L_MSP + mrs r0, PSP + b .L_API_call +.L_MSP: + mrs r0, MSP +.L_API_call: + /* Compensation of stack pointer address due to pushing 4 bytes of LR */ + adds r0, r0, #4 + bl Cy_SysLib_FaultHandler + b . + .size Fault_Handler, . - Fault_Handler + +.macro def_fault_Handler fault_handler_name + .weak \fault_handler_name + .set \fault_handler_name, Fault_Handler + .endm + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + + def_fault_Handler HardFault_Handler + + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler ioss_interrupts_gpio_0_IRQHandler + def_irq_handler ioss_interrupts_gpio_1_IRQHandler + def_irq_handler ioss_interrupts_gpio_2_IRQHandler + def_irq_handler ioss_interrupts_gpio_3_IRQHandler + def_irq_handler ioss_interrupts_gpio_4_IRQHandler + def_irq_handler ioss_interrupts_gpio_5_IRQHandler + def_irq_handler ioss_interrupts_gpio_6_IRQHandler + def_irq_handler ioss_interrupts_gpio_7_IRQHandler + def_irq_handler ioss_interrupts_gpio_8_IRQHandler + def_irq_handler ioss_interrupts_gpio_9_IRQHandler + def_irq_handler ioss_interrupts_gpio_10_IRQHandler + def_irq_handler ioss_interrupts_gpio_11_IRQHandler + def_irq_handler ioss_interrupts_gpio_12_IRQHandler + def_irq_handler ioss_interrupts_gpio_13_IRQHandler + def_irq_handler ioss_interrupts_gpio_14_IRQHandler + def_irq_handler ioss_interrupt_gpio_IRQHandler + def_irq_handler ioss_interrupt_vdd_IRQHandler + def_irq_handler lpcomp_interrupt_IRQHandler + def_irq_handler scb_8_interrupt_IRQHandler + def_irq_handler srss_interrupt_mcwdt_0_IRQHandler + def_irq_handler srss_interrupt_mcwdt_1_IRQHandler + def_irq_handler srss_interrupt_backup_IRQHandler + def_irq_handler srss_interrupt_IRQHandler + def_irq_handler pass_interrupt_ctbs_IRQHandler + def_irq_handler bless_interrupt_IRQHandler + def_irq_handler cpuss_interrupts_ipc_0_IRQHandler + def_irq_handler cpuss_interrupts_ipc_1_IRQHandler + def_irq_handler cpuss_interrupts_ipc_2_IRQHandler + def_irq_handler cpuss_interrupts_ipc_3_IRQHandler + def_irq_handler cpuss_interrupts_ipc_4_IRQHandler + def_irq_handler cpuss_interrupts_ipc_5_IRQHandler + def_irq_handler cpuss_interrupts_ipc_6_IRQHandler + + .end + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cmsis.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cmsis.h new file mode 100644 index 0000000000..5de272b134 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cmsis.h @@ -0,0 +1,38 @@ +/* mbed Microcontroller Library + * A generic CMSIS include header + ******************************************************************************* + * Copyright (c) XXX + * 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 ARM nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef MBED_CMSIS_H +#define MBED_CMSIS_H + +#include "cy8c637bzi_bld74.h" // IRQn - could include "include/cy_device_headers.h" +#include "core_cm0plus.h" // NVIC + +#endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cy8c637bzi_bld74.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cy8c637bzi_bld74.h new file mode 100644 index 0000000000..8a451ed880 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cy8c637bzi_bld74.h @@ -0,0 +1,1030 @@ +/***************************************************************************//** +* \file cy8c637bzi_bld74.h +* +* \brief +* CY8C637BZI-BLD74 device header +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CY8C637BZI_BLD74_H_ +#define _CY8C637BZI_BLD74_H_ + +/** +* \addtogroup group_device CY8C637BZI-BLD74 +* \{ +*/ + +/** +* \addtogroup Configuration_of_CMSIS +* \{ +*/ + +/* =========================================================================================================================== */ +/* ================ Interrupt Number Definition ================ */ +/* =========================================================================================================================== */ + +typedef enum { +#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined (__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3))) +/* ======================================= ARM Cortex-M0+ Specific Interrupt Numbers ======================================= */ + Reset_IRQn = -15, /*!< -15 Reset Vector, invoked on Power up and warm reset */ + NonMaskableInt_IRQn = -14, /*!< -14 Non maskable Interrupt, cannot be stopped or preempted */ + HardFault_IRQn = -13, /*!< -13 Hard Fault, all classes of Fault */ + SVCall_IRQn = -5, /*!< -5 System Service Call via SVC instruction */ + PendSV_IRQn = -2, /*!< -2 Pendable request for system service */ + SysTick_IRQn = -1, /*!< -1 System Tick Timer */ +#else +/* ======================================= ARM Cortex-M4 Specific Interrupt Numbers ======================================== */ + Reset_IRQn = -15, /*!< -15 Reset Vector, invoked on Power up and warm reset */ + NonMaskableInt_IRQn = -14, /*!< -14 Non maskable Interrupt, cannot be stopped or preempted */ + HardFault_IRQn = -13, /*!< -13 Hard Fault, all classes of Fault */ + MemoryManagement_IRQn = -12, /*!< -12 Memory Management, MPU mismatch, including Access Violation and No Match */ + BusFault_IRQn = -11, /*!< -11 Bus Fault, Pre-Fetch-, Memory Access Fault, other address/memory related Fault */ + UsageFault_IRQn = -10, /*!< -10 Usage Fault, i.e. Undef Instruction, Illegal State Transition */ + SVCall_IRQn = -5, /*!< -5 System Service Call via SVC instruction */ + DebugMonitor_IRQn = -4, /*!< -4 Debug Monitor */ + PendSV_IRQn = -2, /*!< -2 Pendable request for system service */ + SysTick_IRQn = -1, /*!< -1 System Tick Timer */ +#endif +/* ====================================== cy8c637bzi_bld74 Specific Interrupt Numbers ====================================== */ + ioss_interrupts_gpio0_IRQn = 0, /*!< 0 GPIO Port Interrupt #0 */ + ioss_interrupts_gpio1_IRQn = 1, /*!< 1 GPIO Port Interrupt #1 */ + ioss_interrupts_gpio2_IRQn = 2, /*!< 2 GPIO Port Interrupt #2 */ + ioss_interrupts_gpio3_IRQn = 3, /*!< 3 GPIO Port Interrupt #3 */ + ioss_interrupts_gpio4_IRQn = 4, /*!< 4 GPIO Port Interrupt #4 */ + ioss_interrupts_gpio5_IRQn = 5, /*!< 5 GPIO Port Interrupt #5 */ + ioss_interrupts_gpio6_IRQn = 6, /*!< 6 GPIO Port Interrupt #6 */ + ioss_interrupts_gpio7_IRQn = 7, /*!< 7 GPIO Port Interrupt #7 */ + ioss_interrupts_gpio8_IRQn = 8, /*!< 8 GPIO Port Interrupt #8 */ + ioss_interrupts_gpio9_IRQn = 9, /*!< 9 GPIO Port Interrupt #9 */ + ioss_interrupts_gpio10_IRQn = 10, /*!< 10 GPIO Port Interrupt #10 */ + ioss_interrupts_gpio11_IRQn = 11, /*!< 11 GPIO Port Interrupt #11 */ + ioss_interrupts_gpio12_IRQn = 12, /*!< 12 GPIO Port Interrupt #12 */ + ioss_interrupts_gpio13_IRQn = 13, /*!< 13 GPIO Port Interrupt #13 */ + ioss_interrupts_gpio14_IRQn = 14, /*!< 14 GPIO Port Interrupt #14 */ + ioss_interrupt_gpio_IRQn = 15, /*!< 15 GPIO All Ports */ + ioss_interrupt_vdd_IRQn = 16, /*!< 16 GPIO Supply Detect Interrupt */ + lpcomp_interrupt_IRQn = 17, /*!< 17 Low Power Comparator Interrupt */ + scb8_interrupt_IRQn = 18, /*!< 18 Serial Communication Block #8 (DeepSleep capable) */ + srss_interrupt_mcwdt0_IRQn = 19, /*!< 19 Multi Counter Watchdog Timer interrupt */ + srss_interrupt_mcwdt1_IRQn = 20, /*!< 20 Multi Counter Watchdog Timer interrupt */ + srss_interrupt_backup_IRQn = 21, /*!< 21 Backup domain interrupt */ + srss_interrupt_IRQn = 22, /*!< 22 Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + pass_interrupt_ctbs_IRQn = 23, /*!< 23 CTBm Interrupt (all CTBms) */ + bless_interrupt_IRQn = 24, /*!< 24 Bluetooth Radio interrupt */ + cpuss_interrupts_ipc0_IRQn = 25, /*!< 25 CPUSS Inter Process Communication Interrupt #0 */ + cpuss_interrupts_ipc1_IRQn = 26, /*!< 26 CPUSS Inter Process Communication Interrupt #1 */ + cpuss_interrupts_ipc2_IRQn = 27, /*!< 27 CPUSS Inter Process Communication Interrupt #2 */ + cpuss_interrupts_ipc3_IRQn = 28, /*!< 28 CPUSS Inter Process Communication Interrupt #3 */ + cpuss_interrupts_ipc4_IRQn = 29, /*!< 29 CPUSS Inter Process Communication Interrupt #4 */ + cpuss_interrupts_ipc5_IRQn = 30, /*!< 30 CPUSS Inter Process Communication Interrupt #5 */ + cpuss_interrupts_ipc6_IRQn = 31, /*!< 31 CPUSS Inter Process Communication Interrupt #6 */ + cpuss_interrupts_ipc7_IRQn = 32, /*!< 32 CPUSS Inter Process Communication Interrupt #7 */ + scb0_interrupt_IRQn = 33, /*!< 33 Serial Communication Block #0 */ + scb1_interrupt_IRQn = 34, /*!< 34 Serial Communication Block #1 */ + scb2_interrupt_IRQn = 35, /*!< 35 Serial Communication Block #2 */ + scb3_interrupt_IRQn = 36, /*!< 36 Serial Communication Block #3 */ + scb4_interrupt_IRQn = 37, /*!< 37 Serial Communication Block #4 */ + scb5_interrupt_IRQn = 38, /*!< 38 Serial Communication Block #5 */ + scb6_interrupt_IRQn = 39, /*!< 39 Serial Communication Block #6 */ + scb7_interrupt_IRQn = 40, /*!< 40 Serial Communication Block #7 */ + csd_interrupt_IRQn = 41, /*!< 41 CSD (Capsense) interrupt */ + cpuss_interrupts_dw00_IRQn = 42, /*!< 42 CPUSS DataWire #0, Channel #0 */ + cpuss_interrupts_dw01_IRQn = 43, /*!< 43 CPUSS DataWire #0, Channel #1 */ + cpuss_interrupts_dw02_IRQn = 44, /*!< 44 CPUSS DataWire #0, Channel #2 */ + cpuss_interrupts_dw03_IRQn = 45, /*!< 45 CPUSS DataWire #0, Channel #3 */ + cpuss_interrupts_dw04_IRQn = 46, /*!< 46 CPUSS DataWire #0, Channel #4 */ + cpuss_interrupts_dw05_IRQn = 47, /*!< 47 CPUSS DataWire #0, Channel #5 */ + cpuss_interrupts_dw06_IRQn = 48, /*!< 48 CPUSS DataWire #0, Channel #6 */ + cpuss_interrupts_dw07_IRQn = 49, /*!< 49 CPUSS DataWire #0, Channel #7 */ + cpuss_interrupts_dw08_IRQn = 50, /*!< 50 CPUSS DataWire #0, Channel #8 */ + cpuss_interrupts_dw09_IRQn = 51, /*!< 51 CPUSS DataWire #0, Channel #9 */ + cpuss_interrupts_dw010_IRQn = 52, /*!< 52 CPUSS DataWire #0, Channel #10 */ + cpuss_interrupts_dw011_IRQn = 53, /*!< 53 CPUSS DataWire #0, Channel #11 */ + cpuss_interrupts_dw012_IRQn = 54, /*!< 54 CPUSS DataWire #0, Channel #12 */ + cpuss_interrupts_dw013_IRQn = 55, /*!< 55 CPUSS DataWire #0, Channel #13 */ + cpuss_interrupts_dw014_IRQn = 56, /*!< 56 CPUSS DataWire #0, Channel #14 */ + cpuss_interrupts_dw015_IRQn = 57, /*!< 57 CPUSS DataWire #0, Channel #15 */ + cpuss_interrupts_dw10_IRQn = 58, /*!< 58 CPUSS DataWire #1, Channel #0 */ + cpuss_interrupts_dw11_IRQn = 59, /*!< 59 CPUSS DataWire #1, Channel #1 */ + cpuss_interrupts_dw12_IRQn = 60, /*!< 60 CPUSS DataWire #1, Channel #2 */ + cpuss_interrupts_dw13_IRQn = 61, /*!< 61 CPUSS DataWire #1, Channel #3 */ + cpuss_interrupts_dw14_IRQn = 62, /*!< 62 CPUSS DataWire #1, Channel #4 */ + cpuss_interrupts_dw15_IRQn = 63, /*!< 63 CPUSS DataWire #1, Channel #5 */ + cpuss_interrupts_dw16_IRQn = 64, /*!< 64 CPUSS DataWire #1, Channel #6 */ + cpuss_interrupts_dw17_IRQn = 65, /*!< 65 CPUSS DataWire #1, Channel #7 */ + cpuss_interrupts_dw18_IRQn = 66, /*!< 66 CPUSS DataWire #1, Channel #8 */ + cpuss_interrupts_dw19_IRQn = 67, /*!< 67 CPUSS DataWire #1, Channel #9 */ + cpuss_interrupts_dw110_IRQn = 68, /*!< 68 CPUSS DataWire #1, Channel #10 */ + cpuss_interrupts_dw111_IRQn = 69, /*!< 69 CPUSS DataWire #1, Channel #11 */ + cpuss_interrupts_dw112_IRQn = 70, /*!< 70 CPUSS DataWire #1, Channel #12 */ + cpuss_interrupts_dw113_IRQn = 71, /*!< 71 CPUSS DataWire #1, Channel #13 */ + cpuss_interrupts_dw114_IRQn = 72, /*!< 72 CPUSS DataWire #1, Channel #14 */ + cpuss_interrupts_dw115_IRQn = 73, /*!< 73 CPUSS DataWire #1, Channel #15 */ + cpuss_interrupts_fault0_IRQn = 74, /*!< 74 CPUSS Fault Structure Interrupt #0 */ + cpuss_interrupts_fault1_IRQn = 75, /*!< 75 CPUSS Fault Structure Interrupt #1 */ + cpuss_interrupt_crypto_IRQn = 76, /*!< 76 CRYPTO Accelerator Interrupt */ + cpuss_interrupt_fm_IRQn = 77, /*!< 77 FLASH Macro Interrupt */ + cpuss_interrupts_cm0_cti0_IRQn = 78, /*!< 78 CM0+ CTI #0 */ + cpuss_interrupts_cm0_cti1_IRQn = 79, /*!< 79 CM0+ CTI #1 */ + cpuss_interrupts_cm4_cti0_IRQn = 80, /*!< 80 CM4 CTI #0 */ + cpuss_interrupts_cm4_cti1_IRQn = 81, /*!< 81 CM4 CTI #1 */ + tcpwm0_interrupts0_IRQn = 82, /*!< 82 TCPWM #0, Counter #0 */ + tcpwm0_interrupts1_IRQn = 83, /*!< 83 TCPWM #0, Counter #1 */ + tcpwm0_interrupts2_IRQn = 84, /*!< 84 TCPWM #0, Counter #2 */ + tcpwm0_interrupts3_IRQn = 85, /*!< 85 TCPWM #0, Counter #3 */ + tcpwm0_interrupts4_IRQn = 86, /*!< 86 TCPWM #0, Counter #4 */ + tcpwm0_interrupts5_IRQn = 87, /*!< 87 TCPWM #0, Counter #5 */ + tcpwm0_interrupts6_IRQn = 88, /*!< 88 TCPWM #0, Counter #6 */ + tcpwm0_interrupts7_IRQn = 89, /*!< 89 TCPWM #0, Counter #7 */ + tcpwm1_interrupts0_IRQn = 90, /*!< 90 TCPWM #1, Counter #0 */ + tcpwm1_interrupts1_IRQn = 91, /*!< 91 TCPWM #1, Counter #1 */ + tcpwm1_interrupts2_IRQn = 92, /*!< 92 TCPWM #1, Counter #2 */ + tcpwm1_interrupts3_IRQn = 93, /*!< 93 TCPWM #1, Counter #3 */ + tcpwm1_interrupts4_IRQn = 94, /*!< 94 TCPWM #1, Counter #4 */ + tcpwm1_interrupts5_IRQn = 95, /*!< 95 TCPWM #1, Counter #5 */ + tcpwm1_interrupts6_IRQn = 96, /*!< 96 TCPWM #1, Counter #6 */ + tcpwm1_interrupts7_IRQn = 97, /*!< 97 TCPWM #1, Counter #7 */ + tcpwm1_interrupts8_IRQn = 98, /*!< 98 TCPWM #1, Counter #8 */ + tcpwm1_interrupts9_IRQn = 99, /*!< 99 TCPWM #1, Counter #9 */ + tcpwm1_interrupts10_IRQn = 100, /*!< 100 TCPWM #1, Counter #10 */ + tcpwm1_interrupts11_IRQn = 101, /*!< 101 TCPWM #1, Counter #11 */ + tcpwm1_interrupts12_IRQn = 102, /*!< 102 TCPWM #1, Counter #12 */ + tcpwm1_interrupts13_IRQn = 103, /*!< 103 TCPWM #1, Counter #13 */ + tcpwm1_interrupts14_IRQn = 104, /*!< 104 TCPWM #1, Counter #14 */ + tcpwm1_interrupts15_IRQn = 105, /*!< 105 TCPWM #1, Counter #15 */ + tcpwm1_interrupts16_IRQn = 106, /*!< 106 TCPWM #1, Counter #16 */ + tcpwm1_interrupts17_IRQn = 107, /*!< 107 TCPWM #1, Counter #17 */ + tcpwm1_interrupts18_IRQn = 108, /*!< 108 TCPWM #1, Counter #18 */ + tcpwm1_interrupts19_IRQn = 109, /*!< 109 TCPWM #1, Counter #19 */ + tcpwm1_interrupts20_IRQn = 110, /*!< 110 TCPWM #1, Counter #20 */ + tcpwm1_interrupts21_IRQn = 111, /*!< 111 TCPWM #1, Counter #21 */ + tcpwm1_interrupts22_IRQn = 112, /*!< 112 TCPWM #1, Counter #22 */ + tcpwm1_interrupts23_IRQn = 113, /*!< 113 TCPWM #1, Counter #23 */ + udb_interrupts0_IRQn = 114, /*!< 114 UDB Interrupt #0 */ + udb_interrupts1_IRQn = 115, /*!< 115 UDB Interrupt #1 */ + udb_interrupts2_IRQn = 116, /*!< 116 UDB Interrupt #2 */ + udb_interrupts3_IRQn = 117, /*!< 117 UDB Interrupt #3 */ + udb_interrupts4_IRQn = 118, /*!< 118 UDB Interrupt #4 */ + udb_interrupts5_IRQn = 119, /*!< 119 UDB Interrupt #5 */ + udb_interrupts6_IRQn = 120, /*!< 120 UDB Interrupt #6 */ + udb_interrupts7_IRQn = 121, /*!< 121 UDB Interrupt #7 */ + udb_interrupts8_IRQn = 122, /*!< 122 UDB Interrupt #8 */ + udb_interrupts9_IRQn = 123, /*!< 123 UDB Interrupt #9 */ + udb_interrupts10_IRQn = 124, /*!< 124 UDB Interrupt #10 */ + udb_interrupts11_IRQn = 125, /*!< 125 UDB Interrupt #11 */ + udb_interrupts12_IRQn = 126, /*!< 126 UDB Interrupt #12 */ + udb_interrupts13_IRQn = 127, /*!< 127 UDB Interrupt #13 */ + udb_interrupts14_IRQn = 128, /*!< 128 UDB Interrupt #14 */ + udb_interrupts15_IRQn = 129, /*!< 129 UDB Interrupt #15 */ + pass_interrupt_sar_IRQn = 130, /*!< 130 SAR ADC interrupt */ + audioss_interrupt_i2s_IRQn = 131, /*!< 131 I2S Audio interrupt */ + audioss_interrupt_pdm_IRQn = 132, /*!< 132 PDM/PCM Audio interrupt */ + profile_interrupt_IRQn = 133, /*!< 133 Energy Profiler interrupt */ + smif_interrupt_IRQn = 134, /*!< 134 Serial Memory Interface interrupt */ + usb_interrupt_hi_IRQn = 135, /*!< 135 USB Interrupt */ + usb_interrupt_med_IRQn = 136, /*!< 136 USB Interrupt */ + usb_interrupt_lo_IRQn = 137, /*!< 137 USB Interrupt */ + pass_interrupt_dacs_IRQn = 138 /*!< 138 Consolidated interrrupt for all DACs */ +} IRQn_Type; + +/* =========================================================================================================================== */ +/* ================ Processor and Core Peripheral Section ================ */ +/* =========================================================================================================================== */ + +#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined (__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3))) + +/* ========================== Configuration of the ARM Cortex-M0+ Processor and Core Peripherals =========================== */ +#define __CM0PLUS_REV 0x0001U /*!< CM0PLUS Core Revision */ +#define __NVIC_PRIO_BITS 2 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#define __VTOR_PRESENT 1 /*!< Set to 1 if CPU supports Vector Table Offset Register */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ + +/** \} Configuration_of_CMSIS */ + +#include "core_cm0plus.h" /*!< ARM Cortex-M0+ processor and core peripherals */ +#include "system_psoc6ble_cm0plus.h" /*!< PSoC 6 BLE System */ + +#else + +/* =========================== Configuration of the ARM Cortex-M4 Processor and Core Peripherals =========================== */ +#define __CM4_REV 0x0001U /*!< CM4 Core Revision */ +#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#define __VTOR_PRESENT 1 /*!< Set to 1 if CPU supports Vector Table Offset Register */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ +#define __FPU_PRESENT 1 /*!< FPU present or not */ + +/** \} Configuration_of_CMSIS */ + +#include "core_cm4.h" /*!< ARM Cortex-M4 processor and core peripherals */ +#include "system_psoc6ble_cm4.h" /*!< PSoC 6 BLE System */ + +#endif + +#include "psoc6ble_config.h" +#include "gpio_psoc6ble_116_bga_ble.h" + +/* Memory Blocks */ +#define CY_ROM_BASE 0x00000000UL +#define CY_ROM_SIZE 0x00020000UL +#define CY_SRAM0_BASE 0x08000000UL +#define CY_SRAM0_SIZE 0x00048000UL +#define CY_FLASH_BASE 0x10000000UL +#define CY_FLASH_SIZE 0x00100000UL +#define CY_WFLASH_BASE 0x14000000UL +#define CY_WFLASH_SIZE 0x00008000UL +#define CY_XIP_BASE 0x18000000UL +#define CY_XIP_SIZE 0x08000000UL + +#define CY_SILICON_ID 0xE2011100UL + +/* Device power profile */ +typedef enum +{ + CY_POWER_MODE_ULP = 0, + CY_POWER_MODE_LP = 1, + CY_POWER_MODE_ANY = 2, +} cy_en_power_mode_t; + +#define CY_POWER_MODE CY_POWER_MODE_ANY + +#define CY_HF_CLK_MAX_FREQ 150000000UL + +/* IP List */ +#define CY_IP_MXTCPWM 1u +#define CY_IP_MXTCPWM_INSTANCES 2u +#define CY_IP_MXTCPWM_VERSION 1u +#define CY_IP_MXCSDV2 1u +#define CY_IP_MXCSDV2_INSTANCES 1u +#define CY_IP_MXCSDV2_VERSION 1u +#define CY_IP_MXLCD 1u +#define CY_IP_MXLCD_INSTANCES 1u +#define CY_IP_MXLCD_VERSION 1u +#define CY_IP_MXS40SRSS 1u +#define CY_IP_MXS40SRSS_INSTANCES 1u +#define CY_IP_MXS40SRSS_VERSION 1u +#define CY_IP_MXSCB 1u +#define CY_IP_MXSCB_INSTANCES 9u +#define CY_IP_MXSCB_VERSION 1u +#define CY_IP_MXPERI 1u +#define CY_IP_MXPERI_INSTANCES 1u +#define CY_IP_MXPERI_VERSION 1u +#define CY_IP_M4CPUSS 1u +#define CY_IP_M4CPUSS_INSTANCES 1u +#define CY_IP_M4CPUSS_VERSION 1u +#define CY_IP_MXBLESS 1u +#define CY_IP_MXBLESS_INSTANCES 1u +#define CY_IP_MXBLESS_VERSION 1u +#define CY_IP_MXAUDIOSS 1u +#define CY_IP_MXAUDIOSS_INSTANCES 1u +#define CY_IP_MXAUDIOSS_VERSION 1u +#define CY_IP_MXLPCOMP 1u +#define CY_IP_MXLPCOMP_INSTANCES 1u +#define CY_IP_MXLPCOMP_VERSION 1u +#define CY_IP_MXS40PASS 1u +#define CY_IP_MXS40PASS_INSTANCES 1u +#define CY_IP_MXS40PASS_VERSION 1u +#define CY_IP_MXSMIF 1u +#define CY_IP_MXSMIF_INSTANCES 1u +#define CY_IP_MXSMIF_VERSION 1u +#define CY_IP_MXS40IOSS 1u +#define CY_IP_MXS40IOSS_INSTANCES 1u +#define CY_IP_MXS40IOSS_VERSION 1u +#define CY_IP_MXEFUSE 1u +#define CY_IP_MXEFUSE_INSTANCES 1u +#define CY_IP_MXEFUSE_VERSION 1u +#define CY_IP_MXUDB 1u +#define CY_IP_MXUDB_INSTANCES 1u +#define CY_IP_MXUDB_VERSION 1u +#define CY_IP_MXPROFILE 1u +#define CY_IP_MXPROFILE_INSTANCES 1u +#define CY_IP_MXPROFILE_VERSION 1u + +/* Include IP definitions */ +#include "cyip_sflash.h" +#include "cyip_peri.h" +#include "cyip_crypto.h" +#include "cyip_cpuss.h" +#include "cyip_fault.h" +#include "cyip_ipc.h" +#include "cyip_prot.h" +#include "cyip_flashc.h" +#include "cyip_srss.h" +#include "cyip_backup.h" +#include "cyip_dw.h" +#include "cyip_efuse.h" +#include "cyip_profile.h" +#include "cyip_hsiom.h" +#include "cyip_gpio.h" +#include "cyip_smartio.h" +#include "cyip_udb.h" +#include "cyip_lpcomp.h" +#include "cyip_csd.h" +#include "cyip_tcpwm.h" +#include "cyip_lcd.h" +#include "cyip_ble.h" +#include "cyip_smif.h" +#include "cyip_scb.h" +#include "cyip_ctbm.h" +#include "cyip_ctdac.h" +#include "cyip_sar.h" +#include "cyip_pass.h" +#include "cyip_i2s.h" +#include "cyip_pdm.h" + +/* =========================================================================================================================== */ +/* ================ SFLASH ================ */ +/* =========================================================================================================================== */ + +#define SFLASH_BASE 0x16000000UL +#define SFLASH ((SFLASH_Type*) SFLASH_BASE) /* 0x16000000 */ + +/* =========================================================================================================================== */ +/* ================ PERI ================ */ +/* =========================================================================================================================== */ + +#define PERI_BASE 0x40010000UL +#define PERI_PPU_GR_MMIO0_BASE 0x40015000UL +#define PERI_PPU_GR_MMIO1_BASE 0x40015040UL +#define PERI_PPU_GR_MMIO2_BASE 0x40015080UL +#define PERI_PPU_GR_MMIO3_BASE 0x400150C0UL +#define PERI_PPU_GR_MMIO4_BASE 0x40015100UL +#define PERI_PPU_GR_MMIO6_BASE 0x40015180UL +#define PERI_PPU_GR_MMIO9_BASE 0x40015240UL +#define PERI_PPU_GR_MMIO10_BASE 0x40015280UL +#define PERI_GR_PPU_SL_PERI_GR1_BASE 0x40100000UL +#define PERI_GR_PPU_SL_CRYPTO_BASE 0x40100040UL +#define PERI_GR_PPU_SL_PERI_GR2_BASE 0x40200000UL +#define PERI_GR_PPU_SL_CPUSS_BASE 0x40200040UL +#define PERI_GR_PPU_SL_FAULT_BASE 0x40200080UL +#define PERI_GR_PPU_SL_IPC_BASE 0x402000C0UL +#define PERI_GR_PPU_SL_PROT_BASE 0x40200100UL +#define PERI_GR_PPU_SL_FLASHC_BASE 0x40200140UL +#define PERI_GR_PPU_SL_SRSS_BASE 0x40200180UL +#define PERI_GR_PPU_SL_BACKUP_BASE 0x402001C0UL +#define PERI_GR_PPU_SL_DW0_BASE 0x40200200UL +#define PERI_GR_PPU_SL_DW1_BASE 0x40200240UL +#define PERI_GR_PPU_SL_EFUSE_BASE 0x40200300UL +#define PERI_GR_PPU_SL_PROFILE_BASE 0x40200340UL +#define PERI_GR_PPU_RG_IPC_STRUCT0_BASE 0x40201000UL +#define PERI_GR_PPU_RG_IPC_STRUCT1_BASE 0x40201040UL +#define PERI_GR_PPU_RG_IPC_STRUCT2_BASE 0x40201080UL +#define PERI_GR_PPU_RG_IPC_STRUCT3_BASE 0x402010C0UL +#define PERI_GR_PPU_RG_IPC_STRUCT4_BASE 0x40201100UL +#define PERI_GR_PPU_RG_IPC_STRUCT5_BASE 0x40201140UL +#define PERI_GR_PPU_RG_IPC_STRUCT6_BASE 0x40201180UL +#define PERI_GR_PPU_RG_IPC_STRUCT7_BASE 0x402011C0UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT0_BASE 0x40201200UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT1_BASE 0x40201240UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT2_BASE 0x40201280UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT3_BASE 0x402012C0UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT4_BASE 0x40201300UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT5_BASE 0x40201340UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT6_BASE 0x40201380UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT7_BASE 0x402013C0UL +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT0_BASE 0x40201400UL +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT1_BASE 0x40201440UL +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT2_BASE 0x40201480UL +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT3_BASE 0x402014C0UL +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT0_BASE 0x40201500UL +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT1_BASE 0x40201540UL +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT2_BASE 0x40201580UL +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT3_BASE 0x402015C0UL +#define PERI_GR_PPU_RG_SMPU_BASE 0x40201600UL +#define PERI_GR_PPU_RG_MPU_CM0P_BASE 0x40201640UL +#define PERI_GR_PPU_RG_MPU_CRYPTO_BASE 0x40201680UL +#define PERI_GR_PPU_RG_MPU_CM4_BASE 0x402016C0UL +#define PERI_GR_PPU_RG_MPU_TC_BASE 0x40201700UL +#define PERI_GR_PPU_SL_PERI_GR3_BASE 0x40300000UL +#define PERI_GR_PPU_SL_HSIOM_BASE 0x40300040UL +#define PERI_GR_PPU_SL_GPIO_BASE 0x40300080UL +#define PERI_GR_PPU_SL_SMARTIO_BASE 0x403000C0UL +#define PERI_GR_PPU_SL_UDB_BASE 0x40300100UL +#define PERI_GR_PPU_SL_LPCOMP_BASE 0x40300140UL +#define PERI_GR_PPU_SL_CSD_BASE 0x40300180UL +#define PERI_GR_PPU_SL_TCPWM0_BASE 0x40300200UL +#define PERI_GR_PPU_SL_TCPWM1_BASE 0x40300240UL +#define PERI_GR_PPU_SL_LCD_BASE 0x40300280UL +#define PERI_GR_PPU_SL_BLE_BASE 0x403002C0UL +#define PERI_GR_PPU_SL_USBFS_BASE 0x40300300UL +#define PERI_GR_PPU_SL_PERI_GR4_BASE 0x40400000UL +#define PERI_GR_PPU_SL_SMIF_BASE 0x40400080UL +#define PERI_GR_PPU_SL_PERI_GR6_BASE 0x40600000UL +#define PERI_GR_PPU_SL_SCB0_BASE 0x40600040UL +#define PERI_GR_PPU_SL_SCB1_BASE 0x40600080UL +#define PERI_GR_PPU_SL_SCB2_BASE 0x406000C0UL +#define PERI_GR_PPU_SL_SCB3_BASE 0x40600100UL +#define PERI_GR_PPU_SL_SCB4_BASE 0x40600140UL +#define PERI_GR_PPU_SL_SCB5_BASE 0x40600180UL +#define PERI_GR_PPU_SL_SCB6_BASE 0x406001C0UL +#define PERI_GR_PPU_SL_SCB7_BASE 0x40600200UL +#define PERI_GR_PPU_SL_SCB8_BASE 0x40600240UL +#define PERI_GR_PPU_SL_PERI_GR9_BASE 0x41000000UL +#define PERI_GR_PPU_SL_PASS6A_BASE 0x41000040UL +#define PERI_GR_PPU_SL_PERI_GR10_BASE 0x42A00000UL +#define PERI_GR_PPU_SL_I2S_BASE 0x42A00040UL +#define PERI_GR_PPU_SL_PDM_BASE 0x42A00080UL +#define PERI ((PERI_Type*) PERI_BASE) /* 0x40010000 */ +#define PERI_GR0 ((PERI_GR_Type*) &PERI->GR[0]) /* 0x40010000 */ +#define PERI_GR1 ((PERI_GR_Type*) &PERI->GR[1]) /* 0x40010040 */ +#define PERI_GR2 ((PERI_GR_Type*) &PERI->GR[2]) /* 0x40010080 */ +#define PERI_GR3 ((PERI_GR_Type*) &PERI->GR[3]) /* 0x400100C0 */ +#define PERI_GR4 ((PERI_GR_Type*) &PERI->GR[4]) /* 0x40010100 */ +#define PERI_GR6 ((PERI_GR_Type*) &PERI->GR[6]) /* 0x40010180 */ +#define PERI_GR9 ((PERI_GR_Type*) &PERI->GR[9]) /* 0x40010240 */ +#define PERI_GR10 ((PERI_GR_Type*) &PERI->GR[10]) /* 0x40010280 */ +#define PERI_TR_GR0 ((PERI_TR_GR_Type*) &PERI->TR_GR[0]) /* 0x40012000 */ +#define PERI_TR_GR1 ((PERI_TR_GR_Type*) &PERI->TR_GR[1]) /* 0x40012200 */ +#define PERI_TR_GR2 ((PERI_TR_GR_Type*) &PERI->TR_GR[2]) /* 0x40012400 */ +#define PERI_TR_GR3 ((PERI_TR_GR_Type*) &PERI->TR_GR[3]) /* 0x40012600 */ +#define PERI_TR_GR4 ((PERI_TR_GR_Type*) &PERI->TR_GR[4]) /* 0x40012800 */ +#define PERI_TR_GR5 ((PERI_TR_GR_Type*) &PERI->TR_GR[5]) /* 0x40012A00 */ +#define PERI_TR_GR6 ((PERI_TR_GR_Type*) &PERI->TR_GR[6]) /* 0x40012C00 */ +#define PERI_TR_GR7 ((PERI_TR_GR_Type*) &PERI->TR_GR[7]) /* 0x40012E00 */ +#define PERI_TR_GR8 ((PERI_TR_GR_Type*) &PERI->TR_GR[8]) /* 0x40013000 */ +#define PERI_TR_GR9 ((PERI_TR_GR_Type*) &PERI->TR_GR[9]) /* 0x40013200 */ +#define PERI_TR_GR10 ((PERI_TR_GR_Type*) &PERI->TR_GR[10]) /* 0x40013400 */ +#define PERI_TR_GR11 ((PERI_TR_GR_Type*) &PERI->TR_GR[11]) /* 0x40013600 */ +#define PERI_TR_GR12 ((PERI_TR_GR_Type*) &PERI->TR_GR[12]) /* 0x40013800 */ +#define PERI_TR_GR13 ((PERI_TR_GR_Type*) &PERI->TR_GR[13]) /* 0x40013A00 */ +#define PERI_TR_GR14 ((PERI_TR_GR_Type*) &PERI->TR_GR[14]) /* 0x40013C00 */ +#define PERI_PPU_PR0 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[0]) /* 0x40014000 */ +#define PERI_PPU_PR1 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[1]) /* 0x40014040 */ +#define PERI_PPU_PR2 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[2]) /* 0x40014080 */ +#define PERI_PPU_PR3 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[3]) /* 0x400140C0 */ +#define PERI_PPU_PR4 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[4]) /* 0x40014100 */ +#define PERI_PPU_PR5 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[5]) /* 0x40014140 */ +#define PERI_PPU_PR6 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[6]) /* 0x40014180 */ +#define PERI_PPU_PR7 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[7]) /* 0x400141C0 */ +#define PERI_PPU_PR8 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[8]) /* 0x40014200 */ +#define PERI_PPU_PR9 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[9]) /* 0x40014240 */ +#define PERI_PPU_PR10 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[10]) /* 0x40014280 */ +#define PERI_PPU_PR11 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[11]) /* 0x400142C0 */ +#define PERI_PPU_PR12 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[12]) /* 0x40014300 */ +#define PERI_PPU_PR13 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[13]) /* 0x40014340 */ +#define PERI_PPU_PR14 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[14]) /* 0x40014380 */ +#define PERI_PPU_PR15 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[15]) /* 0x400143C0 */ +#define PERI_PPU_GR0 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[0]) /* 0x40015000 */ +#define PERI_PPU_GR1 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[1]) /* 0x40015040 */ +#define PERI_PPU_GR2 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[2]) /* 0x40015080 */ +#define PERI_PPU_GR3 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[3]) /* 0x400150C0 */ +#define PERI_PPU_GR4 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[4]) /* 0x40015100 */ +#define PERI_PPU_GR6 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[6]) /* 0x40015180 */ +#define PERI_PPU_GR9 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[9]) /* 0x40015240 */ +#define PERI_PPU_GR10 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[10]) /* 0x40015280 */ +#define PERI_PPU_GR_MMIO0 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO0_BASE) /* 0x40015000 */ +#define PERI_PPU_GR_MMIO1 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO1_BASE) /* 0x40015040 */ +#define PERI_PPU_GR_MMIO2 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO2_BASE) /* 0x40015080 */ +#define PERI_PPU_GR_MMIO3 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO3_BASE) /* 0x400150C0 */ +#define PERI_PPU_GR_MMIO4 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO4_BASE) /* 0x40015100 */ +#define PERI_PPU_GR_MMIO6 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO6_BASE) /* 0x40015180 */ +#define PERI_PPU_GR_MMIO9 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO9_BASE) /* 0x40015240 */ +#define PERI_PPU_GR_MMIO10 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO10_BASE) /* 0x40015280 */ +#define PERI_GR_PPU_SL_PERI_GR1 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR1_BASE) /* 0x40100000 */ +#define PERI_GR_PPU_SL_CRYPTO ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_CRYPTO_BASE) /* 0x40100040 */ +#define PERI_GR_PPU_SL_PERI_GR2 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR2_BASE) /* 0x40200000 */ +#define PERI_GR_PPU_SL_CPUSS ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_CPUSS_BASE) /* 0x40200040 */ +#define PERI_GR_PPU_SL_FAULT ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_FAULT_BASE) /* 0x40200080 */ +#define PERI_GR_PPU_SL_IPC ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_IPC_BASE) /* 0x402000C0 */ +#define PERI_GR_PPU_SL_PROT ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PROT_BASE) /* 0x40200100 */ +#define PERI_GR_PPU_SL_FLASHC ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_FLASHC_BASE) /* 0x40200140 */ +#define PERI_GR_PPU_SL_SRSS ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SRSS_BASE) /* 0x40200180 */ +#define PERI_GR_PPU_SL_BACKUP ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_BACKUP_BASE) /* 0x402001C0 */ +#define PERI_GR_PPU_SL_DW0 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_DW0_BASE) /* 0x40200200 */ +#define PERI_GR_PPU_SL_DW1 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_DW1_BASE) /* 0x40200240 */ +#define PERI_GR_PPU_SL_EFUSE ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_EFUSE_BASE) /* 0x40200300 */ +#define PERI_GR_PPU_SL_PROFILE ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PROFILE_BASE) /* 0x40200340 */ +#define PERI_GR_PPU_RG_IPC_STRUCT0 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT0_BASE) /* 0x40201000 */ +#define PERI_GR_PPU_RG_IPC_STRUCT1 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT1_BASE) /* 0x40201040 */ +#define PERI_GR_PPU_RG_IPC_STRUCT2 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT2_BASE) /* 0x40201080 */ +#define PERI_GR_PPU_RG_IPC_STRUCT3 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT3_BASE) /* 0x402010C0 */ +#define PERI_GR_PPU_RG_IPC_STRUCT4 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT4_BASE) /* 0x40201100 */ +#define PERI_GR_PPU_RG_IPC_STRUCT5 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT5_BASE) /* 0x40201140 */ +#define PERI_GR_PPU_RG_IPC_STRUCT6 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT6_BASE) /* 0x40201180 */ +#define PERI_GR_PPU_RG_IPC_STRUCT7 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT7_BASE) /* 0x402011C0 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT0 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT0_BASE) /* 0x40201200 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT1 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT1_BASE) /* 0x40201240 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT2 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT2_BASE) /* 0x40201280 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT3 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT3_BASE) /* 0x402012C0 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT4 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT4_BASE) /* 0x40201300 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT5 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT5_BASE) /* 0x40201340 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT6 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT6_BASE) /* 0x40201380 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT7 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT7_BASE) /* 0x402013C0 */ +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT0 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW0_DW_CH_STRUCT0_BASE) /* 0x40201400 */ +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT1 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW0_DW_CH_STRUCT1_BASE) /* 0x40201440 */ +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT2 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW0_DW_CH_STRUCT2_BASE) /* 0x40201480 */ +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT3 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW0_DW_CH_STRUCT3_BASE) /* 0x402014C0 */ +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT0 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW1_DW_CH_STRUCT0_BASE) /* 0x40201500 */ +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT1 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW1_DW_CH_STRUCT1_BASE) /* 0x40201540 */ +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT2 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW1_DW_CH_STRUCT2_BASE) /* 0x40201580 */ +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT3 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW1_DW_CH_STRUCT3_BASE) /* 0x402015C0 */ +#define PERI_GR_PPU_RG_SMPU ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_SMPU_BASE) /* 0x40201600 */ +#define PERI_GR_PPU_RG_MPU_CM0P ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_MPU_CM0P_BASE) /* 0x40201640 */ +#define PERI_GR_PPU_RG_MPU_CRYPTO ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_MPU_CRYPTO_BASE) /* 0x40201680 */ +#define PERI_GR_PPU_RG_MPU_CM4 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_MPU_CM4_BASE) /* 0x402016C0 */ +#define PERI_GR_PPU_RG_MPU_TC ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_MPU_TC_BASE) /* 0x40201700 */ +#define PERI_GR_PPU_SL_PERI_GR3 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR3_BASE) /* 0x40300000 */ +#define PERI_GR_PPU_SL_HSIOM ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_HSIOM_BASE) /* 0x40300040 */ +#define PERI_GR_PPU_SL_GPIO ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_GPIO_BASE) /* 0x40300080 */ +#define PERI_GR_PPU_SL_SMARTIO ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SMARTIO_BASE) /* 0x403000C0 */ +#define PERI_GR_PPU_SL_UDB ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_UDB_BASE) /* 0x40300100 */ +#define PERI_GR_PPU_SL_LPCOMP ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_LPCOMP_BASE) /* 0x40300140 */ +#define PERI_GR_PPU_SL_CSD ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_CSD_BASE) /* 0x40300180 */ +#define PERI_GR_PPU_SL_TCPWM0 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_TCPWM0_BASE) /* 0x40300200 */ +#define PERI_GR_PPU_SL_TCPWM1 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_TCPWM1_BASE) /* 0x40300240 */ +#define PERI_GR_PPU_SL_LCD ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_LCD_BASE) /* 0x40300280 */ +#define PERI_GR_PPU_SL_BLE ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_BLE_BASE) /* 0x403002C0 */ +#define PERI_GR_PPU_SL_USBFS ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_USBFS_BASE) /* 0x40300300 */ +#define PERI_GR_PPU_SL_PERI_GR4 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR4_BASE) /* 0x40400000 */ +#define PERI_GR_PPU_SL_SMIF ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SMIF_BASE) /* 0x40400080 */ +#define PERI_GR_PPU_SL_PERI_GR6 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR6_BASE) /* 0x40600000 */ +#define PERI_GR_PPU_SL_SCB0 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB0_BASE) /* 0x40600040 */ +#define PERI_GR_PPU_SL_SCB1 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB1_BASE) /* 0x40600080 */ +#define PERI_GR_PPU_SL_SCB2 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB2_BASE) /* 0x406000C0 */ +#define PERI_GR_PPU_SL_SCB3 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB3_BASE) /* 0x40600100 */ +#define PERI_GR_PPU_SL_SCB4 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB4_BASE) /* 0x40600140 */ +#define PERI_GR_PPU_SL_SCB5 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB5_BASE) /* 0x40600180 */ +#define PERI_GR_PPU_SL_SCB6 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB6_BASE) /* 0x406001C0 */ +#define PERI_GR_PPU_SL_SCB7 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB7_BASE) /* 0x40600200 */ +#define PERI_GR_PPU_SL_SCB8 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB8_BASE) /* 0x40600240 */ +#define PERI_GR_PPU_SL_PERI_GR9 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR9_BASE) /* 0x41000000 */ +#define PERI_GR_PPU_SL_PASS6A ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PASS6A_BASE) /* 0x41000040 */ +#define PERI_GR_PPU_SL_PERI_GR10 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR10_BASE) /* 0x42A00000 */ +#define PERI_GR_PPU_SL_I2S ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_I2S_BASE) /* 0x42A00040 */ +#define PERI_GR_PPU_SL_PDM ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PDM_BASE) /* 0x42A00080 */ + +/* =========================================================================================================================== */ +/* ================ CRYPTO ================ */ +/* =========================================================================================================================== */ + +#define CRYPTO_BASE 0x40110000UL +#define CRYPTO ((CRYPTO_Type*) CRYPTO_BASE) /* 0x40110000 */ + +/* =========================================================================================================================== */ +/* ================ CPUSS ================ */ +/* =========================================================================================================================== */ + +#define CPUSS_BASE 0x40210000UL +#define CPUSS ((CPUSS_Type*) CPUSS_BASE) /* 0x40210000 */ + +/* =========================================================================================================================== */ +/* ================ FAULT ================ */ +/* =========================================================================================================================== */ + +#define FAULT_BASE 0x40220000UL +#define FAULT ((FAULT_Type*) FAULT_BASE) /* 0x40220000 */ +#define FAULT_STRUCT0 ((FAULT_STRUCT_Type*) &FAULT->STRUCT[0]) /* 0x40220000 */ +#define FAULT_STRUCT1 ((FAULT_STRUCT_Type*) &FAULT->STRUCT[1]) /* 0x40220100 */ + +/* =========================================================================================================================== */ +/* ================ IPC ================ */ +/* =========================================================================================================================== */ + +#define IPC_BASE 0x40230000UL +#define IPC ((IPC_Type*) IPC_BASE) /* 0x40230000 */ +#define IPC_STRUCT0 ((IPC_STRUCT_Type*) &IPC->STRUCT[0]) /* 0x40230000 */ +#define IPC_STRUCT1 ((IPC_STRUCT_Type*) &IPC->STRUCT[1]) /* 0x40230020 */ +#define IPC_STRUCT2 ((IPC_STRUCT_Type*) &IPC->STRUCT[2]) /* 0x40230040 */ +#define IPC_STRUCT3 ((IPC_STRUCT_Type*) &IPC->STRUCT[3]) /* 0x40230060 */ +#define IPC_STRUCT4 ((IPC_STRUCT_Type*) &IPC->STRUCT[4]) /* 0x40230080 */ +#define IPC_STRUCT5 ((IPC_STRUCT_Type*) &IPC->STRUCT[5]) /* 0x402300A0 */ +#define IPC_STRUCT6 ((IPC_STRUCT_Type*) &IPC->STRUCT[6]) /* 0x402300C0 */ +#define IPC_STRUCT7 ((IPC_STRUCT_Type*) &IPC->STRUCT[7]) /* 0x402300E0 */ +#define IPC_INTR_STRUCT0 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[0]) /* 0x40231000 */ +#define IPC_INTR_STRUCT1 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[1]) /* 0x40231020 */ +#define IPC_INTR_STRUCT2 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[2]) /* 0x40231040 */ +#define IPC_INTR_STRUCT3 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[3]) /* 0x40231060 */ +#define IPC_INTR_STRUCT4 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[4]) /* 0x40231080 */ +#define IPC_INTR_STRUCT5 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[5]) /* 0x402310A0 */ +#define IPC_INTR_STRUCT6 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[6]) /* 0x402310C0 */ +#define IPC_INTR_STRUCT7 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[7]) /* 0x402310E0 */ + +/* =========================================================================================================================== */ +/* ================ PROT ================ */ +/* =========================================================================================================================== */ + +#define PROT_BASE 0x40240000UL +#define PROT ((PROT_Type*) PROT_BASE) /* 0x40240000 */ +#define PROT_SMPU_SMPU_STRUCT0 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[0]) /* 0x40242000 */ +#define PROT_SMPU_SMPU_STRUCT1 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[1]) /* 0x40242040 */ +#define PROT_SMPU_SMPU_STRUCT2 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[2]) /* 0x40242080 */ +#define PROT_SMPU_SMPU_STRUCT3 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[3]) /* 0x402420C0 */ +#define PROT_SMPU_SMPU_STRUCT4 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[4]) /* 0x40242100 */ +#define PROT_SMPU_SMPU_STRUCT5 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[5]) /* 0x40242140 */ +#define PROT_SMPU_SMPU_STRUCT6 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[6]) /* 0x40242180 */ +#define PROT_SMPU_SMPU_STRUCT7 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[7]) /* 0x402421C0 */ +#define PROT_SMPU_SMPU_STRUCT8 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[8]) /* 0x40242200 */ +#define PROT_SMPU_SMPU_STRUCT9 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[9]) /* 0x40242240 */ +#define PROT_SMPU_SMPU_STRUCT10 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[10]) /* 0x40242280 */ +#define PROT_SMPU_SMPU_STRUCT11 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[11]) /* 0x402422C0 */ +#define PROT_SMPU_SMPU_STRUCT12 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[12]) /* 0x40242300 */ +#define PROT_SMPU_SMPU_STRUCT13 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[13]) /* 0x40242340 */ +#define PROT_SMPU_SMPU_STRUCT14 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[14]) /* 0x40242380 */ +#define PROT_SMPU_SMPU_STRUCT15 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[15]) /* 0x402423C0 */ +#define PROT_SMPU ((PROT_SMPU_Type*) &PROT->SMPU) /* 0x40240000 */ +#define PROT_MPU1_MPU_STRUCT0 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[0]) /* 0x40244600 */ +#define PROT_MPU1_MPU_STRUCT1 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[1]) /* 0x40244620 */ +#define PROT_MPU1_MPU_STRUCT2 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[2]) /* 0x40244640 */ +#define PROT_MPU1_MPU_STRUCT3 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[3]) /* 0x40244660 */ +#define PROT_MPU1_MPU_STRUCT4 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[4]) /* 0x40244680 */ +#define PROT_MPU1_MPU_STRUCT5 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[5]) /* 0x402446A0 */ +#define PROT_MPU1_MPU_STRUCT6 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[6]) /* 0x402446C0 */ +#define PROT_MPU1_MPU_STRUCT7 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[7]) /* 0x402446E0 */ +#define PROT_MPU15_MPU_STRUCT0 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[0]) /* 0x40247E00 */ +#define PROT_MPU15_MPU_STRUCT1 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[1]) /* 0x40247E20 */ +#define PROT_MPU15_MPU_STRUCT2 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[2]) /* 0x40247E40 */ +#define PROT_MPU15_MPU_STRUCT3 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[3]) /* 0x40247E60 */ +#define PROT_MPU15_MPU_STRUCT4 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[4]) /* 0x40247E80 */ +#define PROT_MPU15_MPU_STRUCT5 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[5]) /* 0x40247EA0 */ +#define PROT_MPU15_MPU_STRUCT6 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[6]) /* 0x40247EC0 */ +#define PROT_MPU15_MPU_STRUCT7 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[7]) /* 0x40247EE0 */ +#define PROT_MPU0 ((PROT_MPU_Type*) &PROT->CYMPU[0]) /* 0x40244000 */ +#define PROT_MPU1 ((PROT_MPU_Type*) &PROT->CYMPU[1]) /* 0x40244400 */ +#define PROT_MPU2 ((PROT_MPU_Type*) &PROT->CYMPU[2]) /* 0x40244800 */ +#define PROT_MPU3 ((PROT_MPU_Type*) &PROT->CYMPU[3]) /* 0x40244C00 */ +#define PROT_MPU4 ((PROT_MPU_Type*) &PROT->CYMPU[4]) /* 0x40245000 */ +#define PROT_MPU5 ((PROT_MPU_Type*) &PROT->CYMPU[5]) /* 0x40245400 */ +#define PROT_MPU6 ((PROT_MPU_Type*) &PROT->CYMPU[6]) /* 0x40245800 */ +#define PROT_MPU7 ((PROT_MPU_Type*) &PROT->CYMPU[7]) /* 0x40245C00 */ +#define PROT_MPU8 ((PROT_MPU_Type*) &PROT->CYMPU[8]) /* 0x40246000 */ +#define PROT_MPU9 ((PROT_MPU_Type*) &PROT->CYMPU[9]) /* 0x40246400 */ +#define PROT_MPU10 ((PROT_MPU_Type*) &PROT->CYMPU[10]) /* 0x40246800 */ +#define PROT_MPU11 ((PROT_MPU_Type*) &PROT->CYMPU[11]) /* 0x40246C00 */ +#define PROT_MPU12 ((PROT_MPU_Type*) &PROT->CYMPU[12]) /* 0x40247000 */ +#define PROT_MPU13 ((PROT_MPU_Type*) &PROT->CYMPU[13]) /* 0x40247400 */ +#define PROT_MPU14 ((PROT_MPU_Type*) &PROT->CYMPU[14]) /* 0x40247800 */ +#define PROT_MPU15 ((PROT_MPU_Type*) &PROT->CYMPU[15]) /* 0x40247C00 */ + +/* =========================================================================================================================== */ +/* ================ FLASHC ================ */ +/* =========================================================================================================================== */ + +#define FLASHC_BASE 0x40250000UL +#define FLASHC ((FLASHC_Type*) FLASHC_BASE) /* 0x40250000 */ +#define FLASHC_FM_CTL ((FLASHC_FM_CTL_Type*) &FLASHC->FM_CTL) /* 0x4025F000 */ + +/* =========================================================================================================================== */ +/* ================ SRSS ================ */ +/* =========================================================================================================================== */ + +#define SRSS_BASE 0x40260000UL +#define SRSS ((SRSS_Type*) SRSS_BASE) /* 0x40260000 */ +#define MCWDT_STRUCT0 ((MCWDT_STRUCT_Type*) &SRSS->MCWDT_STRUCT[0]) /* 0x40260200 */ +#define MCWDT_STRUCT1 ((MCWDT_STRUCT_Type*) &SRSS->MCWDT_STRUCT[1]) /* 0x40260240 */ +#define CLK_CSV0 ((CLK_CSV_Type*) &SRSS->CLK_CSV[0]) /* 0x40260400 */ + +/* =========================================================================================================================== */ +/* ================ BACKUP ================ */ +/* =========================================================================================================================== */ + +#define BACKUP_BASE 0x40270000UL +#define BACKUP ((BACKUP_Type*) BACKUP_BASE) /* 0x40270000 */ + +/* =========================================================================================================================== */ +/* ================ DW ================ */ +/* =========================================================================================================================== */ + +#define DW0_BASE 0x40280000UL +#define DW1_BASE 0x40281000UL +#define DW0 ((DW_Type*) DW0_BASE) /* 0x40280000 */ +#define DW1 ((DW_Type*) DW1_BASE) /* 0x40281000 */ +#define DW0_CH_STRUCT0 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[0]) /* 0x40280800 */ +#define DW0_CH_STRUCT1 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[1]) /* 0x40280820 */ +#define DW0_CH_STRUCT2 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[2]) /* 0x40280840 */ +#define DW0_CH_STRUCT3 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[3]) /* 0x40280860 */ +#define DW0_CH_STRUCT4 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[4]) /* 0x40280880 */ +#define DW0_CH_STRUCT5 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[5]) /* 0x402808A0 */ +#define DW0_CH_STRUCT6 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[6]) /* 0x402808C0 */ +#define DW0_CH_STRUCT7 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[7]) /* 0x402808E0 */ +#define DW0_CH_STRUCT8 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[8]) /* 0x40280900 */ +#define DW0_CH_STRUCT9 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[9]) /* 0x40280920 */ +#define DW0_CH_STRUCT10 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[10]) /* 0x40280940 */ +#define DW0_CH_STRUCT11 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[11]) /* 0x40280960 */ +#define DW0_CH_STRUCT12 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[12]) /* 0x40280980 */ +#define DW0_CH_STRUCT13 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[13]) /* 0x402809A0 */ +#define DW0_CH_STRUCT14 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[14]) /* 0x402809C0 */ +#define DW0_CH_STRUCT15 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[15]) /* 0x402809E0 */ +#define DW1_CH_STRUCT0 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[0]) /* 0x40281800 */ +#define DW1_CH_STRUCT1 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[1]) /* 0x40281820 */ +#define DW1_CH_STRUCT2 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[2]) /* 0x40281840 */ +#define DW1_CH_STRUCT3 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[3]) /* 0x40281860 */ +#define DW1_CH_STRUCT4 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[4]) /* 0x40281880 */ +#define DW1_CH_STRUCT5 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[5]) /* 0x402818A0 */ +#define DW1_CH_STRUCT6 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[6]) /* 0x402818C0 */ +#define DW1_CH_STRUCT7 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[7]) /* 0x402818E0 */ +#define DW1_CH_STRUCT8 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[8]) /* 0x40281900 */ +#define DW1_CH_STRUCT9 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[9]) /* 0x40281920 */ +#define DW1_CH_STRUCT10 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[10]) /* 0x40281940 */ +#define DW1_CH_STRUCT11 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[11]) /* 0x40281960 */ +#define DW1_CH_STRUCT12 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[12]) /* 0x40281980 */ +#define DW1_CH_STRUCT13 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[13]) /* 0x402819A0 */ +#define DW1_CH_STRUCT14 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[14]) /* 0x402819C0 */ +#define DW1_CH_STRUCT15 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[15]) /* 0x402819E0 */ +#define DW0_DESCR_STRUCT ((DW_DESCR_STRUCT_Type*) &DW0->DESCR_STRUCT) /* 0x40280C00 */ +#define DW1_DESCR_STRUCT ((DW_DESCR_STRUCT_Type*) &DW1->DESCR_STRUCT) /* 0x40281C00 */ + +/* =========================================================================================================================== */ +/* ================ EFUSE ================ */ +/* =========================================================================================================================== */ + +#define EFUSE_BASE 0x402C0000UL +#define EFUSE ((EFUSE_Type*) EFUSE_BASE) /* 0x402C0000 */ + +/* =========================================================================================================================== */ +/* ================ PROFILE ================ */ +/* =========================================================================================================================== */ + +#define PROFILE_BASE 0x402D0000UL +#define PROFILE ((PROFILE_Type*) PROFILE_BASE) /* 0x402D0000 */ +#define PROFILE_CNT_STRUCT0 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[0]) /* 0x402D0800 */ +#define PROFILE_CNT_STRUCT1 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[1]) /* 0x402D0810 */ +#define PROFILE_CNT_STRUCT2 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[2]) /* 0x402D0820 */ +#define PROFILE_CNT_STRUCT3 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[3]) /* 0x402D0830 */ +#define PROFILE_CNT_STRUCT4 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[4]) /* 0x402D0840 */ +#define PROFILE_CNT_STRUCT5 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[5]) /* 0x402D0850 */ +#define PROFILE_CNT_STRUCT6 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[6]) /* 0x402D0860 */ +#define PROFILE_CNT_STRUCT7 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[7]) /* 0x402D0870 */ + +/* =========================================================================================================================== */ +/* ================ HSIOM ================ */ +/* =========================================================================================================================== */ + +#define HSIOM_BASE 0x40310000UL +#define HSIOM ((HSIOM_Type*) HSIOM_BASE) /* 0x40310000 */ +#define HSIOM_PRT0 ((HSIOM_PRT_Type*) &HSIOM->PRT[0]) /* 0x40310000 */ +#define HSIOM_PRT1 ((HSIOM_PRT_Type*) &HSIOM->PRT[1]) /* 0x40310010 */ +#define HSIOM_PRT2 ((HSIOM_PRT_Type*) &HSIOM->PRT[2]) /* 0x40310020 */ +#define HSIOM_PRT3 ((HSIOM_PRT_Type*) &HSIOM->PRT[3]) /* 0x40310030 */ +#define HSIOM_PRT4 ((HSIOM_PRT_Type*) &HSIOM->PRT[4]) /* 0x40310040 */ +#define HSIOM_PRT5 ((HSIOM_PRT_Type*) &HSIOM->PRT[5]) /* 0x40310050 */ +#define HSIOM_PRT6 ((HSIOM_PRT_Type*) &HSIOM->PRT[6]) /* 0x40310060 */ +#define HSIOM_PRT7 ((HSIOM_PRT_Type*) &HSIOM->PRT[7]) /* 0x40310070 */ +#define HSIOM_PRT8 ((HSIOM_PRT_Type*) &HSIOM->PRT[8]) /* 0x40310080 */ +#define HSIOM_PRT9 ((HSIOM_PRT_Type*) &HSIOM->PRT[9]) /* 0x40310090 */ +#define HSIOM_PRT10 ((HSIOM_PRT_Type*) &HSIOM->PRT[10]) /* 0x403100A0 */ +#define HSIOM_PRT11 ((HSIOM_PRT_Type*) &HSIOM->PRT[11]) /* 0x403100B0 */ +#define HSIOM_PRT12 ((HSIOM_PRT_Type*) &HSIOM->PRT[12]) /* 0x403100C0 */ +#define HSIOM_PRT13 ((HSIOM_PRT_Type*) &HSIOM->PRT[13]) /* 0x403100D0 */ +#define HSIOM_PRT14 ((HSIOM_PRT_Type*) &HSIOM->PRT[14]) /* 0x403100E0 */ + +/* =========================================================================================================================== */ +/* ================ GPIO ================ */ +/* =========================================================================================================================== */ + +#define GPIO_BASE 0x40320000UL +#define GPIO ((GPIO_Type*) GPIO_BASE) /* 0x40320000 */ +#define GPIO_PRT0 ((GPIO_PRT_Type*) &GPIO->PRT[0]) /* 0x40320000 */ +#define GPIO_PRT1 ((GPIO_PRT_Type*) &GPIO->PRT[1]) /* 0x40320080 */ +#define GPIO_PRT2 ((GPIO_PRT_Type*) &GPIO->PRT[2]) /* 0x40320100 */ +#define GPIO_PRT3 ((GPIO_PRT_Type*) &GPIO->PRT[3]) /* 0x40320180 */ +#define GPIO_PRT4 ((GPIO_PRT_Type*) &GPIO->PRT[4]) /* 0x40320200 */ +#define GPIO_PRT5 ((GPIO_PRT_Type*) &GPIO->PRT[5]) /* 0x40320280 */ +#define GPIO_PRT6 ((GPIO_PRT_Type*) &GPIO->PRT[6]) /* 0x40320300 */ +#define GPIO_PRT7 ((GPIO_PRT_Type*) &GPIO->PRT[7]) /* 0x40320380 */ +#define GPIO_PRT8 ((GPIO_PRT_Type*) &GPIO->PRT[8]) /* 0x40320400 */ +#define GPIO_PRT9 ((GPIO_PRT_Type*) &GPIO->PRT[9]) /* 0x40320480 */ +#define GPIO_PRT10 ((GPIO_PRT_Type*) &GPIO->PRT[10]) /* 0x40320500 */ +#define GPIO_PRT11 ((GPIO_PRT_Type*) &GPIO->PRT[11]) /* 0x40320580 */ +#define GPIO_PRT12 ((GPIO_PRT_Type*) &GPIO->PRT[12]) /* 0x40320600 */ +#define GPIO_PRT13 ((GPIO_PRT_Type*) &GPIO->PRT[13]) /* 0x40320680 */ +#define GPIO_PRT14 ((GPIO_PRT_Type*) &GPIO->PRT[14]) /* 0x40320700 */ + +/* =========================================================================================================================== */ +/* ================ SMARTIO ================ */ +/* =========================================================================================================================== */ + +#define SMARTIO_BASE 0x40330000UL +#define SMARTIO ((SMARTIO_Type*) SMARTIO_BASE) /* 0x40330000 */ +#define SMARTIO_PRT8 ((SMARTIO_PRT_Type*) &SMARTIO->PRT[8]) /* 0x40330800 */ +#define SMARTIO_PRT9 ((SMARTIO_PRT_Type*) &SMARTIO->PRT[9]) /* 0x40330900 */ + +/* =========================================================================================================================== */ +/* ================ UDB ================ */ +/* =========================================================================================================================== */ + +#define UDB_BASE 0x40340000UL +#define UDB ((UDB_Type*) UDB_BASE) /* 0x40340000 */ +#define UDB_WRKONE ((UDB_WRKONE_Type*) &UDB->WRKONE) /* 0x40340000 */ +#define UDB_WRKMULT ((UDB_WRKMULT_Type*) &UDB->WRKMULT) /* 0x40341000 */ +#define UDB_UDBPAIR0_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[0].UDBSNG[0]) /* 0x40342000 */ +#define UDB_UDBPAIR0_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[0].UDBSNG[1]) /* 0x40342080 */ +#define UDB_UDBPAIR1_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[1].UDBSNG[0]) /* 0x40342200 */ +#define UDB_UDBPAIR1_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[1].UDBSNG[1]) /* 0x40342280 */ +#define UDB_UDBPAIR2_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[2].UDBSNG[0]) /* 0x40342400 */ +#define UDB_UDBPAIR2_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[2].UDBSNG[1]) /* 0x40342480 */ +#define UDB_UDBPAIR3_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[3].UDBSNG[0]) /* 0x40342600 */ +#define UDB_UDBPAIR3_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[3].UDBSNG[1]) /* 0x40342680 */ +#define UDB_UDBPAIR4_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[4].UDBSNG[0]) /* 0x40342800 */ +#define UDB_UDBPAIR4_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[4].UDBSNG[1]) /* 0x40342880 */ +#define UDB_UDBPAIR5_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[5].UDBSNG[0]) /* 0x40342A00 */ +#define UDB_UDBPAIR5_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[5].UDBSNG[1]) /* 0x40342A80 */ +#define UDB_UDBPAIR0_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[0].ROUTE) /* 0x40342100 */ +#define UDB_UDBPAIR1_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[1].ROUTE) /* 0x40342300 */ +#define UDB_UDBPAIR2_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[2].ROUTE) /* 0x40342500 */ +#define UDB_UDBPAIR3_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[3].ROUTE) /* 0x40342700 */ +#define UDB_UDBPAIR4_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[4].ROUTE) /* 0x40342900 */ +#define UDB_UDBPAIR5_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[5].ROUTE) /* 0x40342B00 */ +#define UDB_UDBPAIR0 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[0]) /* 0x40342000 */ +#define UDB_UDBPAIR1 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[1]) /* 0x40342200 */ +#define UDB_UDBPAIR2 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[2]) /* 0x40342400 */ +#define UDB_UDBPAIR3 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[3]) /* 0x40342600 */ +#define UDB_UDBPAIR4 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[4]) /* 0x40342800 */ +#define UDB_UDBPAIR5 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[5]) /* 0x40342A00 */ +#define UDB_DSI0 ((UDB_DSI_Type*) &UDB->DSI[0]) /* 0x40346000 */ +#define UDB_DSI1 ((UDB_DSI_Type*) &UDB->DSI[1]) /* 0x40346080 */ +#define UDB_DSI2 ((UDB_DSI_Type*) &UDB->DSI[2]) /* 0x40346100 */ +#define UDB_DSI3 ((UDB_DSI_Type*) &UDB->DSI[3]) /* 0x40346180 */ +#define UDB_DSI4 ((UDB_DSI_Type*) &UDB->DSI[4]) /* 0x40346200 */ +#define UDB_DSI5 ((UDB_DSI_Type*) &UDB->DSI[5]) /* 0x40346280 */ +#define UDB_DSI6 ((UDB_DSI_Type*) &UDB->DSI[6]) /* 0x40346300 */ +#define UDB_DSI7 ((UDB_DSI_Type*) &UDB->DSI[7]) /* 0x40346380 */ +#define UDB_DSI8 ((UDB_DSI_Type*) &UDB->DSI[8]) /* 0x40346400 */ +#define UDB_DSI9 ((UDB_DSI_Type*) &UDB->DSI[9]) /* 0x40346480 */ +#define UDB_DSI10 ((UDB_DSI_Type*) &UDB->DSI[10]) /* 0x40346500 */ +#define UDB_DSI11 ((UDB_DSI_Type*) &UDB->DSI[11]) /* 0x40346580 */ +#define UDB_PA0 ((UDB_PA_Type*) &UDB->PA[0]) /* 0x40347000 */ +#define UDB_PA1 ((UDB_PA_Type*) &UDB->PA[1]) /* 0x40347040 */ +#define UDB_PA2 ((UDB_PA_Type*) &UDB->PA[2]) /* 0x40347080 */ +#define UDB_PA3 ((UDB_PA_Type*) &UDB->PA[3]) /* 0x403470C0 */ +#define UDB_PA4 ((UDB_PA_Type*) &UDB->PA[4]) /* 0x40347100 */ +#define UDB_PA5 ((UDB_PA_Type*) &UDB->PA[5]) /* 0x40347140 */ +#define UDB_PA6 ((UDB_PA_Type*) &UDB->PA[6]) /* 0x40347180 */ +#define UDB_PA7 ((UDB_PA_Type*) &UDB->PA[7]) /* 0x403471C0 */ +#define UDB_PA8 ((UDB_PA_Type*) &UDB->PA[8]) /* 0x40347200 */ +#define UDB_PA9 ((UDB_PA_Type*) &UDB->PA[9]) /* 0x40347240 */ +#define UDB_PA10 ((UDB_PA_Type*) &UDB->PA[10]) /* 0x40347280 */ +#define UDB_PA11 ((UDB_PA_Type*) &UDB->PA[11]) /* 0x403472C0 */ +#define UDB_BCTL ((UDB_BCTL_Type*) &UDB->BCTL) /* 0x40347800 */ +#define UDB_UDBIF ((UDB_UDBIF_Type*) &UDB->UDBIF) /* 0x40347900 */ + +/* =========================================================================================================================== */ +/* ================ LPCOMP ================ */ +/* =========================================================================================================================== */ + +#define LPCOMP_BASE 0x40350000UL +#define LPCOMP ((LPCOMP_Type*) LPCOMP_BASE) /* 0x40350000 */ + +/* =========================================================================================================================== */ +/* ================ CSD ================ */ +/* =========================================================================================================================== */ + +#define CSD0_BASE 0x40360000UL +#define CSD0 ((CSD_Type*) CSD0_BASE) /* 0x40360000 */ + +/* =========================================================================================================================== */ +/* ================ TCPWM ================ */ +/* =========================================================================================================================== */ + +#define TCPWM0_BASE 0x40380000UL +#define TCPWM1_BASE 0x40390000UL +#define TCPWM0 ((TCPWM_Type*) TCPWM0_BASE) /* 0x40380000 */ +#define TCPWM1 ((TCPWM_Type*) TCPWM1_BASE) /* 0x40390000 */ +#define TCPWM0_CNT0 ((TCPWM_CNT_Type*) &TCPWM0->CNT[0]) /* 0x40380100 */ +#define TCPWM0_CNT1 ((TCPWM_CNT_Type*) &TCPWM0->CNT[1]) /* 0x40380140 */ +#define TCPWM0_CNT2 ((TCPWM_CNT_Type*) &TCPWM0->CNT[2]) /* 0x40380180 */ +#define TCPWM0_CNT3 ((TCPWM_CNT_Type*) &TCPWM0->CNT[3]) /* 0x403801C0 */ +#define TCPWM0_CNT4 ((TCPWM_CNT_Type*) &TCPWM0->CNT[4]) /* 0x40380200 */ +#define TCPWM0_CNT5 ((TCPWM_CNT_Type*) &TCPWM0->CNT[5]) /* 0x40380240 */ +#define TCPWM0_CNT6 ((TCPWM_CNT_Type*) &TCPWM0->CNT[6]) /* 0x40380280 */ +#define TCPWM0_CNT7 ((TCPWM_CNT_Type*) &TCPWM0->CNT[7]) /* 0x403802C0 */ +#define TCPWM1_CNT0 ((TCPWM_CNT_Type*) &TCPWM1->CNT[0]) /* 0x40390100 */ +#define TCPWM1_CNT1 ((TCPWM_CNT_Type*) &TCPWM1->CNT[1]) /* 0x40390140 */ +#define TCPWM1_CNT2 ((TCPWM_CNT_Type*) &TCPWM1->CNT[2]) /* 0x40390180 */ +#define TCPWM1_CNT3 ((TCPWM_CNT_Type*) &TCPWM1->CNT[3]) /* 0x403901C0 */ +#define TCPWM1_CNT4 ((TCPWM_CNT_Type*) &TCPWM1->CNT[4]) /* 0x40390200 */ +#define TCPWM1_CNT5 ((TCPWM_CNT_Type*) &TCPWM1->CNT[5]) /* 0x40390240 */ +#define TCPWM1_CNT6 ((TCPWM_CNT_Type*) &TCPWM1->CNT[6]) /* 0x40390280 */ +#define TCPWM1_CNT7 ((TCPWM_CNT_Type*) &TCPWM1->CNT[7]) /* 0x403902C0 */ +#define TCPWM1_CNT8 ((TCPWM_CNT_Type*) &TCPWM1->CNT[8]) /* 0x40390300 */ +#define TCPWM1_CNT9 ((TCPWM_CNT_Type*) &TCPWM1->CNT[9]) /* 0x40390340 */ +#define TCPWM1_CNT10 ((TCPWM_CNT_Type*) &TCPWM1->CNT[10]) /* 0x40390380 */ +#define TCPWM1_CNT11 ((TCPWM_CNT_Type*) &TCPWM1->CNT[11]) /* 0x403903C0 */ +#define TCPWM1_CNT12 ((TCPWM_CNT_Type*) &TCPWM1->CNT[12]) /* 0x40390400 */ +#define TCPWM1_CNT13 ((TCPWM_CNT_Type*) &TCPWM1->CNT[13]) /* 0x40390440 */ +#define TCPWM1_CNT14 ((TCPWM_CNT_Type*) &TCPWM1->CNT[14]) /* 0x40390480 */ +#define TCPWM1_CNT15 ((TCPWM_CNT_Type*) &TCPWM1->CNT[15]) /* 0x403904C0 */ +#define TCPWM1_CNT16 ((TCPWM_CNT_Type*) &TCPWM1->CNT[16]) /* 0x40390500 */ +#define TCPWM1_CNT17 ((TCPWM_CNT_Type*) &TCPWM1->CNT[17]) /* 0x40390540 */ +#define TCPWM1_CNT18 ((TCPWM_CNT_Type*) &TCPWM1->CNT[18]) /* 0x40390580 */ +#define TCPWM1_CNT19 ((TCPWM_CNT_Type*) &TCPWM1->CNT[19]) /* 0x403905C0 */ +#define TCPWM1_CNT20 ((TCPWM_CNT_Type*) &TCPWM1->CNT[20]) /* 0x40390600 */ +#define TCPWM1_CNT21 ((TCPWM_CNT_Type*) &TCPWM1->CNT[21]) /* 0x40390640 */ +#define TCPWM1_CNT22 ((TCPWM_CNT_Type*) &TCPWM1->CNT[22]) /* 0x40390680 */ +#define TCPWM1_CNT23 ((TCPWM_CNT_Type*) &TCPWM1->CNT[23]) /* 0x403906C0 */ + +/* =========================================================================================================================== */ +/* ================ LCD ================ */ +/* =========================================================================================================================== */ + +#define LCD0_BASE 0x403B0000UL +#define LCD0 ((LCD_Type*) LCD0_BASE) /* 0x403B0000 */ + +/* =========================================================================================================================== */ +/* ================ BLE ================ */ +/* =========================================================================================================================== */ + +#define BLE_BASE 0x403C0000UL +#define BLE ((BLE_Type*) BLE_BASE) /* 0x403C0000 */ +#define BLE_RCB_RCBLL ((BLE_RCB_RCBLL_Type*) &BLE->RCB.RCBLL) /* 0x403C0100 */ +#define BLE_RCB ((BLE_RCB_Type*) &BLE->RCB) /* 0x403C0000 */ +#define BLE_BLELL ((BLE_BLELL_Type*) &BLE->BLELL) /* 0x403C1000 */ +#define BLE_BLESS ((BLE_BLESS_Type*) &BLE->BLESS) /* 0x403DF000 */ + +/* =========================================================================================================================== */ +/* ================ SMIF ================ */ +/* =========================================================================================================================== */ + +#define SMIF0_BASE 0x40420000UL +#define SMIF0 ((SMIF_Type*) SMIF0_BASE) /* 0x40420000 */ +#define SMIF0_DEVICE0 ((SMIF_DEVICE_Type*) &SMIF0->DEVICE[0]) /* 0x40420800 */ +#define SMIF0_DEVICE1 ((SMIF_DEVICE_Type*) &SMIF0->DEVICE[1]) /* 0x40420880 */ +#define SMIF0_DEVICE2 ((SMIF_DEVICE_Type*) &SMIF0->DEVICE[2]) /* 0x40420900 */ +#define SMIF0_DEVICE3 ((SMIF_DEVICE_Type*) &SMIF0->DEVICE[3]) /* 0x40420980 */ + +/* =========================================================================================================================== */ +/* ================ SCB ================ */ +/* =========================================================================================================================== */ + +#define SCB0_BASE 0x40610000UL +#define SCB1_BASE 0x40620000UL +#define SCB2_BASE 0x40630000UL +#define SCB3_BASE 0x40640000UL +#define SCB4_BASE 0x40650000UL +#define SCB5_BASE 0x40660000UL +#define SCB6_BASE 0x40670000UL +#define SCB7_BASE 0x40680000UL +#define SCB8_BASE 0x40690000UL +#define SCB0 ((CySCB_Type*) SCB0_BASE) /* 0x40610000 */ +#define SCB1 ((CySCB_Type*) SCB1_BASE) /* 0x40620000 */ +#define SCB2 ((CySCB_Type*) SCB2_BASE) /* 0x40630000 */ +#define SCB3 ((CySCB_Type*) SCB3_BASE) /* 0x40640000 */ +#define SCB4 ((CySCB_Type*) SCB4_BASE) /* 0x40650000 */ +#define SCB5 ((CySCB_Type*) SCB5_BASE) /* 0x40660000 */ +#define SCB6 ((CySCB_Type*) SCB6_BASE) /* 0x40670000 */ +#define SCB7 ((CySCB_Type*) SCB7_BASE) /* 0x40680000 */ +#define SCB8 ((CySCB_Type*) SCB8_BASE) /* 0x40690000 */ + +/* =========================================================================================================================== */ +/* ================ CTBM ================ */ +/* =========================================================================================================================== */ + +#define CTBM0_BASE 0x41100000UL +#define CTBM0 ((CTBM_Type*) CTBM0_BASE) /* 0x41100000 */ + +/* =========================================================================================================================== */ +/* ================ CTDAC ================ */ +/* =========================================================================================================================== */ + +#define CTDAC0_BASE 0x41140000UL +#define CTDAC0 ((CTDAC_Type*) CTDAC0_BASE) /* 0x41140000 */ + +/* =========================================================================================================================== */ +/* ================ SAR ================ */ +/* =========================================================================================================================== */ + +#define SAR_BASE 0x411D0000UL +#define SAR ((SAR_Type*) SAR_BASE) /* 0x411D0000 */ + +/* =========================================================================================================================== */ +/* ================ PASS ================ */ +/* =========================================================================================================================== */ + +#define PASS_BASE 0x411F0000UL +#define PASS ((PASS_Type*) PASS_BASE) /* 0x411F0000 */ +#define PASS_AREF ((PASS_AREF_Type*) &PASS->AREF) /* 0x411F0E00 */ + +/* =========================================================================================================================== */ +/* ================ I2S ================ */ +/* =========================================================================================================================== */ + +#define I2S_BASE 0x42A10000UL +#define I2S ((I2S_Type*) I2S_BASE) /* 0x42A10000 */ + +/* =========================================================================================================================== */ +/* ================ PDM ================ */ +/* =========================================================================================================================== */ + +#define PDM_BASE 0x42A20000UL +#define PDM ((PDM_Type*) PDM_BASE) /* 0x42A20000 */ + +/** \} CY8C637BZI-BLD74 */ + +#endif /* _CY8C637BZI_BLD74_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cy_device_headers.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cy_device_headers.h new file mode 100644 index 0000000000..815517a8ca --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cy_device_headers.h @@ -0,0 +1,85 @@ +/***************************************************************************//** +* \file cy_device_headers.h +* +* \brief +* Common header file to be included by the drivers. +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CY_DEVICE_HEADERS_H_ +#define _CY_DEVICE_HEADERS_H_ + +#if defined (CY8C622PSVP) + #include "cy8c622psvp.h" +#elif defined (CY8C622PSVP_DUAL) + #include "cy8c622psvp_dual.h" +#elif defined (CY8C616FMI_BL603) + #include "cy8c616fmi_bl603.h" +#elif defined (CY8C616FMI_BL673) + #include "cy8c616fmi_bl673.h" +#elif defined (CY8C616LQI_BL601) + #include "cy8c616lqi_bl601.h" +#elif defined (CY8C616LQI_BL671) + #include "cy8c616lqi_bl671.h" +#elif defined (CY8C617FMI_BL603) + #include "cy8c617fmi_bl603.h" +#elif defined (CY8C617FMI_BLD73) + #include "cy8c617fmi_bld73.h" +#elif defined (CY8C626FMI_BL603) + #include "cy8c626fmi_bl603.h" +#elif defined (CY8C626BZI_BL604) + #include "cy8c626bzi_bl604.h" +#elif defined (CY8C626BZI_BL674) + #include "cy8c626bzi_bl674.h" +#elif defined (CY8C627BZI_BL604) + #include "cy8c627bzi_bl604.h" +#elif defined (CY8C627FMI_BLD73) + #include "cy8c627fmi_bld73.h" +#elif defined (CY8C627BZI_BLD74) + #include "cy8c627bzi_bld74.h" +#elif defined (CY8C636BZI_BL604) + #include "cy8c636bzi_bl604.h" +#elif defined (CY8C636BZI_BL674) + #include "cy8c636bzi_bl674.h" +#elif defined (CY8C636FMI_BL603) + #include "cy8c636fmi_bl603.h" +#elif defined (CY8C636FMI_BL673) + #include "cy8c636fmi_bl673.h" +#elif defined (CY8C636LQI_BL601) + #include "cy8c636lqi_bl601.h" +#elif defined (CY8C636LQI_BL671) + #include "cy8c636lqi_bl671.h" +#elif defined (CY8C637BZI_BLD04) + #include "cy8c637bzi_bld04.h" +#elif defined (CY8C637BZI_BLD74) + #include "cy8c637bzi_bld74.h" +#elif defined (CY8C637FMI_BLD03) + #include "cy8c637fmi_bld03.h" +#elif defined (CY8C637FMI_BLD73) + #include "cy8c637fmi_bld73.h" +#elif defined (CY8C637LQI_BLD01) + #include "cy8c637lqi_bld01.h" +#elif defined (CY8C637LQI_BLD71) + #include "cy8c637lqi_bld71.h" +#elif defined (CY8C68237FM_BLE) + #include "cy8c68237fm_ble.h" +#elif defined (CY8C68237BZ_BLE) + #include "cy8c68237bz_ble.h" +#else + #error Undefined part number +#endif + +#endif /* _CY_DEVICE_HEADERS_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/gpio_psoc6ble_116_bga_ble.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/gpio_psoc6ble_116_bga_ble.h new file mode 100644 index 0000000000..46d8b6031b --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/gpio_psoc6ble_116_bga_ble.h @@ -0,0 +1,1611 @@ +/***************************************************************************//** +* \file gpio_psoc6ble_116_bga_ble.h +* +* \brief +* PSoC 6 BLE device GPIO header for 116-BGA-BLE package +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _GPIO_PSOC6BLE_116_BGA_BLE_H_ +#define _GPIO_PSOC6BLE_116_BGA_BLE_H_ + +/* Analog Connections */ +#define CSD_CMODPADD_PORT 7u +#define CSD_CMODPADD_PIN 1u +#define CSD_CMODPADS_PORT 7u +#define CSD_CMODPADS_PIN 1u +#define CSD_CSH_TANKPADD_PORT 7u +#define CSD_CSH_TANKPADD_PIN 2u +#define CSD_CSH_TANKPADS_PORT 7u +#define CSD_CSH_TANKPADS_PIN 2u +#define CSD_CSHIELDPADS_PORT 7u +#define CSD_CSHIELDPADS_PIN 7u +#define CSD_VREF_EXT_PORT 7u +#define CSD_VREF_EXT_PIN 3u +#define LPCOMP_INN_COMP1_PORT 6u +#define LPCOMP_INN_COMP1_PIN 3u +#define LPCOMP_INP_COMP0_PORT 5u +#define LPCOMP_INP_COMP0_PIN 6u +#define LPCOMP_INP_COMP1_PORT 6u +#define LPCOMP_INP_COMP1_PIN 2u +#define PASS_AREF_EXT_VREF_PORT 9u +#define PASS_AREF_EXT_VREF_PIN 7u +#define PASS_CTB_OA0_OUT_10X_PORT 9u +#define PASS_CTB_OA0_OUT_10X_PIN 2u +#define PASS_CTB_OA1_OUT_10X_PORT 9u +#define PASS_CTB_OA1_OUT_10X_PIN 3u +#define PASS_CTB_PADS0_PORT 9u +#define PASS_CTB_PADS0_PIN 0u +#define PASS_CTB_PADS1_PORT 9u +#define PASS_CTB_PADS1_PIN 1u +#define PASS_CTB_PADS2_PORT 9u +#define PASS_CTB_PADS2_PIN 2u +#define PASS_CTB_PADS3_PORT 9u +#define PASS_CTB_PADS3_PIN 3u +#define PASS_CTB_PADS4_PORT 9u +#define PASS_CTB_PADS4_PIN 4u +#define PASS_CTB_PADS5_PORT 9u +#define PASS_CTB_PADS5_PIN 5u +#define PASS_CTB_PADS6_PORT 9u +#define PASS_CTB_PADS6_PIN 6u +#define PASS_CTB_PADS7_PORT 9u +#define PASS_CTB_PADS7_PIN 7u +#define PASS_SARMUX_PADS0_PORT 10u +#define PASS_SARMUX_PADS0_PIN 0u +#define PASS_SARMUX_PADS1_PORT 10u +#define PASS_SARMUX_PADS1_PIN 1u +#define PASS_SARMUX_PADS2_PORT 10u +#define PASS_SARMUX_PADS2_PIN 2u +#define PASS_SARMUX_PADS3_PORT 10u +#define PASS_SARMUX_PADS3_PIN 3u +#define PASS_SARMUX_PADS4_PORT 10u +#define PASS_SARMUX_PADS4_PIN 4u +#define PASS_SARMUX_PADS5_PORT 10u +#define PASS_SARMUX_PADS5_PIN 5u +#define PASS_SARMUX_PADS6_PORT 10u +#define PASS_SARMUX_PADS6_PIN 6u +#define SRSS_ADFT_PIN0_PORT 10u +#define SRSS_ADFT_PIN0_PIN 0u +#define SRSS_ADFT_PIN1_PORT 10u +#define SRSS_ADFT_PIN1_PIN 1u +#define SRSS_ECO_IN_PORT 12u +#define SRSS_ECO_IN_PIN 6u +#define SRSS_ECO_OUT_PORT 12u +#define SRSS_ECO_OUT_PIN 7u +#define SRSS_WCO_IN_PORT 0u +#define SRSS_WCO_IN_PIN 0u +#define SRSS_WCO_OUT_PORT 0u +#define SRSS_WCO_OUT_PIN 1u + +/* HSIOM Connections */ +typedef enum +{ + /* Generic HSIOM connections */ + HSIOM_SEL_GPIO = 0, /* GPIO controls 'out' */ + HSIOM_SEL_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + HSIOM_SEL_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + HSIOM_SEL_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + HSIOM_SEL_AMUXA = 4, /* Analog mux bus A */ + HSIOM_SEL_AMUXB = 5, /* Analog mux bus B */ + HSIOM_SEL_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + HSIOM_SEL_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + HSIOM_SEL_ACT_0 = 8, /* Active functionality 0 */ + HSIOM_SEL_ACT_1 = 9, /* Active functionality 1 */ + HSIOM_SEL_ACT_2 = 10, /* Active functionality 2 */ + HSIOM_SEL_ACT_3 = 11, /* Active functionality 3 */ + HSIOM_SEL_DS_0 = 12, /* DeepSleep functionality 0 */ + HSIOM_SEL_DS_1 = 13, /* DeepSleep functionality 1 */ + HSIOM_SEL_DS_2 = 14, /* DeepSleep functionality 2 */ + HSIOM_SEL_DS_3 = 15, /* DeepSleep functionality 3 */ + HSIOM_SEL_ACT_4 = 16, /* Active functionality 4 */ + HSIOM_SEL_ACT_5 = 17, /* Active functionality 5 */ + HSIOM_SEL_ACT_6 = 18, /* Active functionality 6 */ + HSIOM_SEL_ACT_7 = 19, /* Active functionality 7 */ + HSIOM_SEL_ACT_8 = 20, /* Active functionality 8 */ + HSIOM_SEL_ACT_9 = 21, /* Active functionality 9 */ + HSIOM_SEL_ACT_10 = 22, /* Active functionality 10 */ + HSIOM_SEL_ACT_11 = 23, /* Active functionality 11 */ + HSIOM_SEL_ACT_12 = 24, /* Active functionality 12 */ + HSIOM_SEL_ACT_13 = 25, /* Active functionality 13 */ + HSIOM_SEL_ACT_14 = 26, /* Active functionality 14 */ + HSIOM_SEL_ACT_15 = 27, /* Active functionality 15 */ + HSIOM_SEL_DS_4 = 28, /* DeepSleep functionality 4 */ + HSIOM_SEL_DS_5 = 29, /* DeepSleep functionality 5 */ + HSIOM_SEL_DS_6 = 30, /* DeepSleep functionality 6 */ + HSIOM_SEL_DS_7 = 31, /* DeepSleep functionality 7 */ + + /* P0.0 */ + P0_0_GPIO = 0, /* GPIO controls 'out' */ + P0_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_0_AMUXA = 4, /* Analog mux bus A */ + P0_0_AMUXB = 5, /* Analog mux bus B */ + P0_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_0_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:0 */ + P0_0_TCPWM1_LINE0 = 9, /* Digital Active - tcpwm[1].line[0]:0 */ + P0_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:0 */ + P0_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:0 */ + P0_0_LCD_COM0 = 12, /* Digital Deep Sleep - lcd.com[0]:0 */ + P0_0_LCD_SEG0 = 13, /* Digital Deep Sleep - lcd.seg[0]:0 */ + P0_0_SRSS_EXT_CLK = 16, /* Digital Active - srss.ext_clk:0 */ + P0_0_SCB0_SPI_SELECT1 = 20, /* Digital Active - scb[0].spi_select1:0 */ + P0_0_PERI_TR_IO_INPUT0 = 24, /* Digital Active - peri.tr_io_input[0]:0 */ + + /* P0.1 */ + P0_1_GPIO = 0, /* GPIO controls 'out' */ + P0_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_1_AMUXA = 4, /* Analog mux bus A */ + P0_1_AMUXB = 5, /* Analog mux bus B */ + P0_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_1_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:0 */ + P0_1_TCPWM1_LINE_COMPL0 = 9, /* Digital Active - tcpwm[1].line_compl[0]:0 */ + P0_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:1 */ + P0_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:1 */ + P0_1_LCD_COM1 = 12, /* Digital Deep Sleep - lcd.com[1]:0 */ + P0_1_LCD_SEG1 = 13, /* Digital Deep Sleep - lcd.seg[1]:0 */ + P0_1_SCB0_SPI_SELECT2 = 20, /* Digital Active - scb[0].spi_select2:0 */ + P0_1_PERI_TR_IO_INPUT1 = 24, /* Digital Active - peri.tr_io_input[1]:0 */ + P0_1_CPUSS_SWJ_TRSTN = 29, /* Digital Deep Sleep - cpuss.swj_trstn */ + + /* P0.2 */ + P0_2_GPIO = 0, /* GPIO controls 'out' */ + P0_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_2_AMUXA = 4, /* Analog mux bus A */ + P0_2_AMUXB = 5, /* Analog mux bus B */ + P0_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_2_TCPWM0_LINE1 = 8, /* Digital Active - tcpwm[0].line[1]:0 */ + P0_2_TCPWM1_LINE1 = 9, /* Digital Active - tcpwm[1].line[1]:0 */ + P0_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:2 */ + P0_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:2 */ + P0_2_LCD_COM2 = 12, /* Digital Deep Sleep - lcd.com[2]:0 */ + P0_2_LCD_SEG2 = 13, /* Digital Deep Sleep - lcd.seg[2]:0 */ + P0_2_SCB0_UART_RX = 18, /* Digital Active - scb[0].uart_rx:0 */ + P0_2_SCB0_I2C_SCL = 19, /* Digital Active - scb[0].i2c_scl:0 */ + P0_2_SCB0_SPI_MOSI = 20, /* Digital Active - scb[0].spi_mosi:0 */ + + /* P0.3 */ + P0_3_GPIO = 0, /* GPIO controls 'out' */ + P0_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_3_AMUXA = 4, /* Analog mux bus A */ + P0_3_AMUXB = 5, /* Analog mux bus B */ + P0_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_3_TCPWM0_LINE_COMPL1 = 8, /* Digital Active - tcpwm[0].line_compl[1]:0 */ + P0_3_TCPWM1_LINE_COMPL1 = 9, /* Digital Active - tcpwm[1].line_compl[1]:0 */ + P0_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:3 */ + P0_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:3 */ + P0_3_LCD_COM3 = 12, /* Digital Deep Sleep - lcd.com[3]:0 */ + P0_3_LCD_SEG3 = 13, /* Digital Deep Sleep - lcd.seg[3]:0 */ + P0_3_SCB0_UART_TX = 18, /* Digital Active - scb[0].uart_tx:0 */ + P0_3_SCB0_I2C_SDA = 19, /* Digital Active - scb[0].i2c_sda:0 */ + P0_3_SCB0_SPI_MISO = 20, /* Digital Active - scb[0].spi_miso:0 */ + + /* P0.4 */ + P0_4_GPIO = 0, /* GPIO controls 'out' */ + P0_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_4_AMUXA = 4, /* Analog mux bus A */ + P0_4_AMUXB = 5, /* Analog mux bus B */ + P0_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_4_TCPWM0_LINE2 = 8, /* Digital Active - tcpwm[0].line[2]:0 */ + P0_4_TCPWM1_LINE2 = 9, /* Digital Active - tcpwm[1].line[2]:0 */ + P0_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:4 */ + P0_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:4 */ + P0_4_LCD_COM4 = 12, /* Digital Deep Sleep - lcd.com[4]:0 */ + P0_4_LCD_SEG4 = 13, /* Digital Deep Sleep - lcd.seg[4]:0 */ + P0_4_SCB0_UART_RTS = 18, /* Digital Active - scb[0].uart_rts:0 */ + P0_4_SCB0_SPI_CLK = 20, /* Digital Active - scb[0].spi_clk:0 */ + P0_4_PERI_TR_IO_OUTPUT0 = 25, /* Digital Active - peri.tr_io_output[0]:2 */ + + /* P0.5 */ + P0_5_GPIO = 0, /* GPIO controls 'out' */ + P0_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_5_AMUXA = 4, /* Analog mux bus A */ + P0_5_AMUXB = 5, /* Analog mux bus B */ + P0_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_5_TCPWM0_LINE_COMPL2 = 8, /* Digital Active - tcpwm[0].line_compl[2]:0 */ + P0_5_TCPWM1_LINE_COMPL2 = 9, /* Digital Active - tcpwm[1].line_compl[2]:0 */ + P0_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:5 */ + P0_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:5 */ + P0_5_LCD_COM5 = 12, /* Digital Deep Sleep - lcd.com[5]:0 */ + P0_5_LCD_SEG5 = 13, /* Digital Deep Sleep - lcd.seg[5]:0 */ + P0_5_SRSS_EXT_CLK = 16, /* Digital Active - srss.ext_clk:1 */ + P0_5_SCB0_UART_CTS = 18, /* Digital Active - scb[0].uart_cts:0 */ + P0_5_SCB0_SPI_SELECT0 = 20, /* Digital Active - scb[0].spi_select0:0 */ + P0_5_PERI_TR_IO_OUTPUT1 = 25, /* Digital Active - peri.tr_io_output[1]:2 */ + + /* P1.0 */ + P1_0_GPIO = 0, /* GPIO controls 'out' */ + P1_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_0_AMUXA = 4, /* Analog mux bus A */ + P1_0_AMUXB = 5, /* Analog mux bus B */ + P1_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_0_TCPWM0_LINE3 = 8, /* Digital Active - tcpwm[0].line[3]:0 */ + P1_0_TCPWM1_LINE3 = 9, /* Digital Active - tcpwm[1].line[3]:0 */ + P1_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:6 */ + P1_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:6 */ + P1_0_LCD_COM6 = 12, /* Digital Deep Sleep - lcd.com[6]:0 */ + P1_0_LCD_SEG6 = 13, /* Digital Deep Sleep - lcd.seg[6]:0 */ + P1_0_SCB7_UART_RX = 18, /* Digital Active - scb[7].uart_rx:0 */ + P1_0_SCB7_I2C_SCL = 19, /* Digital Active - scb[7].i2c_scl:0 */ + P1_0_SCB7_SPI_MOSI = 20, /* Digital Active - scb[7].spi_mosi:0 */ + P1_0_PERI_TR_IO_INPUT2 = 24, /* Digital Active - peri.tr_io_input[2]:0 */ + + /* P1.1 */ + P1_1_GPIO = 0, /* GPIO controls 'out' */ + P1_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_1_AMUXA = 4, /* Analog mux bus A */ + P1_1_AMUXB = 5, /* Analog mux bus B */ + P1_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_1_TCPWM0_LINE_COMPL3 = 8, /* Digital Active - tcpwm[0].line_compl[3]:0 */ + P1_1_TCPWM1_LINE_COMPL3 = 9, /* Digital Active - tcpwm[1].line_compl[3]:0 */ + P1_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:7 */ + P1_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:7 */ + P1_1_LCD_COM7 = 12, /* Digital Deep Sleep - lcd.com[7]:0 */ + P1_1_LCD_SEG7 = 13, /* Digital Deep Sleep - lcd.seg[7]:0 */ + P1_1_SCB7_UART_TX = 18, /* Digital Active - scb[7].uart_tx:0 */ + P1_1_SCB7_I2C_SDA = 19, /* Digital Active - scb[7].i2c_sda:0 */ + P1_1_SCB7_SPI_MISO = 20, /* Digital Active - scb[7].spi_miso:0 */ + P1_1_PERI_TR_IO_INPUT3 = 24, /* Digital Active - peri.tr_io_input[3]:0 */ + + /* P1.2 */ + P1_2_GPIO = 0, /* GPIO controls 'out' */ + P1_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_2_AMUXA = 4, /* Analog mux bus A */ + P1_2_AMUXB = 5, /* Analog mux bus B */ + P1_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_2_TCPWM0_LINE4 = 8, /* Digital Active - tcpwm[0].line[4]:4 */ + P1_2_TCPWM1_LINE12 = 9, /* Digital Active - tcpwm[1].line[12]:1 */ + P1_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:8 */ + P1_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:8 */ + P1_2_LCD_COM8 = 12, /* Digital Deep Sleep - lcd.com[8]:0 */ + P1_2_LCD_SEG8 = 13, /* Digital Deep Sleep - lcd.seg[8]:0 */ + P1_2_SCB7_UART_RTS = 18, /* Digital Active - scb[7].uart_rts:0 */ + P1_2_SCB7_SPI_CLK = 20, /* Digital Active - scb[7].spi_clk:0 */ + + /* P1.3 */ + P1_3_GPIO = 0, /* GPIO controls 'out' */ + P1_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_3_AMUXA = 4, /* Analog mux bus A */ + P1_3_AMUXB = 5, /* Analog mux bus B */ + P1_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_3_TCPWM0_LINE_COMPL4 = 8, /* Digital Active - tcpwm[0].line_compl[4]:4 */ + P1_3_TCPWM1_LINE_COMPL12 = 9, /* Digital Active - tcpwm[1].line_compl[12]:1 */ + P1_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:9 */ + P1_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:9 */ + P1_3_LCD_COM9 = 12, /* Digital Deep Sleep - lcd.com[9]:0 */ + P1_3_LCD_SEG9 = 13, /* Digital Deep Sleep - lcd.seg[9]:0 */ + P1_3_SCB7_UART_CTS = 18, /* Digital Active - scb[7].uart_cts:0 */ + P1_3_SCB7_SPI_SELECT0 = 20, /* Digital Active - scb[7].spi_select0:0 */ + + /* P1.4 */ + P1_4_GPIO = 0, /* GPIO controls 'out' */ + P1_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_4_AMUXA = 4, /* Analog mux bus A */ + P1_4_AMUXB = 5, /* Analog mux bus B */ + P1_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_4_TCPWM0_LINE5 = 8, /* Digital Active - tcpwm[0].line[5]:4 */ + P1_4_TCPWM1_LINE13 = 9, /* Digital Active - tcpwm[1].line[13]:1 */ + P1_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:10 */ + P1_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:10 */ + P1_4_LCD_COM10 = 12, /* Digital Deep Sleep - lcd.com[10]:0 */ + P1_4_LCD_SEG10 = 13, /* Digital Deep Sleep - lcd.seg[10]:0 */ + P1_4_SCB7_SPI_SELECT1 = 20, /* Digital Active - scb[7].spi_select1:0 */ + + /* P1.5 */ + P1_5_GPIO = 0, /* GPIO controls 'out' */ + P1_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_5_AMUXA = 4, /* Analog mux bus A */ + P1_5_AMUXB = 5, /* Analog mux bus B */ + P1_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_5_TCPWM0_LINE_COMPL5 = 8, /* Digital Active - tcpwm[0].line_compl[5]:4 */ + P1_5_TCPWM1_LINE_COMPL14 = 9, /* Digital Active - tcpwm[1].line_compl[14]:1 */ + P1_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:11 */ + P1_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:11 */ + P1_5_LCD_COM11 = 12, /* Digital Deep Sleep - lcd.com[11]:0 */ + P1_5_LCD_SEG11 = 13, /* Digital Deep Sleep - lcd.seg[11]:0 */ + P1_5_SCB7_SPI_SELECT2 = 20, /* Digital Active - scb[7].spi_select2:0 */ + + /* P5.0 */ + P5_0_GPIO = 0, /* GPIO controls 'out' */ + P5_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_0_AMUXA = 4, /* Analog mux bus A */ + P5_0_AMUXB = 5, /* Analog mux bus B */ + P5_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_0_TCPWM0_LINE4 = 8, /* Digital Active - tcpwm[0].line[4]:0 */ + P5_0_TCPWM1_LINE4 = 9, /* Digital Active - tcpwm[1].line[4]:0 */ + P5_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:30 */ + P5_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:30 */ + P5_0_LCD_COM30 = 12, /* Digital Deep Sleep - lcd.com[30]:0 */ + P5_0_LCD_SEG30 = 13, /* Digital Deep Sleep - lcd.seg[30]:0 */ + P5_0_SCB5_UART_RX = 18, /* Digital Active - scb[5].uart_rx:0 */ + P5_0_SCB5_I2C_SCL = 19, /* Digital Active - scb[5].i2c_scl:0 */ + P5_0_SCB5_SPI_MOSI = 20, /* Digital Active - scb[5].spi_mosi:0 */ + P5_0_AUDIOSS_CLK_I2S_IF = 22, /* Digital Active - audioss.clk_i2s_if */ + P5_0_PERI_TR_IO_INPUT10 = 24, /* Digital Active - peri.tr_io_input[10]:0 */ + + /* P5.1 */ + P5_1_GPIO = 0, /* GPIO controls 'out' */ + P5_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_1_AMUXA = 4, /* Analog mux bus A */ + P5_1_AMUXB = 5, /* Analog mux bus B */ + P5_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_1_TCPWM0_LINE_COMPL4 = 8, /* Digital Active - tcpwm[0].line_compl[4]:0 */ + P5_1_TCPWM1_LINE_COMPL4 = 9, /* Digital Active - tcpwm[1].line_compl[4]:0 */ + P5_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:31 */ + P5_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:31 */ + P5_1_LCD_COM31 = 12, /* Digital Deep Sleep - lcd.com[31]:0 */ + P5_1_LCD_SEG31 = 13, /* Digital Deep Sleep - lcd.seg[31]:0 */ + P5_1_SCB5_UART_TX = 18, /* Digital Active - scb[5].uart_tx:0 */ + P5_1_SCB5_I2C_SDA = 19, /* Digital Active - scb[5].i2c_sda:0 */ + P5_1_SCB5_SPI_MISO = 20, /* Digital Active - scb[5].spi_miso:0 */ + P5_1_AUDIOSS_TX_SCK = 22, /* Digital Active - audioss.tx_sck */ + P5_1_PERI_TR_IO_INPUT11 = 24, /* Digital Active - peri.tr_io_input[11]:0 */ + + /* P5.2 */ + P5_2_GPIO = 0, /* GPIO controls 'out' */ + P5_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_2_AMUXA = 4, /* Analog mux bus A */ + P5_2_AMUXB = 5, /* Analog mux bus B */ + P5_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_2_TCPWM0_LINE5 = 8, /* Digital Active - tcpwm[0].line[5]:0 */ + P5_2_TCPWM1_LINE5 = 9, /* Digital Active - tcpwm[1].line[5]:0 */ + P5_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:32 */ + P5_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:32 */ + P5_2_LCD_COM32 = 12, /* Digital Deep Sleep - lcd.com[32]:0 */ + P5_2_LCD_SEG32 = 13, /* Digital Deep Sleep - lcd.seg[32]:0 */ + P5_2_SCB5_UART_RTS = 18, /* Digital Active - scb[5].uart_rts:0 */ + P5_2_SCB5_SPI_CLK = 20, /* Digital Active - scb[5].spi_clk:0 */ + P5_2_AUDIOSS_TX_WS = 22, /* Digital Active - audioss.tx_ws */ + + /* P5.3 */ + P5_3_GPIO = 0, /* GPIO controls 'out' */ + P5_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_3_AMUXA = 4, /* Analog mux bus A */ + P5_3_AMUXB = 5, /* Analog mux bus B */ + P5_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_3_TCPWM0_LINE_COMPL5 = 8, /* Digital Active - tcpwm[0].line_compl[5]:0 */ + P5_3_TCPWM1_LINE_COMPL5 = 9, /* Digital Active - tcpwm[1].line_compl[5]:0 */ + P5_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:33 */ + P5_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:33 */ + P5_3_LCD_COM33 = 12, /* Digital Deep Sleep - lcd.com[33]:0 */ + P5_3_LCD_SEG33 = 13, /* Digital Deep Sleep - lcd.seg[33]:0 */ + P5_3_SCB5_UART_CTS = 18, /* Digital Active - scb[5].uart_cts:0 */ + P5_3_SCB5_SPI_SELECT0 = 20, /* Digital Active - scb[5].spi_select0:0 */ + P5_3_AUDIOSS_TX_SDO = 22, /* Digital Active - audioss.tx_sdo */ + + /* P5.4 */ + P5_4_GPIO = 0, /* GPIO controls 'out' */ + P5_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_4_AMUXA = 4, /* Analog mux bus A */ + P5_4_AMUXB = 5, /* Analog mux bus B */ + P5_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_4_TCPWM0_LINE6 = 8, /* Digital Active - tcpwm[0].line[6]:0 */ + P5_4_TCPWM1_LINE6 = 9, /* Digital Active - tcpwm[1].line[6]:0 */ + P5_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:34 */ + P5_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:34 */ + P5_4_LCD_COM34 = 12, /* Digital Deep Sleep - lcd.com[34]:0 */ + P5_4_LCD_SEG34 = 13, /* Digital Deep Sleep - lcd.seg[34]:0 */ + P5_4_SCB5_SPI_SELECT1 = 20, /* Digital Active - scb[5].spi_select1:0 */ + P5_4_AUDIOSS_RX_SCK = 22, /* Digital Active - audioss.rx_sck */ + + /* P5.5 */ + P5_5_GPIO = 0, /* GPIO controls 'out' */ + P5_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_5_AMUXA = 4, /* Analog mux bus A */ + P5_5_AMUXB = 5, /* Analog mux bus B */ + P5_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_5_TCPWM0_LINE_COMPL6 = 8, /* Digital Active - tcpwm[0].line_compl[6]:0 */ + P5_5_TCPWM1_LINE_COMPL6 = 9, /* Digital Active - tcpwm[1].line_compl[6]:0 */ + P5_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:35 */ + P5_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:35 */ + P5_5_LCD_COM35 = 12, /* Digital Deep Sleep - lcd.com[35]:0 */ + P5_5_LCD_SEG35 = 13, /* Digital Deep Sleep - lcd.seg[35]:0 */ + P5_5_SCB5_SPI_SELECT2 = 20, /* Digital Active - scb[5].spi_select2:0 */ + P5_5_AUDIOSS_RX_WS = 22, /* Digital Active - audioss.rx_ws */ + + /* P5.6 */ + P5_6_GPIO = 0, /* GPIO controls 'out' */ + P5_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_6_AMUXA = 4, /* Analog mux bus A */ + P5_6_AMUXB = 5, /* Analog mux bus B */ + P5_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_6_TCPWM0_LINE7 = 8, /* Digital Active - tcpwm[0].line[7]:0 */ + P5_6_TCPWM1_LINE7 = 9, /* Digital Active - tcpwm[1].line[7]:0 */ + P5_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:36 */ + P5_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:36 */ + P5_6_LCD_COM36 = 12, /* Digital Deep Sleep - lcd.com[36]:0 */ + P5_6_LCD_SEG36 = 13, /* Digital Deep Sleep - lcd.seg[36]:0 */ + P5_6_SCB5_SPI_SELECT3 = 20, /* Digital Active - scb[5].spi_select3:0 */ + P5_6_AUDIOSS_RX_SDI = 22, /* Digital Active - audioss.rx_sdi */ + + /* P6.0 */ + P6_0_GPIO = 0, /* GPIO controls 'out' */ + P6_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_0_AMUXA = 4, /* Analog mux bus A */ + P6_0_AMUXB = 5, /* Analog mux bus B */ + P6_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_0_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:1 */ + P6_0_TCPWM1_LINE8 = 9, /* Digital Active - tcpwm[1].line[8]:0 */ + P6_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:38 */ + P6_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:38 */ + P6_0_LCD_COM38 = 12, /* Digital Deep Sleep - lcd.com[38]:0 */ + P6_0_LCD_SEG38 = 13, /* Digital Deep Sleep - lcd.seg[38]:0 */ + P6_0_SCB8_I2C_SCL = 14, /* Digital Deep Sleep - scb[8].i2c_scl:0 */ + P6_0_SCB3_UART_RX = 18, /* Digital Active - scb[3].uart_rx:0 */ + P6_0_SCB3_I2C_SCL = 19, /* Digital Active - scb[3].i2c_scl:0 */ + P6_0_SCB3_SPI_MOSI = 20, /* Digital Active - scb[3].spi_mosi:0 */ + P6_0_CPUSS_FAULT_OUT0 = 25, /* Digital Active - cpuss.fault_out[0] */ + P6_0_SCB8_SPI_MOSI = 30, /* Digital Deep Sleep - scb[8].spi_mosi:0 */ + + /* P6.1 */ + P6_1_GPIO = 0, /* GPIO controls 'out' */ + P6_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_1_AMUXA = 4, /* Analog mux bus A */ + P6_1_AMUXB = 5, /* Analog mux bus B */ + P6_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_1_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:1 */ + P6_1_TCPWM1_LINE_COMPL8 = 9, /* Digital Active - tcpwm[1].line_compl[8]:0 */ + P6_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:39 */ + P6_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:39 */ + P6_1_LCD_COM39 = 12, /* Digital Deep Sleep - lcd.com[39]:0 */ + P6_1_LCD_SEG39 = 13, /* Digital Deep Sleep - lcd.seg[39]:0 */ + P6_1_SCB8_I2C_SDA = 14, /* Digital Deep Sleep - scb[8].i2c_sda:0 */ + P6_1_SCB3_UART_TX = 18, /* Digital Active - scb[3].uart_tx:0 */ + P6_1_SCB3_I2C_SDA = 19, /* Digital Active - scb[3].i2c_sda:0 */ + P6_1_SCB3_SPI_MISO = 20, /* Digital Active - scb[3].spi_miso:0 */ + P6_1_CPUSS_FAULT_OUT1 = 25, /* Digital Active - cpuss.fault_out[1] */ + P6_1_SCB8_SPI_MISO = 30, /* Digital Deep Sleep - scb[8].spi_miso:0 */ + + /* P6.2 */ + P6_2_GPIO = 0, /* GPIO controls 'out' */ + P6_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_2_AMUXA = 4, /* Analog mux bus A */ + P6_2_AMUXB = 5, /* Analog mux bus B */ + P6_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_2_TCPWM0_LINE1 = 8, /* Digital Active - tcpwm[0].line[1]:1 */ + P6_2_TCPWM1_LINE9 = 9, /* Digital Active - tcpwm[1].line[9]:0 */ + P6_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:40 */ + P6_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:40 */ + P6_2_LCD_COM40 = 12, /* Digital Deep Sleep - lcd.com[40]:0 */ + P6_2_LCD_SEG40 = 13, /* Digital Deep Sleep - lcd.seg[40]:0 */ + P6_2_SCB3_UART_RTS = 18, /* Digital Active - scb[3].uart_rts:0 */ + P6_2_SCB3_SPI_CLK = 20, /* Digital Active - scb[3].spi_clk:0 */ + P6_2_SCB8_SPI_CLK = 30, /* Digital Deep Sleep - scb[8].spi_clk:0 */ + + /* P6.3 */ + P6_3_GPIO = 0, /* GPIO controls 'out' */ + P6_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_3_AMUXA = 4, /* Analog mux bus A */ + P6_3_AMUXB = 5, /* Analog mux bus B */ + P6_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_3_TCPWM0_LINE_COMPL1 = 8, /* Digital Active - tcpwm[0].line_compl[1]:1 */ + P6_3_TCPWM1_LINE_COMPL9 = 9, /* Digital Active - tcpwm[1].line_compl[9]:0 */ + P6_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:41 */ + P6_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:41 */ + P6_3_LCD_COM41 = 12, /* Digital Deep Sleep - lcd.com[41]:0 */ + P6_3_LCD_SEG41 = 13, /* Digital Deep Sleep - lcd.seg[41]:0 */ + P6_3_SCB3_UART_CTS = 18, /* Digital Active - scb[3].uart_cts:0 */ + P6_3_SCB3_SPI_SELECT0 = 20, /* Digital Active - scb[3].spi_select0:0 */ + P6_3_SCB8_SPI_SELECT0 = 30, /* Digital Deep Sleep - scb[8].spi_select0:0 */ + + /* P6.4 */ + P6_4_GPIO = 0, /* GPIO controls 'out' */ + P6_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_4_AMUXA = 4, /* Analog mux bus A */ + P6_4_AMUXB = 5, /* Analog mux bus B */ + P6_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_4_TCPWM0_LINE2 = 8, /* Digital Active - tcpwm[0].line[2]:1 */ + P6_4_TCPWM1_LINE10 = 9, /* Digital Active - tcpwm[1].line[10]:0 */ + P6_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:42 */ + P6_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:42 */ + P6_4_LCD_COM42 = 12, /* Digital Deep Sleep - lcd.com[42]:0 */ + P6_4_LCD_SEG42 = 13, /* Digital Deep Sleep - lcd.seg[42]:0 */ + P6_4_SCB8_I2C_SCL = 14, /* Digital Deep Sleep - scb[8].i2c_scl:1 */ + P6_4_SCB6_UART_RX = 18, /* Digital Active - scb[6].uart_rx:2 */ + P6_4_SCB6_I2C_SCL = 19, /* Digital Active - scb[6].i2c_scl:2 */ + P6_4_SCB6_SPI_MOSI = 20, /* Digital Active - scb[6].spi_mosi:2 */ + P6_4_PERI_TR_IO_INPUT12 = 24, /* Digital Active - peri.tr_io_input[12]:0 */ + P6_4_PERI_TR_IO_OUTPUT0 = 25, /* Digital Active - peri.tr_io_output[0]:1 */ + P6_4_CPUSS_SWJ_SWO_TDO = 29, /* Digital Deep Sleep - cpuss.swj_swo_tdo */ + P6_4_SCB8_SPI_MOSI = 30, /* Digital Deep Sleep - scb[8].spi_mosi:1 */ + P6_4_SRSS_DDFT_PIN_IN0 = 31, /* Digital Deep Sleep - srss.ddft_pin_in[0]:0 */ + + /* P6.5 */ + P6_5_GPIO = 0, /* GPIO controls 'out' */ + P6_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_5_AMUXA = 4, /* Analog mux bus A */ + P6_5_AMUXB = 5, /* Analog mux bus B */ + P6_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_5_TCPWM0_LINE_COMPL2 = 8, /* Digital Active - tcpwm[0].line_compl[2]:1 */ + P6_5_TCPWM1_LINE_COMPL10 = 9, /* Digital Active - tcpwm[1].line_compl[10]:0 */ + P6_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:43 */ + P6_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:43 */ + P6_5_LCD_COM43 = 12, /* Digital Deep Sleep - lcd.com[43]:0 */ + P6_5_LCD_SEG43 = 13, /* Digital Deep Sleep - lcd.seg[43]:0 */ + P6_5_SCB8_I2C_SDA = 14, /* Digital Deep Sleep - scb[8].i2c_sda:1 */ + P6_5_SCB6_UART_TX = 18, /* Digital Active - scb[6].uart_tx:2 */ + P6_5_SCB6_I2C_SDA = 19, /* Digital Active - scb[6].i2c_sda:2 */ + P6_5_SCB6_SPI_MISO = 20, /* Digital Active - scb[6].spi_miso:2 */ + P6_5_PERI_TR_IO_INPUT13 = 24, /* Digital Active - peri.tr_io_input[13]:0 */ + P6_5_PERI_TR_IO_OUTPUT1 = 25, /* Digital Active - peri.tr_io_output[1]:1 */ + P6_5_CPUSS_SWJ_SWDOE_TDI = 29, /* Digital Deep Sleep - cpuss.swj_swdoe_tdi */ + P6_5_SCB8_SPI_MISO = 30, /* Digital Deep Sleep - scb[8].spi_miso:1 */ + P6_5_SRSS_DDFT_PIN_IN1 = 31, /* Digital Deep Sleep - srss.ddft_pin_in[1]:0 */ + + /* P6.6 */ + P6_6_GPIO = 0, /* GPIO controls 'out' */ + P6_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_6_AMUXA = 4, /* Analog mux bus A */ + P6_6_AMUXB = 5, /* Analog mux bus B */ + P6_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_6_TCPWM0_LINE3 = 8, /* Digital Active - tcpwm[0].line[3]:1 */ + P6_6_TCPWM1_LINE11 = 9, /* Digital Active - tcpwm[1].line[11]:0 */ + P6_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:44 */ + P6_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:44 */ + P6_6_LCD_COM44 = 12, /* Digital Deep Sleep - lcd.com[44]:0 */ + P6_6_LCD_SEG44 = 13, /* Digital Deep Sleep - lcd.seg[44]:0 */ + P6_6_SCB6_UART_RTS = 18, /* Digital Active - scb[6].uart_rts:2 */ + P6_6_SCB6_SPI_CLK = 20, /* Digital Active - scb[6].spi_clk:2 */ + P6_6_CPUSS_SWJ_SWDIO_TMS = 29, /* Digital Deep Sleep - cpuss.swj_swdio_tms */ + P6_6_SCB8_SPI_CLK = 30, /* Digital Deep Sleep - scb[8].spi_clk:1 */ + + /* P6.7 */ + P6_7_GPIO = 0, /* GPIO controls 'out' */ + P6_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_7_AMUXA = 4, /* Analog mux bus A */ + P6_7_AMUXB = 5, /* Analog mux bus B */ + P6_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_7_TCPWM0_LINE_COMPL3 = 8, /* Digital Active - tcpwm[0].line_compl[3]:1 */ + P6_7_TCPWM1_LINE_COMPL11 = 9, /* Digital Active - tcpwm[1].line_compl[11]:0 */ + P6_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:45 */ + P6_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:45 */ + P6_7_LCD_COM45 = 12, /* Digital Deep Sleep - lcd.com[45]:0 */ + P6_7_LCD_SEG45 = 13, /* Digital Deep Sleep - lcd.seg[45]:0 */ + P6_7_SCB6_UART_CTS = 18, /* Digital Active - scb[6].uart_cts:2 */ + P6_7_SCB6_SPI_SELECT0 = 20, /* Digital Active - scb[6].spi_select0:2 */ + P6_7_CPUSS_SWJ_SWCLK_TCLK = 29, /* Digital Deep Sleep - cpuss.swj_swclk_tclk */ + P6_7_SCB8_SPI_SELECT0 = 30, /* Digital Deep Sleep - scb[8].spi_select0:1 */ + + /* P7.0 */ + P7_0_GPIO = 0, /* GPIO controls 'out' */ + P7_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_0_AMUXA = 4, /* Analog mux bus A */ + P7_0_AMUXB = 5, /* Analog mux bus B */ + P7_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_0_TCPWM0_LINE4 = 8, /* Digital Active - tcpwm[0].line[4]:1 */ + P7_0_TCPWM1_LINE12 = 9, /* Digital Active - tcpwm[1].line[12]:0 */ + P7_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:46 */ + P7_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:46 */ + P7_0_LCD_COM46 = 12, /* Digital Deep Sleep - lcd.com[46]:0 */ + P7_0_LCD_SEG46 = 13, /* Digital Deep Sleep - lcd.seg[46]:0 */ + P7_0_SCB4_UART_RX = 18, /* Digital Active - scb[4].uart_rx:1 */ + P7_0_SCB4_I2C_SCL = 19, /* Digital Active - scb[4].i2c_scl:1 */ + P7_0_SCB4_SPI_MOSI = 20, /* Digital Active - scb[4].spi_mosi:1 */ + P7_0_PERI_TR_IO_INPUT14 = 24, /* Digital Active - peri.tr_io_input[14]:0 */ + P7_0_CPUSS_TRACE_CLOCK = 26, /* Digital Active - cpuss.trace_clock */ + + /* P7.1 */ + P7_1_GPIO = 0, /* GPIO controls 'out' */ + P7_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_1_AMUXA = 4, /* Analog mux bus A */ + P7_1_AMUXB = 5, /* Analog mux bus B */ + P7_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_1_TCPWM0_LINE_COMPL4 = 8, /* Digital Active - tcpwm[0].line_compl[4]:1 */ + P7_1_TCPWM1_LINE_COMPL12 = 9, /* Digital Active - tcpwm[1].line_compl[12]:0 */ + P7_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:47 */ + P7_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:47 */ + P7_1_LCD_COM47 = 12, /* Digital Deep Sleep - lcd.com[47]:0 */ + P7_1_LCD_SEG47 = 13, /* Digital Deep Sleep - lcd.seg[47]:0 */ + P7_1_SCB4_UART_TX = 18, /* Digital Active - scb[4].uart_tx:1 */ + P7_1_SCB4_I2C_SDA = 19, /* Digital Active - scb[4].i2c_sda:1 */ + P7_1_SCB4_SPI_MISO = 20, /* Digital Active - scb[4].spi_miso:1 */ + P7_1_PERI_TR_IO_INPUT15 = 24, /* Digital Active - peri.tr_io_input[15]:0 */ + + /* P7.2 */ + P7_2_GPIO = 0, /* GPIO controls 'out' */ + P7_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_2_AMUXA = 4, /* Analog mux bus A */ + P7_2_AMUXB = 5, /* Analog mux bus B */ + P7_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_2_TCPWM0_LINE5 = 8, /* Digital Active - tcpwm[0].line[5]:1 */ + P7_2_TCPWM1_LINE13 = 9, /* Digital Active - tcpwm[1].line[13]:0 */ + P7_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:48 */ + P7_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:48 */ + P7_2_LCD_COM48 = 12, /* Digital Deep Sleep - lcd.com[48]:0 */ + P7_2_LCD_SEG48 = 13, /* Digital Deep Sleep - lcd.seg[48]:0 */ + P7_2_SCB4_UART_RTS = 18, /* Digital Active - scb[4].uart_rts:1 */ + P7_2_SCB4_SPI_CLK = 20, /* Digital Active - scb[4].spi_clk:1 */ + + /* P7.3 */ + P7_3_GPIO = 0, /* GPIO controls 'out' */ + P7_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_3_AMUXA = 4, /* Analog mux bus A */ + P7_3_AMUXB = 5, /* Analog mux bus B */ + P7_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_3_TCPWM0_LINE_COMPL5 = 8, /* Digital Active - tcpwm[0].line_compl[5]:1 */ + P7_3_TCPWM1_LINE_COMPL13 = 9, /* Digital Active - tcpwm[1].line_compl[13]:0 */ + P7_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:49 */ + P7_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:49 */ + P7_3_LCD_COM49 = 12, /* Digital Deep Sleep - lcd.com[49]:0 */ + P7_3_LCD_SEG49 = 13, /* Digital Deep Sleep - lcd.seg[49]:0 */ + P7_3_SCB4_UART_CTS = 18, /* Digital Active - scb[4].uart_cts:1 */ + P7_3_SCB4_SPI_SELECT0 = 20, /* Digital Active - scb[4].spi_select0:1 */ + + /* P7.4 */ + P7_4_GPIO = 0, /* GPIO controls 'out' */ + P7_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_4_AMUXA = 4, /* Analog mux bus A */ + P7_4_AMUXB = 5, /* Analog mux bus B */ + P7_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_4_TCPWM0_LINE6 = 8, /* Digital Active - tcpwm[0].line[6]:1 */ + P7_4_TCPWM1_LINE14 = 9, /* Digital Active - tcpwm[1].line[14]:0 */ + P7_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:50 */ + P7_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:50 */ + P7_4_LCD_COM50 = 12, /* Digital Deep Sleep - lcd.com[50]:0 */ + P7_4_LCD_SEG50 = 13, /* Digital Deep Sleep - lcd.seg[50]:0 */ + P7_4_SCB4_SPI_SELECT1 = 20, /* Digital Active - scb[4].spi_select1:1 */ + P7_4_BLESS_EXT_LNA_RX_CTL_OUT = 26, /* Digital Active - bless.ext_lna_rx_ctl_out */ + P7_4_CPUSS_TRACE_DATA3 = 27, /* Digital Active - cpuss.trace_data[3]:2 */ + + /* P7.5 */ + P7_5_GPIO = 0, /* GPIO controls 'out' */ + P7_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_5_AMUXA = 4, /* Analog mux bus A */ + P7_5_AMUXB = 5, /* Analog mux bus B */ + P7_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_5_TCPWM0_LINE_COMPL6 = 8, /* Digital Active - tcpwm[0].line_compl[6]:1 */ + P7_5_TCPWM1_LINE_COMPL14 = 9, /* Digital Active - tcpwm[1].line_compl[14]:0 */ + P7_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:51 */ + P7_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:51 */ + P7_5_LCD_COM51 = 12, /* Digital Deep Sleep - lcd.com[51]:0 */ + P7_5_LCD_SEG51 = 13, /* Digital Deep Sleep - lcd.seg[51]:0 */ + P7_5_SCB4_SPI_SELECT2 = 20, /* Digital Active - scb[4].spi_select2:1 */ + P7_5_BLESS_EXT_PA_TX_CTL_OUT = 26, /* Digital Active - bless.ext_pa_tx_ctl_out */ + P7_5_CPUSS_TRACE_DATA2 = 27, /* Digital Active - cpuss.trace_data[2]:2 */ + + /* P7.6 */ + P7_6_GPIO = 0, /* GPIO controls 'out' */ + P7_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_6_AMUXA = 4, /* Analog mux bus A */ + P7_6_AMUXB = 5, /* Analog mux bus B */ + P7_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_6_TCPWM0_LINE7 = 8, /* Digital Active - tcpwm[0].line[7]:1 */ + P7_6_TCPWM1_LINE15 = 9, /* Digital Active - tcpwm[1].line[15]:0 */ + P7_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:52 */ + P7_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:52 */ + P7_6_LCD_COM52 = 12, /* Digital Deep Sleep - lcd.com[52]:0 */ + P7_6_LCD_SEG52 = 13, /* Digital Deep Sleep - lcd.seg[52]:0 */ + P7_6_SCB4_SPI_SELECT3 = 20, /* Digital Active - scb[4].spi_select3:1 */ + P7_6_BLESS_EXT_PA_LNA_CHIP_EN_OUT = 26, /* Digital Active - bless.ext_pa_lna_chip_en_out */ + P7_6_CPUSS_TRACE_DATA1 = 27, /* Digital Active - cpuss.trace_data[1]:2 */ + + /* P7.7 */ + P7_7_GPIO = 0, /* GPIO controls 'out' */ + P7_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_7_AMUXA = 4, /* Analog mux bus A */ + P7_7_AMUXB = 5, /* Analog mux bus B */ + P7_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_7_TCPWM0_LINE_COMPL7 = 8, /* Digital Active - tcpwm[0].line_compl[7]:1 */ + P7_7_TCPWM1_LINE_COMPL15 = 9, /* Digital Active - tcpwm[1].line_compl[15]:0 */ + P7_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:53 */ + P7_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:53 */ + P7_7_LCD_COM53 = 12, /* Digital Deep Sleep - lcd.com[53]:0 */ + P7_7_LCD_SEG53 = 13, /* Digital Deep Sleep - lcd.seg[53]:0 */ + P7_7_SCB3_SPI_SELECT1 = 20, /* Digital Active - scb[3].spi_select1:0 */ + P7_7_CPUSS_CLK_FM_PUMP = 21, /* Digital Active - cpuss.clk_fm_pump */ + P7_7_CPUSS_TRACE_DATA0 = 27, /* Digital Active - cpuss.trace_data[0]:2 */ + + /* P8.0 */ + P8_0_GPIO = 0, /* GPIO controls 'out' */ + P8_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_0_AMUXA = 4, /* Analog mux bus A */ + P8_0_AMUXB = 5, /* Analog mux bus B */ + P8_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_0_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:2 */ + P8_0_TCPWM1_LINE16 = 9, /* Digital Active - tcpwm[1].line[16]:0 */ + P8_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:54 */ + P8_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:54 */ + P8_0_LCD_COM54 = 12, /* Digital Deep Sleep - lcd.com[54]:0 */ + P8_0_LCD_SEG54 = 13, /* Digital Deep Sleep - lcd.seg[54]:0 */ + P8_0_SCB4_UART_RX = 18, /* Digital Active - scb[4].uart_rx:0 */ + P8_0_SCB4_I2C_SCL = 19, /* Digital Active - scb[4].i2c_scl:0 */ + P8_0_SCB4_SPI_MOSI = 20, /* Digital Active - scb[4].spi_mosi:0 */ + P8_0_PERI_TR_IO_INPUT16 = 24, /* Digital Active - peri.tr_io_input[16]:0 */ + + /* P8.1 */ + P8_1_GPIO = 0, /* GPIO controls 'out' */ + P8_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_1_AMUXA = 4, /* Analog mux bus A */ + P8_1_AMUXB = 5, /* Analog mux bus B */ + P8_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_1_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:2 */ + P8_1_TCPWM1_LINE_COMPL16 = 9, /* Digital Active - tcpwm[1].line_compl[16]:0 */ + P8_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:55 */ + P8_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:55 */ + P8_1_LCD_COM55 = 12, /* Digital Deep Sleep - lcd.com[55]:0 */ + P8_1_LCD_SEG55 = 13, /* Digital Deep Sleep - lcd.seg[55]:0 */ + P8_1_SCB4_UART_TX = 18, /* Digital Active - scb[4].uart_tx:0 */ + P8_1_SCB4_I2C_SDA = 19, /* Digital Active - scb[4].i2c_sda:0 */ + P8_1_SCB4_SPI_MISO = 20, /* Digital Active - scb[4].spi_miso:0 */ + P8_1_PERI_TR_IO_INPUT17 = 24, /* Digital Active - peri.tr_io_input[17]:0 */ + + /* P8.2 */ + P8_2_GPIO = 0, /* GPIO controls 'out' */ + P8_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_2_AMUXA = 4, /* Analog mux bus A */ + P8_2_AMUXB = 5, /* Analog mux bus B */ + P8_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_2_TCPWM0_LINE1 = 8, /* Digital Active - tcpwm[0].line[1]:2 */ + P8_2_TCPWM1_LINE17 = 9, /* Digital Active - tcpwm[1].line[17]:0 */ + P8_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:56 */ + P8_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:56 */ + P8_2_LCD_COM56 = 12, /* Digital Deep Sleep - lcd.com[56]:0 */ + P8_2_LCD_SEG56 = 13, /* Digital Deep Sleep - lcd.seg[56]:0 */ + P8_2_LPCOMP_DSI_COMP0 = 15, /* Digital Deep Sleep - lpcomp.dsi_comp0:0 */ + P8_2_SCB4_UART_RTS = 18, /* Digital Active - scb[4].uart_rts:0 */ + P8_2_SCB4_SPI_CLK = 20, /* Digital Active - scb[4].spi_clk:0 */ + + /* P8.3 */ + P8_3_GPIO = 0, /* GPIO controls 'out' */ + P8_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_3_AMUXA = 4, /* Analog mux bus A */ + P8_3_AMUXB = 5, /* Analog mux bus B */ + P8_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_3_TCPWM0_LINE_COMPL1 = 8, /* Digital Active - tcpwm[0].line_compl[1]:2 */ + P8_3_TCPWM1_LINE_COMPL17 = 9, /* Digital Active - tcpwm[1].line_compl[17]:0 */ + P8_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:57 */ + P8_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:57 */ + P8_3_LCD_COM57 = 12, /* Digital Deep Sleep - lcd.com[57]:0 */ + P8_3_LCD_SEG57 = 13, /* Digital Deep Sleep - lcd.seg[57]:0 */ + P8_3_LPCOMP_DSI_COMP1 = 15, /* Digital Deep Sleep - lpcomp.dsi_comp1:0 */ + P8_3_SCB4_UART_CTS = 18, /* Digital Active - scb[4].uart_cts:0 */ + P8_3_SCB4_SPI_SELECT0 = 20, /* Digital Active - scb[4].spi_select0:0 */ + + /* P8.4 */ + P8_4_GPIO = 0, /* GPIO controls 'out' */ + P8_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_4_AMUXA = 4, /* Analog mux bus A */ + P8_4_AMUXB = 5, /* Analog mux bus B */ + P8_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_4_TCPWM0_LINE2 = 8, /* Digital Active - tcpwm[0].line[2]:2 */ + P8_4_TCPWM1_LINE18 = 9, /* Digital Active - tcpwm[1].line[18]:0 */ + P8_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:58 */ + P8_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:58 */ + P8_4_LCD_COM58 = 12, /* Digital Deep Sleep - lcd.com[58]:0 */ + P8_4_LCD_SEG58 = 13, /* Digital Deep Sleep - lcd.seg[58]:0 */ + P8_4_SCB4_SPI_SELECT1 = 20, /* Digital Active - scb[4].spi_select1:0 */ + + /* P8.5 */ + P8_5_GPIO = 0, /* GPIO controls 'out' */ + P8_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_5_AMUXA = 4, /* Analog mux bus A */ + P8_5_AMUXB = 5, /* Analog mux bus B */ + P8_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_5_TCPWM0_LINE_COMPL2 = 8, /* Digital Active - tcpwm[0].line_compl[2]:2 */ + P8_5_TCPWM1_LINE_COMPL18 = 9, /* Digital Active - tcpwm[1].line_compl[18]:0 */ + P8_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:59 */ + P8_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:59 */ + P8_5_LCD_COM59 = 12, /* Digital Deep Sleep - lcd.com[59]:0 */ + P8_5_LCD_SEG59 = 13, /* Digital Deep Sleep - lcd.seg[59]:0 */ + P8_5_SCB4_SPI_SELECT2 = 20, /* Digital Active - scb[4].spi_select2:0 */ + + /* P8.6 */ + P8_6_GPIO = 0, /* GPIO controls 'out' */ + P8_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_6_AMUXA = 4, /* Analog mux bus A */ + P8_6_AMUXB = 5, /* Analog mux bus B */ + P8_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_6_TCPWM0_LINE3 = 8, /* Digital Active - tcpwm[0].line[3]:2 */ + P8_6_TCPWM1_LINE19 = 9, /* Digital Active - tcpwm[1].line[19]:0 */ + P8_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:60 */ + P8_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:60 */ + P8_6_LCD_COM60 = 12, /* Digital Deep Sleep - lcd.com[60]:0 */ + P8_6_LCD_SEG60 = 13, /* Digital Deep Sleep - lcd.seg[60]:0 */ + P8_6_SCB4_SPI_SELECT3 = 20, /* Digital Active - scb[4].spi_select3:0 */ + + /* P8.7 */ + P8_7_GPIO = 0, /* GPIO controls 'out' */ + P8_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_7_AMUXA = 4, /* Analog mux bus A */ + P8_7_AMUXB = 5, /* Analog mux bus B */ + P8_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_7_TCPWM0_LINE_COMPL3 = 8, /* Digital Active - tcpwm[0].line_compl[3]:2 */ + P8_7_TCPWM1_LINE_COMPL19 = 9, /* Digital Active - tcpwm[1].line_compl[19]:0 */ + P8_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:61 */ + P8_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:61 */ + P8_7_LCD_COM61 = 12, /* Digital Deep Sleep - lcd.com[61]:0 */ + P8_7_LCD_SEG61 = 13, /* Digital Deep Sleep - lcd.seg[61]:0 */ + P8_7_SCB3_SPI_SELECT2 = 20, /* Digital Active - scb[3].spi_select2:0 */ + + /* P9.0 */ + P9_0_GPIO = 0, /* GPIO controls 'out' */ + P9_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_0_AMUXA = 4, /* Analog mux bus A */ + P9_0_AMUXB = 5, /* Analog mux bus B */ + P9_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_0_TCPWM0_LINE4 = 8, /* Digital Active - tcpwm[0].line[4]:2 */ + P9_0_TCPWM1_LINE20 = 9, /* Digital Active - tcpwm[1].line[20]:0 */ + P9_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:62 */ + P9_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:62 */ + P9_0_LCD_COM0 = 12, /* Digital Deep Sleep - lcd.com[0]:1 */ + P9_0_LCD_SEG0 = 13, /* Digital Deep Sleep - lcd.seg[0]:1 */ + P9_0_SCB2_UART_RX = 18, /* Digital Active - scb[2].uart_rx:0 */ + P9_0_SCB2_I2C_SCL = 19, /* Digital Active - scb[2].i2c_scl:0 */ + P9_0_SCB2_SPI_MOSI = 20, /* Digital Active - scb[2].spi_mosi:0 */ + P9_0_PERI_TR_IO_INPUT18 = 24, /* Digital Active - peri.tr_io_input[18]:0 */ + P9_0_CPUSS_TRACE_DATA3 = 27, /* Digital Active - cpuss.trace_data[3]:0 */ + + /* P9.1 */ + P9_1_GPIO = 0, /* GPIO controls 'out' */ + P9_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_1_AMUXA = 4, /* Analog mux bus A */ + P9_1_AMUXB = 5, /* Analog mux bus B */ + P9_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_1_TCPWM0_LINE_COMPL4 = 8, /* Digital Active - tcpwm[0].line_compl[4]:2 */ + P9_1_TCPWM1_LINE_COMPL20 = 9, /* Digital Active - tcpwm[1].line_compl[20]:0 */ + P9_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:63 */ + P9_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:63 */ + P9_1_LCD_COM1 = 12, /* Digital Deep Sleep - lcd.com[1]:1 */ + P9_1_LCD_SEG1 = 13, /* Digital Deep Sleep - lcd.seg[1]:1 */ + P9_1_SCB2_UART_TX = 18, /* Digital Active - scb[2].uart_tx:0 */ + P9_1_SCB2_I2C_SDA = 19, /* Digital Active - scb[2].i2c_sda:0 */ + P9_1_SCB2_SPI_MISO = 20, /* Digital Active - scb[2].spi_miso:0 */ + P9_1_PERI_TR_IO_INPUT19 = 24, /* Digital Active - peri.tr_io_input[19]:0 */ + P9_1_CPUSS_TRACE_DATA2 = 27, /* Digital Active - cpuss.trace_data[2]:0 */ + P9_1_SRSS_DDFT_PIN_IN0 = 31, /* Digital Deep Sleep - srss.ddft_pin_in[0]:1 */ + + /* P9.2 */ + P9_2_GPIO = 0, /* GPIO controls 'out' */ + P9_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_2_AMUXA = 4, /* Analog mux bus A */ + P9_2_AMUXB = 5, /* Analog mux bus B */ + P9_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_2_TCPWM0_LINE5 = 8, /* Digital Active - tcpwm[0].line[5]:2 */ + P9_2_TCPWM1_LINE21 = 9, /* Digital Active - tcpwm[1].line[21]:0 */ + P9_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:64 */ + P9_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:64 */ + P9_2_LCD_COM2 = 12, /* Digital Deep Sleep - lcd.com[2]:1 */ + P9_2_LCD_SEG2 = 13, /* Digital Deep Sleep - lcd.seg[2]:1 */ + P9_2_SCB2_UART_RTS = 18, /* Digital Active - scb[2].uart_rts:0 */ + P9_2_SCB2_SPI_CLK = 20, /* Digital Active - scb[2].spi_clk:0 */ + P9_2_PASS_DSI_CTB_CMP0 = 22, /* Digital Active - pass.dsi_ctb_cmp0:1 */ + P9_2_CPUSS_TRACE_DATA1 = 27, /* Digital Active - cpuss.trace_data[1]:0 */ + + /* P9.3 */ + P9_3_GPIO = 0, /* GPIO controls 'out' */ + P9_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_3_AMUXA = 4, /* Analog mux bus A */ + P9_3_AMUXB = 5, /* Analog mux bus B */ + P9_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_3_TCPWM0_LINE_COMPL5 = 8, /* Digital Active - tcpwm[0].line_compl[5]:2 */ + P9_3_TCPWM1_LINE_COMPL21 = 9, /* Digital Active - tcpwm[1].line_compl[21]:0 */ + P9_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:65 */ + P9_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:65 */ + P9_3_LCD_COM3 = 12, /* Digital Deep Sleep - lcd.com[3]:1 */ + P9_3_LCD_SEG3 = 13, /* Digital Deep Sleep - lcd.seg[3]:1 */ + P9_3_SCB2_UART_CTS = 18, /* Digital Active - scb[2].uart_cts:0 */ + P9_3_SCB2_SPI_SELECT0 = 20, /* Digital Active - scb[2].spi_select0:0 */ + P9_3_PASS_DSI_CTB_CMP1 = 22, /* Digital Active - pass.dsi_ctb_cmp1:1 */ + P9_3_CPUSS_TRACE_DATA0 = 27, /* Digital Active - cpuss.trace_data[0]:0 */ + P9_3_SRSS_DDFT_PIN_IN1 = 31, /* Digital Deep Sleep - srss.ddft_pin_in[1]:1 */ + + /* P9.4 */ + P9_4_GPIO = 0, /* GPIO controls 'out' */ + P9_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_4_AMUXA = 4, /* Analog mux bus A */ + P9_4_AMUXB = 5, /* Analog mux bus B */ + P9_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_4_TCPWM0_LINE7 = 8, /* Digital Active - tcpwm[0].line[7]:5 */ + P9_4_TCPWM1_LINE0 = 9, /* Digital Active - tcpwm[1].line[0]:2 */ + P9_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:66 */ + P9_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:66 */ + P9_4_LCD_COM4 = 12, /* Digital Deep Sleep - lcd.com[4]:1 */ + P9_4_LCD_SEG4 = 13, /* Digital Deep Sleep - lcd.seg[4]:1 */ + P9_4_SCB2_SPI_SELECT1 = 20, /* Digital Active - scb[2].spi_select1:0 */ + + /* P9.5 */ + P9_5_GPIO = 0, /* GPIO controls 'out' */ + P9_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_5_AMUXA = 4, /* Analog mux bus A */ + P9_5_AMUXB = 5, /* Analog mux bus B */ + P9_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_5_TCPWM0_LINE_COMPL7 = 8, /* Digital Active - tcpwm[0].line_compl[7]:5 */ + P9_5_TCPWM1_LINE_COMPL0 = 9, /* Digital Active - tcpwm[1].line_compl[0]:2 */ + P9_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:67 */ + P9_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:67 */ + P9_5_LCD_COM5 = 12, /* Digital Deep Sleep - lcd.com[5]:1 */ + P9_5_LCD_SEG5 = 13, /* Digital Deep Sleep - lcd.seg[5]:1 */ + P9_5_SCB2_SPI_SELECT2 = 20, /* Digital Active - scb[2].spi_select2:0 */ + + /* P9.6 */ + P9_6_GPIO = 0, /* GPIO controls 'out' */ + P9_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_6_AMUXA = 4, /* Analog mux bus A */ + P9_6_AMUXB = 5, /* Analog mux bus B */ + P9_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_6_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:6 */ + P9_6_TCPWM1_LINE1 = 9, /* Digital Active - tcpwm[1].line[1]:2 */ + P9_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:68 */ + P9_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:68 */ + P9_6_LCD_COM6 = 12, /* Digital Deep Sleep - lcd.com[6]:1 */ + P9_6_LCD_SEG6 = 13, /* Digital Deep Sleep - lcd.seg[6]:1 */ + P9_6_SCB2_SPI_SELECT3 = 20, /* Digital Active - scb[2].spi_select3:0 */ + + /* P9.7 */ + P9_7_GPIO = 0, /* GPIO controls 'out' */ + P9_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_7_AMUXA = 4, /* Analog mux bus A */ + P9_7_AMUXB = 5, /* Analog mux bus B */ + P9_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_7_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:6 */ + P9_7_TCPWM1_LINE_COMPL1 = 9, /* Digital Active - tcpwm[1].line_compl[1]:2 */ + P9_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:69 */ + P9_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:69 */ + P9_7_LCD_COM7 = 12, /* Digital Deep Sleep - lcd.com[7]:1 */ + P9_7_LCD_SEG7 = 13, /* Digital Deep Sleep - lcd.seg[7]:1 */ + + /* P10.0 */ + P10_0_GPIO = 0, /* GPIO controls 'out' */ + P10_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_0_AMUXA = 4, /* Analog mux bus A */ + P10_0_AMUXB = 5, /* Analog mux bus B */ + P10_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_0_TCPWM0_LINE6 = 8, /* Digital Active - tcpwm[0].line[6]:2 */ + P10_0_TCPWM1_LINE22 = 9, /* Digital Active - tcpwm[1].line[22]:0 */ + P10_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:70 */ + P10_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:70 */ + P10_0_LCD_COM8 = 12, /* Digital Deep Sleep - lcd.com[8]:1 */ + P10_0_LCD_SEG8 = 13, /* Digital Deep Sleep - lcd.seg[8]:1 */ + P10_0_SCB1_UART_RX = 18, /* Digital Active - scb[1].uart_rx:1 */ + P10_0_SCB1_I2C_SCL = 19, /* Digital Active - scb[1].i2c_scl:1 */ + P10_0_SCB1_SPI_MOSI = 20, /* Digital Active - scb[1].spi_mosi:1 */ + P10_0_PERI_TR_IO_INPUT20 = 24, /* Digital Active - peri.tr_io_input[20]:0 */ + P10_0_CPUSS_TRACE_DATA3 = 27, /* Digital Active - cpuss.trace_data[3]:1 */ + + /* P10.1 */ + P10_1_GPIO = 0, /* GPIO controls 'out' */ + P10_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_1_AMUXA = 4, /* Analog mux bus A */ + P10_1_AMUXB = 5, /* Analog mux bus B */ + P10_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_1_TCPWM0_LINE_COMPL6 = 8, /* Digital Active - tcpwm[0].line_compl[6]:2 */ + P10_1_TCPWM1_LINE_COMPL22 = 9, /* Digital Active - tcpwm[1].line_compl[22]:0 */ + P10_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:71 */ + P10_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:71 */ + P10_1_LCD_COM9 = 12, /* Digital Deep Sleep - lcd.com[9]:1 */ + P10_1_LCD_SEG9 = 13, /* Digital Deep Sleep - lcd.seg[9]:1 */ + P10_1_SCB1_UART_TX = 18, /* Digital Active - scb[1].uart_tx:1 */ + P10_1_SCB1_I2C_SDA = 19, /* Digital Active - scb[1].i2c_sda:1 */ + P10_1_SCB1_SPI_MISO = 20, /* Digital Active - scb[1].spi_miso:1 */ + P10_1_PERI_TR_IO_INPUT21 = 24, /* Digital Active - peri.tr_io_input[21]:0 */ + P10_1_CPUSS_TRACE_DATA2 = 27, /* Digital Active - cpuss.trace_data[2]:1 */ + + /* P10.2 */ + P10_2_GPIO = 0, /* GPIO controls 'out' */ + P10_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_2_AMUXA = 4, /* Analog mux bus A */ + P10_2_AMUXB = 5, /* Analog mux bus B */ + P10_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_2_TCPWM0_LINE7 = 8, /* Digital Active - tcpwm[0].line[7]:2 */ + P10_2_TCPWM1_LINE23 = 9, /* Digital Active - tcpwm[1].line[23]:0 */ + P10_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:72 */ + P10_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:72 */ + P10_2_LCD_COM10 = 12, /* Digital Deep Sleep - lcd.com[10]:1 */ + P10_2_LCD_SEG10 = 13, /* Digital Deep Sleep - lcd.seg[10]:1 */ + P10_2_SCB1_UART_RTS = 18, /* Digital Active - scb[1].uart_rts:1 */ + P10_2_SCB1_SPI_CLK = 20, /* Digital Active - scb[1].spi_clk:1 */ + P10_2_CPUSS_TRACE_DATA1 = 27, /* Digital Active - cpuss.trace_data[1]:1 */ + + /* P10.3 */ + P10_3_GPIO = 0, /* GPIO controls 'out' */ + P10_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_3_AMUXA = 4, /* Analog mux bus A */ + P10_3_AMUXB = 5, /* Analog mux bus B */ + P10_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_3_TCPWM0_LINE_COMPL7 = 8, /* Digital Active - tcpwm[0].line_compl[7]:2 */ + P10_3_TCPWM1_LINE_COMPL23 = 9, /* Digital Active - tcpwm[1].line_compl[23]:0 */ + P10_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:73 */ + P10_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:73 */ + P10_3_LCD_COM11 = 12, /* Digital Deep Sleep - lcd.com[11]:1 */ + P10_3_LCD_SEG11 = 13, /* Digital Deep Sleep - lcd.seg[11]:1 */ + P10_3_SCB1_UART_CTS = 18, /* Digital Active - scb[1].uart_cts:1 */ + P10_3_SCB1_SPI_SELECT0 = 20, /* Digital Active - scb[1].spi_select0:1 */ + P10_3_CPUSS_TRACE_DATA0 = 27, /* Digital Active - cpuss.trace_data[0]:1 */ + + /* P10.4 */ + P10_4_GPIO = 0, /* GPIO controls 'out' */ + P10_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_4_AMUXA = 4, /* Analog mux bus A */ + P10_4_AMUXB = 5, /* Analog mux bus B */ + P10_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_4_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:3 */ + P10_4_TCPWM1_LINE0 = 9, /* Digital Active - tcpwm[1].line[0]:1 */ + P10_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:74 */ + P10_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:74 */ + P10_4_LCD_COM12 = 12, /* Digital Deep Sleep - lcd.com[12]:1 */ + P10_4_LCD_SEG12 = 13, /* Digital Deep Sleep - lcd.seg[12]:1 */ + P10_4_SCB1_SPI_SELECT1 = 20, /* Digital Active - scb[1].spi_select1:1 */ + P10_4_AUDIOSS_PDM_CLK = 21, /* Digital Active - audioss.pdm_clk */ + + /* P10.5 */ + P10_5_GPIO = 0, /* GPIO controls 'out' */ + P10_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_5_AMUXA = 4, /* Analog mux bus A */ + P10_5_AMUXB = 5, /* Analog mux bus B */ + P10_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_5_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:3 */ + P10_5_TCPWM1_LINE_COMPL0 = 9, /* Digital Active - tcpwm[1].line_compl[0]:1 */ + P10_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:75 */ + P10_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:75 */ + P10_5_LCD_COM13 = 12, /* Digital Deep Sleep - lcd.com[13]:1 */ + P10_5_LCD_SEG13 = 13, /* Digital Deep Sleep - lcd.seg[13]:1 */ + P10_5_SCB1_SPI_SELECT2 = 20, /* Digital Active - scb[1].spi_select2:1 */ + P10_5_AUDIOSS_PDM_DATA = 21, /* Digital Active - audioss.pdm_data */ + + /* P10.6 */ + P10_6_GPIO = 0, /* GPIO controls 'out' */ + P10_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_6_AMUXA = 4, /* Analog mux bus A */ + P10_6_AMUXB = 5, /* Analog mux bus B */ + P10_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_6_TCPWM0_LINE1 = 8, /* Digital Active - tcpwm[0].line[1]:6 */ + P10_6_TCPWM1_LINE2 = 9, /* Digital Active - tcpwm[1].line[2]:2 */ + P10_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:76 */ + P10_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:76 */ + P10_6_LCD_COM14 = 12, /* Digital Deep Sleep - lcd.com[14]:1 */ + P10_6_LCD_SEG14 = 13, /* Digital Deep Sleep - lcd.seg[14]:1 */ + P10_6_SCB1_SPI_SELECT3 = 20, /* Digital Active - scb[1].spi_select3:1 */ + + /* P11.0 */ + P11_0_GPIO = 0, /* GPIO controls 'out' */ + P11_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_0_AMUXA = 4, /* Analog mux bus A */ + P11_0_AMUXB = 5, /* Analog mux bus B */ + P11_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_0_TCPWM0_LINE1 = 8, /* Digital Active - tcpwm[0].line[1]:3 */ + P11_0_TCPWM1_LINE1 = 9, /* Digital Active - tcpwm[1].line[1]:1 */ + P11_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:78 */ + P11_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:78 */ + P11_0_LCD_COM16 = 12, /* Digital Deep Sleep - lcd.com[16]:1 */ + P11_0_LCD_SEG16 = 13, /* Digital Deep Sleep - lcd.seg[16]:1 */ + P11_0_SMIF_SPI_SELECT2 = 17, /* Digital Active - smif.spi_select2 */ + P11_0_SCB5_UART_RX = 18, /* Digital Active - scb[5].uart_rx:1 */ + P11_0_SCB5_I2C_SCL = 19, /* Digital Active - scb[5].i2c_scl:1 */ + P11_0_SCB5_SPI_MOSI = 20, /* Digital Active - scb[5].spi_mosi:1 */ + P11_0_PERI_TR_IO_INPUT22 = 24, /* Digital Active - peri.tr_io_input[22]:0 */ + + /* P11.1 */ + P11_1_GPIO = 0, /* GPIO controls 'out' */ + P11_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_1_AMUXA = 4, /* Analog mux bus A */ + P11_1_AMUXB = 5, /* Analog mux bus B */ + P11_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_1_TCPWM0_LINE_COMPL1 = 8, /* Digital Active - tcpwm[0].line_compl[1]:3 */ + P11_1_TCPWM1_LINE_COMPL1 = 9, /* Digital Active - tcpwm[1].line_compl[1]:1 */ + P11_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:79 */ + P11_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:79 */ + P11_1_LCD_COM17 = 12, /* Digital Deep Sleep - lcd.com[17]:1 */ + P11_1_LCD_SEG17 = 13, /* Digital Deep Sleep - lcd.seg[17]:1 */ + P11_1_SMIF_SPI_SELECT1 = 17, /* Digital Active - smif.spi_select1 */ + P11_1_SCB5_UART_TX = 18, /* Digital Active - scb[5].uart_tx:1 */ + P11_1_SCB5_I2C_SDA = 19, /* Digital Active - scb[5].i2c_sda:1 */ + P11_1_SCB5_SPI_MISO = 20, /* Digital Active - scb[5].spi_miso:1 */ + P11_1_PERI_TR_IO_INPUT23 = 24, /* Digital Active - peri.tr_io_input[23]:0 */ + + /* P11.2 */ + P11_2_GPIO = 0, /* GPIO controls 'out' */ + P11_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_2_AMUXA = 4, /* Analog mux bus A */ + P11_2_AMUXB = 5, /* Analog mux bus B */ + P11_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_2_TCPWM0_LINE2 = 8, /* Digital Active - tcpwm[0].line[2]:3 */ + P11_2_TCPWM1_LINE2 = 9, /* Digital Active - tcpwm[1].line[2]:1 */ + P11_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:80 */ + P11_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:80 */ + P11_2_LCD_COM18 = 12, /* Digital Deep Sleep - lcd.com[18]:1 */ + P11_2_LCD_SEG18 = 13, /* Digital Deep Sleep - lcd.seg[18]:1 */ + P11_2_SMIF_SPI_SELECT0 = 17, /* Digital Active - smif.spi_select0 */ + P11_2_SCB5_UART_RTS = 18, /* Digital Active - scb[5].uart_rts:1 */ + P11_2_SCB5_SPI_CLK = 20, /* Digital Active - scb[5].spi_clk:1 */ + + /* P11.3 */ + P11_3_GPIO = 0, /* GPIO controls 'out' */ + P11_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_3_AMUXA = 4, /* Analog mux bus A */ + P11_3_AMUXB = 5, /* Analog mux bus B */ + P11_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_3_TCPWM0_LINE_COMPL2 = 8, /* Digital Active - tcpwm[0].line_compl[2]:3 */ + P11_3_TCPWM1_LINE_COMPL2 = 9, /* Digital Active - tcpwm[1].line_compl[2]:1 */ + P11_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:81 */ + P11_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:81 */ + P11_3_LCD_COM19 = 12, /* Digital Deep Sleep - lcd.com[19]:1 */ + P11_3_LCD_SEG19 = 13, /* Digital Deep Sleep - lcd.seg[19]:1 */ + P11_3_SMIF_SPI_DATA3 = 17, /* Digital Active - smif.spi_data3 */ + P11_3_SCB5_UART_CTS = 18, /* Digital Active - scb[5].uart_cts:1 */ + P11_3_SCB5_SPI_SELECT0 = 20, /* Digital Active - scb[5].spi_select0:1 */ + P11_3_PERI_TR_IO_OUTPUT0 = 25, /* Digital Active - peri.tr_io_output[0]:0 */ + + /* P11.4 */ + P11_4_GPIO = 0, /* GPIO controls 'out' */ + P11_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_4_AMUXA = 4, /* Analog mux bus A */ + P11_4_AMUXB = 5, /* Analog mux bus B */ + P11_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_4_TCPWM0_LINE3 = 8, /* Digital Active - tcpwm[0].line[3]:3 */ + P11_4_TCPWM1_LINE3 = 9, /* Digital Active - tcpwm[1].line[3]:1 */ + P11_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:82 */ + P11_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:82 */ + P11_4_LCD_COM20 = 12, /* Digital Deep Sleep - lcd.com[20]:1 */ + P11_4_LCD_SEG20 = 13, /* Digital Deep Sleep - lcd.seg[20]:1 */ + P11_4_SMIF_SPI_DATA2 = 17, /* Digital Active - smif.spi_data2 */ + P11_4_SCB5_SPI_SELECT1 = 20, /* Digital Active - scb[5].spi_select1:1 */ + P11_4_PERI_TR_IO_OUTPUT1 = 25, /* Digital Active - peri.tr_io_output[1]:0 */ + + /* P11.5 */ + P11_5_GPIO = 0, /* GPIO controls 'out' */ + P11_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_5_AMUXA = 4, /* Analog mux bus A */ + P11_5_AMUXB = 5, /* Analog mux bus B */ + P11_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_5_TCPWM0_LINE_COMPL3 = 8, /* Digital Active - tcpwm[0].line_compl[3]:3 */ + P11_5_TCPWM1_LINE_COMPL3 = 9, /* Digital Active - tcpwm[1].line_compl[3]:1 */ + P11_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:83 */ + P11_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:83 */ + P11_5_LCD_COM21 = 12, /* Digital Deep Sleep - lcd.com[21]:1 */ + P11_5_LCD_SEG21 = 13, /* Digital Deep Sleep - lcd.seg[21]:1 */ + P11_5_SMIF_SPI_DATA1 = 17, /* Digital Active - smif.spi_data1 */ + P11_5_SCB5_SPI_SELECT2 = 20, /* Digital Active - scb[5].spi_select2:1 */ + + /* P11.6 */ + P11_6_GPIO = 0, /* GPIO controls 'out' */ + P11_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_6_AMUXA = 4, /* Analog mux bus A */ + P11_6_AMUXB = 5, /* Analog mux bus B */ + P11_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:84 */ + P11_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:84 */ + P11_6_LCD_COM22 = 12, /* Digital Deep Sleep - lcd.com[22]:1 */ + P11_6_LCD_SEG22 = 13, /* Digital Deep Sleep - lcd.seg[22]:1 */ + P11_6_SMIF_SPI_DATA0 = 17, /* Digital Active - smif.spi_data0 */ + P11_6_SCB5_SPI_SELECT3 = 20, /* Digital Active - scb[5].spi_select3:1 */ + + /* P11.7 */ + P11_7_GPIO = 0, /* GPIO controls 'out' */ + P11_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_7_AMUXA = 4, /* Analog mux bus A */ + P11_7_AMUXB = 5, /* Analog mux bus B */ + P11_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_7_SMIF_SPI_CLK = 17, /* Digital Active - smif.spi_clk */ + + /* P12.0 */ + P12_0_GPIO = 0, /* GPIO controls 'out' */ + P12_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_0_AMUXA = 4, /* Analog mux bus A */ + P12_0_AMUXB = 5, /* Analog mux bus B */ + P12_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_0_TCPWM0_LINE4 = 8, /* Digital Active - tcpwm[0].line[4]:3 */ + P12_0_TCPWM1_LINE4 = 9, /* Digital Active - tcpwm[1].line[4]:1 */ + P12_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:85 */ + P12_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:85 */ + P12_0_LCD_COM23 = 12, /* Digital Deep Sleep - lcd.com[23]:1 */ + P12_0_LCD_SEG23 = 13, /* Digital Deep Sleep - lcd.seg[23]:1 */ + P12_0_SMIF_SPI_DATA4 = 17, /* Digital Active - smif.spi_data4 */ + P12_0_SCB6_UART_RX = 18, /* Digital Active - scb[6].uart_rx:0 */ + P12_0_SCB6_I2C_SCL = 19, /* Digital Active - scb[6].i2c_scl:0 */ + P12_0_SCB6_SPI_MOSI = 20, /* Digital Active - scb[6].spi_mosi:0 */ + P12_0_PERI_TR_IO_INPUT24 = 24, /* Digital Active - peri.tr_io_input[24]:0 */ + + /* P12.1 */ + P12_1_GPIO = 0, /* GPIO controls 'out' */ + P12_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_1_AMUXA = 4, /* Analog mux bus A */ + P12_1_AMUXB = 5, /* Analog mux bus B */ + P12_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_1_TCPWM0_LINE_COMPL4 = 8, /* Digital Active - tcpwm[0].line_compl[4]:3 */ + P12_1_TCPWM1_LINE_COMPL4 = 9, /* Digital Active - tcpwm[1].line_compl[4]:1 */ + P12_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:86 */ + P12_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:86 */ + P12_1_LCD_COM24 = 12, /* Digital Deep Sleep - lcd.com[24]:1 */ + P12_1_LCD_SEG24 = 13, /* Digital Deep Sleep - lcd.seg[24]:1 */ + P12_1_SMIF_SPI_DATA5 = 17, /* Digital Active - smif.spi_data5 */ + P12_1_SCB6_UART_TX = 18, /* Digital Active - scb[6].uart_tx:0 */ + P12_1_SCB6_I2C_SDA = 19, /* Digital Active - scb[6].i2c_sda:0 */ + P12_1_SCB6_SPI_MISO = 20, /* Digital Active - scb[6].spi_miso:0 */ + P12_1_PERI_TR_IO_INPUT25 = 24, /* Digital Active - peri.tr_io_input[25]:0 */ + + /* P12.2 */ + P12_2_GPIO = 0, /* GPIO controls 'out' */ + P12_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_2_AMUXA = 4, /* Analog mux bus A */ + P12_2_AMUXB = 5, /* Analog mux bus B */ + P12_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_2_TCPWM0_LINE5 = 8, /* Digital Active - tcpwm[0].line[5]:3 */ + P12_2_TCPWM1_LINE5 = 9, /* Digital Active - tcpwm[1].line[5]:1 */ + P12_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:87 */ + P12_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:87 */ + P12_2_LCD_COM25 = 12, /* Digital Deep Sleep - lcd.com[25]:1 */ + P12_2_LCD_SEG25 = 13, /* Digital Deep Sleep - lcd.seg[25]:1 */ + P12_2_SMIF_SPI_DATA6 = 17, /* Digital Active - smif.spi_data6 */ + P12_2_SCB6_UART_RTS = 18, /* Digital Active - scb[6].uart_rts:0 */ + P12_2_SCB6_SPI_CLK = 20, /* Digital Active - scb[6].spi_clk:0 */ + + /* P12.3 */ + P12_3_GPIO = 0, /* GPIO controls 'out' */ + P12_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_3_AMUXA = 4, /* Analog mux bus A */ + P12_3_AMUXB = 5, /* Analog mux bus B */ + P12_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_3_TCPWM0_LINE_COMPL5 = 8, /* Digital Active - tcpwm[0].line_compl[5]:3 */ + P12_3_TCPWM1_LINE_COMPL5 = 9, /* Digital Active - tcpwm[1].line_compl[5]:1 */ + P12_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:88 */ + P12_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:88 */ + P12_3_LCD_COM26 = 12, /* Digital Deep Sleep - lcd.com[26]:1 */ + P12_3_LCD_SEG26 = 13, /* Digital Deep Sleep - lcd.seg[26]:1 */ + P12_3_SMIF_SPI_DATA7 = 17, /* Digital Active - smif.spi_data7 */ + P12_3_SCB6_UART_CTS = 18, /* Digital Active - scb[6].uart_cts:0 */ + P12_3_SCB6_SPI_SELECT0 = 20, /* Digital Active - scb[6].spi_select0:0 */ + + /* P12.4 */ + P12_4_GPIO = 0, /* GPIO controls 'out' */ + P12_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_4_AMUXA = 4, /* Analog mux bus A */ + P12_4_AMUXB = 5, /* Analog mux bus B */ + P12_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_4_TCPWM0_LINE6 = 8, /* Digital Active - tcpwm[0].line[6]:3 */ + P12_4_TCPWM1_LINE6 = 9, /* Digital Active - tcpwm[1].line[6]:1 */ + P12_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:89 */ + P12_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:89 */ + P12_4_LCD_COM27 = 12, /* Digital Deep Sleep - lcd.com[27]:1 */ + P12_4_LCD_SEG27 = 13, /* Digital Deep Sleep - lcd.seg[27]:1 */ + P12_4_SMIF_SPI_SELECT3 = 17, /* Digital Active - smif.spi_select3 */ + P12_4_SCB6_SPI_SELECT1 = 20, /* Digital Active - scb[6].spi_select1:0 */ + + /* P12.5 */ + P12_5_GPIO = 0, /* GPIO controls 'out' */ + P12_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_5_AMUXA = 4, /* Analog mux bus A */ + P12_5_AMUXB = 5, /* Analog mux bus B */ + P12_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_5_TCPWM0_LINE_COMPL6 = 8, /* Digital Active - tcpwm[0].line_compl[6]:3 */ + P12_5_TCPWM1_LINE_COMPL6 = 9, /* Digital Active - tcpwm[1].line_compl[6]:1 */ + P12_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:90 */ + P12_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:90 */ + P12_5_LCD_COM28 = 12, /* Digital Deep Sleep - lcd.com[28]:1 */ + P12_5_LCD_SEG28 = 13, /* Digital Deep Sleep - lcd.seg[28]:1 */ + P12_5_SCB6_SPI_SELECT2 = 20, /* Digital Active - scb[6].spi_select2:0 */ + + /* P12.6 */ + P12_6_GPIO = 0, /* GPIO controls 'out' */ + P12_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_6_AMUXA = 4, /* Analog mux bus A */ + P12_6_AMUXB = 5, /* Analog mux bus B */ + P12_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_6_TCPWM0_LINE7 = 8, /* Digital Active - tcpwm[0].line[7]:3 */ + P12_6_TCPWM1_LINE7 = 9, /* Digital Active - tcpwm[1].line[7]:1 */ + P12_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:91 */ + P12_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:91 */ + P12_6_LCD_COM29 = 12, /* Digital Deep Sleep - lcd.com[29]:1 */ + P12_6_LCD_SEG29 = 13, /* Digital Deep Sleep - lcd.seg[29]:1 */ + P12_6_SCB6_SPI_SELECT3 = 20, /* Digital Active - scb[6].spi_select3:0 */ + + /* P12.7 */ + P12_7_GPIO = 0, /* GPIO controls 'out' */ + P12_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_7_AMUXA = 4, /* Analog mux bus A */ + P12_7_AMUXB = 5, /* Analog mux bus B */ + P12_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_7_TCPWM0_LINE_COMPL7 = 8, /* Digital Active - tcpwm[0].line_compl[7]:3 */ + P12_7_TCPWM1_LINE_COMPL7 = 9, /* Digital Active - tcpwm[1].line_compl[7]:1 */ + P12_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:92 */ + P12_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:92 */ + P12_7_LCD_COM30 = 12, /* Digital Deep Sleep - lcd.com[30]:1 */ + P12_7_LCD_SEG30 = 13, /* Digital Deep Sleep - lcd.seg[30]:1 */ + + /* P13.0 */ + P13_0_GPIO = 0, /* GPIO controls 'out' */ + P13_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P13_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P13_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P13_0_AMUXA = 4, /* Analog mux bus A */ + P13_0_AMUXB = 5, /* Analog mux bus B */ + P13_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P13_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P13_0_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:4 */ + P13_0_TCPWM1_LINE8 = 9, /* Digital Active - tcpwm[1].line[8]:1 */ + P13_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:93 */ + P13_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:93 */ + P13_0_LCD_COM31 = 12, /* Digital Deep Sleep - lcd.com[31]:1 */ + P13_0_LCD_SEG31 = 13, /* Digital Deep Sleep - lcd.seg[31]:1 */ + P13_0_SCB6_UART_RX = 18, /* Digital Active - scb[6].uart_rx:1 */ + P13_0_SCB6_I2C_SCL = 19, /* Digital Active - scb[6].i2c_scl:1 */ + P13_0_SCB6_SPI_MOSI = 20, /* Digital Active - scb[6].spi_mosi:1 */ + P13_0_PERI_TR_IO_INPUT26 = 24, /* Digital Active - peri.tr_io_input[26]:0 */ + + /* P13.1 */ + P13_1_GPIO = 0, /* GPIO controls 'out' */ + P13_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P13_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P13_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P13_1_AMUXA = 4, /* Analog mux bus A */ + P13_1_AMUXB = 5, /* Analog mux bus B */ + P13_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P13_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P13_1_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:4 */ + P13_1_TCPWM1_LINE_COMPL8 = 9, /* Digital Active - tcpwm[1].line_compl[8]:1 */ + P13_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:94 */ + P13_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:94 */ + P13_1_LCD_COM32 = 12, /* Digital Deep Sleep - lcd.com[32]:1 */ + P13_1_LCD_SEG32 = 13, /* Digital Deep Sleep - lcd.seg[32]:1 */ + P13_1_SCB6_UART_TX = 18, /* Digital Active - scb[6].uart_tx:1 */ + P13_1_SCB6_I2C_SDA = 19, /* Digital Active - scb[6].i2c_sda:1 */ + P13_1_SCB6_SPI_MISO = 20, /* Digital Active - scb[6].spi_miso:1 */ + P13_1_PERI_TR_IO_INPUT27 = 24, /* Digital Active - peri.tr_io_input[27]:0 */ + + /* P13.6 */ + P13_6_GPIO = 0, /* GPIO controls 'out' */ + P13_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P13_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P13_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P13_6_AMUXA = 4, /* Analog mux bus A */ + P13_6_AMUXB = 5, /* Analog mux bus B */ + P13_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P13_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P13_6_TCPWM0_LINE3 = 8, /* Digital Active - tcpwm[0].line[3]:4 */ + P13_6_TCPWM1_LINE11 = 9, /* Digital Active - tcpwm[1].line[11]:1 */ + P13_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:99 */ + P13_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:99 */ + P13_6_LCD_COM37 = 12, /* Digital Deep Sleep - lcd.com[37]:1 */ + P13_6_LCD_SEG37 = 13, /* Digital Deep Sleep - lcd.seg[37]:1 */ + P13_6_SCB6_SPI_SELECT3 = 20, /* Digital Active - scb[6].spi_select3:1 */ + + /* P13.7 */ + P13_7_GPIO = 0, /* GPIO controls 'out' */ + P13_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P13_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P13_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P13_7_AMUXA = 4, /* Analog mux bus A */ + P13_7_AMUXB = 5, /* Analog mux bus B */ + P13_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P13_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P13_7_TCPWM0_LINE_COMPL3 = 8, /* Digital Active - tcpwm[0].line_compl[3]:4 */ + P13_7_TCPWM1_LINE_COMPL11 = 9, /* Digital Active - tcpwm[1].line_compl[11]:1 */ + P13_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:100 */ + P13_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:100 */ + P13_7_LCD_COM38 = 12, /* Digital Deep Sleep - lcd.com[38]:1 */ + P13_7_LCD_SEG38 = 13 /* Digital Deep Sleep - lcd.seg[38]:1 */ +} en_hsiom_sel_t; + +#endif /* _GPIO_PSOC6BLE_116_BGA_BLE_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/psoc6ble_config.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/psoc6ble_config.h new file mode 100644 index 0000000000..347d5fb7d4 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/psoc6ble_config.h @@ -0,0 +1,2289 @@ +/***************************************************************************//** +* \file psoc6ble_config.h +* +* \brief +* PSoC 6 BLE device configuration header +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _PSOC6BLE_CONFIG_H_ +#define _PSOC6BLE_CONFIG_H_ + +/* Clock Connections */ +typedef enum +{ + PCLK_SCB0_CLOCK = 0, /* scb[0].clock */ + PCLK_SCB1_CLOCK = 1, /* scb[1].clock */ + PCLK_SCB2_CLOCK = 2, /* scb[2].clock */ + PCLK_SCB3_CLOCK = 3, /* scb[3].clock */ + PCLK_SCB4_CLOCK = 4, /* scb[4].clock */ + PCLK_SCB5_CLOCK = 5, /* scb[5].clock */ + PCLK_SCB6_CLOCK = 6, /* scb[6].clock */ + PCLK_SCB7_CLOCK = 7, /* scb[7].clock */ + PCLK_SCB8_CLOCK = 8, /* scb[8].clock */ + PCLK_UDB_CLOCKS0 = 9, /* udb.clocks[0] */ + PCLK_UDB_CLOCKS1 = 10, /* udb.clocks[1] */ + PCLK_UDB_CLOCKS2 = 11, /* udb.clocks[2] */ + PCLK_UDB_CLOCKS3 = 12, /* udb.clocks[3] */ + PCLK_UDB_CLOCKS4 = 13, /* udb.clocks[4] */ + PCLK_UDB_CLOCKS5 = 14, /* udb.clocks[5] */ + PCLK_UDB_CLOCKS6 = 15, /* udb.clocks[6] */ + PCLK_UDB_CLOCKS7 = 16, /* udb.clocks[7] */ + PCLK_SMARTIO8_CLOCK = 17, /* smartio[8].clock */ + PCLK_SMARTIO9_CLOCK = 18, /* smartio[9].clock */ + PCLK_TCPWM0_CLOCKS0 = 19, /* tcpwm[0].clocks[0] */ + PCLK_TCPWM0_CLOCKS1 = 20, /* tcpwm[0].clocks[1] */ + PCLK_TCPWM0_CLOCKS2 = 21, /* tcpwm[0].clocks[2] */ + PCLK_TCPWM0_CLOCKS3 = 22, /* tcpwm[0].clocks[3] */ + PCLK_TCPWM0_CLOCKS4 = 23, /* tcpwm[0].clocks[4] */ + PCLK_TCPWM0_CLOCKS5 = 24, /* tcpwm[0].clocks[5] */ + PCLK_TCPWM0_CLOCKS6 = 25, /* tcpwm[0].clocks[6] */ + PCLK_TCPWM0_CLOCKS7 = 26, /* tcpwm[0].clocks[7] */ + PCLK_TCPWM1_CLOCKS0 = 27, /* tcpwm[1].clocks[0] */ + PCLK_TCPWM1_CLOCKS1 = 28, /* tcpwm[1].clocks[1] */ + PCLK_TCPWM1_CLOCKS2 = 29, /* tcpwm[1].clocks[2] */ + PCLK_TCPWM1_CLOCKS3 = 30, /* tcpwm[1].clocks[3] */ + PCLK_TCPWM1_CLOCKS4 = 31, /* tcpwm[1].clocks[4] */ + PCLK_TCPWM1_CLOCKS5 = 32, /* tcpwm[1].clocks[5] */ + PCLK_TCPWM1_CLOCKS6 = 33, /* tcpwm[1].clocks[6] */ + PCLK_TCPWM1_CLOCKS7 = 34, /* tcpwm[1].clocks[7] */ + PCLK_TCPWM1_CLOCKS8 = 35, /* tcpwm[1].clocks[8] */ + PCLK_TCPWM1_CLOCKS9 = 36, /* tcpwm[1].clocks[9] */ + PCLK_TCPWM1_CLOCKS10 = 37, /* tcpwm[1].clocks[10] */ + PCLK_TCPWM1_CLOCKS11 = 38, /* tcpwm[1].clocks[11] */ + PCLK_TCPWM1_CLOCKS12 = 39, /* tcpwm[1].clocks[12] */ + PCLK_TCPWM1_CLOCKS13 = 40, /* tcpwm[1].clocks[13] */ + PCLK_TCPWM1_CLOCKS14 = 41, /* tcpwm[1].clocks[14] */ + PCLK_TCPWM1_CLOCKS15 = 42, /* tcpwm[1].clocks[15] */ + PCLK_TCPWM1_CLOCKS16 = 43, /* tcpwm[1].clocks[16] */ + PCLK_TCPWM1_CLOCKS17 = 44, /* tcpwm[1].clocks[17] */ + PCLK_TCPWM1_CLOCKS18 = 45, /* tcpwm[1].clocks[18] */ + PCLK_TCPWM1_CLOCKS19 = 46, /* tcpwm[1].clocks[19] */ + PCLK_TCPWM1_CLOCKS20 = 47, /* tcpwm[1].clocks[20] */ + PCLK_TCPWM1_CLOCKS21 = 48, /* tcpwm[1].clocks[21] */ + PCLK_TCPWM1_CLOCKS22 = 49, /* tcpwm[1].clocks[22] */ + PCLK_TCPWM1_CLOCKS23 = 50, /* tcpwm[1].clocks[23] */ + PCLK_CSD_CLOCK = 51, /* csd.clock */ + PCLK_LCD_CLOCK = 52, /* lcd.clock */ + PCLK_PROFILE_CLOCK_PROFILE = 53, /* profile.clock_profile */ + PCLK_CPUSS_CLOCK_TRACE_IN = 54, /* cpuss.clock_trace_in */ + PCLK_PASS_CLOCK_CTDAC = 55, /* pass.clock_ctdac */ + PCLK_PASS_CLOCK_PUMP_PERI = 56, /* pass.clock_pump_peri */ + PCLK_PASS_CLOCK_SAR = 57, /* pass.clock_sar */ + PCLK_USB_CLOCK_DEV_BRS = 58 /* usb.clock_dev_brs */ +} en_clk_dst_t; + +/* Trigger Group Inputs */ +/* Trigger Input Group 0 - DMA Request Assignments */ +typedef enum +{ + TRIG0_IN_TR_GROUP10_OUTPUT0 = 0x0000u, /* tr_group[10].output[0] */ + TRIG0_IN_TR_GROUP10_OUTPUT1 = 0x0001u, /* tr_group[10].output[1] */ + TRIG0_IN_TR_GROUP10_OUTPUT2 = 0x0002u, /* tr_group[10].output[2] */ + TRIG0_IN_TR_GROUP10_OUTPUT3 = 0x0003u, /* tr_group[10].output[3] */ + TRIG0_IN_TR_GROUP10_OUTPUT4 = 0x0004u, /* tr_group[10].output[4] */ + TRIG0_IN_TR_GROUP10_OUTPUT5 = 0x0005u, /* tr_group[10].output[5] */ + TRIG0_IN_TR_GROUP10_OUTPUT6 = 0x0006u, /* tr_group[10].output[6] */ + TRIG0_IN_TR_GROUP10_OUTPUT7 = 0x0007u, /* tr_group[10].output[7] */ + TRIG0_IN_TR_GROUP11_OUTPUT0 = 0x0008u, /* tr_group[11].output[0] */ + TRIG0_IN_TR_GROUP11_OUTPUT1 = 0x0009u, /* tr_group[11].output[1] */ + TRIG0_IN_TR_GROUP11_OUTPUT2 = 0x000Au, /* tr_group[11].output[2] */ + TRIG0_IN_TR_GROUP11_OUTPUT3 = 0x000Bu, /* tr_group[11].output[3] */ + TRIG0_IN_TR_GROUP11_OUTPUT4 = 0x000Cu, /* tr_group[11].output[4] */ + TRIG0_IN_TR_GROUP11_OUTPUT5 = 0x000Du, /* tr_group[11].output[5] */ + TRIG0_IN_TR_GROUP11_OUTPUT6 = 0x000Eu, /* tr_group[11].output[6] */ + TRIG0_IN_TR_GROUP11_OUTPUT7 = 0x000Fu, /* tr_group[11].output[7] */ + TRIG0_IN_TR_GROUP11_OUTPUT8 = 0x0010u, /* tr_group[11].output[8] */ + TRIG0_IN_TR_GROUP11_OUTPUT9 = 0x0011u, /* tr_group[11].output[9] */ + TRIG0_IN_TR_GROUP11_OUTPUT10 = 0x0012u, /* tr_group[11].output[10] */ + TRIG0_IN_TR_GROUP11_OUTPUT11 = 0x0013u, /* tr_group[11].output[11] */ + TRIG0_IN_TR_GROUP11_OUTPUT12 = 0x0014u, /* tr_group[11].output[12] */ + TRIG0_IN_TR_GROUP11_OUTPUT13 = 0x0015u, /* tr_group[11].output[13] */ + TRIG0_IN_TR_GROUP11_OUTPUT14 = 0x0016u, /* tr_group[11].output[14] */ + TRIG0_IN_TR_GROUP11_OUTPUT15 = 0x0017u, /* tr_group[11].output[15] */ + TRIG0_IN_TR_GROUP12_OUTPUT8 = 0x0018u, /* tr_group[12].output[8] */ + TRIG0_IN_TR_GROUP12_OUTPUT9 = 0x0019u, /* tr_group[12].output[9] */ + TRIG0_IN_TR_GROUP13_OUTPUT0 = 0x001Au, /* tr_group[13].output[0] */ + TRIG0_IN_TR_GROUP13_OUTPUT1 = 0x001Bu, /* tr_group[13].output[1] */ + TRIG0_IN_TR_GROUP13_OUTPUT2 = 0x001Cu, /* tr_group[13].output[2] */ + TRIG0_IN_TR_GROUP13_OUTPUT3 = 0x001Du, /* tr_group[13].output[3] */ + TRIG0_IN_TR_GROUP13_OUTPUT4 = 0x001Eu, /* tr_group[13].output[4] */ + TRIG0_IN_TR_GROUP13_OUTPUT5 = 0x001Fu, /* tr_group[13].output[5] */ + TRIG0_IN_TR_GROUP13_OUTPUT6 = 0x0020u, /* tr_group[13].output[6] */ + TRIG0_IN_TR_GROUP13_OUTPUT7 = 0x0021u, /* tr_group[13].output[7] */ + TRIG0_IN_TR_GROUP13_OUTPUT8 = 0x0022u, /* tr_group[13].output[8] */ + TRIG0_IN_TR_GROUP13_OUTPUT9 = 0x0023u, /* tr_group[13].output[9] */ + TRIG0_IN_TR_GROUP13_OUTPUT10 = 0x0024u, /* tr_group[13].output[10] */ + TRIG0_IN_TR_GROUP13_OUTPUT11 = 0x0025u, /* tr_group[13].output[11] */ + TRIG0_IN_TR_GROUP13_OUTPUT12 = 0x0026u, /* tr_group[13].output[12] */ + TRIG0_IN_TR_GROUP13_OUTPUT13 = 0x0027u, /* tr_group[13].output[13] */ + TRIG0_IN_TR_GROUP13_OUTPUT14 = 0x0028u, /* tr_group[13].output[14] */ + TRIG0_IN_TR_GROUP13_OUTPUT15 = 0x0029u, /* tr_group[13].output[15] */ + TRIG0_IN_TR_GROUP14_OUTPUT0 = 0x002Au, /* tr_group[14].output[0] */ + TRIG0_IN_TR_GROUP14_OUTPUT1 = 0x002Bu, /* tr_group[14].output[1] */ + TRIG0_IN_TR_GROUP14_OUTPUT2 = 0x002Cu, /* tr_group[14].output[2] */ + TRIG0_IN_TR_GROUP14_OUTPUT3 = 0x002Du, /* tr_group[14].output[3] */ + TRIG0_IN_TR_GROUP14_OUTPUT4 = 0x002Eu, /* tr_group[14].output[4] */ + TRIG0_IN_TR_GROUP14_OUTPUT5 = 0x002Fu, /* tr_group[14].output[5] */ + TRIG0_IN_TR_GROUP14_OUTPUT6 = 0x0030u, /* tr_group[14].output[6] */ + TRIG0_IN_TR_GROUP14_OUTPUT7 = 0x0031u /* tr_group[14].output[7] */ +} en_trig_input_grp0_t; + +/* Trigger Input Group 1 - DMA Request Assignments */ +typedef enum +{ + TRIG1_IN_TR_GROUP10_OUTPUT0 = 0x0100u, /* tr_group[10].output[0] */ + TRIG1_IN_TR_GROUP10_OUTPUT1 = 0x0101u, /* tr_group[10].output[1] */ + TRIG1_IN_TR_GROUP10_OUTPUT2 = 0x0102u, /* tr_group[10].output[2] */ + TRIG1_IN_TR_GROUP10_OUTPUT3 = 0x0103u, /* tr_group[10].output[3] */ + TRIG1_IN_TR_GROUP10_OUTPUT4 = 0x0104u, /* tr_group[10].output[4] */ + TRIG1_IN_TR_GROUP10_OUTPUT5 = 0x0105u, /* tr_group[10].output[5] */ + TRIG1_IN_TR_GROUP10_OUTPUT6 = 0x0106u, /* tr_group[10].output[6] */ + TRIG1_IN_TR_GROUP10_OUTPUT7 = 0x0107u, /* tr_group[10].output[7] */ + TRIG1_IN_TR_GROUP11_OUTPUT0 = 0x0108u, /* tr_group[11].output[0] */ + TRIG1_IN_TR_GROUP11_OUTPUT1 = 0x0109u, /* tr_group[11].output[1] */ + TRIG1_IN_TR_GROUP11_OUTPUT2 = 0x010Au, /* tr_group[11].output[2] */ + TRIG1_IN_TR_GROUP11_OUTPUT3 = 0x010Bu, /* tr_group[11].output[3] */ + TRIG1_IN_TR_GROUP11_OUTPUT4 = 0x010Cu, /* tr_group[11].output[4] */ + TRIG1_IN_TR_GROUP11_OUTPUT5 = 0x010Du, /* tr_group[11].output[5] */ + TRIG1_IN_TR_GROUP11_OUTPUT6 = 0x010Eu, /* tr_group[11].output[6] */ + TRIG1_IN_TR_GROUP11_OUTPUT7 = 0x010Fu, /* tr_group[11].output[7] */ + TRIG1_IN_TR_GROUP11_OUTPUT8 = 0x0110u, /* tr_group[11].output[8] */ + TRIG1_IN_TR_GROUP11_OUTPUT9 = 0x0111u, /* tr_group[11].output[9] */ + TRIG1_IN_TR_GROUP11_OUTPUT10 = 0x0112u, /* tr_group[11].output[10] */ + TRIG1_IN_TR_GROUP11_OUTPUT11 = 0x0113u, /* tr_group[11].output[11] */ + TRIG1_IN_TR_GROUP11_OUTPUT12 = 0x0114u, /* tr_group[11].output[12] */ + TRIG1_IN_TR_GROUP11_OUTPUT13 = 0x0115u, /* tr_group[11].output[13] */ + TRIG1_IN_TR_GROUP11_OUTPUT14 = 0x0116u, /* tr_group[11].output[14] */ + TRIG1_IN_TR_GROUP11_OUTPUT15 = 0x0117u, /* tr_group[11].output[15] */ + TRIG1_IN_TR_GROUP12_OUTPUT8 = 0x0118u, /* tr_group[12].output[8] */ + TRIG1_IN_TR_GROUP12_OUTPUT9 = 0x0119u, /* tr_group[12].output[9] */ + TRIG1_IN_TR_GROUP13_OUTPUT0 = 0x011Au, /* tr_group[13].output[0] */ + TRIG1_IN_TR_GROUP13_OUTPUT1 = 0x011Bu, /* tr_group[13].output[1] */ + TRIG1_IN_TR_GROUP13_OUTPUT2 = 0x011Cu, /* tr_group[13].output[2] */ + TRIG1_IN_TR_GROUP13_OUTPUT3 = 0x011Du, /* tr_group[13].output[3] */ + TRIG1_IN_TR_GROUP13_OUTPUT4 = 0x011Eu, /* tr_group[13].output[4] */ + TRIG1_IN_TR_GROUP13_OUTPUT5 = 0x011Fu, /* tr_group[13].output[5] */ + TRIG1_IN_TR_GROUP13_OUTPUT6 = 0x0120u, /* tr_group[13].output[6] */ + TRIG1_IN_TR_GROUP13_OUTPUT7 = 0x0121u, /* tr_group[13].output[7] */ + TRIG1_IN_TR_GROUP13_OUTPUT8 = 0x0122u, /* tr_group[13].output[8] */ + TRIG1_IN_TR_GROUP13_OUTPUT9 = 0x0123u, /* tr_group[13].output[9] */ + TRIG1_IN_TR_GROUP13_OUTPUT10 = 0x0124u, /* tr_group[13].output[10] */ + TRIG1_IN_TR_GROUP13_OUTPUT11 = 0x0125u, /* tr_group[13].output[11] */ + TRIG1_IN_TR_GROUP13_OUTPUT12 = 0x0126u, /* tr_group[13].output[12] */ + TRIG1_IN_TR_GROUP13_OUTPUT13 = 0x0127u, /* tr_group[13].output[13] */ + TRIG1_IN_TR_GROUP13_OUTPUT14 = 0x0128u, /* tr_group[13].output[14] */ + TRIG1_IN_TR_GROUP13_OUTPUT15 = 0x0129u, /* tr_group[13].output[15] */ + TRIG1_IN_TR_GROUP14_OUTPUT0 = 0x012Au, /* tr_group[14].output[0] */ + TRIG1_IN_TR_GROUP14_OUTPUT1 = 0x012Bu, /* tr_group[14].output[1] */ + TRIG1_IN_TR_GROUP14_OUTPUT2 = 0x012Cu, /* tr_group[14].output[2] */ + TRIG1_IN_TR_GROUP14_OUTPUT3 = 0x012Du, /* tr_group[14].output[3] */ + TRIG1_IN_TR_GROUP14_OUTPUT4 = 0x012Eu, /* tr_group[14].output[4] */ + TRIG1_IN_TR_GROUP14_OUTPUT5 = 0x012Fu, /* tr_group[14].output[5] */ + TRIG1_IN_TR_GROUP14_OUTPUT6 = 0x0130u, /* tr_group[14].output[6] */ + TRIG1_IN_TR_GROUP14_OUTPUT7 = 0x0131u /* tr_group[14].output[7] */ +} en_trig_input_grp1_t; + +/* Trigger Input Group 2 - TCPWM trigger inputs */ +typedef enum +{ + TRIG2_IN_TR_GROUP10_OUTPUT0 = 0x0200u, /* tr_group[10].output[0] */ + TRIG2_IN_TR_GROUP10_OUTPUT1 = 0x0201u, /* tr_group[10].output[1] */ + TRIG2_IN_TR_GROUP10_OUTPUT2 = 0x0202u, /* tr_group[10].output[2] */ + TRIG2_IN_TR_GROUP10_OUTPUT3 = 0x0203u, /* tr_group[10].output[3] */ + TRIG2_IN_TR_GROUP10_OUTPUT4 = 0x0204u, /* tr_group[10].output[4] */ + TRIG2_IN_TR_GROUP10_OUTPUT5 = 0x0205u, /* tr_group[10].output[5] */ + TRIG2_IN_TR_GROUP10_OUTPUT6 = 0x0206u, /* tr_group[10].output[6] */ + TRIG2_IN_TR_GROUP10_OUTPUT7 = 0x0207u, /* tr_group[10].output[7] */ + TRIG2_IN_TR_GROUP11_OUTPUT0 = 0x0208u, /* tr_group[11].output[0] */ + TRIG2_IN_TR_GROUP11_OUTPUT1 = 0x0209u, /* tr_group[11].output[1] */ + TRIG2_IN_TR_GROUP11_OUTPUT2 = 0x020Au, /* tr_group[11].output[2] */ + TRIG2_IN_TR_GROUP11_OUTPUT3 = 0x020Bu, /* tr_group[11].output[3] */ + TRIG2_IN_TR_GROUP11_OUTPUT4 = 0x020Cu, /* tr_group[11].output[4] */ + TRIG2_IN_TR_GROUP11_OUTPUT5 = 0x020Du, /* tr_group[11].output[5] */ + TRIG2_IN_TR_GROUP11_OUTPUT6 = 0x020Eu, /* tr_group[11].output[6] */ + TRIG2_IN_TR_GROUP11_OUTPUT7 = 0x020Fu, /* tr_group[11].output[7] */ + TRIG2_IN_TR_GROUP11_OUTPUT8 = 0x0210u, /* tr_group[11].output[8] */ + TRIG2_IN_TR_GROUP11_OUTPUT9 = 0x0211u, /* tr_group[11].output[9] */ + TRIG2_IN_TR_GROUP11_OUTPUT10 = 0x0212u, /* tr_group[11].output[10] */ + TRIG2_IN_TR_GROUP11_OUTPUT11 = 0x0213u, /* tr_group[11].output[11] */ + TRIG2_IN_TR_GROUP11_OUTPUT12 = 0x0214u, /* tr_group[11].output[12] */ + TRIG2_IN_TR_GROUP11_OUTPUT13 = 0x0215u, /* tr_group[11].output[13] */ + TRIG2_IN_TR_GROUP11_OUTPUT14 = 0x0216u, /* tr_group[11].output[14] */ + TRIG2_IN_TR_GROUP11_OUTPUT15 = 0x0217u, /* tr_group[11].output[15] */ + TRIG2_IN_TR_GROUP12_OUTPUT0 = 0x0218u, /* tr_group[12].output[0] */ + TRIG2_IN_TR_GROUP12_OUTPUT1 = 0x0219u, /* tr_group[12].output[1] */ + TRIG2_IN_TR_GROUP12_OUTPUT2 = 0x021Au, /* tr_group[12].output[2] */ + TRIG2_IN_TR_GROUP12_OUTPUT3 = 0x021Bu, /* tr_group[12].output[3] */ + TRIG2_IN_TR_GROUP12_OUTPUT4 = 0x021Cu, /* tr_group[12].output[4] */ + TRIG2_IN_TR_GROUP12_OUTPUT5 = 0x021Du, /* tr_group[12].output[5] */ + TRIG2_IN_TR_GROUP12_OUTPUT6 = 0x021Eu, /* tr_group[12].output[6] */ + TRIG2_IN_TR_GROUP12_OUTPUT7 = 0x021Fu, /* tr_group[12].output[7] */ + TRIG2_IN_TR_GROUP13_OUTPUT16 = 0x0220u, /* tr_group[13].output[16] */ + TRIG2_IN_TR_GROUP13_OUTPUT17 = 0x0221u, /* tr_group[13].output[17] */ + TRIG2_IN_TR_GROUP14_OUTPUT8 = 0x0222u, /* tr_group[14].output[8] */ + TRIG2_IN_TR_GROUP14_OUTPUT9 = 0x0223u, /* tr_group[14].output[9] */ + TRIG2_IN_TR_GROUP14_OUTPUT10 = 0x0224u, /* tr_group[14].output[10] */ + TRIG2_IN_TR_GROUP14_OUTPUT11 = 0x0225u, /* tr_group[14].output[11] */ + TRIG2_IN_TR_GROUP14_OUTPUT12 = 0x0226u, /* tr_group[14].output[12] */ + TRIG2_IN_TR_GROUP14_OUTPUT13 = 0x0227u, /* tr_group[14].output[13] */ + TRIG2_IN_TR_GROUP14_OUTPUT14 = 0x0228u, /* tr_group[14].output[14] */ + TRIG2_IN_TR_GROUP14_OUTPUT15 = 0x0229u /* tr_group[14].output[15] */ +} en_trig_input_grp2_t; + +/* Trigger Input Group 3 - TCPWM trigger inputs */ +typedef enum +{ + TRIG3_IN_TR_GROUP10_OUTPUT0 = 0x0300u, /* tr_group[10].output[0] */ + TRIG3_IN_TR_GROUP10_OUTPUT1 = 0x0301u, /* tr_group[10].output[1] */ + TRIG3_IN_TR_GROUP10_OUTPUT2 = 0x0302u, /* tr_group[10].output[2] */ + TRIG3_IN_TR_GROUP10_OUTPUT3 = 0x0303u, /* tr_group[10].output[3] */ + TRIG3_IN_TR_GROUP10_OUTPUT4 = 0x0304u, /* tr_group[10].output[4] */ + TRIG3_IN_TR_GROUP10_OUTPUT5 = 0x0305u, /* tr_group[10].output[5] */ + TRIG3_IN_TR_GROUP10_OUTPUT6 = 0x0306u, /* tr_group[10].output[6] */ + TRIG3_IN_TR_GROUP10_OUTPUT7 = 0x0307u, /* tr_group[10].output[7] */ + TRIG3_IN_TR_GROUP11_OUTPUT0 = 0x0308u, /* tr_group[11].output[0] */ + TRIG3_IN_TR_GROUP11_OUTPUT1 = 0x0309u, /* tr_group[11].output[1] */ + TRIG3_IN_TR_GROUP11_OUTPUT2 = 0x030Au, /* tr_group[11].output[2] */ + TRIG3_IN_TR_GROUP11_OUTPUT3 = 0x030Bu, /* tr_group[11].output[3] */ + TRIG3_IN_TR_GROUP11_OUTPUT4 = 0x030Cu, /* tr_group[11].output[4] */ + TRIG3_IN_TR_GROUP11_OUTPUT5 = 0x030Du, /* tr_group[11].output[5] */ + TRIG3_IN_TR_GROUP11_OUTPUT6 = 0x030Eu, /* tr_group[11].output[6] */ + TRIG3_IN_TR_GROUP11_OUTPUT7 = 0x030Fu, /* tr_group[11].output[7] */ + TRIG3_IN_TR_GROUP11_OUTPUT8 = 0x0310u, /* tr_group[11].output[8] */ + TRIG3_IN_TR_GROUP11_OUTPUT9 = 0x0311u, /* tr_group[11].output[9] */ + TRIG3_IN_TR_GROUP11_OUTPUT10 = 0x0312u, /* tr_group[11].output[10] */ + TRIG3_IN_TR_GROUP11_OUTPUT11 = 0x0313u, /* tr_group[11].output[11] */ + TRIG3_IN_TR_GROUP11_OUTPUT12 = 0x0314u, /* tr_group[11].output[12] */ + TRIG3_IN_TR_GROUP11_OUTPUT13 = 0x0315u, /* tr_group[11].output[13] */ + TRIG3_IN_TR_GROUP11_OUTPUT14 = 0x0316u, /* tr_group[11].output[14] */ + TRIG3_IN_TR_GROUP11_OUTPUT15 = 0x0317u, /* tr_group[11].output[15] */ + TRIG3_IN_TR_GROUP12_OUTPUT0 = 0x0318u, /* tr_group[12].output[0] */ + TRIG3_IN_TR_GROUP12_OUTPUT1 = 0x0319u, /* tr_group[12].output[1] */ + TRIG3_IN_TR_GROUP12_OUTPUT2 = 0x031Au, /* tr_group[12].output[2] */ + TRIG3_IN_TR_GROUP12_OUTPUT3 = 0x031Bu, /* tr_group[12].output[3] */ + TRIG3_IN_TR_GROUP12_OUTPUT4 = 0x031Cu, /* tr_group[12].output[4] */ + TRIG3_IN_TR_GROUP12_OUTPUT5 = 0x031Du, /* tr_group[12].output[5] */ + TRIG3_IN_TR_GROUP12_OUTPUT6 = 0x031Eu, /* tr_group[12].output[6] */ + TRIG3_IN_TR_GROUP12_OUTPUT7 = 0x031Fu, /* tr_group[12].output[7] */ + TRIG3_IN_TR_GROUP13_OUTPUT16 = 0x0320u, /* tr_group[13].output[16] */ + TRIG3_IN_TR_GROUP13_OUTPUT17 = 0x0321u, /* tr_group[13].output[17] */ + TRIG3_IN_TR_GROUP14_OUTPUT8 = 0x0322u, /* tr_group[14].output[8] */ + TRIG3_IN_TR_GROUP14_OUTPUT9 = 0x0323u, /* tr_group[14].output[9] */ + TRIG3_IN_TR_GROUP14_OUTPUT10 = 0x0324u, /* tr_group[14].output[10] */ + TRIG3_IN_TR_GROUP14_OUTPUT11 = 0x0325u, /* tr_group[14].output[11] */ + TRIG3_IN_TR_GROUP14_OUTPUT12 = 0x0326u, /* tr_group[14].output[12] */ + TRIG3_IN_TR_GROUP14_OUTPUT13 = 0x0327u, /* tr_group[14].output[13] */ + TRIG3_IN_TR_GROUP14_OUTPUT14 = 0x0328u, /* tr_group[14].output[14] */ + TRIG3_IN_TR_GROUP14_OUTPUT15 = 0x0329u /* tr_group[14].output[15] */ +} en_trig_input_grp3_t; + +/* Trigger Input Group 4 - PROFILE trigger multiplexer */ +typedef enum +{ + TRIG4_IN_TR_GROUP10_OUTPUT0 = 0x0400u, /* tr_group[10].output[0] */ + TRIG4_IN_TR_GROUP10_OUTPUT1 = 0x0401u, /* tr_group[10].output[1] */ + TRIG4_IN_TR_GROUP10_OUTPUT2 = 0x0402u, /* tr_group[10].output[2] */ + TRIG4_IN_TR_GROUP10_OUTPUT3 = 0x0403u, /* tr_group[10].output[3] */ + TRIG4_IN_TR_GROUP10_OUTPUT4 = 0x0404u, /* tr_group[10].output[4] */ + TRIG4_IN_TR_GROUP10_OUTPUT5 = 0x0405u, /* tr_group[10].output[5] */ + TRIG4_IN_TR_GROUP10_OUTPUT6 = 0x0406u, /* tr_group[10].output[6] */ + TRIG4_IN_TR_GROUP10_OUTPUT7 = 0x0407u, /* tr_group[10].output[7] */ + TRIG4_IN_TR_GROUP11_OUTPUT0 = 0x0408u, /* tr_group[11].output[0] */ + TRIG4_IN_TR_GROUP11_OUTPUT1 = 0x0409u, /* tr_group[11].output[1] */ + TRIG4_IN_TR_GROUP11_OUTPUT2 = 0x040Au, /* tr_group[11].output[2] */ + TRIG4_IN_TR_GROUP11_OUTPUT3 = 0x040Bu, /* tr_group[11].output[3] */ + TRIG4_IN_TR_GROUP11_OUTPUT4 = 0x040Cu, /* tr_group[11].output[4] */ + TRIG4_IN_TR_GROUP11_OUTPUT5 = 0x040Du, /* tr_group[11].output[5] */ + TRIG4_IN_TR_GROUP11_OUTPUT6 = 0x040Eu, /* tr_group[11].output[6] */ + TRIG4_IN_TR_GROUP11_OUTPUT7 = 0x040Fu, /* tr_group[11].output[7] */ + TRIG4_IN_TR_GROUP11_OUTPUT8 = 0x0410u, /* tr_group[11].output[8] */ + TRIG4_IN_TR_GROUP11_OUTPUT9 = 0x0411u, /* tr_group[11].output[9] */ + TRIG4_IN_TR_GROUP11_OUTPUT10 = 0x0412u, /* tr_group[11].output[10] */ + TRIG4_IN_TR_GROUP11_OUTPUT11 = 0x0413u, /* tr_group[11].output[11] */ + TRIG4_IN_TR_GROUP11_OUTPUT12 = 0x0414u, /* tr_group[11].output[12] */ + TRIG4_IN_TR_GROUP11_OUTPUT13 = 0x0415u, /* tr_group[11].output[13] */ + TRIG4_IN_TR_GROUP11_OUTPUT14 = 0x0416u, /* tr_group[11].output[14] */ + TRIG4_IN_TR_GROUP11_OUTPUT15 = 0x0417u, /* tr_group[11].output[15] */ + TRIG4_IN_TR_GROUP12_OUTPUT0 = 0x0418u, /* tr_group[12].output[0] */ + TRIG4_IN_TR_GROUP12_OUTPUT1 = 0x0419u, /* tr_group[12].output[1] */ + TRIG4_IN_TR_GROUP12_OUTPUT2 = 0x041Au, /* tr_group[12].output[2] */ + TRIG4_IN_TR_GROUP12_OUTPUT3 = 0x041Bu, /* tr_group[12].output[3] */ + TRIG4_IN_TR_GROUP12_OUTPUT4 = 0x041Cu, /* tr_group[12].output[4] */ + TRIG4_IN_TR_GROUP12_OUTPUT5 = 0x041Du, /* tr_group[12].output[5] */ + TRIG4_IN_TR_GROUP12_OUTPUT6 = 0x041Eu, /* tr_group[12].output[6] */ + TRIG4_IN_TR_GROUP12_OUTPUT7 = 0x041Fu, /* tr_group[12].output[7] */ + TRIG4_IN_TR_GROUP13_OUTPUT16 = 0x0420u, /* tr_group[13].output[16] */ + TRIG4_IN_TR_GROUP13_OUTPUT17 = 0x0421u, /* tr_group[13].output[17] */ + TRIG4_IN_TR_GROUP14_OUTPUT8 = 0x0422u, /* tr_group[14].output[8] */ + TRIG4_IN_TR_GROUP14_OUTPUT9 = 0x0423u, /* tr_group[14].output[9] */ + TRIG4_IN_TR_GROUP14_OUTPUT10 = 0x0424u, /* tr_group[14].output[10] */ + TRIG4_IN_TR_GROUP14_OUTPUT11 = 0x0425u, /* tr_group[14].output[11] */ + TRIG4_IN_TR_GROUP14_OUTPUT12 = 0x0426u, /* tr_group[14].output[12] */ + TRIG4_IN_TR_GROUP14_OUTPUT13 = 0x0427u, /* tr_group[14].output[13] */ + TRIG4_IN_TR_GROUP14_OUTPUT14 = 0x0428u, /* tr_group[14].output[14] */ + TRIG4_IN_TR_GROUP14_OUTPUT15 = 0x0429u /* tr_group[14].output[15] */ +} en_trig_input_grp4_t; + +/* Trigger Input Group 5 - CPUSS.CTI trigger multiplexer */ +typedef enum +{ + TRIG5_IN_TR_GROUP10_OUTPUT0 = 0x0500u, /* tr_group[10].output[0] */ + TRIG5_IN_TR_GROUP10_OUTPUT1 = 0x0501u, /* tr_group[10].output[1] */ + TRIG5_IN_TR_GROUP10_OUTPUT2 = 0x0502u, /* tr_group[10].output[2] */ + TRIG5_IN_TR_GROUP10_OUTPUT3 = 0x0503u, /* tr_group[10].output[3] */ + TRIG5_IN_TR_GROUP10_OUTPUT4 = 0x0504u, /* tr_group[10].output[4] */ + TRIG5_IN_TR_GROUP10_OUTPUT5 = 0x0505u, /* tr_group[10].output[5] */ + TRIG5_IN_TR_GROUP10_OUTPUT6 = 0x0506u, /* tr_group[10].output[6] */ + TRIG5_IN_TR_GROUP10_OUTPUT7 = 0x0507u, /* tr_group[10].output[7] */ + TRIG5_IN_TR_GROUP11_OUTPUT0 = 0x0508u, /* tr_group[11].output[0] */ + TRIG5_IN_TR_GROUP11_OUTPUT1 = 0x0509u, /* tr_group[11].output[1] */ + TRIG5_IN_TR_GROUP11_OUTPUT2 = 0x050Au, /* tr_group[11].output[2] */ + TRIG5_IN_TR_GROUP11_OUTPUT3 = 0x050Bu, /* tr_group[11].output[3] */ + TRIG5_IN_TR_GROUP11_OUTPUT4 = 0x050Cu, /* tr_group[11].output[4] */ + TRIG5_IN_TR_GROUP11_OUTPUT5 = 0x050Du, /* tr_group[11].output[5] */ + TRIG5_IN_TR_GROUP11_OUTPUT6 = 0x050Eu, /* tr_group[11].output[6] */ + TRIG5_IN_TR_GROUP11_OUTPUT7 = 0x050Fu, /* tr_group[11].output[7] */ + TRIG5_IN_TR_GROUP11_OUTPUT8 = 0x0510u, /* tr_group[11].output[8] */ + TRIG5_IN_TR_GROUP11_OUTPUT9 = 0x0511u, /* tr_group[11].output[9] */ + TRIG5_IN_TR_GROUP11_OUTPUT10 = 0x0512u, /* tr_group[11].output[10] */ + TRIG5_IN_TR_GROUP11_OUTPUT11 = 0x0513u, /* tr_group[11].output[11] */ + TRIG5_IN_TR_GROUP11_OUTPUT12 = 0x0514u, /* tr_group[11].output[12] */ + TRIG5_IN_TR_GROUP11_OUTPUT13 = 0x0515u, /* tr_group[11].output[13] */ + TRIG5_IN_TR_GROUP11_OUTPUT14 = 0x0516u, /* tr_group[11].output[14] */ + TRIG5_IN_TR_GROUP11_OUTPUT15 = 0x0517u, /* tr_group[11].output[15] */ + TRIG5_IN_TR_GROUP12_OUTPUT0 = 0x0518u, /* tr_group[12].output[0] */ + TRIG5_IN_TR_GROUP12_OUTPUT1 = 0x0519u, /* tr_group[12].output[1] */ + TRIG5_IN_TR_GROUP12_OUTPUT2 = 0x051Au, /* tr_group[12].output[2] */ + TRIG5_IN_TR_GROUP12_OUTPUT3 = 0x051Bu, /* tr_group[12].output[3] */ + TRIG5_IN_TR_GROUP12_OUTPUT4 = 0x051Cu, /* tr_group[12].output[4] */ + TRIG5_IN_TR_GROUP12_OUTPUT5 = 0x051Du, /* tr_group[12].output[5] */ + TRIG5_IN_TR_GROUP12_OUTPUT6 = 0x051Eu, /* tr_group[12].output[6] */ + TRIG5_IN_TR_GROUP12_OUTPUT7 = 0x051Fu, /* tr_group[12].output[7] */ + TRIG5_IN_TR_GROUP13_OUTPUT16 = 0x0520u, /* tr_group[13].output[16] */ + TRIG5_IN_TR_GROUP13_OUTPUT17 = 0x0521u, /* tr_group[13].output[17] */ + TRIG5_IN_TR_GROUP14_OUTPUT8 = 0x0522u, /* tr_group[14].output[8] */ + TRIG5_IN_TR_GROUP14_OUTPUT9 = 0x0523u, /* tr_group[14].output[9] */ + TRIG5_IN_TR_GROUP14_OUTPUT10 = 0x0524u, /* tr_group[14].output[10] */ + TRIG5_IN_TR_GROUP14_OUTPUT11 = 0x0525u, /* tr_group[14].output[11] */ + TRIG5_IN_TR_GROUP14_OUTPUT12 = 0x0526u, /* tr_group[14].output[12] */ + TRIG5_IN_TR_GROUP14_OUTPUT13 = 0x0527u, /* tr_group[14].output[13] */ + TRIG5_IN_TR_GROUP14_OUTPUT14 = 0x0528u, /* tr_group[14].output[14] */ + TRIG5_IN_TR_GROUP14_OUTPUT15 = 0x0529u /* tr_group[14].output[15] */ +} en_trig_input_grp5_t; + +/* Trigger Input Group 6 - PASS trigger multiplexer */ +typedef enum +{ + TRIG6_IN_TR_GROUP10_OUTPUT0 = 0x0600u, /* tr_group[10].output[0] */ + TRIG6_IN_TR_GROUP10_OUTPUT1 = 0x0601u, /* tr_group[10].output[1] */ + TRIG6_IN_TR_GROUP10_OUTPUT2 = 0x0602u, /* tr_group[10].output[2] */ + TRIG6_IN_TR_GROUP10_OUTPUT3 = 0x0603u, /* tr_group[10].output[3] */ + TRIG6_IN_TR_GROUP10_OUTPUT4 = 0x0604u, /* tr_group[10].output[4] */ + TRIG6_IN_TR_GROUP10_OUTPUT5 = 0x0605u, /* tr_group[10].output[5] */ + TRIG6_IN_TR_GROUP10_OUTPUT6 = 0x0606u, /* tr_group[10].output[6] */ + TRIG6_IN_TR_GROUP10_OUTPUT7 = 0x0607u, /* tr_group[10].output[7] */ + TRIG6_IN_TR_GROUP11_OUTPUT0 = 0x0608u, /* tr_group[11].output[0] */ + TRIG6_IN_TR_GROUP11_OUTPUT1 = 0x0609u, /* tr_group[11].output[1] */ + TRIG6_IN_TR_GROUP11_OUTPUT2 = 0x060Au, /* tr_group[11].output[2] */ + TRIG6_IN_TR_GROUP11_OUTPUT3 = 0x060Bu, /* tr_group[11].output[3] */ + TRIG6_IN_TR_GROUP11_OUTPUT4 = 0x060Cu, /* tr_group[11].output[4] */ + TRIG6_IN_TR_GROUP11_OUTPUT5 = 0x060Du, /* tr_group[11].output[5] */ + TRIG6_IN_TR_GROUP11_OUTPUT6 = 0x060Eu, /* tr_group[11].output[6] */ + TRIG6_IN_TR_GROUP11_OUTPUT7 = 0x060Fu, /* tr_group[11].output[7] */ + TRIG6_IN_TR_GROUP11_OUTPUT8 = 0x0610u, /* tr_group[11].output[8] */ + TRIG6_IN_TR_GROUP11_OUTPUT9 = 0x0611u, /* tr_group[11].output[9] */ + TRIG6_IN_TR_GROUP11_OUTPUT10 = 0x0612u, /* tr_group[11].output[10] */ + TRIG6_IN_TR_GROUP11_OUTPUT11 = 0x0613u, /* tr_group[11].output[11] */ + TRIG6_IN_TR_GROUP11_OUTPUT12 = 0x0614u, /* tr_group[11].output[12] */ + TRIG6_IN_TR_GROUP11_OUTPUT13 = 0x0615u, /* tr_group[11].output[13] */ + TRIG6_IN_TR_GROUP11_OUTPUT14 = 0x0616u, /* tr_group[11].output[14] */ + TRIG6_IN_TR_GROUP11_OUTPUT15 = 0x0617u, /* tr_group[11].output[15] */ + TRIG6_IN_TR_GROUP12_OUTPUT0 = 0x0618u, /* tr_group[12].output[0] */ + TRIG6_IN_TR_GROUP12_OUTPUT1 = 0x0619u, /* tr_group[12].output[1] */ + TRIG6_IN_TR_GROUP12_OUTPUT2 = 0x061Au, /* tr_group[12].output[2] */ + TRIG6_IN_TR_GROUP12_OUTPUT3 = 0x061Bu, /* tr_group[12].output[3] */ + TRIG6_IN_TR_GROUP12_OUTPUT4 = 0x061Cu, /* tr_group[12].output[4] */ + TRIG6_IN_TR_GROUP12_OUTPUT5 = 0x061Du, /* tr_group[12].output[5] */ + TRIG6_IN_TR_GROUP12_OUTPUT6 = 0x061Eu, /* tr_group[12].output[6] */ + TRIG6_IN_TR_GROUP12_OUTPUT7 = 0x061Fu, /* tr_group[12].output[7] */ + TRIG6_IN_TR_GROUP13_OUTPUT16 = 0x0620u, /* tr_group[13].output[16] */ + TRIG6_IN_TR_GROUP13_OUTPUT17 = 0x0621u, /* tr_group[13].output[17] */ + TRIG6_IN_TR_GROUP14_OUTPUT8 = 0x0622u, /* tr_group[14].output[8] */ + TRIG6_IN_TR_GROUP14_OUTPUT9 = 0x0623u, /* tr_group[14].output[9] */ + TRIG6_IN_TR_GROUP14_OUTPUT10 = 0x0624u, /* tr_group[14].output[10] */ + TRIG6_IN_TR_GROUP14_OUTPUT11 = 0x0625u, /* tr_group[14].output[11] */ + TRIG6_IN_TR_GROUP14_OUTPUT12 = 0x0626u, /* tr_group[14].output[12] */ + TRIG6_IN_TR_GROUP14_OUTPUT13 = 0x0627u, /* tr_group[14].output[13] */ + TRIG6_IN_TR_GROUP14_OUTPUT14 = 0x0628u, /* tr_group[14].output[14] */ + TRIG6_IN_TR_GROUP14_OUTPUT15 = 0x0629u /* tr_group[14].output[15] */ +} en_trig_input_grp6_t; + +/* Trigger Input Group 7 - UDB general purpose trigger multiplexer */ +typedef enum +{ + TRIG7_IN_TR_GROUP10_OUTPUT0 = 0x0700u, /* tr_group[10].output[0] */ + TRIG7_IN_TR_GROUP10_OUTPUT1 = 0x0701u, /* tr_group[10].output[1] */ + TRIG7_IN_TR_GROUP10_OUTPUT2 = 0x0702u, /* tr_group[10].output[2] */ + TRIG7_IN_TR_GROUP10_OUTPUT3 = 0x0703u, /* tr_group[10].output[3] */ + TRIG7_IN_TR_GROUP10_OUTPUT4 = 0x0704u, /* tr_group[10].output[4] */ + TRIG7_IN_TR_GROUP10_OUTPUT5 = 0x0705u, /* tr_group[10].output[5] */ + TRIG7_IN_TR_GROUP10_OUTPUT6 = 0x0706u, /* tr_group[10].output[6] */ + TRIG7_IN_TR_GROUP10_OUTPUT7 = 0x0707u, /* tr_group[10].output[7] */ + TRIG7_IN_TR_GROUP11_OUTPUT0 = 0x0708u, /* tr_group[11].output[0] */ + TRIG7_IN_TR_GROUP11_OUTPUT1 = 0x0709u, /* tr_group[11].output[1] */ + TRIG7_IN_TR_GROUP11_OUTPUT2 = 0x070Au, /* tr_group[11].output[2] */ + TRIG7_IN_TR_GROUP11_OUTPUT3 = 0x070Bu, /* tr_group[11].output[3] */ + TRIG7_IN_TR_GROUP11_OUTPUT4 = 0x070Cu, /* tr_group[11].output[4] */ + TRIG7_IN_TR_GROUP11_OUTPUT5 = 0x070Du, /* tr_group[11].output[5] */ + TRIG7_IN_TR_GROUP11_OUTPUT6 = 0x070Eu, /* tr_group[11].output[6] */ + TRIG7_IN_TR_GROUP11_OUTPUT7 = 0x070Fu, /* tr_group[11].output[7] */ + TRIG7_IN_TR_GROUP11_OUTPUT8 = 0x0710u, /* tr_group[11].output[8] */ + TRIG7_IN_TR_GROUP11_OUTPUT9 = 0x0711u, /* tr_group[11].output[9] */ + TRIG7_IN_TR_GROUP11_OUTPUT10 = 0x0712u, /* tr_group[11].output[10] */ + TRIG7_IN_TR_GROUP11_OUTPUT11 = 0x0713u, /* tr_group[11].output[11] */ + TRIG7_IN_TR_GROUP11_OUTPUT12 = 0x0714u, /* tr_group[11].output[12] */ + TRIG7_IN_TR_GROUP11_OUTPUT13 = 0x0715u, /* tr_group[11].output[13] */ + TRIG7_IN_TR_GROUP11_OUTPUT14 = 0x0716u, /* tr_group[11].output[14] */ + TRIG7_IN_TR_GROUP11_OUTPUT15 = 0x0717u, /* tr_group[11].output[15] */ + TRIG7_IN_TR_GROUP12_OUTPUT0 = 0x0718u, /* tr_group[12].output[0] */ + TRIG7_IN_TR_GROUP12_OUTPUT1 = 0x0719u, /* tr_group[12].output[1] */ + TRIG7_IN_TR_GROUP12_OUTPUT2 = 0x071Au, /* tr_group[12].output[2] */ + TRIG7_IN_TR_GROUP12_OUTPUT3 = 0x071Bu, /* tr_group[12].output[3] */ + TRIG7_IN_TR_GROUP12_OUTPUT4 = 0x071Cu, /* tr_group[12].output[4] */ + TRIG7_IN_TR_GROUP12_OUTPUT5 = 0x071Du, /* tr_group[12].output[5] */ + TRIG7_IN_TR_GROUP12_OUTPUT6 = 0x071Eu, /* tr_group[12].output[6] */ + TRIG7_IN_TR_GROUP12_OUTPUT7 = 0x071Fu, /* tr_group[12].output[7] */ + TRIG7_IN_TR_GROUP13_OUTPUT16 = 0x0720u, /* tr_group[13].output[16] */ + TRIG7_IN_TR_GROUP13_OUTPUT17 = 0x0721u, /* tr_group[13].output[17] */ + TRIG7_IN_TR_GROUP14_OUTPUT8 = 0x0722u, /* tr_group[14].output[8] */ + TRIG7_IN_TR_GROUP14_OUTPUT9 = 0x0723u, /* tr_group[14].output[9] */ + TRIG7_IN_TR_GROUP14_OUTPUT10 = 0x0724u, /* tr_group[14].output[10] */ + TRIG7_IN_TR_GROUP14_OUTPUT11 = 0x0725u, /* tr_group[14].output[11] */ + TRIG7_IN_TR_GROUP14_OUTPUT12 = 0x0726u, /* tr_group[14].output[12] */ + TRIG7_IN_TR_GROUP14_OUTPUT13 = 0x0727u, /* tr_group[14].output[13] */ + TRIG7_IN_TR_GROUP14_OUTPUT14 = 0x0728u, /* tr_group[14].output[14] */ + TRIG7_IN_TR_GROUP14_OUTPUT15 = 0x0729u /* tr_group[14].output[15] */ +} en_trig_input_grp7_t; + +/* Trigger Input Group 8 - Trigger multiplexer to pins */ +typedef enum +{ + TRIG8_IN_TR_GROUP10_OUTPUT0 = 0x0800u, /* tr_group[10].output[0] */ + TRIG8_IN_TR_GROUP10_OUTPUT1 = 0x0801u, /* tr_group[10].output[1] */ + TRIG8_IN_TR_GROUP10_OUTPUT2 = 0x0802u, /* tr_group[10].output[2] */ + TRIG8_IN_TR_GROUP10_OUTPUT3 = 0x0803u, /* tr_group[10].output[3] */ + TRIG8_IN_TR_GROUP10_OUTPUT4 = 0x0804u, /* tr_group[10].output[4] */ + TRIG8_IN_TR_GROUP10_OUTPUT5 = 0x0805u, /* tr_group[10].output[5] */ + TRIG8_IN_TR_GROUP10_OUTPUT6 = 0x0806u, /* tr_group[10].output[6] */ + TRIG8_IN_TR_GROUP10_OUTPUT7 = 0x0807u, /* tr_group[10].output[7] */ + TRIG8_IN_TR_GROUP11_OUTPUT0 = 0x0808u, /* tr_group[11].output[0] */ + TRIG8_IN_TR_GROUP11_OUTPUT1 = 0x0809u, /* tr_group[11].output[1] */ + TRIG8_IN_TR_GROUP11_OUTPUT2 = 0x080Au, /* tr_group[11].output[2] */ + TRIG8_IN_TR_GROUP11_OUTPUT3 = 0x080Bu, /* tr_group[11].output[3] */ + TRIG8_IN_TR_GROUP11_OUTPUT4 = 0x080Cu, /* tr_group[11].output[4] */ + TRIG8_IN_TR_GROUP11_OUTPUT5 = 0x080Du, /* tr_group[11].output[5] */ + TRIG8_IN_TR_GROUP11_OUTPUT6 = 0x080Eu, /* tr_group[11].output[6] */ + TRIG8_IN_TR_GROUP11_OUTPUT7 = 0x080Fu, /* tr_group[11].output[7] */ + TRIG8_IN_TR_GROUP11_OUTPUT8 = 0x0810u, /* tr_group[11].output[8] */ + TRIG8_IN_TR_GROUP11_OUTPUT9 = 0x0811u, /* tr_group[11].output[9] */ + TRIG8_IN_TR_GROUP11_OUTPUT10 = 0x0812u, /* tr_group[11].output[10] */ + TRIG8_IN_TR_GROUP11_OUTPUT11 = 0x0813u, /* tr_group[11].output[11] */ + TRIG8_IN_TR_GROUP11_OUTPUT12 = 0x0814u, /* tr_group[11].output[12] */ + TRIG8_IN_TR_GROUP11_OUTPUT13 = 0x0815u, /* tr_group[11].output[13] */ + TRIG8_IN_TR_GROUP11_OUTPUT14 = 0x0816u, /* tr_group[11].output[14] */ + TRIG8_IN_TR_GROUP11_OUTPUT15 = 0x0817u, /* tr_group[11].output[15] */ + TRIG8_IN_TR_GROUP12_OUTPUT0 = 0x0818u, /* tr_group[12].output[0] */ + TRIG8_IN_TR_GROUP12_OUTPUT1 = 0x0819u, /* tr_group[12].output[1] */ + TRIG8_IN_TR_GROUP12_OUTPUT2 = 0x081Au, /* tr_group[12].output[2] */ + TRIG8_IN_TR_GROUP12_OUTPUT3 = 0x081Bu, /* tr_group[12].output[3] */ + TRIG8_IN_TR_GROUP12_OUTPUT4 = 0x081Cu, /* tr_group[12].output[4] */ + TRIG8_IN_TR_GROUP12_OUTPUT5 = 0x081Du, /* tr_group[12].output[5] */ + TRIG8_IN_TR_GROUP12_OUTPUT6 = 0x081Eu, /* tr_group[12].output[6] */ + TRIG8_IN_TR_GROUP12_OUTPUT7 = 0x081Fu, /* tr_group[12].output[7] */ + TRIG8_IN_TR_GROUP13_OUTPUT16 = 0x0820u, /* tr_group[13].output[16] */ + TRIG8_IN_TR_GROUP13_OUTPUT17 = 0x0821u, /* tr_group[13].output[17] */ + TRIG8_IN_TR_GROUP14_OUTPUT8 = 0x0822u, /* tr_group[14].output[8] */ + TRIG8_IN_TR_GROUP14_OUTPUT9 = 0x0823u, /* tr_group[14].output[9] */ + TRIG8_IN_TR_GROUP14_OUTPUT10 = 0x0824u, /* tr_group[14].output[10] */ + TRIG8_IN_TR_GROUP14_OUTPUT11 = 0x0825u, /* tr_group[14].output[11] */ + TRIG8_IN_TR_GROUP14_OUTPUT12 = 0x0826u, /* tr_group[14].output[12] */ + TRIG8_IN_TR_GROUP14_OUTPUT13 = 0x0827u, /* tr_group[14].output[13] */ + TRIG8_IN_TR_GROUP14_OUTPUT14 = 0x0828u, /* tr_group[14].output[14] */ + TRIG8_IN_TR_GROUP14_OUTPUT15 = 0x0829u /* tr_group[14].output[15] */ +} en_trig_input_grp8_t; + +/* Trigger Input Group 9 - Feedback mux to USB DMA interface */ +typedef enum +{ + TRIG9_IN_CPUSS_DW0_TR_OUT0 = 0x0900u, /* cpuss.dw0_tr_out[0] */ + TRIG9_IN_CPUSS_DW0_TR_OUT1 = 0x0901u, /* cpuss.dw0_tr_out[1] */ + TRIG9_IN_CPUSS_DW0_TR_OUT2 = 0x0902u, /* cpuss.dw0_tr_out[2] */ + TRIG9_IN_CPUSS_DW0_TR_OUT3 = 0x0903u, /* cpuss.dw0_tr_out[3] */ + TRIG9_IN_CPUSS_DW0_TR_OUT4 = 0x0904u, /* cpuss.dw0_tr_out[4] */ + TRIG9_IN_CPUSS_DW0_TR_OUT5 = 0x0905u, /* cpuss.dw0_tr_out[5] */ + TRIG9_IN_CPUSS_DW0_TR_OUT6 = 0x0906u, /* cpuss.dw0_tr_out[6] */ + TRIG9_IN_CPUSS_DW0_TR_OUT7 = 0x0907u, /* cpuss.dw0_tr_out[7] */ + TRIG9_IN_CPUSS_DW0_TR_OUT8 = 0x0908u, /* cpuss.dw0_tr_out[8] */ + TRIG9_IN_CPUSS_DW0_TR_OUT9 = 0x0909u, /* cpuss.dw0_tr_out[9] */ + TRIG9_IN_CPUSS_DW0_TR_OUT10 = 0x090Au, /* cpuss.dw0_tr_out[10] */ + TRIG9_IN_CPUSS_DW0_TR_OUT11 = 0x090Bu, /* cpuss.dw0_tr_out[11] */ + TRIG9_IN_CPUSS_DW0_TR_OUT12 = 0x090Cu, /* cpuss.dw0_tr_out[12] */ + TRIG9_IN_CPUSS_DW0_TR_OUT13 = 0x090Du, /* cpuss.dw0_tr_out[13] */ + TRIG9_IN_CPUSS_DW0_TR_OUT14 = 0x090Eu, /* cpuss.dw0_tr_out[14] */ + TRIG9_IN_CPUSS_DW0_TR_OUT15 = 0x090Fu, /* cpuss.dw0_tr_out[15] */ + TRIG9_IN_CPUSS_DW1_TR_OUT0 = 0x0910u, /* cpuss.dw1_tr_out[0] */ + TRIG9_IN_CPUSS_DW1_TR_OUT1 = 0x0911u, /* cpuss.dw1_tr_out[1] */ + TRIG9_IN_CPUSS_DW1_TR_OUT2 = 0x0912u, /* cpuss.dw1_tr_out[2] */ + TRIG9_IN_CPUSS_DW1_TR_OUT3 = 0x0913u, /* cpuss.dw1_tr_out[3] */ + TRIG9_IN_CPUSS_DW1_TR_OUT4 = 0x0914u, /* cpuss.dw1_tr_out[4] */ + TRIG9_IN_CPUSS_DW1_TR_OUT5 = 0x0915u, /* cpuss.dw1_tr_out[5] */ + TRIG9_IN_CPUSS_DW1_TR_OUT6 = 0x0916u, /* cpuss.dw1_tr_out[6] */ + TRIG9_IN_CPUSS_DW1_TR_OUT7 = 0x0917u, /* cpuss.dw1_tr_out[7] */ + TRIG9_IN_CPUSS_DW1_TR_OUT8 = 0x0918u, /* cpuss.dw1_tr_out[8] */ + TRIG9_IN_CPUSS_DW1_TR_OUT9 = 0x0919u, /* cpuss.dw1_tr_out[9] */ + TRIG9_IN_CPUSS_DW1_TR_OUT10 = 0x091Au, /* cpuss.dw1_tr_out[10] */ + TRIG9_IN_CPUSS_DW1_TR_OUT11 = 0x091Bu, /* cpuss.dw1_tr_out[11] */ + TRIG9_IN_CPUSS_DW1_TR_OUT12 = 0x091Cu, /* cpuss.dw1_tr_out[12] */ + TRIG9_IN_CPUSS_DW1_TR_OUT13 = 0x091Du, /* cpuss.dw1_tr_out[13] */ + TRIG9_IN_CPUSS_DW1_TR_OUT14 = 0x091Eu, /* cpuss.dw1_tr_out[14] */ + TRIG9_IN_CPUSS_DW1_TR_OUT15 = 0x091Fu /* cpuss.dw1_tr_out[15] */ +} en_trig_input_grp9_t; + +/* Trigger Input Group 10 - Reduces 32 datawire output triggers to 8 signals, used by all except USB */ +typedef enum +{ + TRIG10_IN_CPUSS_DW0_TR_OUT0 = 0x0A00u, /* cpuss.dw0_tr_out[0] */ + TRIG10_IN_CPUSS_DW0_TR_OUT1 = 0x0A01u, /* cpuss.dw0_tr_out[1] */ + TRIG10_IN_CPUSS_DW0_TR_OUT2 = 0x0A02u, /* cpuss.dw0_tr_out[2] */ + TRIG10_IN_CPUSS_DW0_TR_OUT3 = 0x0A03u, /* cpuss.dw0_tr_out[3] */ + TRIG10_IN_CPUSS_DW0_TR_OUT4 = 0x0A04u, /* cpuss.dw0_tr_out[4] */ + TRIG10_IN_CPUSS_DW0_TR_OUT5 = 0x0A05u, /* cpuss.dw0_tr_out[5] */ + TRIG10_IN_CPUSS_DW0_TR_OUT6 = 0x0A06u, /* cpuss.dw0_tr_out[6] */ + TRIG10_IN_CPUSS_DW0_TR_OUT7 = 0x0A07u, /* cpuss.dw0_tr_out[7] */ + TRIG10_IN_CPUSS_DW0_TR_OUT8 = 0x0A08u, /* cpuss.dw0_tr_out[8] */ + TRIG10_IN_CPUSS_DW0_TR_OUT9 = 0x0A09u, /* cpuss.dw0_tr_out[9] */ + TRIG10_IN_CPUSS_DW0_TR_OUT10 = 0x0A0Au, /* cpuss.dw0_tr_out[10] */ + TRIG10_IN_CPUSS_DW0_TR_OUT11 = 0x0A0Bu, /* cpuss.dw0_tr_out[11] */ + TRIG10_IN_CPUSS_DW0_TR_OUT12 = 0x0A0Cu, /* cpuss.dw0_tr_out[12] */ + TRIG10_IN_CPUSS_DW0_TR_OUT13 = 0x0A0Du, /* cpuss.dw0_tr_out[13] */ + TRIG10_IN_CPUSS_DW0_TR_OUT14 = 0x0A0Eu, /* cpuss.dw0_tr_out[14] */ + TRIG10_IN_CPUSS_DW0_TR_OUT15 = 0x0A0Fu, /* cpuss.dw0_tr_out[15] */ + TRIG10_IN_CPUSS_DW1_TR_OUT0 = 0x0A10u, /* cpuss.dw1_tr_out[0] */ + TRIG10_IN_CPUSS_DW1_TR_OUT1 = 0x0A11u, /* cpuss.dw1_tr_out[1] */ + TRIG10_IN_CPUSS_DW1_TR_OUT2 = 0x0A12u, /* cpuss.dw1_tr_out[2] */ + TRIG10_IN_CPUSS_DW1_TR_OUT3 = 0x0A13u, /* cpuss.dw1_tr_out[3] */ + TRIG10_IN_CPUSS_DW1_TR_OUT4 = 0x0A14u, /* cpuss.dw1_tr_out[4] */ + TRIG10_IN_CPUSS_DW1_TR_OUT5 = 0x0A15u, /* cpuss.dw1_tr_out[5] */ + TRIG10_IN_CPUSS_DW1_TR_OUT6 = 0x0A16u, /* cpuss.dw1_tr_out[6] */ + TRIG10_IN_CPUSS_DW1_TR_OUT7 = 0x0A17u, /* cpuss.dw1_tr_out[7] */ + TRIG10_IN_CPUSS_DW1_TR_OUT8 = 0x0A18u, /* cpuss.dw1_tr_out[8] */ + TRIG10_IN_CPUSS_DW1_TR_OUT9 = 0x0A19u, /* cpuss.dw1_tr_out[9] */ + TRIG10_IN_CPUSS_DW1_TR_OUT10 = 0x0A1Au, /* cpuss.dw1_tr_out[10] */ + TRIG10_IN_CPUSS_DW1_TR_OUT11 = 0x0A1Bu, /* cpuss.dw1_tr_out[11] */ + TRIG10_IN_CPUSS_DW1_TR_OUT12 = 0x0A1Cu, /* cpuss.dw1_tr_out[12] */ + TRIG10_IN_CPUSS_DW1_TR_OUT13 = 0x0A1Du, /* cpuss.dw1_tr_out[13] */ + TRIG10_IN_CPUSS_DW1_TR_OUT14 = 0x0A1Eu, /* cpuss.dw1_tr_out[14] */ + TRIG10_IN_CPUSS_DW1_TR_OUT15 = 0x0A1Fu /* cpuss.dw1_tr_out[15] */ +} en_trig_input_grp10_t; + +/* Trigger Input Group 11 - Reduces 96 tcpwm output triggers to 16 signals, used by all sinks */ +typedef enum +{ + TRIG11_IN_TCPWM0_TR_OVERFLOW0 = 0x0B00u, /* tcpwm[0].tr_overflow[0] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW1 = 0x0B01u, /* tcpwm[0].tr_overflow[1] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW2 = 0x0B02u, /* tcpwm[0].tr_overflow[2] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW3 = 0x0B03u, /* tcpwm[0].tr_overflow[3] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW4 = 0x0B04u, /* tcpwm[0].tr_overflow[4] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW5 = 0x0B05u, /* tcpwm[0].tr_overflow[5] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW6 = 0x0B06u, /* tcpwm[0].tr_overflow[6] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW7 = 0x0B07u, /* tcpwm[0].tr_overflow[7] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH0 = 0x0B08u, /* tcpwm[0].tr_compare_match[0] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH1 = 0x0B09u, /* tcpwm[0].tr_compare_match[1] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH2 = 0x0B0Au, /* tcpwm[0].tr_compare_match[2] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH3 = 0x0B0Bu, /* tcpwm[0].tr_compare_match[3] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH4 = 0x0B0Cu, /* tcpwm[0].tr_compare_match[4] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH5 = 0x0B0Du, /* tcpwm[0].tr_compare_match[5] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH6 = 0x0B0Eu, /* tcpwm[0].tr_compare_match[6] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH7 = 0x0B0Fu, /* tcpwm[0].tr_compare_match[7] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW0 = 0x0B10u, /* tcpwm[0].tr_underflow[0] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW1 = 0x0B11u, /* tcpwm[0].tr_underflow[1] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW2 = 0x0B12u, /* tcpwm[0].tr_underflow[2] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW3 = 0x0B13u, /* tcpwm[0].tr_underflow[3] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW4 = 0x0B14u, /* tcpwm[0].tr_underflow[4] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW5 = 0x0B15u, /* tcpwm[0].tr_underflow[5] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW6 = 0x0B16u, /* tcpwm[0].tr_underflow[6] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW7 = 0x0B17u, /* tcpwm[0].tr_underflow[7] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW0 = 0x0B18u, /* tcpwm[1].tr_overflow[0] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW1 = 0x0B19u, /* tcpwm[1].tr_overflow[1] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW2 = 0x0B1Au, /* tcpwm[1].tr_overflow[2] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW3 = 0x0B1Bu, /* tcpwm[1].tr_overflow[3] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW4 = 0x0B1Cu, /* tcpwm[1].tr_overflow[4] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW5 = 0x0B1Du, /* tcpwm[1].tr_overflow[5] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW6 = 0x0B1Eu, /* tcpwm[1].tr_overflow[6] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW7 = 0x0B1Fu, /* tcpwm[1].tr_overflow[7] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW8 = 0x0B20u, /* tcpwm[1].tr_overflow[8] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW9 = 0x0B21u, /* tcpwm[1].tr_overflow[9] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW10 = 0x0B22u, /* tcpwm[1].tr_overflow[10] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW11 = 0x0B23u, /* tcpwm[1].tr_overflow[11] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW12 = 0x0B24u, /* tcpwm[1].tr_overflow[12] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW13 = 0x0B25u, /* tcpwm[1].tr_overflow[13] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW14 = 0x0B26u, /* tcpwm[1].tr_overflow[14] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW15 = 0x0B27u, /* tcpwm[1].tr_overflow[15] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW16 = 0x0B28u, /* tcpwm[1].tr_overflow[16] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW17 = 0x0B29u, /* tcpwm[1].tr_overflow[17] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW18 = 0x0B2Au, /* tcpwm[1].tr_overflow[18] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW19 = 0x0B2Bu, /* tcpwm[1].tr_overflow[19] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW20 = 0x0B2Cu, /* tcpwm[1].tr_overflow[20] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW21 = 0x0B2Du, /* tcpwm[1].tr_overflow[21] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW22 = 0x0B2Eu, /* tcpwm[1].tr_overflow[22] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW23 = 0x0B2Fu, /* tcpwm[1].tr_overflow[23] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH0 = 0x0B30u, /* tcpwm[1].tr_compare_match[0] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH1 = 0x0B31u, /* tcpwm[1].tr_compare_match[1] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH2 = 0x0B32u, /* tcpwm[1].tr_compare_match[2] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH3 = 0x0B33u, /* tcpwm[1].tr_compare_match[3] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH4 = 0x0B34u, /* tcpwm[1].tr_compare_match[4] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH5 = 0x0B35u, /* tcpwm[1].tr_compare_match[5] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH6 = 0x0B36u, /* tcpwm[1].tr_compare_match[6] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH7 = 0x0B37u, /* tcpwm[1].tr_compare_match[7] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH8 = 0x0B38u, /* tcpwm[1].tr_compare_match[8] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH9 = 0x0B39u, /* tcpwm[1].tr_compare_match[9] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH10 = 0x0B3Au, /* tcpwm[1].tr_compare_match[10] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH11 = 0x0B3Bu, /* tcpwm[1].tr_compare_match[11] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH12 = 0x0B3Cu, /* tcpwm[1].tr_compare_match[12] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH13 = 0x0B3Du, /* tcpwm[1].tr_compare_match[13] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH14 = 0x0B3Eu, /* tcpwm[1].tr_compare_match[14] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH15 = 0x0B3Fu, /* tcpwm[1].tr_compare_match[15] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH16 = 0x0B40u, /* tcpwm[1].tr_compare_match[16] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH17 = 0x0B41u, /* tcpwm[1].tr_compare_match[17] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH18 = 0x0B42u, /* tcpwm[1].tr_compare_match[18] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH19 = 0x0B43u, /* tcpwm[1].tr_compare_match[19] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH20 = 0x0B44u, /* tcpwm[1].tr_compare_match[20] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH21 = 0x0B45u, /* tcpwm[1].tr_compare_match[21] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH22 = 0x0B46u, /* tcpwm[1].tr_compare_match[22] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH23 = 0x0B47u, /* tcpwm[1].tr_compare_match[23] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW0 = 0x0B48u, /* tcpwm[1].tr_underflow[0] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW1 = 0x0B49u, /* tcpwm[1].tr_underflow[1] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW2 = 0x0B4Au, /* tcpwm[1].tr_underflow[2] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW3 = 0x0B4Bu, /* tcpwm[1].tr_underflow[3] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW4 = 0x0B4Cu, /* tcpwm[1].tr_underflow[4] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW5 = 0x0B4Du, /* tcpwm[1].tr_underflow[5] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW6 = 0x0B4Eu, /* tcpwm[1].tr_underflow[6] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW7 = 0x0B4Fu, /* tcpwm[1].tr_underflow[7] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW8 = 0x0B50u, /* tcpwm[1].tr_underflow[8] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW9 = 0x0B51u, /* tcpwm[1].tr_underflow[9] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW10 = 0x0B52u, /* tcpwm[1].tr_underflow[10] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW11 = 0x0B53u, /* tcpwm[1].tr_underflow[11] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW12 = 0x0B54u, /* tcpwm[1].tr_underflow[12] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW13 = 0x0B55u, /* tcpwm[1].tr_underflow[13] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW14 = 0x0B56u, /* tcpwm[1].tr_underflow[14] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW15 = 0x0B57u, /* tcpwm[1].tr_underflow[15] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW16 = 0x0B58u, /* tcpwm[1].tr_underflow[16] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW17 = 0x0B59u, /* tcpwm[1].tr_underflow[17] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW18 = 0x0B5Au, /* tcpwm[1].tr_underflow[18] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW19 = 0x0B5Bu, /* tcpwm[1].tr_underflow[19] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW20 = 0x0B5Cu, /* tcpwm[1].tr_underflow[20] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW21 = 0x0B5Du, /* tcpwm[1].tr_underflow[21] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW22 = 0x0B5Eu, /* tcpwm[1].tr_underflow[22] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW23 = 0x0B5Fu /* tcpwm[1].tr_underflow[23] */ +} en_trig_input_grp11_t; + +/* Trigger Input Group 12 - Reduces 28 pin input signals to 10 triggers used by all sinks */ +typedef enum +{ + TRIG12_IN_PERI_TR_IO_INPUT0 = 0x0C00u, /* peri.tr_io_input[0] */ + TRIG12_IN_PERI_TR_IO_INPUT1 = 0x0C01u, /* peri.tr_io_input[1] */ + TRIG12_IN_PERI_TR_IO_INPUT2 = 0x0C02u, /* peri.tr_io_input[2] */ + TRIG12_IN_PERI_TR_IO_INPUT3 = 0x0C03u, /* peri.tr_io_input[3] */ + TRIG12_IN_PERI_TR_IO_INPUT4 = 0x0C04u, /* peri.tr_io_input[4] */ + TRIG12_IN_PERI_TR_IO_INPUT5 = 0x0C05u, /* peri.tr_io_input[5] */ + TRIG12_IN_PERI_TR_IO_INPUT6 = 0x0C06u, /* peri.tr_io_input[6] */ + TRIG12_IN_PERI_TR_IO_INPUT7 = 0x0C07u, /* peri.tr_io_input[7] */ + TRIG12_IN_PERI_TR_IO_INPUT8 = 0x0C08u, /* peri.tr_io_input[8] */ + TRIG12_IN_PERI_TR_IO_INPUT9 = 0x0C09u, /* peri.tr_io_input[9] */ + TRIG12_IN_PERI_TR_IO_INPUT10 = 0x0C0Au, /* peri.tr_io_input[10] */ + TRIG12_IN_PERI_TR_IO_INPUT11 = 0x0C0Bu, /* peri.tr_io_input[11] */ + TRIG12_IN_PERI_TR_IO_INPUT12 = 0x0C0Cu, /* peri.tr_io_input[12] */ + TRIG12_IN_PERI_TR_IO_INPUT13 = 0x0C0Du, /* peri.tr_io_input[13] */ + TRIG12_IN_PERI_TR_IO_INPUT14 = 0x0C0Eu, /* peri.tr_io_input[14] */ + TRIG12_IN_PERI_TR_IO_INPUT15 = 0x0C0Fu, /* peri.tr_io_input[15] */ + TRIG12_IN_PERI_TR_IO_INPUT16 = 0x0C10u, /* peri.tr_io_input[16] */ + TRIG12_IN_PERI_TR_IO_INPUT17 = 0x0C11u, /* peri.tr_io_input[17] */ + TRIG12_IN_PERI_TR_IO_INPUT18 = 0x0C12u, /* peri.tr_io_input[18] */ + TRIG12_IN_PERI_TR_IO_INPUT19 = 0x0C13u, /* peri.tr_io_input[19] */ + TRIG12_IN_PERI_TR_IO_INPUT20 = 0x0C14u, /* peri.tr_io_input[20] */ + TRIG12_IN_PERI_TR_IO_INPUT21 = 0x0C15u, /* peri.tr_io_input[21] */ + TRIG12_IN_PERI_TR_IO_INPUT22 = 0x0C16u, /* peri.tr_io_input[22] */ + TRIG12_IN_PERI_TR_IO_INPUT23 = 0x0C17u, /* peri.tr_io_input[23] */ + TRIG12_IN_PERI_TR_IO_INPUT24 = 0x0C18u, /* peri.tr_io_input[24] */ + TRIG12_IN_PERI_TR_IO_INPUT25 = 0x0C19u, /* peri.tr_io_input[25] */ + TRIG12_IN_PERI_TR_IO_INPUT26 = 0x0C1Au, /* peri.tr_io_input[26] */ + TRIG12_IN_PERI_TR_IO_INPUT27 = 0x0C1Bu /* peri.tr_io_input[27] */ +} en_trig_input_grp12_t; + +/* Trigger Input Group 13 - Reduces DMA requests to 16+2 outputs used by all sinks */ +typedef enum +{ + TRIG13_IN_SCB0_TR_TX_REQ = 0x0D00u, /* scb[0].tr_tx_req */ + TRIG13_IN_SCB0_TR_RX_REQ = 0x0D01u, /* scb[0].tr_rx_req */ + TRIG13_IN_SCB1_TR_TX_REQ = 0x0D02u, /* scb[1].tr_tx_req */ + TRIG13_IN_SCB1_TR_RX_REQ = 0x0D03u, /* scb[1].tr_rx_req */ + TRIG13_IN_SCB2_TR_TX_REQ = 0x0D04u, /* scb[2].tr_tx_req */ + TRIG13_IN_SCB2_TR_RX_REQ = 0x0D05u, /* scb[2].tr_rx_req */ + TRIG13_IN_SCB3_TR_TX_REQ = 0x0D06u, /* scb[3].tr_tx_req */ + TRIG13_IN_SCB3_TR_RX_REQ = 0x0D07u, /* scb[3].tr_rx_req */ + TRIG13_IN_SCB4_TR_TX_REQ = 0x0D08u, /* scb[4].tr_tx_req */ + TRIG13_IN_SCB4_TR_RX_REQ = 0x0D09u, /* scb[4].tr_rx_req */ + TRIG13_IN_SCB5_TR_TX_REQ = 0x0D0Au, /* scb[5].tr_tx_req */ + TRIG13_IN_SCB5_TR_RX_REQ = 0x0D0Bu, /* scb[5].tr_rx_req */ + TRIG13_IN_SCB6_TR_TX_REQ = 0x0D0Cu, /* scb[6].tr_tx_req */ + TRIG13_IN_SCB6_TR_RX_REQ = 0x0D0Du, /* scb[6].tr_rx_req */ + TRIG13_IN_SCB7_TR_TX_REQ = 0x0D0Eu, /* scb[7].tr_tx_req */ + TRIG13_IN_SCB7_TR_RX_REQ = 0x0D0Fu, /* scb[7].tr_rx_req */ + TRIG13_IN_SCB8_TR_TX_REQ = 0x0D10u, /* scb[8].tr_tx_req */ + TRIG13_IN_SCB8_TR_RX_REQ = 0x0D11u, /* scb[8].tr_rx_req */ + TRIG13_IN_AUDIOSS_TR_PDM_RX_REQ = 0x0D12u, /* audioss.tr_pdm_rx_req */ + TRIG13_IN_AUDIOSS_TR_I2S_TX_REQ = 0x0D13u, /* audioss.tr_i2s_tx_req */ + TRIG13_IN_AUDIOSS_TR_I2S_RX_REQ = 0x0D14u, /* audioss.tr_i2s_rx_req */ + TRIG13_IN_SMIF_TR_TX_REQ = 0x0D15u, /* smif.tr_tx_req */ + TRIG13_IN_SMIF_TR_RX_REQ = 0x0D16u, /* smif.tr_rx_req */ + TRIG13_IN_USB_DMA_REQ0 = 0x0D17u, /* usb.dma_req[0] */ + TRIG13_IN_USB_DMA_REQ1 = 0x0D18u, /* usb.dma_req[1] */ + TRIG13_IN_USB_DMA_REQ2 = 0x0D19u, /* usb.dma_req[2] */ + TRIG13_IN_USB_DMA_REQ3 = 0x0D1Au, /* usb.dma_req[3] */ + TRIG13_IN_USB_DMA_REQ4 = 0x0D1Bu, /* usb.dma_req[4] */ + TRIG13_IN_USB_DMA_REQ5 = 0x0D1Cu, /* usb.dma_req[5] */ + TRIG13_IN_USB_DMA_REQ6 = 0x0D1Du, /* usb.dma_req[6] */ + TRIG13_IN_USB_DMA_REQ7 = 0x0D1Eu /* usb.dma_req[7] */ +} en_trig_input_grp13_t; + +/* Trigger Input Group 14 - Reduces general purpose trigger inputs to 8+8 outputs used by all sinks */ +typedef enum +{ + TRIG14_IN_UDB_TR_UDB0 = 0x0E00u, /* udb.tr_udb[0] */ + TRIG14_IN_UDB_TR_UDB1 = 0x0E01u, /* udb.tr_udb[1] */ + TRIG14_IN_UDB_TR_UDB2 = 0x0E02u, /* udb.tr_udb[2] */ + TRIG14_IN_UDB_TR_UDB3 = 0x0E03u, /* udb.tr_udb[3] */ + TRIG14_IN_UDB_TR_UDB4 = 0x0E04u, /* udb.tr_udb[4] */ + TRIG14_IN_UDB_TR_UDB5 = 0x0E05u, /* udb.tr_udb[5] */ + TRIG14_IN_UDB_TR_UDB6 = 0x0E06u, /* udb.tr_udb[6] */ + TRIG14_IN_UDB_TR_UDB7 = 0x0E07u, /* udb.tr_udb[7] */ + TRIG14_IN_UDB_TR_UDB8 = 0x0E08u, /* udb.tr_udb[8] */ + TRIG14_IN_UDB_TR_UDB9 = 0x0E09u, /* udb.tr_udb[9] */ + TRIG14_IN_UDB_TR_UDB10 = 0x0E0Au, /* udb.tr_udb[10] */ + TRIG14_IN_UDB_TR_UDB11 = 0x0E0Bu, /* udb.tr_udb[11] */ + TRIG14_IN_UDB_TR_UDB12 = 0x0E0Cu, /* udb.tr_udb[12] */ + TRIG14_IN_UDB_TR_UDB13 = 0x0E0Du, /* udb.tr_udb[13] */ + TRIG14_IN_UDB_TR_UDB14 = 0x0E0Eu, /* udb.tr_udb[14] */ + TRIG14_IN_UDB_TR_UDB15 = 0x0E0Fu, /* udb.tr_udb[15] */ + TRIG14_IN_UDB_DSI_OUT_TR0 = 0x0E10u, /* udb.dsi_out_tr[0] */ + TRIG14_IN_UDB_DSI_OUT_TR1 = 0x0E11u, /* udb.dsi_out_tr[1] */ + TRIG14_IN_CPUSS_CTI_TR_OUT0 = 0x0E12u, /* cpuss.cti_tr_out[0] */ + TRIG14_IN_CPUSS_CTI_TR_OUT1 = 0x0E13u, /* cpuss.cti_tr_out[1] */ + TRIG14_IN_PASS_TR_SAR_OUT = 0x0E14u, /* pass.tr_sar_out */ + TRIG14_IN_PASS_TR_CTDAC_EMPTY = 0x0E15u, /* pass.tr_ctdac_empty */ + TRIG14_IN_PASS_DSI_CTB_CMP0 = 0x0E16u, /* pass.dsi_ctb_cmp0 */ + TRIG14_IN_PASS_DSI_CTB_CMP1 = 0x0E17u, /* pass.dsi_ctb_cmp1 */ + TRIG14_IN_LPCOMP_DSI_COMP0 = 0x0E18u, /* lpcomp.dsi_comp0 */ + TRIG14_IN_LPCOMP_DSI_COMP1 = 0x0E19u, /* lpcomp.dsi_comp1 */ + TRIG14_IN_SCB0_TR_I2C_SCL_FILTERED = 0x0E1Au, /* scb[0].tr_i2c_scl_filtered */ + TRIG14_IN_SCB1_TR_I2C_SCL_FILTERED = 0x0E1Bu, /* scb[1].tr_i2c_scl_filtered */ + TRIG14_IN_SCB2_TR_I2C_SCL_FILTERED = 0x0E1Cu, /* scb[2].tr_i2c_scl_filtered */ + TRIG14_IN_SCB3_TR_I2C_SCL_FILTERED = 0x0E1Du, /* scb[3].tr_i2c_scl_filtered */ + TRIG14_IN_SCB4_TR_I2C_SCL_FILTERED = 0x0E1Eu, /* scb[4].tr_i2c_scl_filtered */ + TRIG14_IN_SCB5_TR_I2C_SCL_FILTERED = 0x0E1Fu, /* scb[5].tr_i2c_scl_filtered */ + TRIG14_IN_SCB6_TR_I2C_SCL_FILTERED = 0x0E20u, /* scb[6].tr_i2c_scl_filtered */ + TRIG14_IN_SCB7_TR_I2C_SCL_FILTERED = 0x0E21u, /* scb[7].tr_i2c_scl_filtered */ + TRIG14_IN_SCB8_TR_I2C_SCL_FILTERED = 0x0E22u, /* scb[8].tr_i2c_scl_filtered */ + TRIG14_IN_CPUSS_TR_FAULT0 = 0x0E23u, /* cpuss.tr_fault[0] */ + TRIG14_IN_CPUSS_TR_FAULT1 = 0x0E24u /* cpuss.tr_fault[1] */ +} en_trig_input_grp14_t; + +/* Trigger Group Outputs */ +/* Trigger Output Group 0 - DMA Request Assignments */ +typedef enum +{ + TRIG0_OUT_CPUSS_DW0_TR_IN0 = 0x1000u, /* cpuss.dw0_tr_in[0] */ + TRIG0_OUT_CPUSS_DW0_TR_IN1 = 0x1001u, /* cpuss.dw0_tr_in[1] */ + TRIG0_OUT_CPUSS_DW0_TR_IN2 = 0x1002u, /* cpuss.dw0_tr_in[2] */ + TRIG0_OUT_CPUSS_DW0_TR_IN3 = 0x1003u, /* cpuss.dw0_tr_in[3] */ + TRIG0_OUT_CPUSS_DW0_TR_IN4 = 0x1004u, /* cpuss.dw0_tr_in[4] */ + TRIG0_OUT_CPUSS_DW0_TR_IN5 = 0x1005u, /* cpuss.dw0_tr_in[5] */ + TRIG0_OUT_CPUSS_DW0_TR_IN6 = 0x1006u, /* cpuss.dw0_tr_in[6] */ + TRIG0_OUT_CPUSS_DW0_TR_IN7 = 0x1007u, /* cpuss.dw0_tr_in[7] */ + TRIG0_OUT_CPUSS_DW0_TR_IN8 = 0x1008u, /* cpuss.dw0_tr_in[8] */ + TRIG0_OUT_CPUSS_DW0_TR_IN9 = 0x1009u, /* cpuss.dw0_tr_in[9] */ + TRIG0_OUT_CPUSS_DW0_TR_IN10 = 0x100Au, /* cpuss.dw0_tr_in[10] */ + TRIG0_OUT_CPUSS_DW0_TR_IN11 = 0x100Bu, /* cpuss.dw0_tr_in[11] */ + TRIG0_OUT_CPUSS_DW0_TR_IN12 = 0x100Cu, /* cpuss.dw0_tr_in[12] */ + TRIG0_OUT_CPUSS_DW0_TR_IN13 = 0x100Du, /* cpuss.dw0_tr_in[13] */ + TRIG0_OUT_CPUSS_DW0_TR_IN14 = 0x100Eu, /* cpuss.dw0_tr_in[14] */ + TRIG0_OUT_CPUSS_DW0_TR_IN15 = 0x100Fu /* cpuss.dw0_tr_in[15] */ +} en_trig_output_grp0_t; + +/* Trigger Output Group 1 - DMA Request Assignments */ +typedef enum +{ + TRIG1_OUT_CPUSS_DW1_TR_IN0 = 0x1100u, /* cpuss.dw1_tr_in[0] */ + TRIG1_OUT_CPUSS_DW1_TR_IN1 = 0x1101u, /* cpuss.dw1_tr_in[1] */ + TRIG1_OUT_CPUSS_DW1_TR_IN2 = 0x1102u, /* cpuss.dw1_tr_in[2] */ + TRIG1_OUT_CPUSS_DW1_TR_IN3 = 0x1103u, /* cpuss.dw1_tr_in[3] */ + TRIG1_OUT_CPUSS_DW1_TR_IN4 = 0x1104u, /* cpuss.dw1_tr_in[4] */ + TRIG1_OUT_CPUSS_DW1_TR_IN5 = 0x1105u, /* cpuss.dw1_tr_in[5] */ + TRIG1_OUT_CPUSS_DW1_TR_IN6 = 0x1106u, /* cpuss.dw1_tr_in[6] */ + TRIG1_OUT_CPUSS_DW1_TR_IN7 = 0x1107u, /* cpuss.dw1_tr_in[7] */ + TRIG1_OUT_CPUSS_DW1_TR_IN8 = 0x1108u, /* cpuss.dw1_tr_in[8] */ + TRIG1_OUT_CPUSS_DW1_TR_IN9 = 0x1109u, /* cpuss.dw1_tr_in[9] */ + TRIG1_OUT_CPUSS_DW1_TR_IN10 = 0x110Au, /* cpuss.dw1_tr_in[10] */ + TRIG1_OUT_CPUSS_DW1_TR_IN11 = 0x110Bu, /* cpuss.dw1_tr_in[11] */ + TRIG1_OUT_CPUSS_DW1_TR_IN12 = 0x110Cu, /* cpuss.dw1_tr_in[12] */ + TRIG1_OUT_CPUSS_DW1_TR_IN13 = 0x110Du, /* cpuss.dw1_tr_in[13] */ + TRIG1_OUT_CPUSS_DW1_TR_IN14 = 0x110Eu, /* cpuss.dw1_tr_in[14] */ + TRIG1_OUT_CPUSS_DW1_TR_IN15 = 0x110Fu /* cpuss.dw1_tr_in[15] */ +} en_trig_output_grp1_t; + +/* Trigger Output Group 2 - TCPWM trigger inputs */ +typedef enum +{ + TRIG2_OUT_TCPWM0_TR_IN0 = 0x1200u, /* tcpwm[0].tr_in[0] */ + TRIG2_OUT_TCPWM0_TR_IN1 = 0x1201u, /* tcpwm[0].tr_in[1] */ + TRIG2_OUT_TCPWM0_TR_IN2 = 0x1202u, /* tcpwm[0].tr_in[2] */ + TRIG2_OUT_TCPWM0_TR_IN3 = 0x1203u, /* tcpwm[0].tr_in[3] */ + TRIG2_OUT_TCPWM0_TR_IN4 = 0x1204u, /* tcpwm[0].tr_in[4] */ + TRIG2_OUT_TCPWM0_TR_IN5 = 0x1205u, /* tcpwm[0].tr_in[5] */ + TRIG2_OUT_TCPWM0_TR_IN6 = 0x1206u, /* tcpwm[0].tr_in[6] */ + TRIG2_OUT_TCPWM0_TR_IN7 = 0x1207u, /* tcpwm[0].tr_in[7] */ + TRIG2_OUT_TCPWM0_TR_IN8 = 0x1208u, /* tcpwm[0].tr_in[8] */ + TRIG2_OUT_TCPWM0_TR_IN9 = 0x1209u, /* tcpwm[0].tr_in[9] */ + TRIG2_OUT_TCPWM0_TR_IN10 = 0x120Au, /* tcpwm[0].tr_in[10] */ + TRIG2_OUT_TCPWM0_TR_IN11 = 0x120Bu, /* tcpwm[0].tr_in[11] */ + TRIG2_OUT_TCPWM0_TR_IN12 = 0x120Cu, /* tcpwm[0].tr_in[12] */ + TRIG2_OUT_TCPWM0_TR_IN13 = 0x120Du /* tcpwm[0].tr_in[13] */ +} en_trig_output_grp2_t; + +/* Trigger Output Group 3 - TCPWM trigger inputs */ +typedef enum +{ + TRIG3_OUT_TCPWM1_TR_IN0 = 0x1300u, /* tcpwm[1].tr_in[0] */ + TRIG3_OUT_TCPWM1_TR_IN1 = 0x1301u, /* tcpwm[1].tr_in[1] */ + TRIG3_OUT_TCPWM1_TR_IN2 = 0x1302u, /* tcpwm[1].tr_in[2] */ + TRIG3_OUT_TCPWM1_TR_IN3 = 0x1303u, /* tcpwm[1].tr_in[3] */ + TRIG3_OUT_TCPWM1_TR_IN4 = 0x1304u, /* tcpwm[1].tr_in[4] */ + TRIG3_OUT_TCPWM1_TR_IN5 = 0x1305u, /* tcpwm[1].tr_in[5] */ + TRIG3_OUT_TCPWM1_TR_IN6 = 0x1306u, /* tcpwm[1].tr_in[6] */ + TRIG3_OUT_TCPWM1_TR_IN7 = 0x1307u, /* tcpwm[1].tr_in[7] */ + TRIG3_OUT_TCPWM1_TR_IN8 = 0x1308u, /* tcpwm[1].tr_in[8] */ + TRIG3_OUT_TCPWM1_TR_IN9 = 0x1309u, /* tcpwm[1].tr_in[9] */ + TRIG3_OUT_TCPWM1_TR_IN10 = 0x130Au, /* tcpwm[1].tr_in[10] */ + TRIG3_OUT_TCPWM1_TR_IN11 = 0x130Bu, /* tcpwm[1].tr_in[11] */ + TRIG3_OUT_TCPWM1_TR_IN12 = 0x130Cu, /* tcpwm[1].tr_in[12] */ + TRIG3_OUT_TCPWM1_TR_IN13 = 0x130Du /* tcpwm[1].tr_in[13] */ +} en_trig_output_grp3_t; + +/* Trigger Output Group 4 - PROFILE trigger multiplexer */ +typedef enum +{ + TRIG4_OUT_PROFILE_TR_START = 0x1400u, /* profile.tr_start */ + TRIG4_OUT_PROFILE_TR_STOP = 0x1401u /* profile.tr_stop */ +} en_trig_output_grp4_t; + +/* Trigger Output Group 5 - CPUSS.CTI trigger multiplexer */ +typedef enum +{ + TRIG5_OUT_CPUSS_CTI_TR_IN0 = 0x1500u, /* cpuss.cti_tr_in[0] */ + TRIG5_OUT_CPUSS_CTI_TR_IN1 = 0x1501u /* cpuss.cti_tr_in[1] */ +} en_trig_output_grp5_t; + +/* Trigger Output Group 6 - PASS trigger multiplexer */ +typedef enum +{ + TRIG6_OUT_PASS_TR_SAR_IN = 0x1600u /* pass.tr_sar_in */ +} en_trig_output_grp6_t; + +/* Trigger Output Group 7 - UDB general purpose trigger multiplexer */ +typedef enum +{ + TRIG7_OUT_UDB_TR_IN0 = 0x1700u, /* udb.tr_in[0] */ + TRIG7_OUT_UDB_TR_IN1 = 0x1701u /* udb.tr_in[1] */ +} en_trig_output_grp7_t; + +/* Trigger Output Group 8 - Trigger multiplexer to pins */ +typedef enum +{ + TRIG8_OUT_PERI_TR_IO_OUTPUT0 = 0x1800u, /* peri.tr_io_output[0] */ + TRIG8_OUT_PERI_TR_IO_OUTPUT1 = 0x1801u /* peri.tr_io_output[1] */ +} en_trig_output_grp8_t; + +/* Trigger Output Group 9 - Feedback mux to USB DMA interface */ +typedef enum +{ + TRIG9_OUT_USB_DMA_BURSTEND0 = 0x1900u, /* usb.dma_burstend[0] */ + TRIG9_OUT_USB_DMA_BURSTEND1 = 0x1901u, /* usb.dma_burstend[1] */ + TRIG9_OUT_USB_DMA_BURSTEND2 = 0x1902u, /* usb.dma_burstend[2] */ + TRIG9_OUT_USB_DMA_BURSTEND3 = 0x1903u, /* usb.dma_burstend[3] */ + TRIG9_OUT_USB_DMA_BURSTEND4 = 0x1904u, /* usb.dma_burstend[4] */ + TRIG9_OUT_USB_DMA_BURSTEND5 = 0x1905u, /* usb.dma_burstend[5] */ + TRIG9_OUT_USB_DMA_BURSTEND6 = 0x1906u, /* usb.dma_burstend[6] */ + TRIG9_OUT_USB_DMA_BURSTEND7 = 0x1907u /* usb.dma_burstend[7] */ +} en_trig_output_grp9_t; + +/* Trigger Output Group 10 - Reduces 32 datawire output triggers to 8 signals, used by all except USB */ +typedef enum +{ + TRIG10_OUT_UDB_TR_DW_ACK0 = 0x1A00u, /* udb.tr_dw_ack[0] */ + TRIG10_OUT_TR_GROUP0_INPUT0 = 0x1A00u, /* tr_group[0].input[0] */ + TRIG10_OUT_TR_GROUP1_INPUT0 = 0x1A00u, /* tr_group[1].input[0] */ + TRIG10_OUT_TR_GROUP2_INPUT0 = 0x1A00u, /* tr_group[2].input[0] */ + TRIG10_OUT_TR_GROUP3_INPUT0 = 0x1A00u, /* tr_group[3].input[0] */ + TRIG10_OUT_TR_GROUP4_INPUT0 = 0x1A00u, /* tr_group[4].input[0] */ + TRIG10_OUT_TR_GROUP5_INPUT0 = 0x1A00u, /* tr_group[5].input[0] */ + TRIG10_OUT_TR_GROUP6_INPUT0 = 0x1A00u, /* tr_group[6].input[0] */ + TRIG10_OUT_TR_GROUP7_INPUT0 = 0x1A00u, /* tr_group[7].input[0] */ + TRIG10_OUT_TR_GROUP8_INPUT0 = 0x1A00u, /* tr_group[8].input[0] */ + TRIG10_OUT_UDB_TR_DW_ACK1 = 0x1A01u, /* udb.tr_dw_ack[1] */ + TRIG10_OUT_TR_GROUP0_INPUT1 = 0x1A01u, /* tr_group[0].input[1] */ + TRIG10_OUT_TR_GROUP1_INPUT1 = 0x1A01u, /* tr_group[1].input[1] */ + TRIG10_OUT_TR_GROUP2_INPUT1 = 0x1A01u, /* tr_group[2].input[1] */ + TRIG10_OUT_TR_GROUP3_INPUT1 = 0x1A01u, /* tr_group[3].input[1] */ + TRIG10_OUT_TR_GROUP4_INPUT1 = 0x1A01u, /* tr_group[4].input[1] */ + TRIG10_OUT_TR_GROUP5_INPUT1 = 0x1A01u, /* tr_group[5].input[1] */ + TRIG10_OUT_TR_GROUP6_INPUT1 = 0x1A01u, /* tr_group[6].input[1] */ + TRIG10_OUT_TR_GROUP7_INPUT1 = 0x1A01u, /* tr_group[7].input[1] */ + TRIG10_OUT_TR_GROUP8_INPUT1 = 0x1A01u, /* tr_group[8].input[1] */ + TRIG10_OUT_UDB_TR_DW_ACK2 = 0x1A02u, /* udb.tr_dw_ack[2] */ + TRIG10_OUT_TR_GROUP0_INPUT2 = 0x1A02u, /* tr_group[0].input[2] */ + TRIG10_OUT_TR_GROUP1_INPUT2 = 0x1A02u, /* tr_group[1].input[2] */ + TRIG10_OUT_TR_GROUP2_INPUT2 = 0x1A02u, /* tr_group[2].input[2] */ + TRIG10_OUT_TR_GROUP3_INPUT2 = 0x1A02u, /* tr_group[3].input[2] */ + TRIG10_OUT_TR_GROUP4_INPUT2 = 0x1A02u, /* tr_group[4].input[2] */ + TRIG10_OUT_TR_GROUP5_INPUT2 = 0x1A02u, /* tr_group[5].input[2] */ + TRIG10_OUT_TR_GROUP6_INPUT2 = 0x1A02u, /* tr_group[6].input[2] */ + TRIG10_OUT_TR_GROUP7_INPUT2 = 0x1A02u, /* tr_group[7].input[2] */ + TRIG10_OUT_TR_GROUP8_INPUT2 = 0x1A02u, /* tr_group[8].input[2] */ + TRIG10_OUT_UDB_TR_DW_ACK3 = 0x1A03u, /* udb.tr_dw_ack[3] */ + TRIG10_OUT_TR_GROUP0_INPUT3 = 0x1A03u, /* tr_group[0].input[3] */ + TRIG10_OUT_TR_GROUP1_INPUT3 = 0x1A03u, /* tr_group[1].input[3] */ + TRIG10_OUT_TR_GROUP2_INPUT3 = 0x1A03u, /* tr_group[2].input[3] */ + TRIG10_OUT_TR_GROUP3_INPUT3 = 0x1A03u, /* tr_group[3].input[3] */ + TRIG10_OUT_TR_GROUP4_INPUT3 = 0x1A03u, /* tr_group[4].input[3] */ + TRIG10_OUT_TR_GROUP5_INPUT3 = 0x1A03u, /* tr_group[5].input[3] */ + TRIG10_OUT_TR_GROUP6_INPUT3 = 0x1A03u, /* tr_group[6].input[3] */ + TRIG10_OUT_TR_GROUP7_INPUT3 = 0x1A03u, /* tr_group[7].input[3] */ + TRIG10_OUT_TR_GROUP8_INPUT3 = 0x1A03u, /* tr_group[8].input[3] */ + TRIG10_OUT_UDB_TR_DW_ACK4 = 0x1A04u, /* udb.tr_dw_ack[4] */ + TRIG10_OUT_TR_GROUP0_INPUT4 = 0x1A04u, /* tr_group[0].input[4] */ + TRIG10_OUT_TR_GROUP1_INPUT4 = 0x1A04u, /* tr_group[1].input[4] */ + TRIG10_OUT_TR_GROUP2_INPUT4 = 0x1A04u, /* tr_group[2].input[4] */ + TRIG10_OUT_TR_GROUP3_INPUT4 = 0x1A04u, /* tr_group[3].input[4] */ + TRIG10_OUT_TR_GROUP4_INPUT4 = 0x1A04u, /* tr_group[4].input[4] */ + TRIG10_OUT_TR_GROUP5_INPUT4 = 0x1A04u, /* tr_group[5].input[4] */ + TRIG10_OUT_TR_GROUP6_INPUT4 = 0x1A04u, /* tr_group[6].input[4] */ + TRIG10_OUT_TR_GROUP7_INPUT4 = 0x1A04u, /* tr_group[7].input[4] */ + TRIG10_OUT_TR_GROUP8_INPUT4 = 0x1A04u, /* tr_group[8].input[4] */ + TRIG10_OUT_UDB_TR_DW_ACK5 = 0x1A05u, /* udb.tr_dw_ack[5] */ + TRIG10_OUT_TR_GROUP0_INPUT5 = 0x1A05u, /* tr_group[0].input[5] */ + TRIG10_OUT_TR_GROUP1_INPUT5 = 0x1A05u, /* tr_group[1].input[5] */ + TRIG10_OUT_TR_GROUP2_INPUT5 = 0x1A05u, /* tr_group[2].input[5] */ + TRIG10_OUT_TR_GROUP3_INPUT5 = 0x1A05u, /* tr_group[3].input[5] */ + TRIG10_OUT_TR_GROUP4_INPUT5 = 0x1A05u, /* tr_group[4].input[5] */ + TRIG10_OUT_TR_GROUP5_INPUT5 = 0x1A05u, /* tr_group[5].input[5] */ + TRIG10_OUT_TR_GROUP6_INPUT5 = 0x1A05u, /* tr_group[6].input[5] */ + TRIG10_OUT_TR_GROUP7_INPUT5 = 0x1A05u, /* tr_group[7].input[5] */ + TRIG10_OUT_TR_GROUP8_INPUT5 = 0x1A05u, /* tr_group[8].input[5] */ + TRIG10_OUT_UDB_TR_DW_ACK6 = 0x1A06u, /* udb.tr_dw_ack[6] */ + TRIG10_OUT_TR_GROUP0_INPUT6 = 0x1A06u, /* tr_group[0].input[6] */ + TRIG10_OUT_TR_GROUP1_INPUT6 = 0x1A06u, /* tr_group[1].input[6] */ + TRIG10_OUT_TR_GROUP2_INPUT6 = 0x1A06u, /* tr_group[2].input[6] */ + TRIG10_OUT_TR_GROUP3_INPUT6 = 0x1A06u, /* tr_group[3].input[6] */ + TRIG10_OUT_TR_GROUP4_INPUT6 = 0x1A06u, /* tr_group[4].input[6] */ + TRIG10_OUT_TR_GROUP5_INPUT6 = 0x1A06u, /* tr_group[5].input[6] */ + TRIG10_OUT_TR_GROUP6_INPUT6 = 0x1A06u, /* tr_group[6].input[6] */ + TRIG10_OUT_TR_GROUP7_INPUT6 = 0x1A06u, /* tr_group[7].input[6] */ + TRIG10_OUT_TR_GROUP8_INPUT6 = 0x1A06u, /* tr_group[8].input[6] */ + TRIG10_OUT_UDB_TR_DW_ACK7 = 0x1A07u, /* udb.tr_dw_ack[7] */ + TRIG10_OUT_TR_GROUP0_INPUT7 = 0x1A07u, /* tr_group[0].input[7] */ + TRIG10_OUT_TR_GROUP1_INPUT7 = 0x1A07u, /* tr_group[1].input[7] */ + TRIG10_OUT_TR_GROUP2_INPUT7 = 0x1A07u, /* tr_group[2].input[7] */ + TRIG10_OUT_TR_GROUP3_INPUT7 = 0x1A07u, /* tr_group[3].input[7] */ + TRIG10_OUT_TR_GROUP4_INPUT7 = 0x1A07u, /* tr_group[4].input[7] */ + TRIG10_OUT_TR_GROUP5_INPUT7 = 0x1A07u, /* tr_group[5].input[7] */ + TRIG10_OUT_TR_GROUP6_INPUT7 = 0x1A07u, /* tr_group[6].input[7] */ + TRIG10_OUT_TR_GROUP7_INPUT7 = 0x1A07u, /* tr_group[7].input[7] */ + TRIG10_OUT_TR_GROUP8_INPUT7 = 0x1A07u /* tr_group[8].input[7] */ +} en_trig_output_grp10_t; + +/* Trigger Output Group 11 - Reduces 96 tcpwm output triggers to 16 signals, used by all sinks */ +typedef enum +{ + TRIG11_OUT_TR_GROUP0_INPUT8 = 0x1B00u, /* tr_group[0].input[8] */ + TRIG11_OUT_TR_GROUP1_INPUT8 = 0x1B00u, /* tr_group[1].input[8] */ + TRIG11_OUT_TR_GROUP2_INPUT8 = 0x1B00u, /* tr_group[2].input[8] */ + TRIG11_OUT_TR_GROUP3_INPUT8 = 0x1B00u, /* tr_group[3].input[8] */ + TRIG11_OUT_TR_GROUP4_INPUT8 = 0x1B00u, /* tr_group[4].input[8] */ + TRIG11_OUT_TR_GROUP5_INPUT8 = 0x1B00u, /* tr_group[5].input[8] */ + TRIG11_OUT_TR_GROUP6_INPUT8 = 0x1B00u, /* tr_group[6].input[8] */ + TRIG11_OUT_TR_GROUP7_INPUT8 = 0x1B00u, /* tr_group[7].input[8] */ + TRIG11_OUT_TR_GROUP8_INPUT8 = 0x1B00u, /* tr_group[8].input[8] */ + TRIG11_OUT_TR_GROUP0_INPUT9 = 0x1B01u, /* tr_group[0].input[9] */ + TRIG11_OUT_TR_GROUP1_INPUT9 = 0x1B01u, /* tr_group[1].input[9] */ + TRIG11_OUT_TR_GROUP2_INPUT9 = 0x1B01u, /* tr_group[2].input[9] */ + TRIG11_OUT_TR_GROUP3_INPUT9 = 0x1B01u, /* tr_group[3].input[9] */ + TRIG11_OUT_TR_GROUP4_INPUT9 = 0x1B01u, /* tr_group[4].input[9] */ + TRIG11_OUT_TR_GROUP5_INPUT9 = 0x1B01u, /* tr_group[5].input[9] */ + TRIG11_OUT_TR_GROUP6_INPUT9 = 0x1B01u, /* tr_group[6].input[9] */ + TRIG11_OUT_TR_GROUP7_INPUT9 = 0x1B01u, /* tr_group[7].input[9] */ + TRIG11_OUT_TR_GROUP8_INPUT9 = 0x1B01u, /* tr_group[8].input[9] */ + TRIG11_OUT_TR_GROUP0_INPUT10 = 0x1B02u, /* tr_group[0].input[10] */ + TRIG11_OUT_TR_GROUP1_INPUT10 = 0x1B02u, /* tr_group[1].input[10] */ + TRIG11_OUT_TR_GROUP2_INPUT10 = 0x1B02u, /* tr_group[2].input[10] */ + TRIG11_OUT_TR_GROUP3_INPUT10 = 0x1B02u, /* tr_group[3].input[10] */ + TRIG11_OUT_TR_GROUP4_INPUT10 = 0x1B02u, /* tr_group[4].input[10] */ + TRIG11_OUT_TR_GROUP5_INPUT10 = 0x1B02u, /* tr_group[5].input[10] */ + TRIG11_OUT_TR_GROUP6_INPUT10 = 0x1B02u, /* tr_group[6].input[10] */ + TRIG11_OUT_TR_GROUP7_INPUT10 = 0x1B02u, /* tr_group[7].input[10] */ + TRIG11_OUT_TR_GROUP8_INPUT10 = 0x1B02u, /* tr_group[8].input[10] */ + TRIG11_OUT_TR_GROUP0_INPUT11 = 0x1B03u, /* tr_group[0].input[11] */ + TRIG11_OUT_TR_GROUP1_INPUT11 = 0x1B03u, /* tr_group[1].input[11] */ + TRIG11_OUT_TR_GROUP2_INPUT11 = 0x1B03u, /* tr_group[2].input[11] */ + TRIG11_OUT_TR_GROUP3_INPUT11 = 0x1B03u, /* tr_group[3].input[11] */ + TRIG11_OUT_TR_GROUP4_INPUT11 = 0x1B03u, /* tr_group[4].input[11] */ + TRIG11_OUT_TR_GROUP5_INPUT11 = 0x1B03u, /* tr_group[5].input[11] */ + TRIG11_OUT_TR_GROUP6_INPUT11 = 0x1B03u, /* tr_group[6].input[11] */ + TRIG11_OUT_TR_GROUP7_INPUT11 = 0x1B03u, /* tr_group[7].input[11] */ + TRIG11_OUT_TR_GROUP8_INPUT11 = 0x1B03u, /* tr_group[8].input[11] */ + TRIG11_OUT_TR_GROUP0_INPUT12 = 0x1B04u, /* tr_group[0].input[12] */ + TRIG11_OUT_TR_GROUP1_INPUT12 = 0x1B04u, /* tr_group[1].input[12] */ + TRIG11_OUT_TR_GROUP2_INPUT12 = 0x1B04u, /* tr_group[2].input[12] */ + TRIG11_OUT_TR_GROUP3_INPUT12 = 0x1B04u, /* tr_group[3].input[12] */ + TRIG11_OUT_TR_GROUP4_INPUT12 = 0x1B04u, /* tr_group[4].input[12] */ + TRIG11_OUT_TR_GROUP5_INPUT12 = 0x1B04u, /* tr_group[5].input[12] */ + TRIG11_OUT_TR_GROUP6_INPUT12 = 0x1B04u, /* tr_group[6].input[12] */ + TRIG11_OUT_TR_GROUP7_INPUT12 = 0x1B04u, /* tr_group[7].input[12] */ + TRIG11_OUT_TR_GROUP8_INPUT12 = 0x1B04u, /* tr_group[8].input[12] */ + TRIG11_OUT_TR_GROUP0_INPUT13 = 0x1B05u, /* tr_group[0].input[13] */ + TRIG11_OUT_TR_GROUP1_INPUT13 = 0x1B05u, /* tr_group[1].input[13] */ + TRIG11_OUT_TR_GROUP2_INPUT13 = 0x1B05u, /* tr_group[2].input[13] */ + TRIG11_OUT_TR_GROUP3_INPUT13 = 0x1B05u, /* tr_group[3].input[13] */ + TRIG11_OUT_TR_GROUP4_INPUT13 = 0x1B05u, /* tr_group[4].input[13] */ + TRIG11_OUT_TR_GROUP5_INPUT13 = 0x1B05u, /* tr_group[5].input[13] */ + TRIG11_OUT_TR_GROUP6_INPUT13 = 0x1B05u, /* tr_group[6].input[13] */ + TRIG11_OUT_TR_GROUP7_INPUT13 = 0x1B05u, /* tr_group[7].input[13] */ + TRIG11_OUT_TR_GROUP8_INPUT13 = 0x1B05u, /* tr_group[8].input[13] */ + TRIG11_OUT_TR_GROUP0_INPUT14 = 0x1B06u, /* tr_group[0].input[14] */ + TRIG11_OUT_TR_GROUP1_INPUT14 = 0x1B06u, /* tr_group[1].input[14] */ + TRIG11_OUT_TR_GROUP2_INPUT14 = 0x1B06u, /* tr_group[2].input[14] */ + TRIG11_OUT_TR_GROUP3_INPUT14 = 0x1B06u, /* tr_group[3].input[14] */ + TRIG11_OUT_TR_GROUP4_INPUT14 = 0x1B06u, /* tr_group[4].input[14] */ + TRIG11_OUT_TR_GROUP5_INPUT14 = 0x1B06u, /* tr_group[5].input[14] */ + TRIG11_OUT_TR_GROUP6_INPUT14 = 0x1B06u, /* tr_group[6].input[14] */ + TRIG11_OUT_TR_GROUP7_INPUT14 = 0x1B06u, /* tr_group[7].input[14] */ + TRIG11_OUT_TR_GROUP8_INPUT14 = 0x1B06u, /* tr_group[8].input[14] */ + TRIG11_OUT_TR_GROUP0_INPUT15 = 0x1B07u, /* tr_group[0].input[15] */ + TRIG11_OUT_TR_GROUP1_INPUT15 = 0x1B07u, /* tr_group[1].input[15] */ + TRIG11_OUT_TR_GROUP2_INPUT15 = 0x1B07u, /* tr_group[2].input[15] */ + TRIG11_OUT_TR_GROUP3_INPUT15 = 0x1B07u, /* tr_group[3].input[15] */ + TRIG11_OUT_TR_GROUP4_INPUT15 = 0x1B07u, /* tr_group[4].input[15] */ + TRIG11_OUT_TR_GROUP5_INPUT15 = 0x1B07u, /* tr_group[5].input[15] */ + TRIG11_OUT_TR_GROUP6_INPUT15 = 0x1B07u, /* tr_group[6].input[15] */ + TRIG11_OUT_TR_GROUP7_INPUT15 = 0x1B07u, /* tr_group[7].input[15] */ + TRIG11_OUT_TR_GROUP8_INPUT15 = 0x1B07u, /* tr_group[8].input[15] */ + TRIG11_OUT_TR_GROUP0_INPUT16 = 0x1B08u, /* tr_group[0].input[16] */ + TRIG11_OUT_TR_GROUP1_INPUT16 = 0x1B08u, /* tr_group[1].input[16] */ + TRIG11_OUT_TR_GROUP2_INPUT16 = 0x1B08u, /* tr_group[2].input[16] */ + TRIG11_OUT_TR_GROUP3_INPUT16 = 0x1B08u, /* tr_group[3].input[16] */ + TRIG11_OUT_TR_GROUP4_INPUT16 = 0x1B08u, /* tr_group[4].input[16] */ + TRIG11_OUT_TR_GROUP5_INPUT16 = 0x1B08u, /* tr_group[5].input[16] */ + TRIG11_OUT_TR_GROUP6_INPUT16 = 0x1B08u, /* tr_group[6].input[16] */ + TRIG11_OUT_TR_GROUP7_INPUT16 = 0x1B08u, /* tr_group[7].input[16] */ + TRIG11_OUT_TR_GROUP8_INPUT16 = 0x1B08u, /* tr_group[8].input[16] */ + TRIG11_OUT_TR_GROUP0_INPUT17 = 0x1B09u, /* tr_group[0].input[17] */ + TRIG11_OUT_TR_GROUP1_INPUT17 = 0x1B09u, /* tr_group[1].input[17] */ + TRIG11_OUT_TR_GROUP2_INPUT17 = 0x1B09u, /* tr_group[2].input[17] */ + TRIG11_OUT_TR_GROUP3_INPUT17 = 0x1B09u, /* tr_group[3].input[17] */ + TRIG11_OUT_TR_GROUP4_INPUT17 = 0x1B09u, /* tr_group[4].input[17] */ + TRIG11_OUT_TR_GROUP5_INPUT17 = 0x1B09u, /* tr_group[5].input[17] */ + TRIG11_OUT_TR_GROUP6_INPUT17 = 0x1B09u, /* tr_group[6].input[17] */ + TRIG11_OUT_TR_GROUP7_INPUT17 = 0x1B09u, /* tr_group[7].input[17] */ + TRIG11_OUT_TR_GROUP8_INPUT17 = 0x1B09u, /* tr_group[8].input[17] */ + TRIG11_OUT_TR_GROUP0_INPUT18 = 0x1B0Au, /* tr_group[0].input[18] */ + TRIG11_OUT_TR_GROUP1_INPUT18 = 0x1B0Au, /* tr_group[1].input[18] */ + TRIG11_OUT_TR_GROUP2_INPUT18 = 0x1B0Au, /* tr_group[2].input[18] */ + TRIG11_OUT_TR_GROUP3_INPUT18 = 0x1B0Au, /* tr_group[3].input[18] */ + TRIG11_OUT_TR_GROUP4_INPUT18 = 0x1B0Au, /* tr_group[4].input[18] */ + TRIG11_OUT_TR_GROUP5_INPUT18 = 0x1B0Au, /* tr_group[5].input[18] */ + TRIG11_OUT_TR_GROUP6_INPUT18 = 0x1B0Au, /* tr_group[6].input[18] */ + TRIG11_OUT_TR_GROUP7_INPUT18 = 0x1B0Au, /* tr_group[7].input[18] */ + TRIG11_OUT_TR_GROUP8_INPUT18 = 0x1B0Au, /* tr_group[8].input[18] */ + TRIG11_OUT_TR_GROUP0_INPUT19 = 0x1B0Bu, /* tr_group[0].input[19] */ + TRIG11_OUT_TR_GROUP1_INPUT19 = 0x1B0Bu, /* tr_group[1].input[19] */ + TRIG11_OUT_TR_GROUP2_INPUT19 = 0x1B0Bu, /* tr_group[2].input[19] */ + TRIG11_OUT_TR_GROUP3_INPUT19 = 0x1B0Bu, /* tr_group[3].input[19] */ + TRIG11_OUT_TR_GROUP4_INPUT19 = 0x1B0Bu, /* tr_group[4].input[19] */ + TRIG11_OUT_TR_GROUP5_INPUT19 = 0x1B0Bu, /* tr_group[5].input[19] */ + TRIG11_OUT_TR_GROUP6_INPUT19 = 0x1B0Bu, /* tr_group[6].input[19] */ + TRIG11_OUT_TR_GROUP7_INPUT19 = 0x1B0Bu, /* tr_group[7].input[19] */ + TRIG11_OUT_TR_GROUP8_INPUT19 = 0x1B0Bu, /* tr_group[8].input[19] */ + TRIG11_OUT_TR_GROUP0_INPUT20 = 0x1B0Cu, /* tr_group[0].input[20] */ + TRIG11_OUT_TR_GROUP1_INPUT20 = 0x1B0Cu, /* tr_group[1].input[20] */ + TRIG11_OUT_TR_GROUP2_INPUT20 = 0x1B0Cu, /* tr_group[2].input[20] */ + TRIG11_OUT_TR_GROUP3_INPUT20 = 0x1B0Cu, /* tr_group[3].input[20] */ + TRIG11_OUT_TR_GROUP4_INPUT20 = 0x1B0Cu, /* tr_group[4].input[20] */ + TRIG11_OUT_TR_GROUP5_INPUT20 = 0x1B0Cu, /* tr_group[5].input[20] */ + TRIG11_OUT_TR_GROUP6_INPUT20 = 0x1B0Cu, /* tr_group[6].input[20] */ + TRIG11_OUT_TR_GROUP7_INPUT20 = 0x1B0Cu, /* tr_group[7].input[20] */ + TRIG11_OUT_TR_GROUP8_INPUT20 = 0x1B0Cu, /* tr_group[8].input[20] */ + TRIG11_OUT_TR_GROUP0_INPUT21 = 0x1B0Du, /* tr_group[0].input[21] */ + TRIG11_OUT_TR_GROUP1_INPUT21 = 0x1B0Du, /* tr_group[1].input[21] */ + TRIG11_OUT_TR_GROUP2_INPUT21 = 0x1B0Du, /* tr_group[2].input[21] */ + TRIG11_OUT_TR_GROUP3_INPUT21 = 0x1B0Du, /* tr_group[3].input[21] */ + TRIG11_OUT_TR_GROUP4_INPUT21 = 0x1B0Du, /* tr_group[4].input[21] */ + TRIG11_OUT_TR_GROUP5_INPUT21 = 0x1B0Du, /* tr_group[5].input[21] */ + TRIG11_OUT_TR_GROUP6_INPUT21 = 0x1B0Du, /* tr_group[6].input[21] */ + TRIG11_OUT_TR_GROUP7_INPUT21 = 0x1B0Du, /* tr_group[7].input[21] */ + TRIG11_OUT_TR_GROUP8_INPUT21 = 0x1B0Du, /* tr_group[8].input[21] */ + TRIG11_OUT_TR_GROUP0_INPUT22 = 0x1B0Eu, /* tr_group[0].input[22] */ + TRIG11_OUT_TR_GROUP1_INPUT22 = 0x1B0Eu, /* tr_group[1].input[22] */ + TRIG11_OUT_TR_GROUP2_INPUT22 = 0x1B0Eu, /* tr_group[2].input[22] */ + TRIG11_OUT_TR_GROUP3_INPUT22 = 0x1B0Eu, /* tr_group[3].input[22] */ + TRIG11_OUT_TR_GROUP4_INPUT22 = 0x1B0Eu, /* tr_group[4].input[22] */ + TRIG11_OUT_TR_GROUP5_INPUT22 = 0x1B0Eu, /* tr_group[5].input[22] */ + TRIG11_OUT_TR_GROUP6_INPUT22 = 0x1B0Eu, /* tr_group[6].input[22] */ + TRIG11_OUT_TR_GROUP7_INPUT22 = 0x1B0Eu, /* tr_group[7].input[22] */ + TRIG11_OUT_TR_GROUP8_INPUT22 = 0x1B0Eu, /* tr_group[8].input[22] */ + TRIG11_OUT_TR_GROUP0_INPUT23 = 0x1B0Fu, /* tr_group[0].input[23] */ + TRIG11_OUT_TR_GROUP1_INPUT23 = 0x1B0Fu, /* tr_group[1].input[23] */ + TRIG11_OUT_TR_GROUP2_INPUT23 = 0x1B0Fu, /* tr_group[2].input[23] */ + TRIG11_OUT_TR_GROUP3_INPUT23 = 0x1B0Fu, /* tr_group[3].input[23] */ + TRIG11_OUT_TR_GROUP4_INPUT23 = 0x1B0Fu, /* tr_group[4].input[23] */ + TRIG11_OUT_TR_GROUP5_INPUT23 = 0x1B0Fu, /* tr_group[5].input[23] */ + TRIG11_OUT_TR_GROUP6_INPUT23 = 0x1B0Fu, /* tr_group[6].input[23] */ + TRIG11_OUT_TR_GROUP7_INPUT23 = 0x1B0Fu, /* tr_group[7].input[23] */ + TRIG11_OUT_TR_GROUP8_INPUT23 = 0x1B0Fu /* tr_group[8].input[23] */ +} en_trig_output_grp11_t; + +/* Trigger Output Group 12 - Reduces 28 pin input signals to 10 triggers used by all sinks */ +typedef enum +{ + TRIG12_OUT_TR_GROUP2_INPUT24 = 0x1C00u, /* tr_group[2].input[24] */ + TRIG12_OUT_TR_GROUP3_INPUT24 = 0x1C00u, /* tr_group[3].input[24] */ + TRIG12_OUT_TR_GROUP4_INPUT24 = 0x1C00u, /* tr_group[4].input[24] */ + TRIG12_OUT_TR_GROUP5_INPUT24 = 0x1C00u, /* tr_group[5].input[24] */ + TRIG12_OUT_TR_GROUP6_INPUT24 = 0x1C00u, /* tr_group[6].input[24] */ + TRIG12_OUT_TR_GROUP7_INPUT24 = 0x1C00u, /* tr_group[7].input[24] */ + TRIG12_OUT_TR_GROUP8_INPUT24 = 0x1C00u, /* tr_group[8].input[24] */ + TRIG12_OUT_TR_GROUP2_INPUT25 = 0x1C01u, /* tr_group[2].input[25] */ + TRIG12_OUT_TR_GROUP3_INPUT25 = 0x1C01u, /* tr_group[3].input[25] */ + TRIG12_OUT_TR_GROUP4_INPUT25 = 0x1C01u, /* tr_group[4].input[25] */ + TRIG12_OUT_TR_GROUP5_INPUT25 = 0x1C01u, /* tr_group[5].input[25] */ + TRIG12_OUT_TR_GROUP6_INPUT25 = 0x1C01u, /* tr_group[6].input[25] */ + TRIG12_OUT_TR_GROUP7_INPUT25 = 0x1C01u, /* tr_group[7].input[25] */ + TRIG12_OUT_TR_GROUP8_INPUT25 = 0x1C01u, /* tr_group[8].input[25] */ + TRIG12_OUT_TR_GROUP2_INPUT26 = 0x1C02u, /* tr_group[2].input[26] */ + TRIG12_OUT_TR_GROUP3_INPUT26 = 0x1C02u, /* tr_group[3].input[26] */ + TRIG12_OUT_TR_GROUP4_INPUT26 = 0x1C02u, /* tr_group[4].input[26] */ + TRIG12_OUT_TR_GROUP5_INPUT26 = 0x1C02u, /* tr_group[5].input[26] */ + TRIG12_OUT_TR_GROUP6_INPUT26 = 0x1C02u, /* tr_group[6].input[26] */ + TRIG12_OUT_TR_GROUP7_INPUT26 = 0x1C02u, /* tr_group[7].input[26] */ + TRIG12_OUT_TR_GROUP8_INPUT26 = 0x1C02u, /* tr_group[8].input[26] */ + TRIG12_OUT_TR_GROUP2_INPUT27 = 0x1C03u, /* tr_group[2].input[27] */ + TRIG12_OUT_TR_GROUP3_INPUT27 = 0x1C03u, /* tr_group[3].input[27] */ + TRIG12_OUT_TR_GROUP4_INPUT27 = 0x1C03u, /* tr_group[4].input[27] */ + TRIG12_OUT_TR_GROUP5_INPUT27 = 0x1C03u, /* tr_group[5].input[27] */ + TRIG12_OUT_TR_GROUP6_INPUT27 = 0x1C03u, /* tr_group[6].input[27] */ + TRIG12_OUT_TR_GROUP7_INPUT27 = 0x1C03u, /* tr_group[7].input[27] */ + TRIG12_OUT_TR_GROUP8_INPUT27 = 0x1C03u, /* tr_group[8].input[27] */ + TRIG12_OUT_TR_GROUP2_INPUT28 = 0x1C04u, /* tr_group[2].input[28] */ + TRIG12_OUT_TR_GROUP3_INPUT28 = 0x1C04u, /* tr_group[3].input[28] */ + TRIG12_OUT_TR_GROUP4_INPUT28 = 0x1C04u, /* tr_group[4].input[28] */ + TRIG12_OUT_TR_GROUP5_INPUT28 = 0x1C04u, /* tr_group[5].input[28] */ + TRIG12_OUT_TR_GROUP6_INPUT28 = 0x1C04u, /* tr_group[6].input[28] */ + TRIG12_OUT_TR_GROUP7_INPUT28 = 0x1C04u, /* tr_group[7].input[28] */ + TRIG12_OUT_TR_GROUP8_INPUT28 = 0x1C04u, /* tr_group[8].input[28] */ + TRIG12_OUT_TR_GROUP2_INPUT29 = 0x1C05u, /* tr_group[2].input[29] */ + TRIG12_OUT_TR_GROUP3_INPUT29 = 0x1C05u, /* tr_group[3].input[29] */ + TRIG12_OUT_TR_GROUP4_INPUT29 = 0x1C05u, /* tr_group[4].input[29] */ + TRIG12_OUT_TR_GROUP5_INPUT29 = 0x1C05u, /* tr_group[5].input[29] */ + TRIG12_OUT_TR_GROUP6_INPUT29 = 0x1C05u, /* tr_group[6].input[29] */ + TRIG12_OUT_TR_GROUP7_INPUT29 = 0x1C05u, /* tr_group[7].input[29] */ + TRIG12_OUT_TR_GROUP8_INPUT29 = 0x1C05u, /* tr_group[8].input[29] */ + TRIG12_OUT_TR_GROUP2_INPUT30 = 0x1C06u, /* tr_group[2].input[30] */ + TRIG12_OUT_TR_GROUP3_INPUT30 = 0x1C06u, /* tr_group[3].input[30] */ + TRIG12_OUT_TR_GROUP4_INPUT30 = 0x1C06u, /* tr_group[4].input[30] */ + TRIG12_OUT_TR_GROUP5_INPUT30 = 0x1C06u, /* tr_group[5].input[30] */ + TRIG12_OUT_TR_GROUP6_INPUT30 = 0x1C06u, /* tr_group[6].input[30] */ + TRIG12_OUT_TR_GROUP7_INPUT30 = 0x1C06u, /* tr_group[7].input[30] */ + TRIG12_OUT_TR_GROUP8_INPUT30 = 0x1C06u, /* tr_group[8].input[30] */ + TRIG12_OUT_TR_GROUP2_INPUT31 = 0x1C07u, /* tr_group[2].input[31] */ + TRIG12_OUT_TR_GROUP3_INPUT31 = 0x1C07u, /* tr_group[3].input[31] */ + TRIG12_OUT_TR_GROUP4_INPUT31 = 0x1C07u, /* tr_group[4].input[31] */ + TRIG12_OUT_TR_GROUP5_INPUT31 = 0x1C07u, /* tr_group[5].input[31] */ + TRIG12_OUT_TR_GROUP6_INPUT31 = 0x1C07u, /* tr_group[6].input[31] */ + TRIG12_OUT_TR_GROUP7_INPUT31 = 0x1C07u, /* tr_group[7].input[31] */ + TRIG12_OUT_TR_GROUP8_INPUT31 = 0x1C07u, /* tr_group[8].input[31] */ + TRIG12_OUT_TR_GROUP0_INPUT24 = 0x1C08u, /* tr_group[0].input[24] */ + TRIG12_OUT_TR_GROUP1_INPUT24 = 0x1C08u, /* tr_group[1].input[24] */ + TRIG12_OUT_TR_GROUP0_INPUT25 = 0x1C09u, /* tr_group[0].input[25] */ + TRIG12_OUT_TR_GROUP1_INPUT25 = 0x1C09u /* tr_group[1].input[25] */ +} en_trig_output_grp12_t; + +/* Trigger Output Group 13 - Reduces DMA requests to 16+2 outputs used by all sinks */ +typedef enum +{ + TRIG13_OUT_TR_GROUP0_INPUT26 = 0x1D00u, /* tr_group[0].input[26] */ + TRIG13_OUT_TR_GROUP1_INPUT26 = 0x1D00u, /* tr_group[1].input[26] */ + TRIG13_OUT_TR_GROUP0_INPUT27 = 0x1D01u, /* tr_group[0].input[27] */ + TRIG13_OUT_TR_GROUP1_INPUT27 = 0x1D01u, /* tr_group[1].input[27] */ + TRIG13_OUT_TR_GROUP0_INPUT28 = 0x1D02u, /* tr_group[0].input[28] */ + TRIG13_OUT_TR_GROUP1_INPUT28 = 0x1D02u, /* tr_group[1].input[28] */ + TRIG13_OUT_TR_GROUP0_INPUT29 = 0x1D03u, /* tr_group[0].input[29] */ + TRIG13_OUT_TR_GROUP1_INPUT29 = 0x1D03u, /* tr_group[1].input[29] */ + TRIG13_OUT_TR_GROUP0_INPUT30 = 0x1D04u, /* tr_group[0].input[30] */ + TRIG13_OUT_TR_GROUP1_INPUT30 = 0x1D04u, /* tr_group[1].input[30] */ + TRIG13_OUT_TR_GROUP0_INPUT31 = 0x1D05u, /* tr_group[0].input[31] */ + TRIG13_OUT_TR_GROUP1_INPUT31 = 0x1D05u, /* tr_group[1].input[31] */ + TRIG13_OUT_TR_GROUP0_INPUT32 = 0x1D06u, /* tr_group[0].input[32] */ + TRIG13_OUT_TR_GROUP1_INPUT32 = 0x1D06u, /* tr_group[1].input[32] */ + TRIG13_OUT_TR_GROUP0_INPUT33 = 0x1D07u, /* tr_group[0].input[33] */ + TRIG13_OUT_TR_GROUP1_INPUT33 = 0x1D07u, /* tr_group[1].input[33] */ + TRIG13_OUT_TR_GROUP0_INPUT34 = 0x1D08u, /* tr_group[0].input[34] */ + TRIG13_OUT_TR_GROUP1_INPUT34 = 0x1D08u, /* tr_group[1].input[34] */ + TRIG13_OUT_TR_GROUP0_INPUT35 = 0x1D09u, /* tr_group[0].input[35] */ + TRIG13_OUT_TR_GROUP1_INPUT35 = 0x1D09u, /* tr_group[1].input[35] */ + TRIG13_OUT_TR_GROUP0_INPUT36 = 0x1D0Au, /* tr_group[0].input[36] */ + TRIG13_OUT_TR_GROUP1_INPUT36 = 0x1D0Au, /* tr_group[1].input[36] */ + TRIG13_OUT_TR_GROUP0_INPUT37 = 0x1D0Bu, /* tr_group[0].input[37] */ + TRIG13_OUT_TR_GROUP1_INPUT37 = 0x1D0Bu, /* tr_group[1].input[37] */ + TRIG13_OUT_TR_GROUP0_INPUT38 = 0x1D0Cu, /* tr_group[0].input[38] */ + TRIG13_OUT_TR_GROUP1_INPUT38 = 0x1D0Cu, /* tr_group[1].input[38] */ + TRIG13_OUT_TR_GROUP0_INPUT39 = 0x1D0Du, /* tr_group[0].input[39] */ + TRIG13_OUT_TR_GROUP1_INPUT39 = 0x1D0Du, /* tr_group[1].input[39] */ + TRIG13_OUT_TR_GROUP0_INPUT40 = 0x1D0Eu, /* tr_group[0].input[40] */ + TRIG13_OUT_TR_GROUP1_INPUT40 = 0x1D0Eu, /* tr_group[1].input[40] */ + TRIG13_OUT_TR_GROUP0_INPUT41 = 0x1D0Fu, /* tr_group[0].input[41] */ + TRIG13_OUT_TR_GROUP1_INPUT41 = 0x1D0Fu, /* tr_group[1].input[41] */ + TRIG13_OUT_TR_GROUP2_INPUT32 = 0x1D10u, /* tr_group[2].input[32] */ + TRIG13_OUT_TR_GROUP3_INPUT32 = 0x1D10u, /* tr_group[3].input[32] */ + TRIG13_OUT_TR_GROUP4_INPUT32 = 0x1D10u, /* tr_group[4].input[32] */ + TRIG13_OUT_TR_GROUP5_INPUT32 = 0x1D10u, /* tr_group[5].input[32] */ + TRIG13_OUT_TR_GROUP6_INPUT32 = 0x1D10u, /* tr_group[6].input[32] */ + TRIG13_OUT_TR_GROUP7_INPUT32 = 0x1D10u, /* tr_group[7].input[32] */ + TRIG13_OUT_TR_GROUP8_INPUT32 = 0x1D10u, /* tr_group[8].input[32] */ + TRIG13_OUT_TR_GROUP2_INPUT33 = 0x1D11u, /* tr_group[2].input[33] */ + TRIG13_OUT_TR_GROUP3_INPUT33 = 0x1D11u, /* tr_group[3].input[33] */ + TRIG13_OUT_TR_GROUP4_INPUT33 = 0x1D11u, /* tr_group[4].input[33] */ + TRIG13_OUT_TR_GROUP5_INPUT33 = 0x1D11u, /* tr_group[5].input[33] */ + TRIG13_OUT_TR_GROUP6_INPUT33 = 0x1D11u, /* tr_group[6].input[33] */ + TRIG13_OUT_TR_GROUP7_INPUT33 = 0x1D11u, /* tr_group[7].input[33] */ + TRIG13_OUT_TR_GROUP8_INPUT33 = 0x1D11u /* tr_group[8].input[33] */ +} en_trig_output_grp13_t; + +/* Trigger Output Group 14 - Reduces general purpose trigger inputs to 8+8 outputs used by all sinks */ +typedef enum +{ + TRIG14_OUT_TR_GROUP0_INPUT42 = 0x1E00u, /* tr_group[0].input[42] */ + TRIG14_OUT_TR_GROUP1_INPUT42 = 0x1E00u, /* tr_group[1].input[42] */ + TRIG14_OUT_TR_GROUP0_INPUT43 = 0x1E01u, /* tr_group[0].input[43] */ + TRIG14_OUT_TR_GROUP1_INPUT43 = 0x1E01u, /* tr_group[1].input[43] */ + TRIG14_OUT_TR_GROUP0_INPUT44 = 0x1E02u, /* tr_group[0].input[44] */ + TRIG14_OUT_TR_GROUP1_INPUT44 = 0x1E02u, /* tr_group[1].input[44] */ + TRIG14_OUT_TR_GROUP0_INPUT45 = 0x1E03u, /* tr_group[0].input[45] */ + TRIG14_OUT_TR_GROUP1_INPUT45 = 0x1E03u, /* tr_group[1].input[45] */ + TRIG14_OUT_TR_GROUP0_INPUT46 = 0x1E04u, /* tr_group[0].input[46] */ + TRIG14_OUT_TR_GROUP1_INPUT46 = 0x1E04u, /* tr_group[1].input[46] */ + TRIG14_OUT_TR_GROUP0_INPUT47 = 0x1E05u, /* tr_group[0].input[47] */ + TRIG14_OUT_TR_GROUP1_INPUT47 = 0x1E05u, /* tr_group[1].input[47] */ + TRIG14_OUT_TR_GROUP0_INPUT48 = 0x1E06u, /* tr_group[0].input[48] */ + TRIG14_OUT_TR_GROUP1_INPUT48 = 0x1E06u, /* tr_group[1].input[48] */ + TRIG14_OUT_TR_GROUP0_INPUT49 = 0x1E07u, /* tr_group[0].input[49] */ + TRIG14_OUT_TR_GROUP1_INPUT49 = 0x1E07u, /* tr_group[1].input[49] */ + TRIG14_OUT_TR_GROUP2_INPUT34 = 0x1E08u, /* tr_group[2].input[34] */ + TRIG14_OUT_TR_GROUP3_INPUT34 = 0x1E08u, /* tr_group[3].input[34] */ + TRIG14_OUT_TR_GROUP4_INPUT34 = 0x1E08u, /* tr_group[4].input[34] */ + TRIG14_OUT_TR_GROUP5_INPUT34 = 0x1E08u, /* tr_group[5].input[34] */ + TRIG14_OUT_TR_GROUP6_INPUT34 = 0x1E08u, /* tr_group[6].input[34] */ + TRIG14_OUT_TR_GROUP7_INPUT34 = 0x1E08u, /* tr_group[7].input[34] */ + TRIG14_OUT_TR_GROUP8_INPUT34 = 0x1E08u, /* tr_group[8].input[34] */ + TRIG14_OUT_TR_GROUP2_INPUT35 = 0x1E09u, /* tr_group[2].input[35] */ + TRIG14_OUT_TR_GROUP3_INPUT35 = 0x1E09u, /* tr_group[3].input[35] */ + TRIG14_OUT_TR_GROUP4_INPUT35 = 0x1E09u, /* tr_group[4].input[35] */ + TRIG14_OUT_TR_GROUP5_INPUT35 = 0x1E09u, /* tr_group[5].input[35] */ + TRIG14_OUT_TR_GROUP6_INPUT35 = 0x1E09u, /* tr_group[6].input[35] */ + TRIG14_OUT_TR_GROUP7_INPUT35 = 0x1E09u, /* tr_group[7].input[35] */ + TRIG14_OUT_TR_GROUP8_INPUT35 = 0x1E09u, /* tr_group[8].input[35] */ + TRIG14_OUT_TR_GROUP2_INPUT36 = 0x1E0Au, /* tr_group[2].input[36] */ + TRIG14_OUT_TR_GROUP3_INPUT36 = 0x1E0Au, /* tr_group[3].input[36] */ + TRIG14_OUT_TR_GROUP4_INPUT36 = 0x1E0Au, /* tr_group[4].input[36] */ + TRIG14_OUT_TR_GROUP5_INPUT36 = 0x1E0Au, /* tr_group[5].input[36] */ + TRIG14_OUT_TR_GROUP6_INPUT36 = 0x1E0Au, /* tr_group[6].input[36] */ + TRIG14_OUT_TR_GROUP7_INPUT36 = 0x1E0Au, /* tr_group[7].input[36] */ + TRIG14_OUT_TR_GROUP8_INPUT36 = 0x1E0Au, /* tr_group[8].input[36] */ + TRIG14_OUT_TR_GROUP2_INPUT37 = 0x1E0Bu, /* tr_group[2].input[37] */ + TRIG14_OUT_TR_GROUP3_INPUT37 = 0x1E0Bu, /* tr_group[3].input[37] */ + TRIG14_OUT_TR_GROUP4_INPUT37 = 0x1E0Bu, /* tr_group[4].input[37] */ + TRIG14_OUT_TR_GROUP5_INPUT37 = 0x1E0Bu, /* tr_group[5].input[37] */ + TRIG14_OUT_TR_GROUP6_INPUT37 = 0x1E0Bu, /* tr_group[6].input[37] */ + TRIG14_OUT_TR_GROUP7_INPUT37 = 0x1E0Bu, /* tr_group[7].input[37] */ + TRIG14_OUT_TR_GROUP8_INPUT37 = 0x1E0Bu, /* tr_group[8].input[37] */ + TRIG14_OUT_TR_GROUP2_INPUT38 = 0x1E0Cu, /* tr_group[2].input[38] */ + TRIG14_OUT_TR_GROUP3_INPUT38 = 0x1E0Cu, /* tr_group[3].input[38] */ + TRIG14_OUT_TR_GROUP4_INPUT38 = 0x1E0Cu, /* tr_group[4].input[38] */ + TRIG14_OUT_TR_GROUP5_INPUT38 = 0x1E0Cu, /* tr_group[5].input[38] */ + TRIG14_OUT_TR_GROUP6_INPUT38 = 0x1E0Cu, /* tr_group[6].input[38] */ + TRIG14_OUT_TR_GROUP7_INPUT38 = 0x1E0Cu, /* tr_group[7].input[38] */ + TRIG14_OUT_TR_GROUP8_INPUT38 = 0x1E0Cu, /* tr_group[8].input[38] */ + TRIG14_OUT_TR_GROUP2_INPUT39 = 0x1E0Du, /* tr_group[2].input[39] */ + TRIG14_OUT_TR_GROUP3_INPUT39 = 0x1E0Du, /* tr_group[3].input[39] */ + TRIG14_OUT_TR_GROUP4_INPUT39 = 0x1E0Du, /* tr_group[4].input[39] */ + TRIG14_OUT_TR_GROUP5_INPUT39 = 0x1E0Du, /* tr_group[5].input[39] */ + TRIG14_OUT_TR_GROUP6_INPUT39 = 0x1E0Du, /* tr_group[6].input[39] */ + TRIG14_OUT_TR_GROUP7_INPUT39 = 0x1E0Du, /* tr_group[7].input[39] */ + TRIG14_OUT_TR_GROUP8_INPUT39 = 0x1E0Du, /* tr_group[8].input[39] */ + TRIG14_OUT_TR_GROUP2_INPUT40 = 0x1E0Eu, /* tr_group[2].input[40] */ + TRIG14_OUT_TR_GROUP3_INPUT40 = 0x1E0Eu, /* tr_group[3].input[40] */ + TRIG14_OUT_TR_GROUP4_INPUT40 = 0x1E0Eu, /* tr_group[4].input[40] */ + TRIG14_OUT_TR_GROUP5_INPUT40 = 0x1E0Eu, /* tr_group[5].input[40] */ + TRIG14_OUT_TR_GROUP6_INPUT40 = 0x1E0Eu, /* tr_group[6].input[40] */ + TRIG14_OUT_TR_GROUP7_INPUT40 = 0x1E0Eu, /* tr_group[7].input[40] */ + TRIG14_OUT_TR_GROUP8_INPUT40 = 0x1E0Eu, /* tr_group[8].input[40] */ + TRIG14_OUT_TR_GROUP2_INPUT41 = 0x1E0Fu, /* tr_group[2].input[41] */ + TRIG14_OUT_TR_GROUP3_INPUT41 = 0x1E0Fu, /* tr_group[3].input[41] */ + TRIG14_OUT_TR_GROUP4_INPUT41 = 0x1E0Fu, /* tr_group[4].input[41] */ + TRIG14_OUT_TR_GROUP5_INPUT41 = 0x1E0Fu, /* tr_group[5].input[41] */ + TRIG14_OUT_TR_GROUP6_INPUT41 = 0x1E0Fu, /* tr_group[6].input[41] */ + TRIG14_OUT_TR_GROUP7_INPUT41 = 0x1E0Fu, /* tr_group[7].input[41] */ + TRIG14_OUT_TR_GROUP8_INPUT41 = 0x1E0Fu /* tr_group[8].input[41] */ +} en_trig_output_grp14_t; + +/* Level or edge detection setting for a trigger mux */ +typedef enum +{ + /* The trigger is a simple level output */ + TRIGGER_TYPE_LEVEL = 0u, + /* The trigger is synchronized to the consumer blocks clock + and a two cycle pulse is generated on this clock */ + TRIGGER_TYPE_EDGE = 1u +} en_trig_type_t; + +/* Trigger Type Defines */ +/* TCPWM Trigger Types */ +#define TRIGGER_TYPE_TCPWM_LINE TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_TCPWM_LINE_COMPL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_TCPWM_TR_IN__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_TCPWM_TR_IN__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_TCPWM_TR_OVERFLOW TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_TCPWM_TR_COMPARE_MATCH TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_TCPWM_TR_UNDERFLOW TRIGGER_TYPE_EDGE +/* CSD Trigger Types */ +#define TRIGGER_TYPE_CSD_DSI_SAMPLE_OUT TRIGGER_TYPE_EDGE +/* SCB Trigger Types */ +#define TRIGGER_TYPE_SCB_TR_TX_REQ TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_SCB_TR_RX_REQ TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_SCB_TR_I2C_SCL_FILTERED TRIGGER_TYPE_LEVEL +/* PERI Trigger Types */ +#define TRIGGER_TYPE_PERI_TR_IO_INPUT__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_PERI_TR_IO_INPUT__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_PERI_TR_IO_OUTPUT__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_PERI_TR_IO_OUTPUT__EDGE TRIGGER_TYPE_EDGE +/* CPUSS Trigger Types */ +#define TRIGGER_TYPE_CPUSS_DW0_TR_IN__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_CPUSS_DW0_TR_IN__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_DW1_TR_IN__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_CPUSS_DW1_TR_IN__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_CTI_TR_IN TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_DW0_TR_OUT TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_DW1_TR_OUT TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_CTI_TR_OUT TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_TR_FAULT TRIGGER_TYPE_EDGE +/* AUDIOSS Trigger Types */ +#define TRIGGER_TYPE_AUDIOSS_TR_PDM_RX_REQ TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_AUDIOSS_TR_I2S_TX_REQ TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_AUDIOSS_TR_I2S_RX_REQ TRIGGER_TYPE_LEVEL +/* LPCOMP Trigger Types */ +#define TRIGGER_TYPE_LPCOMP_DSI_COMP0 TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_LPCOMP_DSI_COMP1 TRIGGER_TYPE_LEVEL +/* PASS Trigger Types */ +#define TRIGGER_TYPE_PASS_DSI_CTB_CMP0 TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_PASS_DSI_CTB_CMP1 TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_PASS_TR_SAR_IN TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_PASS_TR_SAR_OUT TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_PASS_TR_CTDAC_EMPTY TRIGGER_TYPE_EDGE +/* SMIF Trigger Types */ +#define TRIGGER_TYPE_SMIF_TR_TX_REQ TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_SMIF_TR_RX_REQ TRIGGER_TYPE_LEVEL +/* USB Trigger Types */ +#define TRIGGER_TYPE_USB_DMA_BURSTEND TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_USB_DMA_REQ TRIGGER_TYPE_EDGE +/* UDB Trigger Types */ +#define TRIGGER_TYPE_UDB_TR_IN__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_UDB_TR_IN__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_UDB_TR_DW_ACK__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_UDB_TR_DW_ACK__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_UDB_TR_UDB__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_UDB_TR_UDB__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_UDB_DSI_OUT_TR__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_UDB_DSI_OUT_TR__EDGE TRIGGER_TYPE_EDGE +/* PROFILE Trigger Types */ +#define TRIGGER_TYPE_PROFILE_TR_START TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_PROFILE_TR_STOP TRIGGER_TYPE_EDGE +/* TR_GROUP Trigger Types */ +#define TRIGGER_TYPE_TR_GROUP_OUTPUT__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_TR_GROUP_OUTPUT__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_TR_GROUP_INPUT__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_TR_GROUP_INPUT__EDGE TRIGGER_TYPE_EDGE + +/* Monitor Signal Defines */ +typedef enum +{ + PROFILE_ONE = 0, + CPUSS_MONITOR_CM0 = 1, + CPUSS_MONITOR_CM4 = 2, + CPUSS_MONITOR_FLASH = 3, + CPUSS_MONITOR_DW0_AHB = 4, + CPUSS_MONITOR_DW1_AHB = 5, + CPUSS_MONITOR_CRYPTO = 6, + USB_MONITOR_AHB = 7, + SCB0_MONITOR_AHB = 8, + SCB1_MONITOR_AHB = 9, + SCB2_MONITOR_AHB = 10, + SCB3_MONITOR_AHB = 11, + SCB4_MONITOR_AHB = 12, + SCB5_MONITOR_AHB = 13, + SCB6_MONITOR_AHB = 14, + SCB7_MONITOR_AHB = 15, + SCB8_MONITOR_AHB = 16, + UDB_MONITOR_UDB0 = 17, + UDB_MONITOR_UDB1 = 18, + UDB_MONITOR_UDB2 = 19, + UDB_MONITOR_UDB3 = 20, + SMIF_MONITOR_SMIF_SPI_SELECT0 = 21, + SMIF_MONITOR_SMIF_SPI_SELECT1 = 22, + SMIF_MONITOR_SMIF_SPI_SELECT2 = 23, + SMIF_MONITOR_SMIF_SPI_SELECT3 = 24, + SMIF_MONITOR_SMIF_SPI_SELECT_ANY = 25, + BLESS_EXT_LNA_RX_CTL_OUT = 26, + BLESS_EXT_PA_TX_CTL_OUT = 27 +} en_ep_mon_sel_t; + +/* Total count of Energy Profiler monitor signal connections */ +#define EP_MONITOR_COUNT 28u + +/* Bus masters */ +typedef enum +{ + CPUSS_MS_ID_CM0 = 0, + CPUSS_MS_ID_CRYPTO = 1, + CPUSS_MS_ID_DW0 = 2, + CPUSS_MS_ID_DW1 = 3, + CPUSS_MS_ID_CM4 = 14, + CPUSS_MS_ID_TC = 15 +} en_prot_master_t; + +/* Parameter Defines */ +/* Number of regulator modules instantiated within SRSS */ +#define SRSS_NUM_ACTREG_PWRMOD 2u +/* Number of shorting switches between vccd and vccact */ +#define SRSS_NUM_ACTIVE_SWITCH 3u +/* ULP linear regulator system is present */ +#define SRSS_ULPLINREG_PRESENT 1u +/* HT linear regulator system is present */ +#define SRSS_HTLINREG_PRESENT 0u +/* SIMO buck core regulator is present. Only compatible with ULP linear + regulator system (ULPLINREG_PRESENT==1). */ +#define SRSS_SIMOBUCK_PRESENT 1u +/* Precision ILO (PILO) is present */ +#define SRSS_PILO_PRESENT 1u +/* External Crystal Oscillator is present (high frequency) */ +#define SRSS_ECO_PRESENT 1u +/* System Buck-Boost is present */ +#define SRSS_SYSBB_PRESENT 0u +/* Number of clock paths. Must be > 0 */ +#define SRSS_NUM_CLKPATH 3u +/* Number of PLLs present. Must be <= NUM_CLKPATH */ +#define SRSS_NUM_PLL 1u +/* Number of HFCLK roots present. Must be > 0 */ +#define SRSS_NUM_HFROOT 5u +/* Number of PWR_HIB_DATA registers */ +#define SRSS_NUM_HIBDATA 1u +/* Backup domain is present */ +#define SRSS_BACKUP_PRESENT 1u +/* Mask of HFCLK root clock supervisors (CSV). For each clock root i, bit[i] of + mask indicates presence of a CSV. */ +#define SRSS_MASK_HFCSV 1u +/* Clock supervisor is present on WCO. Must be 0 if BACKUP_PRESENT==0. */ +#define SRSS_WCOCSV_PRESENT 1u +/* Number of software watchdog timers. */ +#define SRSS_NUM_MCWDT 2u +/* Number of DSI inputs into clock muxes. This is used for logic optimization. */ +#define SRSS_NUM_DSI 2u +/* Alternate high-frequency clock is present. This is used for logic + optimization. */ +#define SRSS_ALTHF_PRESENT 1u +/* Alternate low-frequency clock is present. This is used for logic + optimization. */ +#define SRSS_ALTLF_PRESENT 0u +/* Backup memory is present (only used when BACKUP_PRESENT==1) */ +#define SRSS_BACKUP_BMEM_PRESENT 0u +/* Number of Backup registers to include (each is 32b). Only used when + BACKUP_PRESENT==1. */ +#define SRSS_BACKUP_NUM_BREG 8u +/* Number of AMUX splitter cells */ +#define IOSS_HSIOM_AMUX_SPLIT_NR 8u +/* Number of HSIOM ports in device (same as GPIO.GPIO_PRT_NR) */ +#define IOSS_HSIOM_HSIOM_PORT_NR 15u +/* Number of GPIO ports in range 0..31 */ +#define IOSS_GPIO_GPIO_PORT_NR_0_31 15u +/* Number of GPIO ports in range 32..63 */ +#define IOSS_GPIO_GPIO_PORT_NR_32_63 0u +/* Number of GPIO ports in range 64..95 */ +#define IOSS_GPIO_GPIO_PORT_NR_64_95 0u +/* Number of GPIO ports in range 96..127 */ +#define IOSS_GPIO_GPIO_PORT_NR_96_127 0u +/* Number of ports in device */ +#define IOSS_GPIO_GPIO_PORT_NR 15u +/* Mask of SMARTIO instances presence */ +#define IOSS_SMARTIO_SMARTIO_MASK 768u +/* The number of protection contexts ([2, 16]). */ +#define PERI_PC_NR 8u +/* Master interface presence mask (4 bits) */ +#define PERI_MS_PRESENT 15u +/* Master interface PPU combinatorial (1) or registerd (0) */ +#define PERI_MS_PPU_COMBINATORIAL 1u +/* The number of programmable PPU structures for PERI (all peripherals) */ +#define PERI_MS_PPU_PROG_STRUCT_NR 16u +/* Number of programmable clocks (outputs) */ +#define PERI_CLOCK_NR 59u +/* Number of 8.0 dividers */ +#define PERI_DIV_8_NR 8u +/* Number of 16.0 dividers */ +#define PERI_DIV_16_NR 16u +/* Number of 16.5 (fractional) dividers */ +#define PERI_DIV_16_5_NR 4u +/* Number of 24.5 (fractional) dividers */ +#define PERI_DIV_24_5_NR 1u +/* Divider number width: max(1,roundup(log2(max(DIV_*_NR))) */ +#define PERI_DIV_ADDR_WIDTH 4u +/* Trigger module present (0=No, 1=Yes) */ +#define PERI_TR 1u +/* Number of trigger groups */ +#define PERI_TR_GROUP_NR 15u +/* The number of protection contexts minus 1 ([1, 15]). */ +#define PERI_PPU_FIXED_STRUCT_PC_NR_MINUS1 7u +/* The number of protection contexts minus 1 ([1, 15]). */ +#define PERI_PPU_PROG_STRUCT_PC_NR_MINUS1 7u +/* UDB present or not ('0': no, '1': yes) */ +#define CPUSS_UDB_PRESENT 1u +/* System RAM 0 size in kilobytes */ +#define CPUSS_SRAM0_SIZE 288u +/* Number of macros used to implement System RAM 0. Example: 8 if 256 KB System + SRAM0 is implemented with 8 32KB macros. */ +#define CPUSS_RAMC0_MACRO_NR 9u +/* System RAM 1 present or not (0=No, 1=Yes) */ +#define CPUSS_RAMC1_PRESENT 0u +/* System RAM 1 size in kilobytes */ +#define CPUSS_SRAM1_SIZE 32u +/* Number of macros used to implement System RAM 1. Example: 8 if 256 KB System + RAM 1 is implemented with 8 32KB macros. */ +#define CPUSS_RAMC1_MACRO_NR 1u +/* System RAM 2 present or not (0=No, 1=Yes) */ +#define CPUSS_RAMC2_PRESENT 0u +/* System RAM 2 size in kilobytes */ +#define CPUSS_SRAM2_SIZE 256u +/* Number of macros used to implement System RAM 2. Example: 8 if 256 KB System + RAM 2 is implemented with 8 32KB macros. */ +#define CPUSS_RAMC2_MACRO_NR 16u +/* System ROM size in KB */ +#define CPUSS_ROM_SIZE 128u +/* Flash main region size in KB */ +#define CPUSS_FLASH_SIZE 1024u +/* Flash work region size in KB (EEPROM emulation, data) */ +#define CPUSS_WFLASH_SIZE 32u +/* Flash supervisory region size in KB */ +#define CPUSS_SFLASH_SIZE 32u +/* Number of external slaves directly connected to slow AHB-Lite + infrastructure. Maximum nubmer of slave supported is 4. Width of this + parameter is 4-bits. 1-bit mask for each slave indicating present or not. + Example: 4'b0011 - slave 0 and slave 1 are present. Note: The SLOW_SLx_ADDR + and SLOW_SLx_MASK parameters (for the slaves present) should be derived from + the Memory Map. */ +#define CPUSS_SLOW_SL_PRESENT 1u +/* Number of external slaves directly connected to fast AHB-Lite + infrastructure. Maximum nubmer of slave supported is 4. Width of this + parameter is 4-bits. 1-bit mask for each slave indicating present or not. + Example: 4'b0011 - slave 0 and slave 1 are present. Note: The FAST_SLx_ADDR + and FAST_SLx_MASK parameters (for the slaves present) should be derived from + the Memory Map. */ +#define CPUSS_FAST_SL_PRESENT 1u +/* Number of external masters driving the slow AHB-Lite infrastructure. Maximum + number of masters supported is 2. Width of this parameter is 2-bits. 1-bit + mask for each master indicating present or not. Example: 2'b01 - master 0 is + present. */ +#define CPUSS_SLOW_MS_PRESENT 0u +/* Number of LF clock (which is connected to clk_lf input of CPUSS) cycles to + make 10ms time period. Example: =327 (or 24'000147) for 32.678 KHz LF clock + from SRSS. */ +#define CPUSS_LF_10MS_TICKS 16777215u +/* Number of total interrupt request inputs to CPUSS */ +#define CPUSS_IRQ_NR 139u +/* Number of DeepSleep wakeup interrupt inputs to CPUSS */ +#define CPUSS_DPSLP_IRQ_NR 33u +/* Number of DeepSleep wakeup interrupt inputs to CM0+ (product configuration) */ +#define CPUSS_CM0_DPSLP_IRQ_NR 8u +/* Width of the CM4 interrupt priority bits. Legal range [3,8] Example: 3 = 8 + levels of priority 8 = 256 levels of priority */ +#define CPUSS_CM4_LVL_WIDTH 3u +/* CM4 Floating point unit present or not (0=No, 1=Yes) */ +#define CPUSS_CM4_FPU_PRESENT 1u +/* Debug level. Legal range [0,3] */ +#define CPUSS_DEBUG_LVL 3u +/* Trace level. Legal range [0,2] Note: CM4 HTM is not supported. Hence vaule 3 + for trace level is not supported in CPUSS. */ +#define CPUSS_TRACE_LVL 2u +/* Embedded Trace Buffer present or not (0=No, 1=Yes) */ +#define CPUSS_ETB_PRESENT 0u +/* CM0+ MTB SRAM buffer size in kilobytes. Legal vaules 4, 8 or 16 */ +#define CPUSS_MTB_SRAM_SIZE 4u +/* CM4 ETB SRAM buffer size in kilobytes. Legal vaules 4, 8 or 16 */ +#define CPUSS_ETB_SRAM_SIZE 16u +/* PTM interface present (0=No, 1=Yes) */ +#define CPUSS_PTM_PRESENT 1u +/* Width of the PTM interface in bits ([2,32]) */ +#define CPUSS_PTM_WIDTH 8u +/* Width of the TPIU interface in bits ([1,32]) */ +#define CPUSS_TPIU_WIDTH 4u +/* CoreSight Part Identification Number */ +#define CPUSS_JEPID 52u +/* CoreSight Part Identification Number */ +#define CPUSS_JEPCONTINUATION 0u +/* CoreSight Part Identification Number */ +#define CPUSS_FAMILYID 256u +/* Cryptography IP present or not (0=No, 1=Yes) */ +#define CPUSS_CRYPTO_PRESENT 1u +/* DataWire 0 present or not (0=No, 1=Yes) */ +#define CPUSS_DW0_PRESENT 1u +/* Number of DataWire 0 channels (8, 16 or 32) */ +#define CPUSS_DW0_CH_NR 16u +/* DataWire 1 present or not (0=No, 1=Yes) */ +#define CPUSS_DW1_PRESENT 1u +/* Number of DataWire 1 channels (8, 16 or 32) */ +#define CPUSS_DW1_CH_NR 16u +/* AES cipher support (0 = no support, 1 = support */ +#define CPUSS_CRYPTO_AES 1u +/* (Tripple) DES cipher support (0 = no support, 1 = support */ +#define CPUSS_CRYPTO_DES 1u +/* Pseudo random number generation support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_PR 1u +/* SHA support included */ +#define CPUSS_CRYPTO_SHA 1u +/* SHA1 hash support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_SHA1 1u +/* SHA256 hash support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_SHA256 1u +/* SHA512 hash support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_SHA512 1u +/* Cyclic Redundancy Check support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_CRC 1u +/* Vector unit support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_VU 1u +/* True random number generation support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_TR 1u +/* String support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_STR 1u +/* AHB-Lite master interface support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_MASTER_IF 1u +/* Number of 32-bit words in the IP internal memory buffer (from the set [64, + 128, 256, 512, 1024, 2048, 4096], to allow for a 256 B, 512 B, 1 kB, 2 kB, 4 + kB, 8 kB and 16 kB memory buffer) */ +#define CPUSS_CRYPTO_BUFF_SIZE 1024u +/* Number of fault structures. Legal range [1, 4] */ +#define CPUSS_FAULT_FAULT_NR 2u +/* Number of IPC structures. Legal range [1, 16] */ +#define CPUSS_IPC_IPC_NR 8u +/* Number of IPC interrupt structures. Legal range [1, 16] */ +#define CPUSS_IPC_IPC_IRQ_NR 8u +/* Master 0 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS0_PC_NR_MINUS1 7u +/* Master 1 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS1_PC_NR_MINUS1 7u +/* Master 2 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS2_PC_NR_MINUS1 0u +/* Master 3 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS3_PC_NR_MINUS1 0u +/* Master 4 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS4_PC_NR_MINUS1 0u +/* Master 5 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS5_PC_NR_MINUS1 0u +/* Master 6 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS6_PC_NR_MINUS1 0u +/* Master 7 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS7_PC_NR_MINUS1 0u +/* Master 8 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS8_PC_NR_MINUS1 0u +/* Master 9 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS9_PC_NR_MINUS1 0u +/* Master 10 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS10_PC_NR_MINUS1 0u +/* Master 11 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS11_PC_NR_MINUS1 0u +/* Master 12 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS12_PC_NR_MINUS1 0u +/* Master 13 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS13_PC_NR_MINUS1 0u +/* Master 14 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS14_PC_NR_MINUS1 7u +/* Master 15 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS15_PC_NR_MINUS1 7u +/* Number of SMPU protection structures */ +#define CPUSS_PROT_SMPU_STRUCT_NR 16u +/* Number of protection contexts supported minus 1. Legal range [1,16] */ +#define CPUSS_SMPU_STRUCT_PC_NR_MINUS1 7u +/* Number of DataWire controllers present (max 2) */ +#define CPUSS_DW_NR 2u +/* Number of channels in each DataWire controller (must be the same for now) */ +#define CPUSS_DW_CH_NR 16u +/* Page size in # of 32-bit words (1: 4 bytes, 2: 8 bytes, ... */ +#define CPUSS_FLASHC_PA_SIZE 128u +/* Number of profiling counters. Legal range [1, 32] */ +#define PROFILE_PRFL_CNT_NR 8u +/* Number of monitor event signals. Legal range [1, 128] */ +#define PROFILE_PRFL_MONITOR_NR 128u +/* Number of UDB Interrupts */ +#define UDB_NUMINT 16u +/* Number of triggers */ +#define UDB_NUMTR 16u +/* Number of UDB array rows (must be multiple of 2) */ +#define UDB_NUMROW 2u +/* Number of UDB array columns */ +#define UDB_NUMCOL 6u +/* DSI on bottom (1) or on bottom and top (2) of UDB array */ +#define UDB_DSISIDES 2u +/* Number of UDBs = NUMROW * NUMCOL */ +#define UDB_NUMUDB 12u +/* Number of UDB pairs = NUMUDB / 2 */ +#define UDB_NUMUDBPAIR 6u +/* Number of DSIs = NUMCOL * DSISIDES */ +#define UDB_NUMDSI 12u +/* Number of quad clocks */ +#define UDB_NUMQCLK 3u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB0_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB0_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB0_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB0_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB0_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB0_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB0_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB0_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB0_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB0_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB0_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB0_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB0_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB0_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB0_UART 1u +/* UART flow control support? ('0': no, '1': yes) */ +#define SCB0_UART_FLOW 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB0_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB0_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB0_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB0_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB0_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB0_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB0_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB1_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB1_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB1_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB1_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB1_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB1_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB1_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB1_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB1_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB1_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB1_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB1_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB1_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB1_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB1_UART 1u +/* UART flow control support? ('0': no, '1': yes) */ +#define SCB1_UART_FLOW 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB1_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB1_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB1_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB1_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB1_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB1_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB1_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB2_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB2_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB2_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB2_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB2_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB2_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB2_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB2_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB2_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB2_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB2_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB2_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB2_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB2_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB2_UART 1u +/* UART flow control support? ('0': no, '1': yes) */ +#define SCB2_UART_FLOW 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB2_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB2_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB2_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB2_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB2_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB2_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB2_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB3_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB3_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB3_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB3_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB3_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB3_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB3_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB3_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB3_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB3_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB3_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB3_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB3_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB3_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB3_UART 1u +/* UART flow control support? ('0': no, '1': yes) */ +#define SCB3_UART_FLOW 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB3_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB3_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB3_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB3_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB3_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB3_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB3_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB4_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB4_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB4_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB4_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB4_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB4_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB4_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB4_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB4_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB4_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB4_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB4_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB4_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB4_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB4_UART 1u +/* UART flow control support? ('0': no, '1': yes) */ +#define SCB4_UART_FLOW 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB4_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB4_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB4_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB4_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB4_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB4_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB4_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB5_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB5_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB5_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB5_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB5_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB5_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB5_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB5_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB5_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB5_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB5_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB5_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB5_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB5_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB5_UART 1u +/* UART flow control support? ('0': no, '1': yes) */ +#define SCB5_UART_FLOW 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB5_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB5_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB5_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB5_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB5_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB5_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB5_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB6_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB6_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB6_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB6_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB6_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB6_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB6_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB6_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB6_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB6_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB6_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB6_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB6_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB6_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB6_UART 1u +/* UART flow control support? ('0': no, '1': yes) */ +#define SCB6_UART_FLOW 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB6_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB6_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB6_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB6_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB6_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB6_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB6_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB7_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB7_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB7_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB7_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB7_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB7_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB7_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB7_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB7_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB7_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB7_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB7_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB7_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB7_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB7_UART 1u +/* UART flow control support? ('0': no, '1': yes) */ +#define SCB7_UART_FLOW 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB7_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB7_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB7_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB7_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB7_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB7_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB7_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB8_DEEPSLEEP 1u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB8_EC 1u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB8_I2C_M 0u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB8_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB8_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB8_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB8_I2C_EC 1u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB8_I2C_M_S 0u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB8_I2C_S_EC 1u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB8_SPI_M 0u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB8_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB8_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB8_SPI_EC 1u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB8_SPI_S_EC 1u +/* UART support? ('0': no, '1': yes) */ +#define SCB8_UART 0u +/* UART flow control support? ('0': no, '1': yes) */ +#define SCB8_UART_FLOW 0u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB8_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB8_CMD_RESP 1u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB8_EZ 1u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB8_EZ_CMD_RESP 1u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB8_I2C_S_EZ 1u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB8_SPI_S_EZ 1u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB8_I2C_FAST_PLUS 1u +/* Number of counters per IP (1..8) */ +#define TCPWM0_CNT_NR 8u +/* Counter width (in number of bits) */ +#define TCPWM0_CNT_CNT_WIDTH 32u +/* Number of counters per IP (1..8) */ +#define TCPWM1_CNT_NR 24u +/* Counter width (in number of bits) */ +#define TCPWM1_CNT_CNT_WIDTH 16u +/* Max number of LCD commons supported */ +#define LCD_COM_NR 8u +/* Max number of LCD pins (total) supported */ +#define LCD_PIN_NR 62u +/* Number of ports supoprting up to 4 COMs */ +#define LCD_NUMPORTS 8u +/* Number of ports supporting up to 8 COMs */ +#define LCD_NUMPORTS8 8u +/* Number of ports supporting up to 16 COMs */ +#define LCD_NUMPORTS16 0u +/* Number of IREF outputs from AREF */ +#define PASS_NR_IREFS 4u +/* Number of CTBs in the Subsystem */ +#define PASS_NR_CTBS 1u +/* Number of CTDACs in the Subsystem */ +#define PASS_NR_CTDACS 1u +/* CTB0 Exists */ +#define PASS_CTB0_EXISTS 1u +/* CTB1 Exists */ +#define PASS_CTB1_EXISTS 0u +/* CTB2 Exists */ +#define PASS_CTB2_EXISTS 0u +/* CTB3 Exists */ +#define PASS_CTB3_EXISTS 0u +/* CTDAC0 Exists */ +#define PASS_CTDAC0_EXISTS 1u +/* CTDAC1 Exists */ +#define PASS_CTDAC1_EXISTS 0u +/* CTDAC2 Exists */ +#define PASS_CTDAC2_EXISTS 0u +/* CTDAC3 Exists */ +#define PASS_CTDAC3_EXISTS 0u +/* Number of SAR channels */ +#define PASS_SAR_SAR_CHANNELS 16u +/* Averaging logic present in SAR */ +#define PASS_SAR_SAR_AVERAGE 1u +/* Range detect logic present in SAR */ +#define PASS_SAR_SAR_RANGEDET 1u +/* Support for UAB sampling */ +#define PASS_SAR_SAR_UAB 0u +#define PASS_CTBM_CTDAC_PRESENT 1u +/* Number of AHB-Lite "hmaster[]" bits ([1, 8]) */ +#define SMIF_MASTER_WIDTH 8u +/* Base address of the SMIF XIP memory region. This address must be a multiple + of the SMIF XIP memory capacity. This address must be a multiple of 64 KB. + This address must be in the [0x0000:0000, 0x1fff:ffff] memory region. The XIP + memory region should NOT overlap with other memory regions. */ +#define SMIF_SMIF_XIP_ADDR 402653184u +/* Capacity of the SMIF XIP memory region. The more significant bits of this + parameter must be '1' and the lesser significant bits of this paramter must + be '0'. E.g., 0xfff0:0000 specifies a 1 MB memory region. Legal values are + {0xffff:0000, 0xfffe:0000, 0xfffc:0000, 0xfff8:0000, 0xfff0:0000, + 0xffe0:0000, ..., 0xe000:0000}. */ +#define SMIF_SMIF_XIP_MASK 4160749568u +/* Cryptography (AES) support ('0' = no support, '1' = support) */ +#define SMIF_CRYPTO 1u +/* Number of external devices supported ([1,4]) */ +#define SMIF_DEVICE_NR 4u +/* External device write support. This is a 4-bit field. Each external device + has a dedicated bit. E.g., if bit 2 is '1', external device 2 has write + support. */ +#define SMIF_DEVICE_WR_EN 15u +/* AHB bus Master Width */ +#define BLE_BLESS_MASTER_WIDTH 8u +/* I2S capable? (0=No,1=Yes) */ +#define AUDIOSS_I2S 1u +/* PDM capable? (0=No,1=Yes) */ +#define AUDIOSS_PDM 1u + +#endif /* _PSOC6BLE_CONFIG_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/system_psoc6ble_cm0plus.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/system_psoc6ble_cm0plus.c new file mode 100644 index 0000000000..3b8ca3e4e3 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/system_psoc6ble_cm0plus.c @@ -0,0 +1,667 @@ +/***************************************************************************//** +* \file system_psoc6ble_cm0plus.c +* \version 1.0 +* +* The device system-source file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include +#include "system_psoc6ble_cm0plus.h" +#include "cy_device_headers.h" + +#include "ipc/cy_ipc_drv.h" +#include "ipc/cy_ipc_pipe.h" +#include "ipc/cy_ipc_lock.h" +#include "sysint/cy_sysint.h" + +/******************************************************************************* +* Inter Process Communication (IPC) +*******************************************************************************/ +cy_stc_ipc_pipe_ep_t cy_ipc_pipe_sysEpArray[CPUSS_IPC_IPC_NR]; +uint32_t ipcLockArray[CY_IPC_LOCK_COUNT/CY_IPC_LOCKS_PER_WORD]; +cy_ipc_pipe_callback_ptr_t ipc_pipe_cyPipeCbArray[CY_IPC_CYPIPE_CLIENT_CNT]; + + +/******************************************************************************* +* SystemCoreClockUpdate() +*******************************************************************************/ + +/** Default HFClk frequency in Hz */ +#define CY_HFCLK0_FREQ_HZ_DEFAULT ( 8000000UL) + +/** Default PeriClk frequency in Hz */ +#define CY_PERICLK_FREQ_HZ_DEFAULT (4000000UL) + +/** Default SlowClk system core frequency in Hz */ +#define CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT (4000000UL) + + +#define CY_IMO_FREQ_HZ ( 8000000UL) +#ifndef CY_EXT_FREQ_HZ + #define CY_EXT_FREQ_HZ (24000000UL) +#endif +#ifndef CY_ECO_FREQ_HZ + #define CY_ECO_FREQ_HZ (24000000UL) +#endif + +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) + #ifndef CY_ALTHF_FREQ_HZ + #define CY_ALTHF_FREQ_HZ (32000000UL) + #endif + uint32_t cy_BleEcoClockFreqHz = CY_ALTHF_FREQ_HZ; +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) */ + +#define CY_ROOT_PATH_SRC_IMO (0UL) +#define CY_ROOT_PATH_SRC_EXT (1UL) +#define CY_ROOT_PATH_SRC_ECO (2UL) +#define CY_ROOT_PATH_SRC_ALTHF (3UL) + +/** Holds the SlowClk system core clock, which is the system clock frequency supplied to the SysTick timer and the +* processor core clock. This variable can be used by debuggers to query the frequency of the debug timer or to configure +* the trace clock speed. +* +* \attention Compilers must be configured to avoid removing this variable in case the application program is not using +* it. Debugging systems require the variable to be physically present in memory so that it can be examined to configure +* the debugger. */ +uint32_t SystemCoreClock = CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT; + +/** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_Hfclk0FreqHz = CY_HFCLK0_FREQ_HZ_DEFAULT; + +/** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_PeriClkFreqHz = CY_PERICLK_FREQ_HZ_DEFAULT; + + +/* Do not use these definitions directly in your application */ +#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) +#define CY_DELAY_1K_THRESHOLD (1000u) +#define CY_DELAY_1K_MINUS_1_THRESHOLD (CY_DELAY_1K_THRESHOLD - 1u) +#define CY_DELAY_1M_THRESHOLD (1000000u) +#define CY_DELAY_1M_MINUS_1_THRESHOLD (CY_DELAY_1M_THRESHOLD - 1u) +uint32_t cy_delayFreqHz = CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT; +uint32_t cy_delayFreqKhz = (CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD; +uint8_t cy_delayFreqMhz = (uint8_t)((CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT + CY_DELAY_1M_MINUS_1_THRESHOLD) / CY_DELAY_1M_THRESHOLD); +uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * ((CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / + CY_DELAY_1K_THRESHOLD); + + +/******************************************************************************* +* Table Of Content (TOC) +*******************************************************************************/ +typedef struct { + uint32_t securityImageAddr; /** Address of security image */ + uint32_t flashBootAddr; /** Address of Flash Boot stored in SFLASH */ + uint32_t flashBootSize; /** Size of Flash Boot (in bytes) */ + uint32_t objectOneAddr; /** Address of next object (0 if none) */ + uint32_t objectOneSize; /** Size of next object (0 if none) */ + uint32_t objectTwoAddr; /** Address of next object (0 if none) */ + uint32_t objectTwoSize; /** Size of next object (0 if none) */ + uint32_t objectThreeAddr; /** Address of next object (0 if none) */ + uint32_t objectThreeSize; /** Size of next object (0 if none) */ + uint32_t userAppAddr; /** Address of start of User Application */ + uint32_t userAppSize; /** Size of the User Application */ + uint32_t keyStorageAddr; /** Address of Key Storage Flash Blocks. */ + uint32_t keyStorageSize; /** Size of key storage area in bytes. */ + uint32_t smifConfigAddr; /** SMIF Configuration Table */ + uint32_t reserved[113u]; + uint32_t crc; /** 0x1FC CRC16-CCITT */ +} Cy_TOC_Type; + + +#define CY_TOC_BASE (0x100FFE00UL) +#define CY_TOC ((Cy_TOC_Type*) CY_TOC_BASE) + +#ifndef CY_TOC_FLASH_BOOT_ADDR + #define CY_TOC_FLASH_BOOT_ADDR (0x160020D8UL) +#endif + +#ifndef CY_TOC_FLASH_BOOT_SIZE + #define CY_TOC_FLASH_BOOT_SIZE (0x2000UL) +#endif + +#ifndef CY_TOC_SMIF_CONFIG_ADDR + #define CY_TOC_SMIF_CONFIG_ADDR (0xFFFFFFFFUL) +#endif + +#ifndef CY_TOC_USER_APP_ADDR + #define CY_TOC_USER_APP_ADDR (0x10000000UL) +#endif + +#ifndef CY_TOC_USER_APP_SIZE + #define CY_TOC_USER_APP_SIZE (0x80000UL) +#endif + +#ifdef CY_TOC_PRESENT + #if defined(__GNUC__) || defined(__ARMCC_VERSION) + __attribute__ ((__section__(".cy_toc"), used)) + #elif defined(__ICCARM__) + #pragma location=".cy_toc" + #endif + Cy_TOC_Type cyToc = { + .flashBootAddr = CY_TOC_FLASH_BOOT_ADDR, + .flashBootSize = CY_TOC_FLASH_BOOT_SIZE, + .smifConfigAddr = CY_TOC_SMIF_CONFIG_ADDR, + .userAppAddr = CY_TOC_USER_APP_ADDR, + .userAppSize = CY_TOC_USER_APP_SIZE + }; +#endif + + +/******************************************************************************* +* SystemInit() +*******************************************************************************/ +#define CY_WDT_LOCK_BIT0 ((uint32_t)0x01u << 30u) +#define CY_WDT_LOCK_BIT1 ((uint32_t)0x01u << 31u) + +/* CLK_FLL_CONFIG default values, from MXS40-IP-SRSS */ +#define CY_FB_CLK_FLL_CONFIG_VALUE (0x01000000u) +#define CY_FB_CLK_FLL_CONFIG2_VALUE (0x00020001u) +#define CY_FB_CLK_FLL_CONFIG3_VALUE (0x00002800u) +#define CY_FB_CLK_FLL_CONFIG4_VALUE (0x000000FFu) + + + +/******************************************************************************* +* Function Name: SystemInit +****************************************************************************//** +* +* Initializes the system. +* +*******************************************************************************/ +void SystemInit(void) +{ + /* Restores FLL to default state as it is not restored by ROM code */ + uint32_t copy = SRSS->CLK_FLL_CONFIG; + copy &= ~SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk; + SRSS->CLK_FLL_CONFIG = copy; + + copy = SRSS->CLK_ROOT_SELECT[0u]; + copy &= ~SRSS_CLK_ROOT_SELECT_ROOT_DIV_Msk; /* Set ROOT_DIV = 0*/ + SRSS->CLK_ROOT_SELECT[0u] = copy; + + SRSS->CLK_FLL_CONFIG = CY_FB_CLK_FLL_CONFIG_VALUE; + SRSS->CLK_FLL_CONFIG2 = CY_FB_CLK_FLL_CONFIG2_VALUE; + SRSS->CLK_FLL_CONFIG3 = CY_FB_CLK_FLL_CONFIG3_VALUE; + SRSS->CLK_FLL_CONFIG4 = CY_FB_CLK_FLL_CONFIG4_VALUE; + + + /* Unlock and disable WDT */ + SRSS->WDT_CTL = ((SRSS->WDT_CTL & (uint32_t)(~SRSS_WDT_CTL_WDT_LOCK_Msk)) | CY_WDT_LOCK_BIT0); + SRSS->WDT_CTL = (SRSS->WDT_CTL | CY_WDT_LOCK_BIT1); + SRSS->WDT_CTL &= (~ (uint32_t) SRSS_WDT_CTL_WDT_EN_Msk); + + + Cy_SystemInit(); + SystemCoreClockUpdate(); + Cy_SystemInitIpc(); + Cy_SMIF_StartupCallBack(); +} + + +/******************************************************************************* +* Function Name: Cy_SystemInit +****************************************************************************//** +* +* The function is called during device startup. Once project compiled as part of +* the PSoC Creator project, the Cy_SystemInit() function is generated by the +* PSoC Creator. +* +* The function generated by PSoC Creator performs all of the necessary device +* configuration based on the design settings. This includes settings from the +* Design Wide Resources (DWR) such as Clocks and Pins as well as any component +* configuration that is necessary. +* +*******************************************************************************/ +__WEAK void Cy_SystemInit(void) +{ + /* Empty weak function. The actual implementation to be in the PSoC Creator + * generated strong function. + */ +} + + +/******************************************************************************* +* Function Name: Cy_SMIF_StartupCallBack +****************************************************************************//** +* +* The function is called during device startup. Once SMIF functionality is +* required, user should implement the function as described by the SMIF +* documentation. +* +******************************************************************************/ +__WEAK void Cy_SMIF_StartupCallBack(void) +{ + /* Empty weak function. The actual implementation to be in the user's + * strong function. + */ +} + + +/******************************************************************************* +* Function Name: SystemCoreClockUpdate +****************************************************************************//** +* +* Get Core Clock Frequency. +* +* Update \ref SystemCoreClock, \ref cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. +* +*******************************************************************************/ +void SystemCoreClockUpdate (void) +{ + uint32_t srcFreqHz; + uint32_t pathFreqHz; + uint32_t slowClkDiv; + uint32_t periClkDiv; + uint32_t rootPath; + uint32_t srcClk; + + /* Get root path clock for the high-frequency clock # 0 */ + rootPath = _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_MUX, SRSS->CLK_ROOT_SELECT[0u]); + + /* Get source of the root path clock */ + srcClk = _FLD2VAL(SRSS_CLK_PATH_SELECT_PATH_MUX, SRSS->CLK_PATH_SELECT[rootPath]); + + /* Get frequency of the source */ + switch (srcClk) + { + case CY_ROOT_PATH_SRC_IMO: + srcFreqHz = CY_IMO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_EXT: + srcFreqHz = CY_EXT_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_ECO: + srcFreqHz = CY_ECO_FREQ_HZ; + break; + +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) + case CY_ROOT_PATH_SRC_ALTHF: + srcFreqHz = cy_BleEcoClockFreqHz; + break; +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) */ + + default: + srcFreqHz = CY_EXT_FREQ_HZ; + break; + } + + if (rootPath == 0UL) + { + /* FLL */ + bool fllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_FLL_STATUS_LOCKED, SRSS->CLK_FLL_STATUS)); + bool fllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)); + bool fllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)) || + (1UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3))); + if ((fllOutputAuto && fllLocked) || fllOutputOutput) + { + uint32_t fllMult; + uint32_t refDiv; + uint32_t outputDiv; + + fllMult = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_MULT, SRSS->CLK_FLL_CONFIG); + refDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV, SRSS->CLK_FLL_CONFIG2); + outputDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV, SRSS->CLK_FLL_CONFIG) + 1UL; + + pathFreqHz = ((srcFreqHz / refDiv) * fllMult) / outputDiv; + } + else + { + pathFreqHz = srcFreqHz; + } + } + else if (rootPath == 1UL) + { + /* PLL */ + bool pllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_PLL_STATUS_LOCKED, SRSS->CLK_PLL_STATUS[0UL])); + bool pllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])); + bool pllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])) || + (1UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL]))); + if ((pllOutputAuto && pllLocked) || pllOutputOutput) + { + uint32_t feedbackDiv; + uint32_t referenceDiv; + uint32_t outputDiv; + + feedbackDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + referenceDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_REFERENCE_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + outputDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_OUTPUT_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + + pathFreqHz = ((srcFreqHz * feedbackDiv) / referenceDiv) / outputDiv; + + } + else + { + pathFreqHz = srcFreqHz; + } + } + else + { + /* Direct */ + pathFreqHz = srcFreqHz; + } + + /* Get frequency after hf_clk pre-divider */ + pathFreqHz = pathFreqHz >> _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_DIV, SRSS->CLK_ROOT_SELECT[0u]); + cy_Hfclk0FreqHz = pathFreqHz; + + /* Slow Clock Divider */ + slowClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_SLOW_INT_DIV, CPUSS->CM0_CLOCK_CTL); + + /* Peripheral Clock Divider */ + periClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV, CPUSS->CM0_CLOCK_CTL); + + pathFreqHz = pathFreqHz / periClkDiv; + cy_PeriClkFreqHz = pathFreqHz; + pathFreqHz = pathFreqHz / slowClkDiv; + SystemCoreClock = pathFreqHz; + + /* Sets clock frequency for Delay API */ + cy_delayFreqHz = SystemCoreClock; + cy_delayFreqMhz = (uint8_t)((cy_delayFreqHz + CY_DELAY_1M_MINUS_1_THRESHOLD) / CY_DELAY_1M_THRESHOLD); + cy_delayFreqKhz = (cy_delayFreqHz + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD; + cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * cy_delayFreqKhz; +} + + +/******************************************************************************* +* Function Name: Cy_SystemInitIpcCyPipeIsr +****************************************************************************//** +* +* This is the Interrupt Service Routine for the Cypress Pipe. +* +*******************************************************************************/ +void Cy_SystemInitIpcCyPipeIsr(void) +{ + Cy_IPC_PIPE_ExecCallback(&cy_ipc_pipe_sysEpArray[CY_IPC_EP_CYPIPE_ADDR]); +} + + +/******************************************************************************* +* Function Name: Cy_SystemInitIpc +****************************************************************************//** +* +* Performs initial IPC configuration. +* +*******************************************************************************/ +void Cy_SystemInitIpc(void) +{ + cy_stc_sysint_t ipc_intr_cypipeConfig; + + Cy_IPC_PIPE_Config(cy_ipc_pipe_sysEpArray); + + #if (CY_CPU_CORTEX_M0P) + /* Initialize the lock subsystem. Should be called only on one CPU. */ + (void) Cy_IPC_LOCK_Init(CY_IPC_LOCK_COUNT, ipcLockArray); + #endif /* (CY_CPU_CORTEX_M0P) */ + + /* Initialize the pipe endpoints */ + Cy_IPC_PIPE_Init(CY_IPC_EP_CYPIPE_ADDR, ipc_pipe_cyPipeCbArray, CY_IPC_CYPIPE_CLIENT_CNT, CY_IPC_CYPIPE_CONFIG); + + /* Configure interrupts */ + ipc_intr_cypipeConfig.intrSrc = CY_IPC_INTR_CYPIPE_SRC; + ipc_intr_cypipeConfig.intrCm0p = CY_IPC_INTR_CYPIPE_CM0SRC; + ipc_intr_cypipeConfig.intrPriority = CY_IPC_INTR_CYPIPE_PRIO; + + Cy_SysInt_Init(&ipc_intr_cypipeConfig, &Cy_SystemInitIpcCyPipeIsr); + #if (CY_CPU_CORTEX_M0P) + NVIC_EnableIRQ((IRQn_Type)ipc_intr_cypipeConfig.intrCm0p); + #else + NVIC_EnableIRQ((IRQn_Type)ipc_intr_cypipeConfig.intrSrc); + #endif +} + + +/******************************************************************************* +* Function Name: Cy_SysGetCM4Status +****************************************************************************//** +* +* Gets the Cortex-M4 core mode. +* +* \return \ref group_startup_macro +* +*******************************************************************************/ +uint32_t Cy_SysGetCM4Status(void) +{ + uint32_t returnValue; + uint32_t regValue; + + regValue = CPUSS->CM4_PWR_CTL & CPUSS_CM4_PWR_CTL_Msk; + switch(regValue) + { + case CPUSS_CM4_PWR_CTL_DISABLED: + returnValue = CY_SYS_CM4_STATUS_DISABLED; + break; + + case CPUSS_CM4_PWR_CTL_RETAINED: + returnValue = CY_SYS_CM4_STATUS_RETAINED; + break; + + case CPUSS_CM4_PWR_CTL_ENABLED: + returnValue = CY_SYS_CM4_STATUS_ENABLED; + break; + + case CPUSS_CM4_PWR_CTL_RESET_MODE: + returnValue = CY_SYS_CM4_STATUS_RESET; + break; + + default: + returnValue = CY_SYS_CM4_STATUS_UNKNOWN; + break; + } + + return (returnValue); +} + + +/******************************************************************************* +* Function Name: Cy_SysEnableCM4 +****************************************************************************//** +* +* Enables the Cortex-M4 core. The CPU is enabled once if it was in the disabled +* or retained mode. If the CPU is enabled, the vector table base address is +* updated and software reset of the Cortex-M4 core is performed. +* +* \param vectorTableOffset The offset of the vector table base address from +* memory address 0x00000000. The offset should be multiple to 1024 bytes. +* +*******************************************************************************/ +void Cy_SysEnableCM4(uint32_t vectorTableOffset) +{ + uint32_t cm4Status; + uint32_t interruptState; + + interruptState = Cy_SaveIRQ(); + cm4Status = Cy_SysGetCM4Status(); + + switch(cm4Status) + { + case CY_SYS_CM4_STATUS_DISABLED: + CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; + + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_POWER, 1UL); + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_ISOLATE, 1UL); + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); + break; + + case CY_SYS_CM4_STATUS_RETAINED: + CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; + + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_POWER, 1UL); + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_RETAIN, 1UL); + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_ISOLATE, 1UL); + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); + break; + + case CY_SYS_CM4_STATUS_RESET: + CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; + + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); + break; + + case CY_SYS_CM4_STATUS_ENABLED: + CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; + + /* Move to Reset from Enabled state */ + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); + + /* Move to Enabled from Reset state */ + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); + break; + + default: + /* Do nothing if Cortex-M4 is already enabled. */ + break; + } + + Cy_RestoreIRQ(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysDisableCM4 +****************************************************************************//** +* +* Disables the Cortex-M4 core. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref SysPm_ReadStatus() to get a status of the CPU. +* +*******************************************************************************/ +void Cy_SysDisableCM4(void) +{ + uint32_t cm4Status; + uint32_t interruptState; + + interruptState = Cy_SaveIRQ(); + cm4Status = Cy_SysGetCM4Status(); + + switch(cm4Status) + { + case CY_SYS_CM4_STATUS_ENABLED: + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_ISOLATE, 1UL); + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_POWER, 1UL); + break; + + case CY_SYS_CM4_STATUS_RETAINED: + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_RETAIN, 1UL); + break; + + default: + /* Do nothing if Cortex-M4 is already disabled. */ + break; + } + + Cy_RestoreIRQ(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysRetainCM4 +****************************************************************************//** +* +* Retains the Cortex-M4 core. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the CPU. +* +*******************************************************************************/ +void Cy_SysRetainCM4(void) +{ + uint32_t cm4Status; + uint32_t interruptState; + + interruptState = Cy_SaveIRQ(); + cm4Status = Cy_SysGetCM4Status(); + + switch(cm4Status) + { + case CY_SYS_CM4_STATUS_ENABLED: + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_ISOLATE, 1UL); + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_RETAIN, 1UL); + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_POWER, 1UL); + break; + + case CY_SYS_CM4_STATUS_DISABLED: + /* Switch from the DISABLED to the RETAINED state is not valid. + * Do nothing in this case. */ + break; + + default: + /* Do nothing if Cortex-M4 is already in the RETAINED state. */ + break; + } + + Cy_RestoreIRQ(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysResetCM4 +****************************************************************************//** +* +* Resets the Cortex-M4 core. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the CPU. +* +*******************************************************************************/ +void Cy_SysResetCM4(void) +{ + uint32_t cm4Status; + uint32_t interruptState; + + interruptState = Cy_SaveIRQ(); + cm4Status = Cy_SysGetCM4Status(); + + switch(cm4Status) + { + case CY_SYS_CM4_STATUS_ENABLED: + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); + break; + + case CY_SYS_CM4_STATUS_DISABLED: + CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_ISOLATE, 1UL); + CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_POWER, 1UL); + break; + + default: + /* Do nothing if Cortex-M4 is already in the RETAINED state. */ + break; + } + + Cy_RestoreIRQ(interruptState); +} + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/system_psoc6ble_cm0plus.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/system_psoc6ble_cm0plus.h new file mode 100644 index 0000000000..5e2c5054c5 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/system_psoc6ble_cm0plus.h @@ -0,0 +1,185 @@ +/***************************************************************************//** +* \file system_psoc6ble_cm0plus.h +* \version 1.0 +* +* \brief Device system header file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#ifndef _SYSTEM_PSOC6BLE_CM0PLUS_H_ +#define _SYSTEM_PSOC6BLE_CM0PLUS_H_ + +#define CY_CM0 ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined (__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3))) + +#if (CY_CM0) + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** startup_m0p driver identifier */ +#define CY_STARTUP_M0P_ID ((uint32_t)((uint32_t)((0x0Eu) & 0x3FFFu) << 18u)) + + +/******************************************************************************* +* Inter Process Communication (IPC) +*******************************************************************************/ + +#define CY_IPC_CYPIPE_CLIENT_CNT (8u) /* Number of the defined clients */ + +#define CY_IPC_EP_MAX (CPUSS_IPC_IPC_NR) /* Number of IPC structures */ +#define CY_IPC_EP_CYPIPE_CM0_ADDR (0u) +#define CY_IPC_EP_CYPIPE_CM4_ADDR (1u) +#if (CY_CM0) + #define CY_IPC_EP_CYPIPE_ADDR CY_IPC_EP_CYPIPE_CM0_ADDR +#else + #define CY_IPC_EP_CYPIPE_ADDR CY_IPC_EP_CYPIPE_CM4_ADDR +#endif /* (CY_CM0) */ + + +#define CY_IPC_LOCK_COUNT (128u) /* Locks number. Must be a multiple of 32 */ + +/* IPC channels */ +#define CY_IPC_CHAN_SYSCALL_CM0 (0u) /* System calls for the CM0 processor */ +#define CY_IPC_CHAN_SYSCALL_CM4 (1u) /* System calls for the 1st non-CM0 processor */ +#if (CY_CM0) + #define CY_IPC_CHAN_SYSCALL CY_IPC_CHAN_SYSCALL_CM0 +#else + #define CY_IPC_CHAN_SYSCALL CY_IPC_CHAN_SYSCALL_CM4 +#endif /* (CY_CM0) */ +#define CY_IPC_CHAN_SYSCALL_DAP (2u) /* System call */ +#define CY_IPC_CHAN_CRYPTO (3u) /* Crypto functions */ +#define CY_IPC_CHAN_LOCK (4u) /* IPC Locks (System wide) */ +#define CY_IPC_CHAN_CYPIPE_CM0 (5u) /* Cypress Pipe, CM0 side */ +#define CY_IPC_CHAN_CYPIPE_CM4 (6u) /* Cypress Pipe, CM4 side */ + +/* IPC interrupts */ +#define CY_IPC_INTR_SYSCALL_CM0 (0u) +#define CY_IPC_INTR_SYSCALL_CM4 (1u) +#define CY_IPC_INTR_SYSCALL_DAP (2u) +#define CY_IPC_INTR_CRYPTO_M0 (3u) +#define CY_IPC_INTR_CRYPTO_M4 (4u) +#define CY_IPC_INTR_CYPIPE_CM0 (5u) +#define CY_IPC_INTR_CYPIPE_CM4 (6u) + +/* IPC CM0 Interrupts */ +#if (CY_CM0) + #define CY_IPC_INTR_CYPIPE_SRC cpuss_interrupts_ipc5_IRQn + #define CY_IPC_INTR_CYPIPE_CM0SRC NvicMux28 + #define CY_IPC_INTR_CYPIPE_PRIO (1u) +#else + #define CY_IPC_INTR_CYPIPE_SRC cpuss_interrupts_ipc6_IRQn + #define CY_IPC_INTR_CYPIPE_CM0SRC (240u) /* Default value of CM0_INT_CTLx register */ + #define CY_IPC_INTR_CYPIPE_PRIO (1u) +#endif + +/* The System pipe configuration defines the IPC channel number, interrupt number and the pipe interrupt mask */ +#define CY_IPC_CYPIPE_INTR_MASK (uint32_t)((0x0001ul << CY_IPC_CHAN_CYPIPE_CM0) | (0x0001ul << CY_IPC_CHAN_CYPIPE_CM4) ) + +#if (CY_CM0) + #define CY_IPC_CYPIPE_CONFIG (uint32_t)( (CY_IPC_CYPIPE_INTR_MASK << 16) | (CY_IPC_INTR_CYPIPE_CM0 << 8u) | CY_IPC_CHAN_CYPIPE_CM0) +#else + #define CY_IPC_CYPIPE_CONFIG (uint32_t)( (CY_IPC_CYPIPE_INTR_MASK << 16) | (CY_IPC_INTR_CYPIPE_CM4 << 8u) | CY_IPC_CHAN_CYPIPE_CM4) +#endif + + +/** +* \addtogroup group_startup_functions +* \{ +*/ +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); +/** \} group_startup_functions */ + + +/** +* \addtogroup group_startup_functions +* \{ +*/ +extern uint32_t Cy_SysGetCM4Status(void); +extern void Cy_SysEnableCM4(uint32_t vectorTableOffset); +extern void Cy_SysDisableCM4(void); +extern void Cy_SysRetainCM4(void); +extern void Cy_SysResetCM4(void); +/** \} group_startup_functions */ + + +/** \cond */ +extern void Default_Handler (void); +extern uint32_t Cy_SaveIRQ(void); +extern void Cy_RestoreIRQ(uint32_t saved); + +extern void Cy_SMIF_StartupCallBack(void); +extern void Cy_SystemInit(void); +extern void Cy_SystemInitIpc(void); +extern void Cy_SystemInitFpuEnable(void); + +extern uint32_t cy_delayFreqHz; +extern uint32_t cy_delayFreqKhz; +extern uint8_t cy_delayFreqMhz; +extern uint32_t cy_delay32kMs; + +extern uint32_t cy_BleEcoClockFreqHz; +extern uint32_t cy_Hfclk0FreqHz; +extern uint32_t cy_PeriClkFreqHz; +/** \endcond */ + + +/** +* \addtogroup group_startup_macro +* \{ +*/ + +#ifndef CY_CORTEX_M4_APPL_ADDR + /** Start address of the Cortex-M4 application */ + #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) +#endif + +#define CY_SYS_CM4_STATUS_ENABLED (0u) /**< The Cortex-M4 core is enabled. */ +#define CY_SYS_CM4_STATUS_DISABLED (1u) /**< The Cortex-M4 core is disabled. */ +#define CY_SYS_CM4_STATUS_RETAINED (2u) /**< The Cortex-M4 core is retained. */ +#define CY_SYS_CM4_STATUS_UNKNOWN (3u) /**< The Cortex-M4 core is in the unknown state. Invalid state. */ +#define CY_SYS_CM4_STATUS_RESET (4u) /**< The Cortex-M4 core is in the Reset mode. */ +/** \} group_startup_macro */ + + +/** \cond */ + #define CPUSS_CM4_PWR_CTL_Msk (CPUSS_CM4_PWR_CTL_ISOLATE_Msk | \ + CPUSS_CM4_PWR_CTL_RETAIN_Msk | CPUSS_CM4_PWR_CTL_POWER_Msk | \ + CPUSS_CM4_PWR_CTL_RESET_Msk | CPUSS_CM4_PWR_CTL_CLOCK_Msk) + + #define CPUSS_CM4_PWR_CTL_DISABLED (CPUSS_CM4_PWR_CTL_RESET_Msk | CPUSS_CM4_PWR_CTL_ISOLATE_Msk) + #define CPUSS_CM4_PWR_CTL_RETAINED (CPUSS_CM4_PWR_CTL_RETAIN_Msk | CPUSS_CM4_PWR_CTL_ISOLATE_Msk) + #define CPUSS_CM4_PWR_CTL_ENABLED (CPUSS_CM4_PWR_CTL_CLOCK_Msk | CPUSS_CM4_PWR_CTL_POWER_Msk) + #define CPUSS_CM4_PWR_CTL_RESET_MODE (CPUSS_CM4_PWR_CTL_RESET_Msk | CPUSS_CM4_PWR_CTL_POWER_Msk) +/** \endcond */ + + +/** \addtogroup group_startup_globals +* \{ +*/ + +extern uint32_t SystemCoreClock; + +/** \} group_startup_globals */ + +#ifdef __cplusplus +} +#endif + +#endif /* CY_CM0 */ +#endif /* _SYSTEM_PSOC6BLE_CM0PLUS_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cy_crypto_config.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cy_crypto_config.h new file mode 100644 index 0000000000..1de2332e52 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cy_crypto_config.h @@ -0,0 +1,92 @@ +/***************************************************************************//** +* \file cy_crypto_config.h +* \version 1.0 +* +* \brief +* This file provides user parameters for the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CONFIG_H) +#define CY_CRYPTO_CONFIG_H + + +/* Defines to configure interrupts used in Crypto driver */ + +/* Number of Crypto Notify interrupt inputs to CM0+ */ +#define CY_CRYPTO_CM0_NOTIFY_INTR_NR (26u) +/* Priority of Crypto Notify interrupt inputs to CM0+ */ +#define CY_CRYPTO_NOTIFY_INTR_PR (2u) + +/* Number of Crypto release interrupt inputs to CM0+ */ +#define CY_CRYPTO_CM0_RELEASE_INTR_NR (27u) +/* Priority of Crypto release interrupt inputs to CM0+ */ +#define CY_CRYPTO_RELEASE_INTR_PR (2u) + +/* Number of Crypto Error interrupt inputs to CM0+ */ +#define CY_CRYPTO_CM0_ERROR_INTR_NR (28u) +/* Priority of Crypto Error interrupt inputs to CM0+ */ +#define CY_CRYPTO_CM0_ERROR_INTR_PR (2u) + +/* Default Crypto driver configuration */ +#define CY_CRYPTO_DEFAULT_CONFIG \ + { \ + CY_CRYPTO_CM0_NOTIFY_INTR_NR, \ + CY_CRYPTO_NOTIFY_INTR_PR, \ + CY_CRYPTO_CM0_RELEASE_INTR_NR, \ + CY_CRYPTO_RELEASE_INTR_PR, \ + CY_CRYPTO_CM0_ERROR_INTR_NR, \ + CY_CRYPTO_CM0_ERROR_INTR_PR, \ + NULL, \ + NULL, \ + NULL \ + } + +/* Defines to Enable/Disable Crypto functionality */ + +/* AES CMAC support (0 = no support, 1 = support), + * to run CMAC, AES ECB mode should be enabled */ +#define CY_CRYPTO_USER_CMAC (1u) +/* AES ECB cipher support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_AES_ECB (1u) +/* AES CBC cipher support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_AES_CBC (1u) +/* AES CFB cipher support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_AES_CFB (1u) +/* AES CTR cipher support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_AES_CTR (1u) +/* PKCS1-v1_5 verification support (0 = no support, 1 = support), + * to run PKCS1-v1_ at least one of SHA modes should be enabled */ +#define CY_CRYPTO_USER_PKCS1_5 (1u) +/* HMAC support (0 = no support, 1 = support), + * to run HMAC at least one of SHA modes should be enabled */ +#define CY_CRYPTO_USER_HMAC (1u) +/* SHA1 hash support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_SHA1 (1u) +/* SHA 224 and 256 hash support, (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_SHA256 (1u) +/* SHA 384, 512, 512_224 and 512_256 hash support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_SHA512 (1u) +/* (Triple) DES cipher support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_DES (1u) +/* Pseudo random number generation support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_PR (1u) +/* Cyclic Redundancy Check support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_CRC (1u) +/* Vector unit support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_VU (1u) +/* True random number generation support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_TR (1u) +/* String support (0 = no support, 1 = support) */ +#define CY_CRYPTO_USER_STR (1u) + +#endif /* #if !defined(CY_CRYPTO_CONFIG_H) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyapicallbacks.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyapicallbacks.h new file mode 100644 index 0000000000..ff6c7a2d92 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyapicallbacks.h @@ -0,0 +1,28 @@ +/* ======================================== + * + * Copyright YOUR COMPANY, THE YEAR + * All Rights Reserved + * UNPUBLISHED, LICENSED SOFTWARE. + * + * CONFIDENTIAL AND PROPRIETARY INFORMATION + * WHICH IS THE PROPERTY OF your company. + * + * ======================================== +*/ +#ifndef CYAPICALLBACKS_H +#define CYAPICALLBACKS_H + + +#ifdef CPU_CORTEX_M0p + /*Define your Cortex-M0p macro callbacks here */ +#endif + +#ifdef CPU_CORTEX_M4 + /*Define your Cortex-M4 macro callbacks here */ +#endif + + /*For more information, refer to the Writing Code topic in the PSoC Creator Help.*/ + + +#endif /* CYAPICALLBACKS_H */ +/* [] */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cydisabledsheets.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cydisabledsheets.h new file mode 100644 index 0000000000..8178873980 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cydisabledsheets.h @@ -0,0 +1,5 @@ +#ifndef INCLUDED_CYDISABLEDSHEETS_H +#define INCLUDED_CYDISABLEDSHEETS_H + + +#endif /* INCLUDED_CYDISABLEDSHEETS_H */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter.h new file mode 100644 index 0000000000..1a368ea3e4 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter.h @@ -0,0 +1,6 @@ +#ifndef INCLUDED_CYFITTER_H +#define INCLUDED_CYFITTER_H + +#include "cy_device_headers.h" + +#endif /* INCLUDED_CYFITTER_H */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_cfg.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_cfg.c new file mode 100644 index 0000000000..5f575c3a3b --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_cfg.c @@ -0,0 +1,271 @@ + +/******************************************************************************* +* File Name: cyfitter_cfg.c +* +* PSoC Creator 4.1 +* +* Description: +* This file contains device initialization code. +* Except for the user defined sections in CyClockStartupError(), this file should not be modified. +* This file is automatically generated by PSoC Creator. +* +******************************************************************************** +* Copyright (c) 2007-2017 Cypress Semiconductor. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +********************************************************************************/ + +#include +#include "cyfitter.h" +#include "gpio/cy_gpio.h" +#include "syslib/cy_syslib.h" +#include "cyfitter_cfg.h" +#include "sysclk/cy_sysclk.h" +#include "systick/cy_systick.h" + +#define CY_NEED_CYCLOCKSTARTUPERROR 1 + + +#if defined(__GNUC__) || defined(__ARMCC_VERSION) + #define CYPACKED + #define CYPACKED_ATTR __attribute__ ((packed)) + #define CYALIGNED __attribute__ ((aligned)) + #define CY_CFG_UNUSED __attribute__ ((unused)) + #ifndef CY_CFG_SECTION + #define CY_CFG_SECTION __attribute__ ((section(".psocinit"))) + #endif + + #if defined(__ARMCC_VERSION) + #define CY_CFG_MEMORY_BARRIER() __memory_changed() + #else + #define CY_CFG_MEMORY_BARRIER() __sync_synchronize() + #endif + +#elif defined(__ICCARM__) + #include + + #define CYPACKED __packed + #define CYPACKED_ATTR + #define CYALIGNED _Pragma("data_alignment=4") + #define CY_CFG_UNUSED _Pragma("diag_suppress=Pe177") + #define CY_CFG_SECTION _Pragma("location=\".psocinit\"") + + #define CY_CFG_MEMORY_BARRIER() __DMB() + +#else + #error Unsupported toolchain +#endif + +#ifndef CYCODE + #define CYCODE +#endif +#ifndef CYDATA + #define CYDATA +#endif +#ifndef CYFAR + #define CYFAR +#endif +#ifndef CYXDATA + #define CYXDATA +#endif + + +CY_CFG_UNUSED +static void CYMEMZERO(void *s, size_t n); +CY_CFG_UNUSED +static void CYMEMZERO(void *s, size_t n) +{ + (void)memset(s, 0, n); +} +CY_CFG_UNUSED +static void CYCONFIGCPY(void *dest, const void *src, size_t n); +CY_CFG_UNUSED +static void CYCONFIGCPY(void *dest, const void *src, size_t n) +{ + (void)memcpy(dest, src, n); +} +CY_CFG_UNUSED +static void CYCONFIGCPYCODE(void *dest, const void *src, size_t n); +CY_CFG_UNUSED +static void CYCONFIGCPYCODE(void *dest, const void *src, size_t n) +{ + (void)memcpy(dest, src, n); +} + + + + +/* Clock startup error codes */ +#define CYCLOCKSTART_NO_ERROR 0u +#define CYCLOCKSTART_XTAL_ERROR 1u +#define CYCLOCKSTART_32KHZ_ERROR 2u +#define CYCLOCKSTART_PLL_ERROR 3u +#define CYCLOCKSTART_FLL_ERROR 4u + + +#ifdef CY_NEED_CYCLOCKSTARTUPERROR +/******************************************************************************* +* Function Name: CyClockStartupError +******************************************************************************** +* Summary: +* If an error is encountered during clock configuration (crystal startup error, +* PLL lock error, etc.), the system will end up here. Unless reimplemented by +* the customer, this function will stop in an infinite loop. +* +* Parameters: +* void +* +* Return: +* void +* +*******************************************************************************/ +CY_CFG_UNUSED +static void CyClockStartupError(uint8 errorCode); +CY_CFG_UNUSED +static void CyClockStartupError(uint8 errorCode) +{ + /* To remove the compiler warning if errorCode not used. */ + errorCode = errorCode; + + /* If we have a clock startup error (bad MHz crystal, PLL lock, etc.), */ + /* we will end up here to allow the customer to implement something to */ + /* deal with the clock condition. */ + +#ifdef CY_CFG_CLOCK_STARTUP_ERROR_CALLBACK + CY_CFG_Clock_Startup_ErrorCallback(); +#else + while(1) {} +#endif /* CY_CFG_CLOCK_STARTUP_ERROR_CALLBACK */ +} +#endif + +void ClockInit(void); +void ClockInit(void) +{ + uint32_t status; + + /* Enable all source clocks */ + Cy_SysClk_LfClkSetSource(CY_SYSCLK_LFCLK_IN_ILO); + + /* Configure CPU clock dividers */ + Cy_SysClk_FastClkSetDivider(0u); + Cy_SysClk_PeriClkSetDivider(1u); + Cy_SysClk_SlowClkSetDivider(0u); + + /* Configure LF & HF clocks */ + Cy_SysClk_HfClockSetSource(0u, CY_SYSCLK_HFCLK_IN_CLKPATH0); + Cy_SysClk_HfClockSetDivider(0u, CY_SYSCLK_HFCLK_NO_DIVIDE); + Cy_SysClk_ClkHfEnable(0u); + + /* Configure Path Clocks */ + Cy_SysClk_ClkPathSetSource(0, CY_SYSCLK_CLKPATH_IN_IMO); + Cy_SysClk_ClkPathSetSource(1, CY_SYSCLK_CLKPATH_IN_IMO); + Cy_SysClk_ClkPathSetSource(2, CY_SYSCLK_CLKPATH_IN_IMO); + { + const cy_stc_fll_manual_config_t fllConfig = + { + .fllMult = 1825u, + .refDiv = 73u, + .ccoRange = CY_SYSCLK_FLL_CCO_RANGE4, + .enableOutputDiv = true, + .lockTolerance = 20u, + .igain = 7u, + .pgain = 5u, + .settlingCount = 8u, + .outputMode = CY_SYSCLK_FLLPLL_OUTPUT_AUTO + }; + status = Cy_SysClk_FllManualConfigure(&fllConfig); + if (CY_RET_SUCCESS != status) + { + CyClockStartupError(CYCLOCKSTART_FLL_ERROR); + } + } + status = Cy_SysClk_FllEnable(10000u); + if (CY_RET_SUCCESS != status) + { + CyClockStartupError(CYCLOCKSTART_FLL_ERROR); + } + + /* Configure miscellaneous clocks */ + Cy_SysClk_ClkTimerSetSource(CY_SYSCLK_CLKTIMER_IN_IMO); + Cy_SysClk_ClkTimerSetDivider(0); + Cy_SysClk_ClkTimerEnable(); + Cy_SysClk_ClkPumpSetSource(CY_SYSCLK_PUMP_IN_CLKPATH0); + Cy_SysClk_ClkPumpSetDivider(CY_SYSCLK_PUMP_NO_DIV); + Cy_SysClk_ClkPumpEnable(); + Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_CLKLF); + Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_LF); + Cy_SysClk_IloEnable(); + + /* Set memory wait states based on 100 MHz HFClk[0] */ + Cy_SysLib_SetWaitStates(false, 100); + + /* Configure peripheral clock dividers */ + /* + no Cy_SysClk_Periph* calls + + Each clock is configured in its respective API source file: + * 1M Hz clock (50M/50 Hz) for us_ticker + * oversample*bps Hz clock (50M/(oversample*bps) Hz clock) for serial_api + (depending on the bps) + */ +} + + +/* Analog API Functions */ + + +/******************************************************************************* +* Function Name: AnalogSetDefault +******************************************************************************** +* +* Summary: +* Sets up the analog portions of the chip to default values based on chip +* configuration options from the project. +* +* Parameters: +* void +* +* Return: +* void +* +*******************************************************************************/ +static void AnalogSetDefault(void); +static void AnalogSetDefault(void) +{ +} + +#define CY_AMUX_UNUSED CYREG_CPUSS_CM0_STATUS + + +/******************************************************************************* +* Function Name: Cy_SystemInit +******************************************************************************** +* Summary: +* This function is called by the start-up code for the selected device. It +* performs all of the necessary device configuration based on the design +* settings. This includes settings from the Design Wide Resources (DWR) such +* as Clocks and Pins as well as any component configuration that is necessary. +* +* Parameters: +* void +* +* Return: +* void +* +*******************************************************************************/ + +void Cy_SystemInit(void) +{ + /* Set worst case memory wait states (150 MHz), ClockInit() will update */ + Cy_SysLib_SetWaitStates(false, 150); + + /* Clock */ + ClockInit(); + + /* Perform basic analog initialization to defaults */ + AnalogSetDefault(); + + __enable_irq(); +} diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_cfg.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_cfg.h new file mode 100644 index 0000000000..690718f687 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_cfg.h @@ -0,0 +1,29 @@ +/******************************************************************************* +* File Name: cyfitter_cfg.h +* +* PSoC Creator 4.1 +* +* Description: +* This file provides basic startup and mux configuration settings +* This file is automatically generated by PSoC Creator. +* +******************************************************************************** +* Copyright (c) 2007-2017 Cypress Semiconductor. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +********************************************************************************/ + +#ifndef CYFITTER_CFG_H +#define CYFITTER_CFG_H + + + +extern void Cy_SystemInit(void); + +/* Analog Set/Unset methods */ + + +#endif /* CYFITTER_CFG_H */ + +/*[]*/ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_gpio.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_gpio.h new file mode 100644 index 0000000000..4db0a07429 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_gpio.h @@ -0,0 +1,6 @@ +#ifndef INCLUDED_CYFITTER_GPIO_H +#define INCLUDED_CYFITTER_GPIO_H + +#include "cy_device_headers.h" + +#endif /* INCLUDED_CYFITTER_GPIO_H */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cymetadata.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cymetadata.c new file mode 100644 index 0000000000..e7727ca9c0 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cymetadata.c @@ -0,0 +1,48 @@ +/******************************************************************************* +* File Name: cymetadata.c +* +* PSoC Creator 4.1 +* +* Description: +* This file defines all extra memory spaces that need to be included. +* This file is automatically generated by PSoC Creator. +* +******************************************************************************** +* Copyright (c) 2007-2017 Cypress Semiconductor. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +********************************************************************************/ + + +#include "stdint.h" + + +#if defined(__GNUC__) || defined(__ARMCC_VERSION) +#ifndef CY_META_SECTION +#define CY_META_SECTION __attribute__ ((__section__(".cymeta"), used)) +#endif +CY_META_SECTION +#elif defined(__ICCARM__) +#pragma location=".cymeta" +#else +#error "Unsupported toolchain" +#endif +const uint8_t cy_metadata[] = { + 0x00u, 0x05u, 0xE2u, 0x01u, 0x11u, 0x00u, 0x00u, 0x01u, + 0x00u, 0x00u, 0x00u, 0x00u +}; + +#if defined(__GNUC__) || defined(__ARMCC_VERSION) +#ifndef CY_CHIP_PROT_SECTION +#define CY_CHIP_PROT_SECTION __attribute__ ((__section__(".cychipprotect"), used)) +#endif +CY_CHIP_PROT_SECTION +#elif defined(__ICCARM__) +#pragma location=".cychipprotect" +#else +#error "Unsupported toolchain" +#endif +const uint8_t cy_meta_chipprotect[] = { + 0x01u +}; diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto.c new file mode 100644 index 0000000000..4b3bb62b44 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto.c @@ -0,0 +1,1809 @@ +/***************************************************************************//** +* \file cy_crypto.c +* \version 1.0 +* +* \brief +* Provides API implementation of the Cypress PDL Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto.h" +#include "crypto/cy_crypto_common.h" +#include "ipc/cy_ipc_drv.h" +#include "sysint/cy_sysint.h" +#include "syslib/cy_syslib.h" + + +#if (CPUSS_CRYPTO_PRESENT == 1) + + +#if defined(__cplusplus) +extern "C" { +#endif + +/* The function prototypes */ +void Cy_Crypto_Client_ReleaseIntrHndlr(void); +cy_en_crypto_status_t Cy_Crypto_Client_Send(cy_stc_crypto_context_t const *cryptoContext); + + +/* + * The global variable to store a pointer on the customer callback function. + * This variable is global because it is called from an interrupt. + */ +cy_crypto_callback_ptr_t cy_cryptoCompleteCallbackPtr = NULL; + +/******************************************************************************* +* Function Name: Cy_Crypto_Client_ReleaseIntrHndlr +****************************************************************************//** +* +* The interrupt handler for the Crypto IPC Release interrupt; happens +* when Crypto hardware completes operation. This function clears the specific +* interrupt source and calls the customer interrupt handler. +* +*******************************************************************************/ +void Cy_Crypto_Client_ReleaseIntrHndlr(void) +{ + uint32_t interruptMasked; + + interruptMasked = Cy_IPC_DRV_GetIntrStatusMasked(Cy_IPC_DRV_GetIntrBaseAddr(CY_CRYPTO_RELEASE_INTR)); + + /* Check that there is really the IPC Crypto Release interrupt */ + if((1uL << CY_IPC_CHAN_CRYPTO) == (interruptMasked & IPC_INTR_STRUCT_INTR_MASKED_RELEASE_Msk)) + { + Cy_IPC_DRV_ClearIntr(Cy_IPC_DRV_GetIntrBaseAddr(CY_IPC_INTR_CRYPTO_M4), + (interruptMasked & IPC_INTR_STRUCT_INTR_MASKED_RELEASE_Msk), CY_IPC_NO_NOTIFIFICATION); + + if (cy_cryptoCompleteCallbackPtr != NULL) + { + cy_cryptoCompleteCallbackPtr(); + } + } +} + +/******************************************************************************* +* Function Name: Cy_Crypto_IsServerStarted +****************************************************************************//** +* +* Checks if CryptoServer is started. +* +* \return +* True - CryptoServer is started. +* False - CryptoServer is not started. +* +*******************************************************************************/ +bool Cy_Crypto_IsServerStarted(void) +{ + /* Check if the Crypto server started (Crypto IPC Notify interrupt is started) */ + return ((1uL << (CY_IPC_CHAN_CRYPTO + IPC_INTR_STRUCT_INTR_MASK_NOTIFY_Pos)) == + (Cy_IPC_DRV_GetIntrMask(Cy_IPC_DRV_GetIntrBaseAddr(CY_CRYPTO_NOTIFY_INTR)) & IPC_INTR_STRUCT_INTR_MASK_NOTIFY_Msk)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_IsServerReady +****************************************************************************//** +* +* Checks if CryptoServer is ready for operations. +* +* \return +* True - CryptoServer is ready. +* False - CryptoServer is not ready. +* +*******************************************************************************/ +bool Cy_Crypto_IsServerReady(void) +{ + return (CY_IPC_DRV_LOCKED != Cy_IPC_DRV_GetLockStatus(Cy_IPC_DRV_GetIpcBaseAddress(CY_IPC_CHAN_CRYPTO))); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Sync +****************************************************************************//** +* +* The synchronization function that waits or just checks (depending on the parameter) +* for the Crypto operation to complete. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param isBlocking +* Set whether Crypto_Sync is blocking or not: +* True - is blocking. +* False - is not blocking. +* +* \return +* True - Crypto HW is ready to new task. +* False - Crypto HW is busy. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Sync(cy_stc_crypto_context_t const *cryptoContext, bool isBlocking) +{ + cy_en_crypto_status_t status = CY_CRYPTO_NOT_INITIALIZED; + + if (CY_CRYPTO_INSTR_UNKNOWN != cryptoContext->instr) + { + status = CY_CRYPTO_SERVER_NOT_STARTED; + + /* Check if the Crypto server started (Crypto IPC Notify interrupt is started) */ + if (Cy_Crypto_IsServerStarted()) + { + + if (!isBlocking) + { + status = CY_CRYPTO_SERVER_BUSY; + + if (Cy_Crypto_IsServerReady()) + { + status = cryptoContext->resp; + } + } + else + { + while (!Cy_Crypto_IsServerReady()) + { + } + + status = cryptoContext->resp; + } + } + } + + return (status); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Client_Send +****************************************************************************//** +* +* Sends a pointer to the Crypto Server. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Client_Send(cy_stc_crypto_context_t const *cryptoContext) +{ + cy_en_crypto_status_t status = CY_CRYPTO_SERVER_NOT_STARTED; + + if (Cy_Crypto_IsServerStarted()) + { + status = CY_CRYPTO_SERVER_BUSY; + + if (Cy_Crypto_IsServerReady()) + { + status = CY_CRYPTO_SUCCESS; + + if (CY_IPC_DRV_SUCCESS != Cy_IPC_DRV_SendMsgPtr(Cy_IPC_DRV_GetIpcBaseAddress(CY_IPC_CHAN_CRYPTO), (1uL << CY_IPC_INTR_CRYPTO_M0), cryptoContext)) + { + status = CY_CRYPTO_COMM_FAIL; + } + } + } + + return (status); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_GetErrorStatus +****************************************************************************//** +* +* The function returns a cause of a Crypto hardware error. +* This function is independent of the Crypto previous state. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param hwErrorCause +* \ref cy_stc_crypto_hw_error_t. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_GetErrorStatus(const cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_hw_error_t *hwErrorCause) +{ + if(NULL != hwErrorCause) + { + hwErrorCause->errorStatus0 = cryptoContext->hwErrorStatus.errorStatus0; + hwErrorCause->errorStatus1 = cryptoContext->hwErrorStatus.errorStatus1; + } + + return (cryptoContext->resp); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Init +****************************************************************************//** +* +* Initializes the Crypto context buffer and +* interrupt for the Crypto callback. Must be called at first. +* +* To start working with Crypto methods after Crypto_Init(), +* call Crypto_Enable() to turn-on the Crypto Hardware. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param configStruct +* The pointer to the Crypto configuration structure. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Init(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_config_t const *configStruct) +{ + cy_stc_sysint_t intrCfg; + cy_en_crypto_status_t status = CY_CRYPTO_SERVER_NOT_STARTED; + + /* Release the Crypto IPC channel with the Release interrupt */ + (void)Cy_IPC_DRV_Release(Cy_IPC_DRV_GetIpcBaseAddress(CY_IPC_CHAN_CRYPTO), CY_IPC_NO_NOTIFIFICATION); + + cryptoContext->instr = CY_CRYPTO_INSTR_ENABLE; + + /* Check if the Crypto server started (Crypto IPC Notify interrupt is started) */ + if (Cy_Crypto_IsServerStarted()) + { + /* Set up a Release interrupt if the customer wants */ + if(NULL != configStruct->userCompleteCallback) + { + intrCfg.intrSrc = (IRQn_Type)(cpuss_interrupts_ipc0_IRQn + CY_CRYPTO_RELEASE_INTR); + intrCfg.intrCm0p = (IRQn_CM0P_Type)(configStruct->cm0ReleaseIntrNum); + intrCfg.intrPriority = configStruct->releaseIntrPrior; + Cy_SysInt_Init(&intrCfg, &Cy_Crypto_Client_ReleaseIntrHndlr); + + cy_cryptoCompleteCallbackPtr = configStruct->userCompleteCallback; + + /* Set up the IPC Release interrupt here */ + Cy_IPC_DRV_SetIntrMask(Cy_IPC_DRV_GetIntrBaseAddr(CY_CRYPTO_RELEASE_INTR), (1uL << CY_IPC_CHAN_CRYPTO), CY_IPC_NO_NOTIFIFICATION); + +#if (CY_CPU_CORTEX_M0P) + NVIC_EnableIRQ((IRQn_Type)intrCfg.intrCm0p); +#else + NVIC_EnableIRQ((IRQn_Type)intrCfg.intrSrc); +#endif + } + + status = CY_CRYPTO_SUCCESS; + } + + return(status); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_DeInit +****************************************************************************//** +* +* The function to de-initialize the Crypto driver. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param configStruct +* The pointer to the Crypto configuration structure. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_DeInit(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_config_t const *configStruct) +{ + uint32_t interruptMasked; + cy_en_crypto_status_t err = CY_CRYPTO_SUCCESS; + + cryptoContext->instr = CY_CRYPTO_INSTR_UNKNOWN; + + /* If the release interrupt was enable, disable it here */ + if(NULL != configStruct->userCompleteCallback) + { + /* Disable the Release interrupt from IPC */ +#if (CY_CPU_CORTEX_M0P) + NVIC_DisableIRQ((IRQn_Type)configStruct->cm0ReleaseIntrNum); +#else + NVIC_DisableIRQ((IRQn_Type)(cpuss_interrupts_ipc0_IRQn + CY_IPC_INTR_CRYPTO_M4)); +#endif + /* Reset up the IPC Release interrupt here */ + interruptMasked = Cy_IPC_DRV_GetIntrStatusMasked(Cy_IPC_DRV_GetIntrBaseAddr(CY_CRYPTO_RELEASE_INTR)); + + /* Check that there is really the IPC Crypto Release interrupt */ + if((1uL << CY_IPC_CHAN_CRYPTO) == (interruptMasked & IPC_INTR_STRUCT_INTR_MASK_RELEASE_Msk)) + { + Cy_IPC_DRV_ClearIntr(Cy_IPC_DRV_GetIntrBaseAddr(CY_IPC_INTR_CRYPTO_M4), (interruptMasked & IPC_INTR_STRUCT_INTR_MASK_RELEASE_Msk), CY_IPC_NO_NOTIFIFICATION); + } + } + + return (err); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Enable +****************************************************************************//** +* +* Enable the Crypo hardware. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Enable(cy_stc_crypto_context_t *cryptoContext) +{ + cy_en_crypto_status_t err; + + cryptoContext->instr = CY_CRYPTO_INSTR_ENABLE; + cryptoContext->xdata = NULL; + + err = Cy_Crypto_Client_Send(cryptoContext); + + /* Wait until initialization completes */ + if (CY_CRYPTO_SUCCESS == err) + { + err = Cy_Crypto_Sync(cryptoContext, CY_CRYPTO_SYNC_BLOCKING); + } + + return (err); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Disable +****************************************************************************//** +* +* Disables the Crypto hardware. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Disable(cy_stc_crypto_context_t *cryptoContext) +{ + cy_en_crypto_status_t err; + + cryptoContext->instr = CY_CRYPTO_INSTR_DISABLE; + cryptoContext->xdata = NULL; + + err = Cy_Crypto_Client_Send(cryptoContext); + + /* Wait until initialization completes */ + if (CY_CRYPTO_SUCCESS == err) + { + err = Cy_Crypto_Sync(cryptoContext, CY_CRYPTO_SYNC_BLOCKING); + } + + return (err); +} + +#if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) +/******************************************************************************* +* Function Name: Cy_Crypto_Prng_Init +****************************************************************************//** +* +* This function initializes parameters of the PRND. +* Resets the pseudo random sequence. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoPrngContext +* The pointer to the \ref cy_stc_crypto_context_prng_t structure which stores +* the Crypto function context. +* +* \param lfsr32InitState +* A non-zero seed value for the first LFSR. + +* \param lfsr31InitState +* A non-zero seed value for the second LFSR. + +* \param lfsr29InitState +* A non-zero seed value for the third LFSR +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Prng_Init(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_prng_t *cryptoPrngContext, + const uint32_t lfsr32InitState, + const uint32_t lfsr31InitState, + const uint32_t lfsr29InitState) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_PRNG_INIT; + cryptoContext->xdata = (void *)cryptoPrngContext; + + cryptoPrngContext->lfsr32InitState = lfsr32InitState; + cryptoPrngContext->lfsr31InitState = lfsr31InitState; + cryptoPrngContext->lfsr29InitState = lfsr29InitState; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Prng_Generate +****************************************************************************//** +* +* Generates the Pseudo Random Number. +* This function is dependent on Cy_Crypto_Prng_Init which should be called before. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoPrngContext +* The pointer to the \ref cy_stc_crypto_context_prng_t structure which stores +* the Crypto function context. +* +* \param max +* The maximum value of a random number. +* +* \param rndNumPtr +* The pointer to a generated pseudo random number. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Prng_Generate(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_prng_t *cryptoPrngContext, + uint32_t const max, + uint32_t *rndNumPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_PRNG; + cryptoContext->xdata = (void *)cryptoPrngContext; + + cryptoPrngContext->max = max; + cryptoPrngContext->prngNumPtr = rndNumPtr; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) */ + +#if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Init +****************************************************************************//** +* +* Initialize the AES operation by setting key and key length. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoAesContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure which stores all internal variables +* the Crypto driver requires. +* +* \param keyPtr +* The pointer to the encryption/decryption key. +* +* \param keyLength +* One of these: CRYPTO_AES_128, CRYPTO_AES_192 or CRYPTO_AES_256. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Init(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + uint32_t *keyPtr, + cy_en_crypto_aes_key_length_t keyLength) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_AES_INIT; + cryptoContext->xdata = cryptoAesContext; + + cryptoAesContext->aesState.keyPtr = keyPtr; + cryptoAesContext->aesState.keyLength = keyLength; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} + +#if (CY_CRYPTO_USER_AES_ECB == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Ecb_Run +****************************************************************************//** +* +* Performs AES operation on one Block. +* This function is dependent from Cy_Crypto_Aes_Init which should be called before. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoAesContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure which stores all internal variables +* the Crypto driver requires. +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT. +* +* \param srcBlockPtr +* The pointer to a source block. +* +* \param dstBlockPtr +* The pointer to a destination cipher block. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Ecb_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t *dstBlockPtr, + uint32_t *srcBlockPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_AES_ECB; + cryptoContext->xdata = cryptoAesContext; + + cryptoAesContext->dirMode = dirMode; + cryptoAesContext->dstPtr = dstBlockPtr; + cryptoAesContext->srcPtr = srcBlockPtr; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if (CY_CRYPTO_USER_AES_ECB == 1) */ + +#if (CY_CRYPTO_USER_AES_CBC == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Cbc_Run +****************************************************************************//** +* +* Performs AES operation on a plain text with Cipher Block Chaining (CBC). +* This function is dependent from Cy_Crypto_Aes_Init which should be called before. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoAesContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure which stores all internal variables +* the Crypto driver requires. +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT. +* +* \param srcSize +* The size of the source plain text. +* +* \param ivPtr +* The pointer to the initial vector. +* +* \param dstPtr +* The pointer to a destination cipher text. +* +* \param srcPtr +* The pointer to a source plain text. Must be 4-Byte aligned! +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Cbc_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t srcSize, + uint32_t *ivPtr, + uint32_t *dstPtr, + uint32_t *srcPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_AES_CBC; + cryptoContext->xdata = cryptoAesContext; + + cryptoAesContext->dirMode = dirMode; + cryptoAesContext->srcSize = srcSize; + cryptoAesContext->ivPtr = ivPtr; + cryptoAesContext->dstPtr = dstPtr; + cryptoAesContext->srcPtr = srcPtr; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if (CY_CRYPTO_USER_AES_CBC == 1) */ + +#if (CY_CRYPTO_USER_AES_CFB == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Cfb_Run +****************************************************************************//** +* +* Performs AES operation on a plain text with Cipher Feedback mode (CFB). +* This function is dependent from Cy_Crypto_Aes_Init +* which should be called before. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoAesContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure which stores all internal variables +* the Crypto driver requires. +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT. +* +* \param srcSize +* The size of the source plain text. +* +* \param ivPtr +* The pointer to the initial vector. +* +* \param dstPtr +* The pointer to a destination cipher text. +* +* \param srcPtr +* The pointer to a source plain text. Must be 4-Byte aligned! +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Cfb_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t srcSize, + uint32_t *ivPtr, + uint32_t *dstPtr, + uint32_t *srcPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_AES_CFB; + cryptoContext->xdata = cryptoAesContext; + + cryptoAesContext->dirMode = dirMode; + cryptoAesContext->srcSize = srcSize; + cryptoAesContext->ivPtr = ivPtr; + cryptoAesContext->dstPtr = dstPtr; + cryptoAesContext->srcPtr = srcPtr; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if (CY_CRYPTO_USER_AES_CFB == 1) */ + +#if (CY_CRYPTO_USER_AES_CTR == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Ctr_Run +****************************************************************************//** +* +* Performs AES operation on a plain text with Cipher Block Counter mode (CTR). +* NOTE: preparation of the unique nonceCounter for each block is +* the user's responsibility. This function is dependent from +* Cy_Crypto_Aes_Init which should be called before. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoAesContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure which stores all internal variables +* the Crypto driver requires. +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT. +* +* \param srcSize +* The size of a source plain text. +* +* \param srcOffset +* The size of an offset within the current block stream for resuming within the current cipher stream. +* +* \param nonceCounter +* The 128-bit nonce and counter. +* +* \param streamBlock +* The saved stream-block for resuming, is over-written by the function. +* +* \param dstPtr +* The pointer to a destination cipher text. +* +* \param srcPtr +* The pointer to a source plain text. Must be 4-Byte aligned! +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Ctr_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t srcSize, + uint32_t *srcOffset, + uint32_t nonceCounter[CY_CRYPTO_AES_BLOCK_SIZE / 8u], + uint32_t streamBlock[CY_CRYPTO_AES_BLOCK_SIZE / 8u], + uint32_t *dstPtr, + uint32_t *srcPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_AES_CTR; + cryptoContext->xdata = cryptoAesContext; + + cryptoAesContext->dirMode = dirMode; + cryptoAesContext->srcSize = srcSize; + cryptoAesContext->srcOffset = srcOffset; + cryptoAesContext->ivPtr = nonceCounter; + cryptoAesContext->streamBlock = streamBlock; + cryptoAesContext->dstPtr = dstPtr; + cryptoAesContext->srcPtr = srcPtr; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if (CY_CRYPTO_USER_AES_CTR == 1) */ + +#if (CY_CRYPTO_USER_CMAC == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Cmac_Run +****************************************************************************//** +* +* Performs the cipher-block chaining-message authentication-code. +* This function is independent of the previous Crypto state. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoAesContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure which stores all internal variables +* the Crypto driver requires. +* +* \param srcPtr +* The pointer to a source plain text. Must be 4-Byte aligned! +* +* \param srcSize +* The size of a source plain text. +* +* \param keyPtr +* The pointer to the encryption key. +* +* \param keyLength +* One of these: \ref cy_en_crypto_aes_key_length_t +* +* \param cmacPtr +* The pointer to the calculated CMAC. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Cmac_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + uint32_t *srcPtr, + uint32_t srcSize, + uint32_t *keyPtr, + cy_en_crypto_aes_key_length_t keyLength, + uint32_t *cmacPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_CMAC; + cryptoContext->xdata = cryptoAesContext; + + cryptoAesContext->srcSize = srcSize; + cryptoAesContext->dstPtr = cmacPtr; + cryptoAesContext->srcPtr = srcPtr; + cryptoAesContext->aesState.keyPtr = keyPtr; + cryptoAesContext->aesState.keyLength = keyLength; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if (CY_CRYPTO_USER_CMAC == 1) */ + +#endif /* #if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) */ + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) +/******************************************************************************* +* Function Name: Cy_Crypto_Sha_Run +****************************************************************************//** +* +* Performs the SHA Hash function. +* This function is independent of the previous Crypto state. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoShaContext +* the pointer to the \ref cy_stc_crypto_context_sha_t structure which stores all internal variables +* for Crypto driver. +* +* \param mode +* One of CRYPTO_SHA256, CRYPTO_SHA1, CRYPTO_SHA256_224, CRYPTO_SHA512, +* CRYPTO_SHA384, CRYPTO_SHA512_224, CRYPTO_SHA512_256. +* +* \param messagePtr +* The pointer to a message whose hash value is being computed. +* +* \param messageSize +* The size of a message. +* +* \param digestPtr +* The pointer to the hash digest . +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Sha_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_sha_t *cryptoShaContext, + uint32_t *messagePtr, + uint32_t messageSize, + uint32_t *digestPtr, + cy_en_crypto_sha_mode_t mode) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_SHA; + cryptoContext->xdata = cryptoShaContext; + + cryptoShaContext->messagePtr = messagePtr; + cryptoShaContext->messageSize = messageSize; + cryptoShaContext->dstPtr = digestPtr; + cryptoShaContext->mode = mode; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) */ + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) +/******************************************************************************* +* Function Name: Cy_Crypto_Hmac_Run +****************************************************************************//** +* +* Performs HMAC calculation. +* This function is independent of the previous Crypto state. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoShaContext +* the pointer to the \ref cy_stc_crypto_context_sha_t structure which stores all internal variables +* for Crypto driver. +* +* \param hmacPtr +* The pointer to the calculated HMAC . +* +* \param messagePtr +* The pointer to a message whose hash value is being computed. +* +* \param messageSize +* The size of a message. +* +* \param keyPtr +* The pointer to the key. +* +* \param keyLength +* The length of the key. +* +* \param mode +* One of these: CRYPTO_SHA256, CRYPTO_SHA1, CRYPTO_SHA256_224, CRYPTO_SHA512, +* CRYPTO_SHA384, CRYPTO_SHA512_224, CRYPTO_SHA512_256. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Hmac_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_sha_t *cryptoShaContext, + uint32_t *hmacPtr, + uint32_t *messagePtr, + uint32_t messageSize, + uint32_t *keyPtr, + uint32_t keyLength, + cy_en_crypto_sha_mode_t mode) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_HMAC; + cryptoContext->xdata = cryptoShaContext; + + cryptoShaContext->messagePtr = messagePtr; + cryptoShaContext->messageSize = messageSize; + cryptoShaContext->dstPtr = hmacPtr; + cryptoShaContext->mode = mode; + cryptoShaContext->keyPtr = keyPtr; + cryptoShaContext->keyLength = keyLength; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) */ + +#if ((CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) +/******************************************************************************* +* Function Name: Cy_Crypto_Str_MemCpy +****************************************************************************//** +* +* Function MemCpy that uses Crypto HW. +* Memory structures should not overlap! +* There is no alignment restriction. +* This function is independent of the previous Crypto state. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoMemContext +* the pointer to the \ref cy_stc_crypto_context_str_t structure which stores all internal variables +* for Crypto driver. +* +* \param dstPtr +* The pointer to the destination of MemCpy. +* +* \param srcPtr +* The pointer to the source of MemCpy. +* +* \param size +* The size in bytes of the copy operation. Maximum size is 65535 Bytes. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Str_MemCpy(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_str_t *cryptoMemContext, + void* dstPtr, + void const *srcPtr, + uint16_t size) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_MEM_CPY; + cryptoContext->xdata = cryptoMemContext; + + cryptoMemContext->dstPtr = dstPtr; + cryptoMemContext->srcPtr0 = srcPtr; + cryptoMemContext->dataSize = size; + + return(Cy_Crypto_Client_Send(cryptoContext)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Str_MemSet +****************************************************************************//** +* +* Function MemSet uses Crypto HW. +* There is no alignment restriction. +* This function is independent from the previous Crypto state. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoMemContext +* the pointer to the \ref cy_stc_crypto_context_str_t structure which stores all internal variables +* for Crypto driver. +* +* \param dstPtr +* The pointer to the destination of MemSet. +* +* \param data +* The value to be set. +* +* \param size +* The size in bytes of the set operation. Maximum size is 65535 Bytes. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Str_MemSet(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_str_t *cryptoMemContext, + void* dstPtr, + uint8_t data, + uint16_t size) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_MEM_SET; + cryptoContext->xdata = cryptoMemContext; + + cryptoMemContext->dstPtr = dstPtr; + cryptoMemContext->data = data; + cryptoMemContext->dataSize = size; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Str_MemCmp +****************************************************************************//** +* +* Function MemCmp uses Crypto HW. +* There is no alignment restriction. +* This function is independent from the previous Crypto state. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoMemContext +* the pointer to the \ref cy_stc_crypto_context_str_t structure which stores all internal variables +* for Crypto driver. +* +* \param src0Ptr +* The pointer to the first source of MemCmp. +* +* \param src1Ptr +* The pointer to the second source of MemCmp. +* +* \param size +* The size in bytes of the compare operation. Maximum size is 65535 Bytes. +* +* \param resultPtr +* The pointer to the result: 0 - if Source 1 = Source 2, 1 - if not. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Str_MemCmp(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_str_t *cryptoMemContext, + void const *src0Ptr, + void const *src1Ptr, + uint16_t size, + uint32_t *resultPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_MEM_CMP; + cryptoContext->xdata = cryptoMemContext; + + cryptoMemContext->srcPtr0 = src0Ptr; + cryptoMemContext->srcPtr1 = src1Ptr; + cryptoMemContext->dataSize = size; + cryptoMemContext->dstPtr = (void* )resultPtr; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} + +/******************************************************************************* +* Function Name: Crypto_Str_MemXor +****************************************************************************//** +* +* Function MemXor uses Crypto HW. +* Memory structures should not overlap! +* There is no alignment restriction. +* This function is independent from the previous Crypto state. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoMemContext +* the pointer to the \ref cy_stc_crypto_context_str_t structure which stores all internal variables +* for Crypto driver. +* +* \param src0Ptr +* The pointer to the first source of MemXor. + +* \param src1Ptr +* The pointer to the second source of MemXor. + +* \param dstPtr +* The pointer to the destination of MemXor. +* +* \param size +* The size in bytes of the compare operation. Maximum size is 65535 Bytes. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Str_MemXor(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_str_t *cryptoMemContext, + void const *src0Ptr, + void const *src1Ptr, + void* dstPtr, + uint16_t size) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_MEM_XOR; + cryptoContext->xdata = cryptoMemContext; + + cryptoMemContext->srcPtr0 = src0Ptr; + cryptoMemContext->srcPtr1 = src1Ptr; + cryptoMemContext->dstPtr = dstPtr; + cryptoMemContext->dataSize = size; + + return(Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if ((CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) */ + +#if ((CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) +/******************************************************************************* +* Function Name: Cy_Crypto_Crc_Init +****************************************************************************//** +* +* Performs CRC initialization. +* The peculiarity of CRC hardware block is that for some polynomials +* calculated CRC is MSB aligned, for another is LSB aligned. +* Here below is the table with knowing polynomials and their +* calculated CRCs from the string "123456789". +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
CRC modes and parameters
NameWidthPolyInitData RevData XORRem RevRem XORExpected CRCOutput of the CRC block
CRC-3 / ROHC30x30x71010x00x60x00000006
CRC-4 / ITU40x30x01010x00x70x00000007
CRC-5 / EPC50x90x90000x00x00x00000000
CRC-5 / ITU50x150x01010x00x70x00000007
CRC-5 / USB50x50x1F1010x1F0x190x00000019
CRC-6 / CDMA2000-A60x270x3F0000x00xD0xD0000000
CRC-6 / CDMA2000-B60x70x3F0000x00x3B0x3B000000
CRC-6 / DARC60x190x01010x00x260x00000026
CRC-6 / ITU60x30x01010x00x60x00000006
CRC-770x90x00000x00x750x75000000
CRC-7 / ROHC70x4F0x7F1010x00x530x00000053
CRC-880x70x00000x00xF40xF4000000
CRC-8 / CDMA200080x9B0xFF0000x00xDA0xDA000000
CRC-8 / DARC80x390x01010x00x150x00000015
CRC-8 / DVB-S280xD50x00000x00xBC0xBC000000
CRC-8 / EBU80x1D0xFF1010x00x970x00000097
CRC-8 / I-CODE80x1D0xFD0000x00x7E0x7E000000
CRC-8 / ITU80x70x00000x550xA10xA1000000
CRC-8 / MAXIM80x310x01010x00xA10x000000A1
CRC-8 / ROHC80x70xFF1010x00xD00x000000D0
CRC-8 / WCDMA80x9B0x01010x00x250x00000025
CRC-10100x2330x00000x00x1990x19900000
CRC-10 / CDMA2000100x3D90x3FF0000x00x2330x23300000
CRC-11110x3850x1A0000x00x5A30x5A300000
CRC-12 / 3GPP120x80F0x00010x00xDAF0x00000DAF
CRC-12 / CDMA2000120xF130xFFF0000x00xD4D0xD4D00000
CRC-12 / DECT120x80F0x00000x00xF5B0xF5B00000
CRC-13 / BBC130x1CF50x00000x00x4FA0x4FA00000
CRC-14 / DARC140x8050x01010x00x82D0x0000082D
CRC-15150x45990x00000x00x59E0x59E00000
CRC-15 / MPT1327150x68150x00000x10x25660x25660000
CRC-24240x0864CFB0x00B704CE0000x00x21CF020x21CF0200
CRC-24 / FLEXRAY-A240x05D6DCB0x00FEDCBA0000x00x7979BD0x7979BD00
CRC-24 / FLEXRAY-B240x05D6DCB0x00ABCDEF0000x00x1F23B80x1F23B800
CRC-31 / PHILIPS310x4C11DB70x7FFFFFFF0000x7FFFFFFF0xCE9E46C0xCE9E46C0
CRC-16 / ARC160x80050x00001010x00000xBB3D0x0000BB3D
CRC-16 / AUG-CCITT160x10210x1D0F0000x00000xE5CC0xE5CC0000
CRC-16 / BUYPASS160x80050x00000000x00000xFEE80xFEE80000
CRC-16 / CCITT-0160x10210xFFFF0000x00000x29B10x29B10000
CRC-16 / CDMA2000160xC8670xFFFF0000x00000x4C060x4C060000
CRC-16 / DDS-110160x80050x800D0000x00000x9ECF0x9ECF0000
CRC-16 / DECT-R160x05890x00000000x00010x007E0x007E0000
CRC-16 / DECT-X160x05890x00000000x00000x007F0x007F0000
CRC-16 / DNP160x3D650x00001010xFFFF0xEA820x0000EA82
CRC-16 / EN-13757160x3D650x00000000xFFFF0xC2B70xC2B70000
CRC-16 / GENIBUS160x10210xFFFF0000xFFFF0xD64E0xD64E0000
CRC-16 / MAXIM160x80050x00001010xFFFF0x44C20x000044C2
CRC-16 / MCRF4XX160x10210xFFFF1010x00000x6F910x00006F91
CRC-16 / RIELLO160x10210xB2AA1010x00000x63D00x000063D0
CRC-16 / T10-DIF160x8BB70x00000000x00000xD0DB0xD0DB0000
CRC-16 / TELEDISK160xA0970x00000000x00000x0FB30x0FB30000
CRC-16 / TMS37157160x10210x89EC1010x00000x26B10x000026B1
CRC-16 / USB160x80050xFFFF1010xFFFF0xB4C80x0000B4C8
CRC-A160x10210xC6C61010x00000xBF050x0000BF05
CRC-16 / KERMIT160x10210x00001010x00000x21890x00002189
CRC-16 / MODBUS160x80050xFFFF1010x00000x4B370x00004B37
CRC-16 / X-25160x10210xFFFF1010xFFFF0x906E0x0000906E
CRC-16 / XMODEM160x10210x00000000x00000x31C30x31C30000
CRC-32320x04C11DB70xFFFFFFFF1010xFFFFFFFF0xCBF439260xCBF43926
CRC-32 / BZIP2320x04C11DB70xFFFFFFFF0000xFFFFFFFF0xFC8919180xFC891918
CRC-32C320x1EDC6F410xFFFFFFFF1010xFFFFFFFF0xE30692830xE3069283
CRC-32D320xA833982B0xFFFFFFFF1010xFFFFFFFF0x873155760x87315576
CRC-32 / MPEG-2320x04C11DB70xFFFFFFFF0000x000000000x0376E6E70x0376E6E7
CRC-32 / POSIX320x04C11DB70x000000000000xFFFFFFFF0x765E76800x765E7680
CRC-32Q320x814141AB0x000000000000x000000000x3010BF7F0x3010BF7F
CRC-32 / JAMCRC320x04C11DB70xFFFFFFFF1010x000000000x340BC6D90x340BC6D9
CRC-32 / XFER320x000000AF0x000000000000x000000000xBD0BE3380xBD0BE338
+* +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoCrcContext +* The pointer to the \ref cy_stc_crypto_context_crc_t structure which stores +* the Crypto driver context. +* +* \param polynomial +* The polynomial (specified using 32 bits) used in the computing CRC. +* +* \param dataReverse +* The order in which data bytes are processed. 0 - MSB first, 1- LSB first. +* +* \param dataXor +* The byte mask for xoring data +* +* \param remReverse +* A reminder reverse: 0 means the remainder is not reversed. 1 means - reversed. +* +* \param remXor +* Specifies a mask with which the LFSR32 register is XORed to produce a remainder. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Crc_Init(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_crc_t *cryptoCrcContext, + uint32_t polynomial, + uint8_t dataReverse, + uint8_t dataXor, + uint8_t remReverse, + uint32_t remXor) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_CRC_INIT; + cryptoContext->xdata = cryptoCrcContext; + + cryptoCrcContext->dataReverse = dataReverse; + cryptoCrcContext->remReverse = remReverse; + cryptoCrcContext->dataXor = dataXor; + cryptoCrcContext->polynomial = polynomial; + cryptoCrcContext->remXor = remXor; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Crc_Run +****************************************************************************//** +* +* Performs CRC calculation on a message. +* This function is dependent from Cy_Crypto_Crc_Init which should be called before. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoCrcContext +* The pointer to the \ref cy_stc_crypto_context_crc_t structure which stores +* the Crypto driver context. +* +* \param dataPtr +* The pointer to the message whose CRC is being computed. +* +* \param dataSize +* The size of a message in bytes. +* +* \param crcPtr +* The pointer to a computed CRC value. +* +* \param lfsrInitState +* The initial state of the LFSR. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Crc_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_crc_t *cryptoCrcContext, + void* dataPtr, + uint16_t dataSize, + uint32_t *crcPtr, + uint32_t lfsrInitState) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_CRC; + cryptoContext->xdata = cryptoCrcContext; + + cryptoCrcContext->lfsrInitState = lfsrInitState; + cryptoCrcContext->srcDataPtr = dataPtr; + cryptoCrcContext->dataSize = dataSize; + cryptoCrcContext->crcPtr = crcPtr; + + return(Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if ((CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) */ + +#if ((CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) +/******************************************************************************* +* Function Name: Cy_Crypto_Trng_Generate +****************************************************************************//** +* +* Generates a True Random Number. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoTrngContext +* The pointer to the \ref cy_stc_crypto_context_trng_t structure which stores +* the Crypto driver context. +* +* \param GAROPol; +* The polynomial for the programmable Galois ring oscillator. +* +* \param FIROPol; +* The polynomial for the programmable Fibonacci ring oscillator. +* +* \param max +* The maximum length of a random number, in the range [0, 32] Bits. +* +* \param rndNumPtr +* the pointer to a generated true random number. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Trng_Generate(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_trng_t *cryptoTrngContext, + uint32_t GAROPol, + uint32_t FIROPol, + uint32_t max, + uint32_t *rndNumPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_TRNG; + cryptoContext->xdata = cryptoTrngContext; + + cryptoTrngContext->GAROPol = GAROPol; + cryptoTrngContext->GAROPol = FIROPol; + cryptoTrngContext->max = max; + cryptoTrngContext->trngNumPtr = rndNumPtr; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if ((CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) */ + +#if ((CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) +/******************************************************************************* +* Function Name: Cy_Crypto_Des_Run +****************************************************************************//** +* +* Performs DES operation on a Single Block. All addresses must be 4-Byte aligned. +* Ciphertext (dstBlockPtr) may overlap with plaintext (srcBlockPtr) +* This function is independent from the previous Crypto state. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoDesContext +* The pointer to the cy_stc_crypto_context_des_t structure which stores +* the Crypto driver context. +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT +* +* \param keyPtr +* The pointer to the encryption/decryption key. +* +* \param srcBlockPtr +* The pointer to a source block. Must be 4-Byte aligned! +* +* \param dstBlockPtr +* The pointer to a destination cipher block. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Des_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_des_t *cryptoDesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t *keyPtr, + uint32_t *dstBlockPtr, + uint32_t *srcBlockPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_DES; + cryptoContext->xdata = cryptoDesContext; + + cryptoDesContext->dirMode = dirMode; + cryptoDesContext->keyPtr = keyPtr; + cryptoDesContext->dstPtr = dstBlockPtr; + cryptoDesContext->srcPtr = srcBlockPtr; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Tdes_Run +****************************************************************************//** +* +* Performs TDES operation on a Single Block. All addresses must be 4-Byte aligned. +* Ciphertext (dstBlockPtr) may overlap with plaintext (srcBlockPtr) +* This function is independent from the previous Crypto state. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoDesContext +* The pointer to the cy_stc_crypto_context_des_t structure which stores +* the Crypto driver context. +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT. +* +* \param keyPtr +* The pointer to the encryption/decryption key. +* +* \param srcBlockPtr +* The pointer to a source block. Must be 4-Byte aligned! +* +* \param dstBlockPtr +* The pointer to a destination cipher block. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Tdes_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_des_t *cryptoDesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t *keyPtr, + uint32_t *dstBlockPtr, + uint32_t *srcBlockPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_3DES; + cryptoContext->xdata = cryptoDesContext; + + cryptoDesContext->dirMode = dirMode; + cryptoDesContext->keyPtr = keyPtr; + cryptoDesContext->dstPtr = dstBlockPtr; + cryptoDesContext->srcPtr = srcBlockPtr; + + return (Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if ((CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) */ + +#if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) +/******************************************************************************* +* Function Name: Cy_Crypto_Rsa_Proc +****************************************************************************//** +* +* Calculates (m^e mod modulo) where m is Message (Signature), e - public exponent +* using a public key in the next representation, it contains: +* modulo, +* public exponent, +* coefficient for Barrett reduction, +* binary inverse of the modulo, +* result of (2^moduloLength mod modulo) +* +* Not all fields in key must be given. Modulo and public exponent is mandatory; +* Barrett coefficient, inverse modulo and r-bar are optional. +* If they don't exists according pointers should be NULL. These coefficients +* could be calculated by \ref Cy_Crypto_Rsa_CalcCoefs. +* Their presence accelerates performance by 5 times. +* +* Returns the processed value and a success value. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoRsaContext +* The pointer to the \ref cy_stc_crypto_context_rsa_t structure which stores +* the RSA context. +* +* \param pubKeyPtr +* The pointer to the \ref cy_stc_crypto_rsa_pub_key_t structure which stores +* public key. +* +* \param messagePtr +* The pointer to the message to be processed. +* +* \param messageLength +* The length of the message to be processed. +* +* \param processedMessagePtr +* The pointer to processed message. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Rsa_Proc(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_rsa_t *cryptoRsaContext, + cy_stc_crypto_rsa_pub_key_t const *pubKeyPtr, + uint32_t const *messageePtr, + uint32_t messageLength, + uint32_t const *processedMessagePtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_RSA_PROC; + cryptoContext->xdata = cryptoRsaContext; + + cryptoRsaContext->keyPtr = (cy_stc_crypto_rsa_pub_key_t*)pubKeyPtr; + cryptoRsaContext->messagePtr = messageePtr; + cryptoRsaContext->messageLength = messageLength; + cryptoRsaContext->resultPtr = processedMessagePtr; + + return(Cy_Crypto_Client_Send(cryptoContext)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Rsa_CalcCoefs +****************************************************************************//** +* +* Calculates constant coefficients (which is dependent only on modulo +* and independent on message). With this pre-calculated coefficients calculations +* speed-up by 5 times. +* +* These coefficients are: +* coefficient for Barrett reduction, +* binary inverse of the modulo, +* result of (2^moduloLength mod modulo) +* +* Calculated coefficients will be placed by addresses provided in +* pubKeyPtr structure for according coefficients. +* Function overwrites previous values. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoRsaContext +* The pointer to the \ref cy_stc_crypto_context_rsa_t structure which stores +* the RSA context. +* +* \param pubKeyPtr +* The pointer to the \ref cy_stc_crypto_rsa_pub_key_t structure which stores +* public key. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Rsa_CalcCoefs(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_rsa_t *cryptoRsaContext, + cy_stc_crypto_rsa_pub_key_t const *pubKeyPtr) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_RSA_COEF; + cryptoContext->xdata = cryptoRsaContext; + + cryptoRsaContext->keyPtr = (cy_stc_crypto_rsa_pub_key_t*)pubKeyPtr; + + return(Cy_Crypto_Client_Send(cryptoContext)); +} +#endif /* #if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +#if (CY_CRYPTO_USER_PKCS1_5 == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Rsa_Verify +****************************************************************************//** +* +* RSA verification with checks for content, paddings and signature format. +* SHA digest of the message and decrypted message should be calculated before. +* Supports only PKCS1-v1_5 format, inside of this format supported padding +* using only SHA, cases with MD2 and MD5 are not supported. +* +* PKCS1-v1_5 described here, page 31: +* http://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf +* +* Returns the verification result \ref cy_en_crypto_rsa_ver_result_t. +* +* \param cryptoContext +* The pointer to the \ref cy_stc_crypto_context_t structure which stores +* the Crypto driver common context. +* +* \param cryptoRsaVerContext +* The pointer to the \ref cy_stc_crypto_context_rsa_ver_t structure which stores +* the RSA context. +* +* \param verResult +* The pointer to the verification result \ref cy_en_crypto_rsa_ver_result_t. +* +* \param digestType +* SHA mode used for hash calculation \ref cy_en_crypto_sha_mode_t. +* +* \param digestPtr +* The pointer to the hash of message whose signature to be verified. +* +* \param decryptedSignaturePtr +* The pointer to decrypted signature to be verified. +* +* \param decryptedSignatureLength +* The length of the decrypted signature to be verified, in Bytes +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Rsa_Verify(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_rsa_ver_t *cryptoRsaVerContext, + cy_en_crypto_rsa_ver_result_t *verResult, + cy_en_crypto_sha_mode_t digestType, + uint32_t const *digestPtr, + uint32_t const *decryptedSignaturePtr, + uint32_t decryptedSignatureLength) +{ + cryptoContext->instr = CY_CRYPTO_INSTR_RSA_VER; + cryptoContext->xdata = cryptoRsaVerContext; + + cryptoRsaVerContext->verResult = verResult; + cryptoRsaVerContext->digestType = digestType; + cryptoRsaVerContext->hashPtr = digestPtr; + cryptoRsaVerContext->decryptedSignaturePtr = decryptedSignaturePtr; + cryptoRsaVerContext->decryptedSignatureLength = decryptedSignatureLength; + + return(Cy_Crypto_Client_Send(cryptoContext)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Rsa_InvertEndianness +****************************************************************************//** +* +* Inverts endianness in the memory range, like: +* inArr[0] <---> inArr[n] +* inArr[1] <---> inArr[n-1] +* inArr[2] <---> inArr[n-2] +* ........................ +* inArr[n/2] <---> inArr[n/2-1] +* +* Odd or even byteSize are acceptable. +* +* \param inArrPtr +* The pointer to the memory whose endianness to be inverted. +* +* \param byteSize +* The length of the memory range whose endianness to be inverted, in Bytes +* +*******************************************************************************/ +void Cy_Crypto_Rsa_InvertEndianness(void *inArrPtr, uint32_t byteSize) +{ + int32_t limit; + int32_t i; + int32_t j = 0; + uint8_t temp; + uint8_t *tempPtr = (uint8_t*)inArrPtr; + + if (byteSize > 1u) + { + limit = byteSize / 2u; + if (0u == (byteSize % 2u)) + { + limit -= 1u; + } + + for (i = byteSize - 1u, j = 0u; i > limit; i--, j++) + { + temp = tempPtr[j]; + tempPtr[j] = tempPtr[i]; + tempPtr[i] = temp; + } + } +} + +#endif /* #if (CY_CRYPTO_USER_PKCS1_5 == 1) */ + + +#if defined(__cplusplus) +} +#endif + + +#endif /* #if (CPUSS_CRYPTO_PRESENT == 1) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto.h new file mode 100644 index 0000000000..0430e77d98 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto.h @@ -0,0 +1,450 @@ +/***************************************************************************//** +* \file cy_crypto.h +* \version 1.0 +* +* \brief +* This file provides the public interface for the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +********************************************************************************/ + +/** +* \defgroup group_crypto Cryptography (Crypto) +* \{ +* The Crypto driver provides an API to perform +* cryptographic operations on user-designated data. +* +* Crypto supports: DES, TDES, AES (128, 192, 256 bits), SHA, CMAC-AES, +* HMAC, PRNG, TRNG, CRC, the utility functions for string management, and +* the accelerator for arithmetic on very large numbers (up to 4096 bits). +* +* Definitions +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
TermDefinition
PlaintextAn unencrypted message
CiphertextAn encrypted message
Block cipherAn encryption function for fixed-size blocks of data. +* This function takes a fixed-size key and a block of plaintext data from +* the message and encrypts it to generate ciphertext. Block ciphers are +* reversible. The function performed on a block of encrypted data will decrypt it.
Block cipher modeA mode of encrypting a message using Block ciphers for messages of arbitrary length. +* The message is padded so that its length is an integer multiple of the block size. +* ECB (Electronic Code Book), CBC (Cipher Block Chaining), and CFB (Cipher Feedback) are all +* modes of using Block ciphers to create an encrypted message of arbitrary length.
Data Encryption Standard (DES)An obsolete Block cipher supported for legacy +* reasons. It uses a 56-bit key and a 64-bit message block size.
Triple DES (3DES or TDES)Uses the DES operation and three DES encryptions in sequence: encrypt +* with DES with one 56-bit key, decrypt with a second 56-bit key, and then encrypt again with either +* the first key or a third 56-bit key. The block size is 64-bits.
Advanced Encryption Standard (AES)This Block cipher replaces DES and 3DES. +* It is the current Block cipher standard. Keys can be 128, 192, or 256 bits +* in length and the message block size is 128 bits. This is the US government standard. +* AES is also used for message authentication.
Cipher-based Message Authentication Code (CMAC)This method uses a key along with the message +* to compute the MAC value using the AES Block Cipher algorithm.
Secure Hash Algorithm (SHA)This function takes a message of the arbitrary length +* and reduces it to a fixed-length residue or message digest after performing a series +* of mathematically defined operations that practically guarantee that any change in +* the message will change the hash value. It is used for message authentication by transmitting +* a message with a hash value appended to it and recalculating the message hash value using +* the same algorithm at the recipient's end. If the hashes differ, then the message is corrupted.
Message Authentication Code (MAC)MACs are used to verify that a received message has not been altered. +* This is done by first computing a MAC value at the sender's end and appending it to the transmitted message. +* When the message is received, the MAC is computed again and checked against the MAC value transmitted with +* the message. If they do not match, the message has been altered. Either a Hash algorithm (such as SHA) +* or a Block Cipher (such as AES) can be used to produce the MAC value. Keyed MAC schemes use a Secret Key +* along with the message, thus the Key value must be known to be able to compute the MAC value.
Hash Message Authentication Code (HMAC)This method uses a Key along with the message to compute +* the MAC value using a Hash algorithm.
Pseudo Random Number Generator (PRNG)Based on Linear Feedback Shift Registers that generate a sequence +* starting from a non-zero seed.
True Random Number Generator (TRNG)A block that generates a number that is statistically random and based +* on some physical random variation. The number cannot be duplicated by running the process again.
Symmetric Key CryptographyUses a common, known key to encrypt and decrypt messages (a shared secret between sender +* and receiver). An efficient method used for encrypting and decrypting messages once the authenticity +* of the other party has been established. DES (now obsolete), 3DES, and AES (currently used) +* are well known symmetric cryptography methods.
Asymmetric Key CryptographyAlso referred to as Public Key encryption. Someone who wishes to receive a message, publishes +* a very large public key (up to 4096 bits currently), which is one of two prime factors of a very large +* number. The other prime factor is the private key of the recipient and a secret. Someone wishing +* to send a message to the publisher of the public key encrypts the message with the public key. This message +* can now be decrypted only with the private key (the other prime factor held secret by the recipient). +* The message is now sent over any channel to the recipient who can decrypt it with the private, secret, key. +* The same process is used to send messages to the sender of the original message. The asymmetric cryptography +* relies on the mathematical impracticality (usually related to the processing power available at any given time) +* of factoring the keys. Common, computationally intensive, asymmetric algorithms are RSA and ECC. +* The public key is described by the pair (n, e) where n is a product of two randomly chosen primes p and q. +* The exponent e is a random integer 1 < e < Q where Q = (p-1) (q-1). The private key d is uniquely +* defined by the integer 1 < d < Q such that ed congruent to 1 (mod Q ).
+* +* \section group_crypto_configuration Configuration Considerations +* +* Crypto has one configuration structure: +* \ref cy_stc_crypto_config_t +* +* \section group_crypto_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* \section group_crypto_changelog Changelog +*
MISRA ruleRule Class (Required/ Advisory)Rule DescriptionDescription of Deviation(s)
11.4AA cast should not be performed between a pointer to the void to a pointer to the object type.The cast from the void to pointer and vice versa is used to transmit data via the IPC channel +* by exchanging the pointer. We exchange only one pointer, so there is no way to avoid this cast.
14.4RCast from a pointer to the void to a pointer to the object type.The cast from the void to pointer and vice versa is used to transmit data via the IPC channel +* by exchanging the pointer. We exchange only one pointer, so there is no way to avoid this cast.
16.7RThe object addressed by the pointer parameter '%s' is not modified +* and so the pointer can be of type 'pointer to const'.Data addressed by the pointer is modified by Crypto hardware, out of the compiler scope, so +* it can't be the pointer to const.
+* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \section group_crypto_memory_usage Memory Usage +* +* Flash and RAM memory usage for the Crypto driver is shown in the table below. +* The usage is measured for GCC 5.4.1 in a release build with "-Os" optimization +* for Cortex-M0+ and Cortex-M4 cores. +* +* +* +* +* +* +*
CoreFlash SizeRAM Size
CM0p 4294 5
CM4 692 4
+* +* \defgroup group_crypto_macro Macro +* \defgroup group_crypto_functions Functions +* \defgroup group_crypto_data_structures Data Structures +* \defgroup group_crypto_enums Enumerated Types +* +*/ + +#if !defined(CY_CRYPTO_H) +#define CY_CRYPTO_H + + +#include +#include +#include "cy_device_headers.h" +#include "crypto/cy_crypto_common.h" + +#if (CPUSS_CRYPTO_PRESENT == 1) + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** +* \addtogroup group_crypto_functions +* \{ +*/ + +cy_en_crypto_status_t Cy_Crypto_Init(cy_stc_crypto_context_t *cryptoContext, cy_stc_crypto_config_t const *configStruct); + +cy_en_crypto_status_t Cy_Crypto_DeInit(cy_stc_crypto_context_t *cryptoContext, cy_stc_crypto_config_t const *configStruct); + +cy_en_crypto_status_t Cy_Crypto_Enable(cy_stc_crypto_context_t *cryptoContext); + +cy_en_crypto_status_t Cy_Crypto_Disable(cy_stc_crypto_context_t *cryptoContext); + +cy_en_crypto_status_t Cy_Crypto_Sync(cy_stc_crypto_context_t const *cryptoContext, bool isBlocking); + +cy_en_crypto_status_t Cy_Crypto_GetErrorStatus(const cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_hw_error_t *hwErrorCause); + +#if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) +cy_en_crypto_status_t Cy_Crypto_Prng_Init(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_prng_t *cryptoPrngContext, + const uint32_t lfsr32InitState, + const uint32_t lfsr31InitState, + const uint32_t lfsr29InitState); + +cy_en_crypto_status_t Cy_Crypto_Prng_Generate(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_prng_t *cryptoPrngContext, + uint32_t const max, + uint32_t *rndNumPtr); +#endif /* #if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) */ + +#if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) +cy_en_crypto_status_t Cy_Crypto_Aes_Init(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + uint32_t *keyPtr, + cy_en_crypto_aes_key_length_t keyLength); + +#if (CY_CRYPTO_USER_AES_ECB == 1) +cy_en_crypto_status_t Cy_Crypto_Aes_Ecb_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t *dstBlockPtr, + uint32_t *srcBlockPtr); +#endif /* #if (CY_CRYPTO_USER_AES_ECB == 1) */ + +#if (CY_CRYPTO_USER_AES_CBC == 1) +cy_en_crypto_status_t Cy_Crypto_Aes_Cbc_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t srcSize, + uint32_t *ivPtr, + uint32_t *dstPtr, + uint32_t *srcPtr); +#endif /* #if (CY_CRYPTO_USER_AES_CBC == 1) */ + +#if (CY_CRYPTO_USER_AES_CFB == 1) +cy_en_crypto_status_t Cy_Crypto_Aes_Cfb_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t srcSize, + uint32_t *ivPtr, + uint32_t *dstPtr, + uint32_t *srcPtr); +#endif /* #if (CY_CRYPTO_USER_AES_CFB == 1) */ + +#if (CY_CRYPTO_USER_AES_CTR == 1) +cy_en_crypto_status_t Cy_Crypto_Aes_Ctr_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t srcSize, + uint32_t *srcOffset, + uint32_t nonceCounter[CY_CRYPTO_AES_BLOCK_SIZE / 8u], + uint32_t streamBlock[CY_CRYPTO_AES_BLOCK_SIZE / 8u], + uint32_t *dstPtr, + uint32_t *srcPtr); +#endif /* #if (CY_CRYPTO_USER_AES_CTR == 1) */ + +#if (CY_CRYPTO_USER_CMAC == 1) +cy_en_crypto_status_t Cy_Crypto_Aes_Cmac_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_aes_t *cryptoAesContext, + uint32_t *srcPtr, + uint32_t srcSize, + uint32_t *keyPtr, + cy_en_crypto_aes_key_length_t keyLength, + uint32_t *cmacPtr); +#endif /* #if (CY_CRYPTO_USER_CMAC == 1) */ +#endif /* #if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) */ + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) +cy_en_crypto_status_t Cy_Crypto_Sha_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_sha_t *cryptoShaContext, + uint32_t *messagePtr, + uint32_t messageSize, + uint32_t *digestPtr, + cy_en_crypto_sha_mode_t mode); +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) */ + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) +cy_en_crypto_status_t Cy_Crypto_Hmac_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_sha_t *cryptoShaContext, + uint32_t *hmacPtr, + uint32_t *messagePtr, + uint32_t messageSize, + uint32_t *keyPtr, + uint32_t keyLength, + cy_en_crypto_sha_mode_t mode); +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) */ + +#if ((CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) +cy_en_crypto_status_t Cy_Crypto_Str_MemCpy(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_str_t *cryptoMemContext, + void *dstPtr, + void const *srcPtr, + uint16_t size); + +cy_en_crypto_status_t Cy_Crypto_Str_MemSet(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_str_t *cryptoMemContext, + void *dstPtr, + uint8_t data, + uint16_t size); + +cy_en_crypto_status_t Cy_Crypto_Str_MemCmp(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_str_t *cryptoMemContext, + void const *src0Ptr, + void const *src1Ptr, + uint16_t size, + uint32_t *resultPtr); + +cy_en_crypto_status_t Cy_Crypto_Str_MemXor(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_str_t *cryptoMemContext, + void const *src0Ptr, + void const *src1Ptr, + void *dstPtr, + uint16_t size); +#endif /* #if ((CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) */ + +#if ((CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) +cy_en_crypto_status_t Cy_Crypto_Crc_Init(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_crc_t *cryptoCrcContext, + uint32_t polynomial, + uint8_t dataReverse, + uint8_t dataXor, + uint8_t remReverse, + uint32_t remXor); + +cy_en_crypto_status_t Cy_Crypto_Crc_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_crc_t *cryptoCrcContext, + void *dataPtr, + uint16_t dataSize, + uint32_t *crcPtr, + uint32_t lfsrInitState); +#endif /* #if ((CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) */ + +#if ((CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) +cy_en_crypto_status_t Cy_Crypto_Trng_Generate(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_trng_t *cryptoTrngContext, + uint32_t GAROPol, + uint32_t FIROPol, + uint32_t max, + uint32_t *rndNumPtr); +#endif /* #if ((CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) */ + +#if ((CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) +cy_en_crypto_status_t Cy_Crypto_Des_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_des_t *cryptoDesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t *keyPtr, + uint32_t *dstBlockPtr, + uint32_t *srcBlockPtr); + +cy_en_crypto_status_t Cy_Crypto_Tdes_Run(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_des_t *cryptoDesContext, + cy_en_crypto_dir_mode_t dirMode, + uint32_t *keyPtr, + uint32_t *dstBlockPtr, + uint32_t *srcBlockPtr); +#endif /* #if ((CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) */ + +#if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) +cy_en_crypto_status_t Cy_Crypto_Rsa_Proc(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_rsa_t *cryptoRsaContext, + cy_stc_crypto_rsa_pub_key_t const *pubKeyPtr, + uint32_t const *messageePtr, + uint32_t messageLength, + uint32_t const *processedMessagePtr); + +cy_en_crypto_status_t Cy_Crypto_Rsa_CalcCoefs(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_rsa_t *cryptoRsaContext, + cy_stc_crypto_rsa_pub_key_t const *pubKeyPtr); +#endif /* #if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +#if (CY_CRYPTO_USER_PKCS1_5 == 1) +cy_en_crypto_status_t Cy_Crypto_Rsa_Verify(cy_stc_crypto_context_t *cryptoContext, + cy_stc_crypto_context_rsa_ver_t *cryptoRsaVerContext, + cy_en_crypto_rsa_ver_result_t *verResult, + cy_en_crypto_sha_mode_t digestType, + uint32_t const *digestPtr, + uint32_t const *decryptedSignaturePtr, + uint32_t decryptedSignatureLength); + +void Cy_Crypto_Rsa_InvertEndianness(void *inArrPtr, uint32_t byteSize); +#endif /* #if (CY_CRYPTO_USER_PKCS1_5 == 1) */ + + +/** \} group_crypto_functions */ + + +#if defined(__cplusplus) +} +#endif + +#endif /* #if (CPUSS_CRYPTO_PRESENT == 1) */ + +#endif /* (CY_CRYPTO_H) */ + +/** \} group_crypto */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_common.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_common.h new file mode 100644 index 0000000000..2934a27a92 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_common.h @@ -0,0 +1,504 @@ +/***************************************************************************//** +* \file cy_crypto_common.h +* \version 1.0 +* +* \brief +* This file provides common constants and parameters +* for the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_CRYPTO_COMMON_H) +#define CY_CRYPTO_COMMON_H + +#include +#include "cy_device_headers.h" +#include "syslib/cy_syslib.h" +#include "cy_crypto_config.h" + +#if (CPUSS_CRYPTO_PRESENT == 1) + +/** +* \addtogroup group_crypto_macro +* \{ +*/ + +/** Driver major version */ +#define CY_CRYPTO_DRV_VERSION_MAJOR (1) + +/** Driver minor version */ +#define CY_CRYPTO_DRV_VERSION_MINOR (0) + +/** Defines Crypto_Sync blocking execution type parameter */ +#define CY_CRYPTO_SYNC_BLOCKING (true) + +/** Defines Crypto_Sync non-blocking execution type parameter */ +#define CY_CRYPTO_SYNC_NON_BLOCKING (false) + +/** Defines the Crypto DES key size (in bytes) */ +#define CY_CRYPTO_DES_KEY_SIZE (8u) + +/** Defines the Crypto TDES key size (in bytes) */ +#define CY_CRYPTO_TDES_KEY_SIZE (24u) + +/** Defines the Crypto AES block size (in bytes) */ +#define CY_CRYPTO_AES_BLOCK_SIZE (16u) + +/** Defines the Crypto AES key maximum size (in bytes) */ +#define CY_CRYPTO_AES_128_KEY_SIZE (16u) + +/** Defines the Crypto AES key maximum size (in bytes) */ +#define CY_CRYPTO_AES_192_KEY_SIZE (24u) + +/** Defines the Crypto AES key maximum size (in bytes) */ +#define CY_CRYPTO_AES_256_KEY_SIZE (32u) + +/** Defines size of the AES block, in four byte words */ +#define CY_CRYPTO_AES_BLOCK_SIZE_U32 (4UL) + +/** Defines the Crypto notify interrupt number */ +#define CY_CRYPTO_NOTIFY_INTR CY_IPC_INTR_CRYPTO_M0 + +/* Overall AES enable */ +#define CY_CRYPTO_USER_AES_ENABLE (CY_CRYPTO_USER_AES_ECB | \ + CY_CRYPTO_USER_AES_CBC | \ + CY_CRYPTO_USER_AES_CFB | \ + CY_CRYPTO_USER_AES_CTR | \ + CY_CRYPTO_USER_CMAC) + +/* Overall SHA enable */ +#define CY_CRYPTO_USER_SHA_ENABLE (CY_CRYPTO_USER_SHA1 | \ + CY_CRYPTO_USER_SHA256 | \ + CY_CRYPTO_USER_SHA512 | \ + CY_CRYPTO_USER_HMAC) + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) + +/** Hash size for the SHA1 mode, in Bytes */ +#define CY_CRYPTO_SHA1_DIGEST_SIZE (20u) +/** Hash size for the SHA224 mode, in Bytes */ +#define CY_CRYPTO_SHA224_DIGEST_SIZE (28u) +/** Hash size for the SHA256 mode, in Bytes */ +#define CY_CRYPTO_SHA256_DIGEST_SIZE (32u) +/** Hash size for the SHA384 mode, in Bytes */ +#define CY_CRYPTO_SHA384_DIGEST_SIZE (48u) +/** Hash size for the SHA512 mode, in Bytes */ +#define CY_CRYPTO_SHA512_DIGEST_SIZE (64u) +/** Hash size for the SHA512_224 mode, in Bytes */ +#define CY_CRYPTO_SHA512_224_DIGEST_SIZE (28u) +/** Hash size for the SHA512_256 mode, in Bytes */ +#define CY_CRYPTO_SHA512_256_DIGEST_SIZE (32u) + +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) */ + + +#if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) + +/** Processed message size for the RSA 1024Bit mode, in Bytes */ +#define CY_CRYPTO_RSA1024_MESSAGE_SIZE (128) +/** Processed message size for the RSA 1536Bit mode, in Bytes */ +#define CY_CRYPTO_RSA1536_MESSAGE_SIZE (192) +/** Processed message size for the RSA 2048Bit mode, in Bytes */ +#define CY_CRYPTO_RSA2048_MESSAGE_SIZE (256) + +#endif /* #if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +/** Defines the Crypto release interrupt number */ +#define CY_CRYPTO_RELEASE_INTR CY_IPC_INTR_CRYPTO_M4 + +/** Crypto Driver PDL ID */ +#define CY_CRYPTO_ID CY_PDL_DRV_ID(0x0Cu) + +/** \} group_crypto_macro */ + +/** +* \addtogroup group_crypto_data_structures +* \{ +*/ + +/** The Crypto user callback function type called at the end of Crypto calculation. */ +typedef void (*cy_crypto_callback_ptr_t)(void); + +/** The Crypto configuration structure. */ +typedef struct +{ + uint8_t cm0NotifyIntrNum; /**< Specifies the notify interrupt number for the CM0 core */ + uint8_t notifyIntrPrior; /**< Specifies the notify interrupt priority */ + uint8_t cm0ReleaseIntrNum; /**< Specifies the release interrupt number for the CM0 core */ + uint8_t releaseIntrPrior; /**< Specifies the release interrupt priority */ + uint8_t cm0CryptoErrorIntrNum; /**< Specifies the interrupt number for the Crypto error handler */ + uint8_t cryptoErrorIntrPrior; /**< Specifies the interrupt priority for the Crypto error handler */ + cy_crypto_callback_ptr_t userCompleteCallback; /**< User callback, called after Crypto HW completes calculation */ + cy_israddress userGetDataHandler; /**< User IPC process data IRQ handler */ + cy_israddress userErrorHandler; /**< User error IRQ handler */ +} cy_stc_crypto_config_t; + +#if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) +/** The structure for storing the RSA public key. */ +typedef struct +{ + uint8_t *moduloPtr; /**< The pointer to the modulus for both public and private keys. */ + uint32_t moduloLength; /**< The modulus length, in bits, maximum supported size is 2048Bit */ + uint8_t *pubExpPtr; /**< The pointer to the RSA key public exponent */ + uint32_t pubExpLength; /**< The RSA key public exponent length, in bits, maximum supported size is 256Bit */ + uint8_t *barretCoefPtr; /**< The pointer to the Barrett coefficient of size (moduloLength + 1) */ + uint8_t *inverseModuloPtr; /**< The pointer to the binary inverse of the modulo of size moduloLength */ + uint8_t *rBarPtr; /**< The pointer to the (2^moduloLength mod modulo) of size moduloLength */ +} cy_stc_crypto_rsa_pub_key_t; + +typedef enum +{ + CY_CRYPTO_RSA_VERIFY_SUCCESS = 0x00u, /**< RSA verify SUCCESS */ + CY_CRYPTO_RSA_VERIFY_FAIL = 0x01u /**< RSA verify FAILED */ +} cy_en_crypto_rsa_ver_result_t; + +#endif /* #if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +/** Structure for storing a description of a Crypto hardware error */ +typedef struct +{ + uint32_t errorStatus0; /**< Captures error description information: + for INSTR_OPC_ERROR: - violating the instruction. + for INSTR_CC_ERROR : - violating the instruction condition code. + for BUS_ERROR : - violating the transfer address. */ + + uint32_t errorStatus1; /**< [31] - Specifies if ERROR_STATUS0 and ERROR_STATUS1 capture is valid error-information. + [26..24] - The error source: + "0": INSTR_OPC_ERROR - an instruction decoder error. + "1": INSTR_CC_ERROR - an instruction condition code-error. + "2": BUS_ERROR - a bus master interface AHB-Lite bus-error. + "3": TR_AP_DETECT_ERROR. + [23..0] - Captures error description information. + For BUS_ERROR: - violating the transfer, read the attribute (DATA23[0]). + - violating the transfer, the size attribute (DATA23[5:4]). + "0": an 8-bit transfer; "1": 16 bits transfer; "2": 32-bit transfer. */ +} cy_stc_crypto_hw_error_t; + +/** \} group_crypto_data_structures */ + + +/** +* \addtogroup group_crypto_enums +* \{ +*/ + + +/** The key length options for the AES method. */ +#if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) +typedef enum +{ + CY_CRYPTO_KEY_AES_128 = 0x00u, /**< The AES key size is 128 bits */ + CY_CRYPTO_KEY_AES_192 = 0x01u, /**< The AES key size is 192 bits */ + CY_CRYPTO_KEY_AES_256 = 0x02u /**< The AES key size is 256 bits */ +} cy_en_crypto_aes_key_length_t; +#endif /* #if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) */ + +/** Defines the direction of the Crypto methods*/ +typedef enum +{ + CY_CRYPTO_ENCRYPT = 0x00u, /**< The forward mode, plain text will be encrypted into cipher text */ + CY_CRYPTO_DECRYPT = 0x01u /**< The reverse mode, cipher text will be decrypted into plain text */ +} cy_en_crypto_dir_mode_t; + +/** Define modes of SHA method */ +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) +typedef enum +{ +#if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) + CY_CRYPTO_MODE_SHA1 = 0x00u, /**< Sets the SHA1 mode */ +#endif /* #if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) + CY_CRYPTO_MODE_SHA224 = 0x11u, /**< Sets the SHA224 mode */ + CY_CRYPTO_MODE_SHA256 = 0x01u, /**< Sets the SHA256 mode */ +#endif /* #if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) + CY_CRYPTO_MODE_SHA384 = 0x12u, /**< Sets the SHA384 mode */ + CY_CRYPTO_MODE_SHA512 = 0x02u, /**< Sets the SHA512 mode */ + CY_CRYPTO_MODE_SHA512_256 = 0x22u, /**< Sets the SHA512/256 mode */ + CY_CRYPTO_MODE_SHA512_224 = 0x32u /**< Sets the SHA512/224 mode */ +#endif /* #if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) */ +} cy_en_crypto_sha_mode_t; +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) */ + +/** Errors of the Crypto block */ +typedef enum +{ + /** Operation completed successfully. */ + CY_CRYPTO_SUCCESS = 0x00u, + + /** A hardware error occurred, detailed information is in stc_crypto_hw_error_t. */ + CY_CRYPTO_HW_ERROR = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x01u, + + /** The size of input data is not multiple of 16. */ + CY_CRYPTO_SIZE_NOT_X16 = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x02u, + + /** The key for the DES method is weak. */ + CY_CRYPTO_DES_WEAK_KEY = CY_CRYPTO_ID | CY_PDL_STATUS_WARNING | 0x03u, + + /** Communication between the client-server via IPC is broken. */ + CY_CRYPTO_COMM_FAIL = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x04u, + + /** The Crypto server is not started. */ + CY_CRYPTO_SERVER_NOT_STARTED = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x06u, + + /** Communication between the client-server via IPC is broken. */ + CY_CRYPTO_SERVER_BUSY = CY_CRYPTO_ID | CY_PDL_STATUS_INFO | 0x07u, + + /** The Crypto driver is not initialized. */ + CY_CRYPTO_NOT_INITIALIZED = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x08u, + + /** The Crypto hardware is not enabled. */ + CY_CRYPTO_HW_NOT_ENABLED = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x09u, + + /** The Crypto hardware is not enabled. */ + CY_CRYPTO_NOT_SUPPORTED = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x0Au + +} cy_en_crypto_status_t; + +/** \} group_crypto_enums */ + +/** Instruction to communicate between Client and Server */ +typedef enum +{ + CY_CRYPTO_INSTR_UNKNOWN = 0x00u, + CY_CRYPTO_INSTR_ENABLE = 0x01u, + CY_CRYPTO_INSTR_DISABLE = 0x02u, + +#if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) + CY_CRYPTO_INSTR_PRNG_INIT = 0x03u, + CY_CRYPTO_INSTR_PRNG = 0x04u, +#endif /* #if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) */ + +#if ((CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) + CY_CRYPTO_INSTR_TRNG_INIT = 0x05u, + CY_CRYPTO_INSTR_TRNG = 0x06u, +#endif /* #if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_TR == 1)) */ + +#if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) + CY_CRYPTO_INSTR_AES_INIT = 0x07u, + +#if (CY_CRYPTO_USER_AES_ECB == 1) + CY_CRYPTO_INSTR_AES_ECB = 0x08u, +#endif /* #if (CRYPTO_USER_AES_ECB == 1) */ + +#if (CY_CRYPTO_USER_AES_CBC == 1) + CY_CRYPTO_INSTR_AES_CBC = 0x09u, +#endif /* #if (CRYPTO_USER_AES_CBC == 1) */ + +#if (CY_CRYPTO_USER_AES_CFB == 1) + CY_CRYPTO_INSTR_AES_CFB = 0x0Au, +#endif /* #if (CRYPTO_USER_AES_CFB == 1) */ + +#if (CY_CRYPTO_USER_AES_CTR == 1) + CY_CRYPTO_INSTR_AES_CTR = 0x0Bu, +#endif /* #if (CRYPTO_USER_AES_CTR == 1) */ + +#if (CY_CRYPTO_USER_CMAC == 1) + CY_CRYPTO_INSTR_CMAC = 0x0Cu, +#endif /* #if (CY_CRYPTO_USER_CMAC == 1) */ +#endif /* #if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) */ + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) + CY_CRYPTO_INSTR_SHA = 0x0Du, +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) */ + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) + CY_CRYPTO_INSTR_HMAC = 0x0Eu, +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) */ + +#if ((CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) + CY_CRYPTO_INSTR_MEM_CPY = 0x0Fu, + CY_CRYPTO_INSTR_MEM_SET = 0x10u, + CY_CRYPTO_INSTR_MEM_CMP = 0x11u, + CY_CRYPTO_INSTR_MEM_XOR = 0x12u, +#endif /* #if ((CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) */ + +#if ((CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) + CY_CRYPTO_INSTR_CRC_INIT = 0x13u, + CY_CRYPTO_INSTR_CRC = 0x14u, +#endif /* #if ((CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) */ + +#if ((CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) + CY_CRYPTO_INSTR_DES = 0x15u, + CY_CRYPTO_INSTR_3DES = 0x16u, +#endif /* #if ((CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) */ + +#if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) + CY_CRYPTO_INSTR_RSA_PROC = 0x17u, + CY_CRYPTO_INSTR_RSA_COEF = 0x18u, +#endif /* #if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) + CY_CRYPTO_INSTR_RSA_VER = 0x19u +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) */ + +} cy_en_crypto_comm_instr_t; + + +/** +* \addtogroup group_crypto_data_structures +* \{ +*/ + +/** Structure for storing the AES state */ +#if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) +typedef struct +{ + uint32_t *keyPtr; /**< Pointer to AES key */ + uint32_t invKey[CY_CRYPTO_AES_256_KEY_SIZE / 4u]; /**< Storage for inversed key */ + cy_en_crypto_aes_key_length_t keyLength; /**< AES key length */ + uint32_t blockIdx; /**< AES processed block index (for CMAC, SHA operations) */ +} cy_stc_crypto_aes_state_t; +#endif /* #if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) */ + +/************************************************************* +* Structures used for communication between Client and Server +***************************************************************/ + +/** Structure for storing the global context */ +typedef struct +{ + cy_en_crypto_comm_instr_t instr; /**< Server instruction code */ + cy_en_crypto_status_t resp; /**< Response from executed crypto function */ + cy_stc_crypto_hw_error_t hwErrorStatus; /**< Hardware processing errors */ + void *xdata; /**< Pointer to the crypto function specific context data */ +} cy_stc_crypto_context_t; + + +#if ((CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) +/** Structure for storing the DES context */ +typedef struct +{ + cy_en_crypto_dir_mode_t dirMode; /**< Operation direction (Encrypt / Decrypt) */ + uint32_t *keyPtr; /**< Pointer to key data */ + uint32_t *dstPtr; /**< Pointer to data destination block */ + uint32_t *srcPtr; /**< Pointer to data source block */ +} cy_stc_crypto_context_des_t; +#endif /* #if ((CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) */ + +#if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) +/** Structure for storing the AES context */ +typedef struct +{ + cy_stc_crypto_aes_state_t aesState; /**< AES state data */ + cy_en_crypto_dir_mode_t dirMode; /**< Operation direction (Encrypt / Decrypt) */ + uint32_t srcSize; /**< Operation data size */ + uint32_t *srcOffset; /**< Size of the last non-complete block (for CTR mode only) */ + uint32_t *ivPtr; /**< Initialization vector, in the CTR mode is used as nonceCounter */ + uint32_t *streamBlock; /**< AES processed block pointer (for CTR mode only) */ + uint32_t *dstPtr; /**< Pointer to data destination block */ + uint32_t *srcPtr; /**< Pointer to data source block */ +} cy_stc_crypto_context_aes_t; +#endif /* #if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) */ + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) +/** Structure for storing the SHA context */ +typedef struct +{ + uint32_t *messagePtr; /**< Pointer to data source block */ + uint32_t messageSize; /**< Operation data size */ + uint32_t *dstPtr; /**< Pointer to data destination block */ + cy_en_crypto_sha_mode_t mode; /**< SHA mode */ + uint32_t *keyPtr; /**< Pointer to key data (for HMAC only) */ + uint32_t keyLength; /**< Key data length (for HMAC only) */ +} cy_stc_crypto_context_sha_t; +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) */ + +#if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) +/** Structure for storing the PRNG context */ +typedef struct +{ + uint32_t lfsr32InitState; /**< lfsr32 initialization data */ + uint32_t lfsr31InitState; /**< lfsr31 initialization data */ + uint32_t lfsr29InitState; /**< lfsr29 initialization data */ + uint32_t max; /**< Maximum of the generated value */ + uint32_t *prngNumPtr; /**< Pointer to generated value */ +} cy_stc_crypto_context_prng_t; +#endif /* #if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) */ + +#if ((CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) +/** Structure for storing the TRNG context */ +typedef struct +{ + uint32_t GAROPol; /**< The polynomial for the programmable Galois ring oscillator (TR_GARO_CTL). + The polynomial is represented WITHOUT the high order bit (this bit is always assumed '1'). + The polynomial should be aligned so that more significant bits (bit 30 and down) + contain the polynomial and less significant bits (bit 0 and up) contain padding '0's. */ + + uint32_t FIROPol; /**< The polynomial for the programmable Fibonacci ring oscillator(TR_FIRO_CTL). + The polynomial is represented WITHOUT the high order bit (this bit is always assumed '1'). + The polynomial should be aligned so that more significant bits (bit 30 and down) + contain the polynomial and less significant bits (bit 0 and up) contain padding '0's. */ + uint32_t max; /**< Maximum of the generated value */ + uint32_t *trngNumPtr; /**< Pointer to generated value */ +} cy_stc_crypto_context_trng_t; +#endif /* #if ((CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) */ + +#if ((CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) +/** Structure for storing the STR context */ +typedef struct +{ + void const *srcPtr0; /**< Pointer to 1-st string source */ + void const *srcPtr1; /**< Pointer to 2-nd string source */ + void *dstPtr; /**< Pointer to string destination */ + uint32_t dataSize; /**< Operation data size */ + uint32_t data; /**< Operation data value (for memory setting) */ +} cy_stc_crypto_context_str_t; +#endif /* #if ((CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) */ + +#if ((CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) +/** Structure for storing the CRC context */ +typedef struct +{ + void* srcDataPtr; /**< Pointer to data source block */ + uint32_t dataSize; /**< operation data size */ + uint32_t *crcPtr; /**< Pointer to CRC destination variable */ + uint32_t polynomial; /**< Polynomial for CRC calculate */ + uint32_t lfsrInitState; /**< CRC calculation initial value */ + uint32_t dataReverse; /**< Input data reverse flag */ + uint32_t dataXor; /**< Input data XOR flag */ + uint32_t remReverse; /**< Output data reverse flag */ + uint32_t remXor; /**< Output data XOR flag */ +} cy_stc_crypto_context_crc_t; +#endif /* #if ((CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) */ + +#if (CY_CRYPTO_USER_PKCS1_5 == 1) +/** Structure for storing the RSA verify context */ +typedef struct +{ + cy_en_crypto_rsa_ver_result_t *verResult; /**< Pointer to verification result /ref cy_en_crypto_rsa_ver_result_t */ + cy_en_crypto_sha_mode_t digestType; /**< SHA digess type, used with SHA calculation of the message */ + uint32_t const *hashPtr; /**< SHA digest of the message, calculated with digestType */ + uint32_t const *decryptedSignaturePtr; /**< Previously decrypted RSA signature */ + uint32_t decryptedSignatureLength; /**< Length of the decrypted RSA signature */ +} cy_stc_crypto_context_rsa_ver_t; +#endif /* #if (CY_CRYPTO_USER_PKCS1_5 == 1) */ + +#if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) +/** Structure for storing the RSA process context */ +typedef struct +{ + cy_stc_crypto_rsa_pub_key_t *keyPtr; /**< Pointer to key data */ + uint32_t const *messagePtr; /**< Pointer to data source block */ + uint32_t messageLength; /**< Operation data size */ + uint32_t const *resultPtr; /**< Pointer to data destination block */ +} cy_stc_crypto_context_rsa_t; +#endif /* #if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +/** \} group_crypto_data_structures */ + + +#endif /* (CPUSS_CRYPTO_PRESENT == 1) */ + +#endif /* #if !defined(CY_CRYPTO_COMMON_H) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_aes.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_aes.c new file mode 100644 index 0000000000..86d13fe225 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_aes.c @@ -0,0 +1,405 @@ +/***************************************************************************//** +* \file cy_crypto_core_aes.c +* \version 1.0 +* +* \brief +* This file provides the source code fro the API for the AES method +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_aes.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_str.h" +#include "syslib/cy_syslib.h" +#include + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Aes_InvKey +****************************************************************************//** +* +* Calculates an inverse block cipher key from the block cipher key. +* +* This function available for CM0+ core only. +* +* \param cryptoAesContext +* The pointer to the stc_crypto_context_t structure which stores all internal variables +* the Crypto driver requires. +* +*******************************************************************************/ +void Cy_Crypto_Core_Aes_InvKey(cy_stc_crypto_aes_state_t const *aesStatePtr) +{ + /* Issue the AES_KEY instruction to prepare the key for decrypt operation */ + Cy_Crypto_SetReg2Instr((uint32_t)aesStatePtr->keyPtr, (uint32_t)aesStatePtr->invKey); + + Cy_Crypto_Run2ParamInstr(CY_CRYPTO_AES_KEY_OPC, + CY_CRYPTO_RSRC0_SHIFT, + CY_CRYPTO_RSRC8_SHIFT); + + /* Wait until the AES instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_AES_BUSY, CRYPTO->STATUS)) + { + } +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Aes_Init +****************************************************************************//** +* +* Sets Aes mode and prepare inversed key. +* +* This function available for CM0+ core only. +* +* \param cryptoAesContext +* The pointer to the stc_crypto_context_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Aes_Init(cy_stc_crypto_context_aes_t const *cryptoAesContext) +{ + /* Set the key mode: 128, 192 or 256 Bit */ + CRYPTO->AES_CTL = (uint32_t)(_VAL2FLD(CRYPTO_AES_CTL_KEY_SIZE, + (uint32_t)(cryptoAesContext->aesState.keyLength))); + + Cy_Crypto_Core_Aes_InvKey(&(cryptoAesContext->aesState)); + + return (CY_CRYPTO_SUCCESS); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Aes_ProcessBlock +****************************************************************************//** +* +* Performs the AES block cipher. +* +* This function available for CM0+ core only. +* +* \param aesStatePtr +* The pointer to the aesStatePtr structure which stores the AES context. +* +* \param dirMode +* One of CRYPTO_ENCRYPT or CRYPTO_DECRYPT. +* +* \param dstBlockPtr +* The pointer to the cipher text. +* +* \param srcBlockPtr +* The pointer to the plain text. Must be 4-Byte aligned! +* +*******************************************************************************/ +void Cy_Crypto_Core_Aes_ProcessBlock(cy_stc_crypto_aes_state_t const *aesStatePtr, + cy_en_crypto_dir_mode_t dirMode, + uint32_t *dstBlockPtr, + uint32_t const *srcBlockPtr) +{ + Cy_Crypto_SetReg3Instr((CY_CRYPTO_DECRYPT == dirMode) ? (uint32_t)aesStatePtr->invKey : (uint32_t)aesStatePtr->keyPtr, + (uint32_t)srcBlockPtr, + (uint32_t)dstBlockPtr); + + Cy_Crypto_Run3ParamInstr((CY_CRYPTO_DECRYPT == dirMode) ? CY_CRYPTO_AES_BLOCK_INV_OPC : CY_CRYPTO_AES_BLOCK_OPC, + CY_CRYPTO_RSRC0_SHIFT, + CY_CRYPTO_RSRC4_SHIFT, + CY_CRYPTO_RSRC12_SHIFT); + + /* Wait until the AES instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_AES_BUSY, CRYPTO->STATUS)) + { + } +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Aes_Xor +****************************************************************************//** +* +* Perform the XOR of two 16-Byte memory structures. +* All addresses must be 4-Byte aligned! +* +* This function available for CM0+ core only. +* +* \param src0BlockPtr +* The pointer to the first memory structure. Must be 4-Byte aligned! +* +* \param src1BlockPtr +* The pointer to the second memory structure. Must be 4-Byte aligned! +* +* \param dstBlockPtr +* The pointer to the memory structure with the XOR results. +* +*******************************************************************************/ +void Cy_Crypto_Core_Aes_Xor(uint32_t const *src0BlockPtr, + uint32_t const *src1BlockPtr, + uint32_t *dstBlockPtr) +{ + Cy_Crypto_SetReg3Instr((uint32_t)src0BlockPtr, + (uint32_t)src1BlockPtr, + (uint32_t)dstBlockPtr); + + /* Issue the AES_XOR instruction */ + Cy_Crypto_Run3ParamInstr(CY_CRYPTO_AES_XOR_OPC, + CY_CRYPTO_RSRC0_SHIFT, + CY_CRYPTO_RSRC4_SHIFT, + CY_CRYPTO_RSRC8_SHIFT); + + /* Wait until the AES instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_AES_BUSY, CRYPTO->STATUS)) + { + } +} + +#if (CY_CRYPTO_USER_AES_ECB == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Aes_Ecb +****************************************************************************//** +* +* Performs AES operation on one Block. +* +* This function available for CM0+ core only. +* +* \param cryptoAesContext +* The pointer to the stc_crypto_context_t structure which stores +* Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Aes_Ecb(cy_stc_crypto_context_aes_t *cryptoAesContext) +{ + cy_stc_crypto_aes_state_t aesStateTmp = cryptoAesContext->aesState; + cy_en_crypto_dir_mode_t dirModeTmp = (cy_en_crypto_dir_mode_t)(cryptoAesContext->dirMode); + + Cy_Crypto_Core_Aes_ProcessBlock(&aesStateTmp, + dirModeTmp, + cryptoAesContext->dstPtr, + cryptoAesContext->srcPtr); + + return (CY_CRYPTO_SUCCESS); +} +#endif /* #if (CY_CRYPTO_USER_AES_ECB == 1) */ + +#if (CY_CRYPTO_USER_AES_CBC == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Aes_Cbc +****************************************************************************//** +* +* Performs AES operation on a plain text with Cipher Block Chaining (CBC). +* +* This function available for CM0+ core only. +* +* \param cryptoAesContext +* The pointer to stc_crypto_context_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Aes_Cbc(cy_stc_crypto_context_aes_t *cryptoAesContext) +{ + uint32_t size = (uint32_t)cryptoAesContext->srcSize; + uint32_t *dstPtrTmp = (uint32_t*)cryptoAesContext->dstPtr; + uint32_t *srcPtrTmp = (uint32_t*)cryptoAesContext->srcPtr; + cy_en_crypto_dir_mode_t dirModeTmp = cryptoAesContext->dirMode; + uint32_t *tempBuffPtr = (uint32_t*)CRYPTO->MEM_BUFF; + cy_en_crypto_status_t result; + + /* Check whether the data size is multiple of 16 */ + if (0uL != (uint32_t)(size & (CY_CRYPTO_AES_BLOCK_SIZE - 1u))) + { + result = CY_CRYPTO_SIZE_NOT_X16; + } + else + { + /* Copy the Initialization Vector to the local buffer because it changes during calculation */ + memcpy(tempBuffPtr, cryptoAesContext->ivPtr, CY_CRYPTO_AES_BLOCK_SIZE); + + if (CY_CRYPTO_DECRYPT == dirModeTmp) + { + while (size > 0uL) + { + Cy_Crypto_Core_Aes_ProcessBlock(&(cryptoAesContext->aesState), + dirModeTmp, + dstPtrTmp, + srcPtrTmp); + + Cy_Crypto_Core_Aes_Xor(tempBuffPtr, dstPtrTmp, dstPtrTmp); + + memcpy(tempBuffPtr, srcPtrTmp, CY_CRYPTO_AES_BLOCK_SIZE); + + srcPtrTmp += CY_CRYPTO_AES_BLOCK_SIZE_U32; + dstPtrTmp += CY_CRYPTO_AES_BLOCK_SIZE_U32; + size -= CY_CRYPTO_AES_BLOCK_SIZE; + } + } + else + { + while (size > 0uL) + { + Cy_Crypto_Core_Aes_Xor(srcPtrTmp, tempBuffPtr, tempBuffPtr); + + Cy_Crypto_Core_Aes_ProcessBlock(&(cryptoAesContext->aesState), + dirModeTmp, + dstPtrTmp, + tempBuffPtr); + + memcpy(tempBuffPtr, dstPtrTmp, CY_CRYPTO_AES_BLOCK_SIZE); + + srcPtrTmp += CY_CRYPTO_AES_BLOCK_SIZE_U32; + dstPtrTmp += CY_CRYPTO_AES_BLOCK_SIZE_U32; + size -= CY_CRYPTO_AES_BLOCK_SIZE; + } + } + + result = CY_CRYPTO_SUCCESS; + } + + return (result); +} +#endif /* #if (CY_CRYPTO_USER_AES_CBC == 1) */ + +#if (CY_CRYPTO_USER_AES_CFB == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Aes_Cfb +******************************************************************************** +* +* Performs AES operation on a plain text with the Cipher Feedback Block method (CFB). +* +* This function available for CM0+ core only. +* +* \param cryptoAesContext +* The pointer to the stc_crypto_context_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Aes_Cfb(cy_stc_crypto_context_aes_t *cryptoAesContext) +{ + uint32_t size = (uint32_t)cryptoAesContext->srcSize; + uint32_t *tempIvPtr = (uint32_t*)CRYPTO->MEM_BUFF; + uint32_t *dstPtrTmp = (uint32_t*)cryptoAesContext->dstPtr; + uint32_t *srcPtrTmp = (uint32_t*)cryptoAesContext->srcPtr; + uint32_t *tempBuffPtr = (uint32_t*)dstPtrTmp; + cy_en_crypto_status_t result; + + /* Check whether the data size is multiple of 16 */ + if (0uL != (size & (CY_CRYPTO_AES_BLOCK_SIZE - 1u))) + { + result = CY_CRYPTO_SIZE_NOT_X16; + } + else + { + /* Copy the Initialization Vector to local buffer because it is changing during calculation */ + memcpy(tempIvPtr, cryptoAesContext->ivPtr, CY_CRYPTO_AES_BLOCK_SIZE); + + if (CY_CRYPTO_DECRYPT == cryptoAesContext->dirMode) + { + tempBuffPtr = srcPtrTmp; + } + + while (size > 0uL) + { + /* In this mode, (CFB) is always an encryption! */ + Cy_Crypto_Core_Aes_ProcessBlock(&(cryptoAesContext->aesState), + CY_CRYPTO_ENCRYPT, + dstPtrTmp, + tempIvPtr); + + Cy_Crypto_Core_Aes_Xor(srcPtrTmp, dstPtrTmp, dstPtrTmp); + + memcpy(tempIvPtr, tempBuffPtr, CY_CRYPTO_AES_BLOCK_SIZE); + + srcPtrTmp += CY_CRYPTO_AES_BLOCK_SIZE_U32; + dstPtrTmp += CY_CRYPTO_AES_BLOCK_SIZE_U32; + tempBuffPtr += CY_CRYPTO_AES_BLOCK_SIZE_U32; + size -= CY_CRYPTO_AES_BLOCK_SIZE; + } + + result = CY_CRYPTO_SUCCESS; + } + + return (result); +} +#endif /* #if (CY_CRYPTO_USER_AES_CFB == 1) */ + +#if (CY_CRYPTO_USER_AES_CTR == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Aes_Ctr +******************************************************************************** +* +* Performs AES operation on a plain text using the counter method (CTR). +* +* This function available for CM0+ core only. +* +* \param cryptoAesContext +* The pointer to the stc_crypto_context_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Aes_Ctr(cy_stc_crypto_context_aes_t *cryptoAesContext) +{ + uint32_t *dstPtrTmp = (uint32_t*)cryptoAesContext->dstPtr; + uint32_t *srcPtrTmp = (uint32_t*)cryptoAesContext->srcPtr; + uint32_t size = (uint32_t)cryptoAesContext->srcSize; + uint32_t *streamBlockTmp = (uint32_t*)cryptoAesContext->streamBlock; + uint32_t *nonceCounter = (uint32_t*)cryptoAesContext->ivPtr; + uint32_t cnt; + uint32_t i; + uint64_t counter; + + cnt = (uint32_t)(size / CY_CRYPTO_AES_BLOCK_SIZE); + + for (i = 0uL; i < cnt; i++) + { + /* In this mode, (CTR) is always an encryption! */ + Cy_Crypto_Core_Aes_ProcessBlock(&(cryptoAesContext->aesState), + CY_CRYPTO_ENCRYPT, + streamBlockTmp, + nonceCounter); + + /* Increment the nonce counter, at least 64Bits (from 128) is the counter part */ + counter = *(uint64_t*)(nonceCounter + CY_CRYPTO_AES_CTR_CNT_POS); + counter = Cy_Crypto_InvertEndian8(counter); + counter++; + counter = Cy_Crypto_InvertEndian8(counter); + *(uint64_t*)(nonceCounter + CY_CRYPTO_AES_CTR_CNT_POS) = counter; + + Cy_Crypto_Core_Aes_Xor(srcPtrTmp, + streamBlockTmp, + dstPtrTmp); + + srcPtrTmp += CY_CRYPTO_AES_BLOCK_SIZE_U32; + dstPtrTmp += CY_CRYPTO_AES_BLOCK_SIZE_U32; + } + + /* Save the reminder of the last non-complete block */ + *cryptoAesContext->srcOffset = (uint32_t)(size % CY_CRYPTO_AES_BLOCK_SIZE); + + return (CY_CRYPTO_SUCCESS); +} +#endif /* #if (CY_CRYPTO_USER_AES_CTR == 1) */ + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_aes.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_aes.h new file mode 100644 index 0000000000..2514192aba --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_aes.h @@ -0,0 +1,77 @@ +/***************************************************************************//** +* \file cy_crypto_core_aes.h +* \version 1.0 +* +* \brief +* This file provides constant and parameters for the API for the AES method +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_CRYPTO_CORE_AES_H) +#define CY_CRYPTO_CORE_AES_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) + + +#define CY_CRYPTO_AES_CTR_CNT_POS (0x02u) + +void Cy_Crypto_Core_Aes_InvKey(cy_stc_crypto_aes_state_t const *aesStatePtr); + +void Cy_Crypto_Core_Aes_ProcessBlock(cy_stc_crypto_aes_state_t const *aesStatePtr, + cy_en_crypto_dir_mode_t dirMode, + uint32_t *dstBlockPtr, + uint32_t const *srcBlockPtr); + +void Cy_Crypto_Core_Aes_Xor(uint32_t const *src0BlockPtr, + uint32_t const *src1BlockPtr, + uint32_t *dstBlockPtr); + +cy_en_crypto_status_t Cy_Crypto_Core_Aes_Init(cy_stc_crypto_context_aes_t const *cryptoContextPtr); + +#if (CY_CRYPTO_USER_AES_ECB == 1) +cy_en_crypto_status_t Cy_Crypto_Core_Aes_Ecb(cy_stc_crypto_context_aes_t *cryptoContextPtr); +#endif /* #if (CY_CRYPTO_USER_AES_ECB == 1) */ + +#if (CY_CRYPTO_USER_AES_CBC == 1) +cy_en_crypto_status_t Cy_Crypto_Core_Aes_Cbc(cy_stc_crypto_context_aes_t *cryptoContextPtr); +#endif /* #if (CY_CRYPTO_USER_AES_CBC == 1) */ + +#if (CY_CRYPTO_USER_AES_CFB == 1) +cy_en_crypto_status_t Cy_Crypto_Core_Aes_Cfb(cy_stc_crypto_context_aes_t *cryptoContextPtr); +#endif /* #if (CY_CRYPTO_USER_AES_CFB == 1) */ + +#if (CY_CRYPTO_USER_AES_CTR == 1) +cy_en_crypto_status_t Cy_Crypto_Core_Aes_Ctr(cy_stc_crypto_context_aes_t *cryptoContextPtr); +#endif /* #if (CY_CRYPTO_USER_AES_CTE == 1) */ + +__STATIC_INLINE void Cy_Crypto_Core_Aes_WaitReady(void) +{ + /* Wait until the TRNG instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_AES_BUSY, CRYPTO->STATUS)) + { + } +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_AES_H) */ + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_cmac.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_cmac.c new file mode 100644 index 0000000000..9fae4cd10b --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_cmac.c @@ -0,0 +1,272 @@ +/***************************************************************************//** +* \file cy_crypto_core_cmac.c +* \version 1.0 +* +* \brief +* This file provides the source code to the API for the CMAC method +* in the Crypto block driver. +* +* Implementation is done in accordance with: +* http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38b.pdf +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_core_cmac.h" +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_aes.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_str.h" +#include "syslib/cy_syslib.h" +#include + + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_CMAC == 1)) + + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Cmac_CalcSubKey +****************************************************************************//** +* +* Calculates the sub-key for the CMAC algorithm +* according to the NIST publication 800-38B, page 7. +* +* This function available for CM0+ core only. +* +* \param srcDstPtr +* The pointer to the source data for sub-key calculation, see 800-38B. +* +*******************************************************************************/ +static void Cy_Crypto_Core_Cmac_CalcSubKey(uint8_t *srcDstPtr) +{ + int32_t i; + uint32_t c; + uint32_t msb = 0uL; + + for (i = 15; i >= 0; i--) + { + c = (uint32_t)srcDstPtr[i]; + c = (c << 1) | msb; + srcDstPtr[i] = (uint8_t) c; + msb = (c >> 8u) & 1uL; + } + + if (0uL != msb) + { + /* Just one byte is valuable, the rest are zeros */ + srcDstPtr[(uint8_t)(CY_CRYPTO_AES_BLOCK_SIZE - 1u)] ^= CY_CRYPTO_CMAC_RB; + } +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Cmac_Init +****************************************************************************//** +* +* The function for initialization of CMAC operation. +* +* This function available for CM0+ core only. +* +* \param cmacStatePtr +* The pointer to the structure which stores the CMAC context. +* +* \param tempPtr +* The pointer to the temporary memory needed for CMAC calculation, +* the max needed - 128 Bytes. +* +* \param blockPtr +* The pointer to the temporary storage for block, the max needed - 128 Bytes. +* +* \param kPtr +* The pointer to the sub-key. + +*******************************************************************************/ +void Cy_Crypto_Core_Cmac_Init(cy_stc_crypto_cmac_state_t* cmacStatePtr, + uint32_t* tempPtr, + uint32_t* blockPtr, + uint32_t* kPtr) +{ + cmacStatePtr->blockPtr = blockPtr; + cmacStatePtr->tempPtr = tempPtr; + cmacStatePtr->kPtr = kPtr; +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Cmac_Start +****************************************************************************//** +* +* Starts CMAC calculation. +* +* This function available for CM0+ core only. +* +* \param aesStatePtr +* The pointer to the structure which stores the AES context. +* +* \param cmacStatePtr +* the pointer to the structure which stores the CMAC context. +* +*******************************************************************************/ +void Cy_Crypto_Core_Cmac_Start(cy_stc_crypto_aes_state_t *aesStatePtr, + cy_stc_crypto_cmac_state_t *cmacStatePtr) +{ + uint32_t *kPtrTmp = cmacStatePtr->kPtr; + uint32_t *tempPtrTmp = cmacStatePtr->tempPtr; + + /* Calculate the K1 sub-key */ + memset((void*)tempPtrTmp, 0u, CY_CRYPTO_AES_BLOCK_SIZE); + Cy_Crypto_Core_Aes_ProcessBlock(aesStatePtr, CY_CRYPTO_ENCRYPT, kPtrTmp, tempPtrTmp); + + Cy_Crypto_Core_Cmac_CalcSubKey((uint8_t*)kPtrTmp); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Cmac_Update +****************************************************************************//** +* +* Calculates CMAC on a message. +* +* This function available for CM0+ core only. +* +* \param aesStatePtr +* The pointer to the structure which stores the AES context. +* +* \param cmacStatePtr +* The pointer to the structure which stores the CMAC context. +* +* \param messagePtr +* The pointer to the message whose CMAC is being computed. +* +* \param messageSize +* The size of the message whose CMAC is being computed. +* +*******************************************************************************/ +void Cy_Crypto_Core_Cmac_Update(cy_stc_crypto_aes_state_t *aesStatePtr, + cy_stc_crypto_cmac_state_t *cmacStatePtr, + uint32_t *messagePtr, + uint32_t messageSize) +{ + uint32_t *blockPtrTmp = cmacStatePtr->blockPtr; + uint32_t *tempPtrTmp = cmacStatePtr->tempPtr; + + /* Clear the argument for XOR for the first block */ + memset((void* )tempPtrTmp, 0x00u, CY_CRYPTO_AES_BLOCK_SIZE); + + /* Process all blocks except last */ + while (messageSize > CY_CRYPTO_AES_BLOCK_SIZE) + { + Cy_Crypto_Core_Aes_Xor(messagePtr, tempPtrTmp, blockPtrTmp); + Cy_Crypto_Core_Aes_ProcessBlock(aesStatePtr, CY_CRYPTO_ENCRYPT, tempPtrTmp, blockPtrTmp); + + /* Attention! 4 because the pointer is uint32_t */ + messagePtr += 4u; + messageSize -= 16u; + } + + /* The calculation size of the last block */ + aesStatePtr->blockIdx = messageSize; + + /* Copy the last block to the blockPtr */ + memcpy((void*)blockPtrTmp, (void*)messagePtr, (uint16_t)aesStatePtr->blockIdx); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Cmac_Finish +****************************************************************************//** +* +* Completes CMAC calculation. +* +* This function available for CM0+ core only. +* +* \param aesStatePtr +* the pointer to the structure which stores the AES context. +* +* \param cmacStatePtr +* The pointer to the structure which stores the CMAC context. +* +* \param cmacPtr +* The pointer to the computed CMAC value. +* +*******************************************************************************/ +void Cy_Crypto_Core_Cmac_Finish(cy_stc_crypto_aes_state_t *aesStatePtr, + cy_stc_crypto_cmac_state_t *cmacStatePtr, + uint32_t* cmacPtr) +{ + uint32_t *blockPtrTmp = cmacStatePtr->blockPtr; + uint32_t *tempPtrTmp = cmacStatePtr->tempPtr; + uint32_t *kPtrTmp = cmacStatePtr->kPtr; + uint32_t blockIdxTmp = aesStatePtr->blockIdx; + uint32_t copySize; + + if (blockIdxTmp < CY_CRYPTO_AES_BLOCK_SIZE) + { + /* Calculate the K2 sub-key */ + Cy_Crypto_Core_Cmac_CalcSubKey((uint8_t* )kPtrTmp); + + /* Appended '1' bit to the end of message, followed by '0' */ + *((uint8_t* )blockPtrTmp + blockIdxTmp) = 0x80u; + + /* Write zeros into the rest of the message */ + copySize = CY_CRYPTO_AES_BLOCK_SIZE - 1u - blockIdxTmp; + memset(((uint8_t* )blockPtrTmp + blockIdxTmp + 1), 0x00u, (uint16_t)copySize); + } + + Cy_Crypto_Core_Aes_Xor(blockPtrTmp, tempPtrTmp, blockPtrTmp); + Cy_Crypto_Core_Aes_Xor(blockPtrTmp, kPtrTmp, blockPtrTmp); + + Cy_Crypto_Core_Aes_ProcessBlock(aesStatePtr, CY_CRYPTO_ENCRYPT, cmacPtr, blockPtrTmp); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Cmac +****************************************************************************//** +* +* Performs CMAC(Cipher-based Message Authentication Code) operation +* on a message to produce message authentication code using AES. +* +* This function available for CM0+ core only. +* +* \param cryptoAesContext +* The pointer to the stc_crypto_context_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Cmac(cy_stc_crypto_context_aes_t *cryptoAesContext) +{ + uint32_t *resultPtr = (uint32_t*)cryptoAesContext->dstPtr; + uint32_t *messagePtr = (uint32_t*)cryptoAesContext->srcPtr; + uint32_t messageSize = (uint32_t)cryptoAesContext->srcSize; + + cy_stc_crypto_aes_state_t *aesStatePtr = &cryptoAesContext->aesState; + + uint32_t *blockPtr = (uint32_t*)CRYPTO->MEM_BUFF; + uint32_t *tempPtr = (uint32_t*)((uint8_t*)blockPtr + CY_CRYPTO_AES_BLOCK_SIZE); + uint32_t *kPtr = (uint32_t*)((uint8_t*)tempPtr + CY_CRYPTO_AES_BLOCK_SIZE); + + cy_stc_crypto_cmac_state_t *cmacStatePtr = (cy_stc_crypto_cmac_state_t* )((uint8_t*)kPtr + CY_CRYPTO_AES_BLOCK_SIZE); + + (void)Cy_Crypto_Core_Aes_Init(cryptoAesContext); + + Cy_Crypto_Core_Cmac_Init (cmacStatePtr, tempPtr, blockPtr, kPtr); + Cy_Crypto_Core_Cmac_Start (aesStatePtr, cmacStatePtr); + Cy_Crypto_Core_Cmac_Update(aesStatePtr, cmacStatePtr, messagePtr, messageSize); + Cy_Crypto_Core_Cmac_Finish(aesStatePtr, cmacStatePtr, resultPtr); + + return (CY_CRYPTO_SUCCESS); +} + + +#endif /* ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_CMAC == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_cmac.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_cmac.h new file mode 100644 index 0000000000..3a0c06ef2b --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_cmac.h @@ -0,0 +1,72 @@ +/***************************************************************************//** +* \file cy_crypto_core_cmac.h +* \version 1.0 +* +* \brief +* This file provides constants and function prototypes +* for the API for the CMAC method in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CORE_CMAC_H) +#define CY_CRYPTO_CORE_CMAC_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_CMAC == 1)) + +/** \cond INTERNAL */ + +/* The bit string used to generate sub-keys */ +#define CY_CRYPTO_CMAC_RB (0x87u) + +/* The structure to store the AES-CMAC context */ +typedef struct +{ + uint32_t *blockPtr; + uint32_t *kPtr; + uint32_t *tempPtr; +} cy_stc_crypto_cmac_state_t; + + +/* The function prototypes */ +uint32_t Cy_Crypto_Core_Cmac_LeftShift(uint8_t *srcDstPtr); + +void Cy_Crypto_Core_Cmac_Init(cy_stc_crypto_cmac_state_t *cmacStatePtr, + uint32_t *tempPtr, + uint32_t *blockPtr, + uint32_t *kPtr); + +void Cy_Crypto_Core_Cmac_Start(cy_stc_crypto_aes_state_t *aesStatePtr, + cy_stc_crypto_cmac_state_t *cmacStatePtr); + +void Cy_Crypto_Core_Cmac_Update(cy_stc_crypto_aes_state_t *aesStatePtr, + cy_stc_crypto_cmac_state_t *cmacStatePtr, + uint32_t *messagePtr, + uint32_t messageSize); + +void Cy_Crypto_Core_Cmac_Finish(cy_stc_crypto_aes_state_t *aesStatePtr, + cy_stc_crypto_cmac_state_t *cmacStatePtr, + uint32_t* cmacPtr); + +cy_en_crypto_status_t Cy_Crypto_Core_Cmac(cy_stc_crypto_context_aes_t *cryptoAesContext); + +/** \endcond */ + + +#endif /* ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_CMAC == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_CMAC_H) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_crc.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_crc.c new file mode 100644 index 0000000000..acd6034f9d --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_crc.c @@ -0,0 +1,117 @@ +/***************************************************************************//** +* \file cy_crypto_core_crc.c +* \version 1.0 +* +* \brief +* This file provides the source code for CRC API +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_crc.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "syslib/cy_syslib.h" + + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) + + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Crc_Init +****************************************************************************//** +* +* Initializes CRC calculation. +* +* This function available for CM0+ core only. +* +* \param cryptoCrcContext +* The pointer to the stc_crypto_context_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Crc_Init(cy_stc_crypto_context_crc_t *cryptoCrcContext) +{ + + /* Specifies the bit order in which a data Byte is processed + * (reversal is performed after XORing): + * '0': Most significant bit (bit 1) first. + * '1': Least significant bit (bit 0) first. */ + CRYPTO->CRC_CTL = (uint32_t)( (_VAL2FLD(CRYPTO_CRC_CTL_DATA_REVERSE, (uint32_t)(cryptoCrcContext->dataReverse))) | + (_VAL2FLD(CRYPTO_CRC_CTL_REM_REVERSE, (uint32_t)(cryptoCrcContext->remReverse))) ); + + /* Specifies a byte mask with which each data byte is XORed. + * The XOR is performed before data reversal. */ + CRYPTO->CRC_DATA_CTL = (uint32_t)(_VAL2FLD(CRYPTO_CRC_DATA_CTL_DATA_XOR, (uint32_t)cryptoCrcContext->dataXor)); + + /* CRC polynomial. The polynomial is represented WITHOUT the high order bit + * (this bit is always assumed '1'). */ + CRYPTO->CRC_POL_CTL = (uint32_t)(_VAL2FLD(CRYPTO_CRC_POL_CTL_POLYNOMIAL, (uint32_t)cryptoCrcContext->polynomial)); + + /*Specifies a mask with which the CRC_LFSR_CTL.LFSR32 register is XORed to produce a remainder. + * The XOR is performed before remainder reversal. */ + CRYPTO->CRC_REM_CTL = (uint32_t)(_VAL2FLD(CRYPTO_CRC_REM_CTL_REM_XOR, (uint32_t)cryptoCrcContext->remXor)); + + return (CY_CRYPTO_SUCCESS); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_Crc +****************************************************************************//** +* +* Performs CRC calculation on a message. +* +* This function available for CM0+ core only. +* +* \param cryptoCrcContext +* The pointer to the stc_crypto_context_t structure which stores +* vCrypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Crc(cy_stc_crypto_context_crc_t *cryptoCrcContext) +{ + + /* A state of 32-bit Linear Feedback Shift Registers (LFSR) used to implement CRC. */ + CRYPTO->CRC_LFSR_CTL = (uint32_t)(_VAL2FLD(CRYPTO_CRC_LFSR_CTL_LFSR32, (uint32_t)cryptoCrcContext->lfsrInitState)); + + /* Fill the FIFO with the instruction parameters */ + Cy_Crypto_SetReg2Instr( (uint32_t)cryptoCrcContext->srcDataPtr, + (uint32_t)cryptoCrcContext->dataSize ); + + /* Issue the CRC instruction */ + Cy_Crypto_Run2ParamInstr(CY_CRYPTO_CRC_OPC, + CY_CRYPTO_RSRC0_SHIFT, + CY_CRYPTO_RSRC4_SHIFT); + + /* Wait until STR instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_CRC_BUSY, CRYPTO->STATUS)) + { + } + + /* Copy the result from the CRC_REM_RESULT register */ + *cryptoCrcContext->crcPtr = (uint32_t)_FLD2VAL(CRYPTO_CRC_REM_RESULT_REM, CRYPTO->CRC_REM_RESULT); + + return (CY_CRYPTO_SUCCESS); +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_crc.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_crc.h new file mode 100644 index 0000000000..222e22a5d5 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_crc.h @@ -0,0 +1,41 @@ +/***************************************************************************//** +* \file cy_crypto_core_crc.h +* \version 1.0 +* +* \brief +* This file provides the headers for CRC API +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CORE_CRC_H) +#define CY_CRYPTO_CORE_CRC_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) + + +cy_en_crypto_status_t Cy_Crypto_Core_Crc_Init (cy_stc_crypto_context_crc_t *cryptoCrcContext); + +cy_en_crypto_status_t Cy_Crypto_Core_Crc (cy_stc_crypto_context_crc_t *cryptoCrcContext); + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_CRC_H) */ + + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_des.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_des.c new file mode 100644 index 0000000000..4fd12ee002 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_des.c @@ -0,0 +1,208 @@ +/***************************************************************************//** +* \file cy_crypto_core_des.c +* \version 1.0 +* +* \brief +* This file provides the source code fro the API for the DES method +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_des.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_str.h" +#include "syslib/cy_syslib.h" +#include + + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) + + +uint8_t const cy_desCommands[2][2] = { + { CY_CRYPTO_DES_BLOCK_OPC, CY_CRYPTO_DES_BLOCK_INV_OPC }, /* DES mode */ + { CY_CRYPTO_TDES_BLOCK_OPC, CY_CRYPTO_TDES_BLOCK_INV_OPC } /* TDES mode */ +}; + +/* Table with DES weak keys */ +CY_ALIGN(4) uint8_t const cy_desWeakKeys[CY_CRYPTO_DES_WEAK_KEY_COUNT][CY_CRYPTO_DES_KEY_BYTE_LENGTH] = +{ + { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE }, + { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E }, + { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 }, + + { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E }, + { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 }, + { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 }, + { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 }, + { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE }, + { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 }, + { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 }, + { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E }, + { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE }, + { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E }, + { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE }, + { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 } +}; + + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Des_ProcessBlock +****************************************************************************//** +* +* Performs the DES or TDES block cipher. +* All addresses must be 4Byte aligned, +* srcBlock could overlap dstBlock. +* +* This function available for CM0+ core only. +* +* \param dirMode +* One of CRYPTO_ENCRYPT or CRYPTO_DECRYPT. +* +* \param keyPtr +* The pointer to the encryption/decryption key. +* +* \param dstBlockPtr +* The pointer to the cipher text. +* +* \param srcBlockPtr +* The pointer to the plain text. Must be 4-Byte aligned! +* +*******************************************************************************/ +void Cy_Crypto_Core_Des_ProcessBlock(cy_en_crypto_des_mode_t desMode, + cy_en_crypto_dir_mode_t dirMode, + uint32_t const *keyPtr, + uint32_t *dstBlockPtr, + uint32_t const *srcBlockPtr) +{ + Cy_Crypto_SetReg3Instr((uint32_t)keyPtr, + (uint32_t)srcBlockPtr, + (uint32_t)dstBlockPtr); + + /* Issue the DES_BLOCK instruction */ + Cy_Crypto_Run3ParamInstr(cy_desCommands[(uint8_t)desMode][(uint8_t)dirMode], + CY_CRYPTO_RSRC0_SHIFT, + CY_CRYPTO_RSRC4_SHIFT, + CY_CRYPTO_RSRC8_SHIFT); + + /* Wait until the AES instruction is complete */ + while (0uL != _FLD2VAL(CRYPTO_STATUS_DES_BUSY, CRYPTO->STATUS)) + { + } +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Des +****************************************************************************//** +* +* Performs DES operation on a Single Block. All addresses must be 4-Byte aligned. +* Ciphertext (dstBlockPtr) may overlap with plaintext (srcBlockPtr) +* This function is independent from the previous Crypto state. +* +* This function available for CM0+ core only. +* +* \param cryptoDesContext +* The pointer to the cy_stc_crypto_context_des_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Des(cy_stc_crypto_context_des_t *cryptoDesContext) +{ + uint32_t i; + cy_en_crypto_status_t status = CY_CRYPTO_SUCCESS; + + /* Check weak keys */ + for (i = 0; i < CY_CRYPTO_DES_WEAK_KEY_COUNT; i++) + { + if (memcmp(cryptoDesContext->keyPtr, (uint8_t*)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0) + { + status = CY_CRYPTO_DES_WEAK_KEY; + break; + } + } + + Cy_Crypto_Core_Des_ProcessBlock(CY_CRYPTO_DES_MODE_SINGLE, + cryptoDesContext->dirMode, + cryptoDesContext->keyPtr, + cryptoDesContext->dstPtr, + cryptoDesContext->srcPtr); + + return (status); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Tdes +****************************************************************************//** +* +* Performs TDES operation on a Single Block. All addresses must be 4-Byte aligned. +* Ciphertext (dstBlockPtr) may overlap with plaintext (srcBlockPtr) +* This function is independent from the previous Crypto state. +* +* This function available for CM0+ core only. +* +* \param cryptoDesContext +* The pointer to the cy_stc_crypto_context_des_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Tdes(cy_stc_crypto_context_des_t *cryptoDesContext) +{ + uint32_t i; + cy_en_crypto_status_t status = CY_CRYPTO_SUCCESS; + uint32_t *_keyPtr = cryptoDesContext->keyPtr; + + /* Check weak keys */ + for (i = 0; i < CY_CRYPTO_DES_WEAK_KEY_COUNT; i++) + { + if (memcmp(_keyPtr, (uint8_t*)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0) + { + status = CY_CRYPTO_DES_WEAK_KEY; + break; + } + + if (memcmp(&(_keyPtr[CY_CRYPTO_DES_KEY_BYTE_LENGTH]), + (uint8_t*)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0) + { + status = CY_CRYPTO_DES_WEAK_KEY; + break; + } + + if (memcmp(&(_keyPtr[2 * CY_CRYPTO_DES_KEY_BYTE_LENGTH]), + (uint8_t*)cy_desWeakKeys[i], CY_CRYPTO_DES_KEY_BYTE_LENGTH) == 0) + { + status = CY_CRYPTO_DES_WEAK_KEY; + break; + } + } + + Cy_Crypto_Core_Des_ProcessBlock(CY_CRYPTO_DES_MODE_TRIPLE, + cryptoDesContext->dirMode, + _keyPtr, + cryptoDesContext->dstPtr, + cryptoDesContext->srcPtr); + + return (status); +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_des.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_des.h new file mode 100644 index 0000000000..d5085031d9 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_des.h @@ -0,0 +1,48 @@ +/***************************************************************************//** +* \file cy_crypto_core_des.h +* \version 1.0 +* +* \brief +* This file provides constant and parameters for the API for the DES method +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_CRYPTO_CORE_DES_H) +#define CY_CRYPTO_CORE_DES_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) + +#define CY_CRYPTO_DES_WEAK_KEY_COUNT (16) +#define CY_CRYPTO_DES_KEY_BYTE_LENGTH (8) + +typedef enum { + CY_CRYPTO_DES_MODE_SINGLE = 0, + CY_CRYPTO_DES_MODE_TRIPLE = 1 +} cy_en_crypto_des_mode_t; + +cy_en_crypto_status_t Cy_Crypto_Core_Des(cy_stc_crypto_context_des_t *cryptoDesContext); + +cy_en_crypto_status_t Cy_Crypto_Core_Tdes(cy_stc_crypto_context_des_t *cryptoDesContext); + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) */ +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_DES_H) */ + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_hmac.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_hmac.c new file mode 100644 index 0000000000..81b216792c --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_hmac.c @@ -0,0 +1,244 @@ +/***************************************************************************//** +* \file cy_crypto_core_hmac.c +* \version 1.0 +* +* \brief +* This file provides the source code to the API for the HMAC method +* in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_hmac.h" +#include "crypto/cy_crypto_core_sha.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_str.h" +#include "syslib/cy_syslib.h" +#include + + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) + +#define CY_CRYPTO_HMAC_IPAD (0x36u) +#define CY_CRYPTO_HMAC_0PAD (0x5Cu) +#define CY_CRYPTO_HMAC_MAX_PAD_SIZE (128u) +#define CY_CRYPTO_HMAC_MAX_M0_KEY_SIZE (128u) + +typedef struct +{ + uint32_t *ipadPtr; + uint32_t *opadPtr; + uint32_t *m0KeyPtr; +} cy_stc_crypto_hmac_state_t; + + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Hmac_Init +****************************************************************************//** +* +* Initializes HMAC (Hash-based Message Authentication Code) calculation. +* Allocate two buffers (ipadPtr and opadPtr) for HMAC calculation. +* +* This function available for CM0+ core only. +* +* \param hmacStatePtr +* the pointer to the hmacStatePtr structure which stores internal variables +* for HMAC calculation. +* +* \param ipadPtr +* The memory buffer for HMAC calculation, the max used size = CRYPTO_HMAC_MAX_PAD_SIZE. +* +* \param opadPtr +* The memory buffer for HMAC calculation, the max used size = CRYPTO_HMAC_MAX_PAD_SIZE. +* +* * \param m0KeyPtr +* The memory buffer for HMAC calculation, the max used size = CRYPTO_HMAC_MAX_M0_KEY_SIZE. +* +*******************************************************************************/ +void Cy_Crypto_Core_Hmac_Init(cy_stc_crypto_hmac_state_t *hmacStatePtr, + uint32_t *ipadPtr, + uint32_t *opadPtr, + uint32_t *m0KeyPtr) +{ + hmacStatePtr->ipadPtr = ipadPtr; + hmacStatePtr->opadPtr = opadPtr; + hmacStatePtr->m0KeyPtr = m0KeyPtr; +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Hmac_Calculate +****************************************************************************//** +* +* Starts HMAC (Hash-based Message Authentication Code) calculation. +* +* This function available for CM0+ core only. +* +* \param hmacStatePtr +* The pointer to the hmacStatePtr structure which stores internal variables +* for HMAC calculation. +* +* \param hashStatePtr +* The pointer to the hashStatePtr structure which stores internal variables +* of the SHA algorithm because it is used for HMAC calculation. +* +* \param keyPtr +* The pointer to the encryption key used in computing AES-CMAC. +* +* \param keyLength +* The size of the encryption key. +* +* \param messagePtr +* The pointer to the input message. +* +* \param messageSize +* The size of the input message. +* +* \param hmacPtr +* The pointer to the calculated HMAC. +* +*******************************************************************************/ +void Cy_Crypto_Core_Hmac_Calculate(cy_stc_crypto_hmac_state_t *hmacStatePtr, + cy_stc_crypto_sha_state_t *hashStatePtr, + uint32_t *keyPtr, + uint32_t keyLength, + uint32_t *messagePtr, + uint32_t messageSize, + uint32_t *hmacPtr) +{ + uint32_t i = 0uL; + uint8_t *ipadPtrTmp = (uint8_t*)hmacStatePtr->ipadPtr; + uint8_t *opadPtrTmp = (uint8_t*)hmacStatePtr->opadPtr; + uint8_t *m0KeyPtrTmp = (uint8_t*)hmacStatePtr->m0KeyPtr; + + + /* Steps 1-3 according to FIPS 198-1 */ + if (keyLength > hashStatePtr->blockSize) + { + /* The key is larger than the block size. Do a hash on the key. */ + Cy_Crypto_Core_Sha_Start (hashStatePtr); + Cy_Crypto_Core_Sha_Update (hashStatePtr, keyPtr, keyLength); + Cy_Crypto_Core_Sha_Finish (hashStatePtr, (uint32_t*)m0KeyPtrTmp, keyLength); + + /* Append zeros */ + memset((m0KeyPtrTmp + hashStatePtr->digestSize), 0x00u, + (hashStatePtr->blockSize - hashStatePtr->digestSize)); + } + else if (keyLength < hashStatePtr->blockSize) + { + /* If the key is shorter than the block, append zeros */ + memcpy(m0KeyPtrTmp, keyPtr, (uint16_t)keyLength); + memset((m0KeyPtrTmp + keyLength), 0x00u, (hashStatePtr->blockSize - keyLength)); + } + else + { + memcpy(m0KeyPtrTmp, keyPtr, keyLength); + } + + /* Steps 4 and 7 according to FIPS 198-1 */ + while (i < hashStatePtr->blockSize) + { + ipadPtrTmp[i] = CY_CRYPTO_HMAC_IPAD ^ m0KeyPtrTmp[i]; + opadPtrTmp[i] = CY_CRYPTO_HMAC_0PAD ^ m0KeyPtrTmp[i]; + i++; + } + + /* Step 6 according to FIPS 198-1 */ + Cy_Crypto_Core_Sha_Start (hashStatePtr); + Cy_Crypto_Core_Sha_ProcessBlock (hashStatePtr, (uint32_t*)ipadPtrTmp); + + /* Append a message */ + Cy_Crypto_Core_Sha_Update (hashStatePtr, messagePtr, messageSize); + Cy_Crypto_Core_Sha_Finish (hashStatePtr, (uint32_t*)ipadPtrTmp, (messageSize + hashStatePtr->blockSize)); + + /* Here is the ready part of HASH: Hash((Key^ipad)||text) */ + + /* Steps 8, 9 according to FIPS 198-1 */ + Cy_Crypto_Core_Sha_Start (hashStatePtr); + Cy_Crypto_Core_Sha_ProcessBlock (hashStatePtr, (uint32_t*)opadPtrTmp); + + /* Append HASH from Step 6 */ + Cy_Crypto_Core_Sha_Update (hashStatePtr, (uint32_t*)ipadPtrTmp, hashStatePtr->digestSize); + Cy_Crypto_Core_Sha_Finish (hashStatePtr, hmacPtr, (hashStatePtr->digestSize + hashStatePtr->blockSize)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Hmac_Free +****************************************************************************//** +* +* Clears the used memory buffers. +* +* This function available for CM0+ core only. +* +* \param hmacStatePtr +* The pointer to the HMAC context. +* +*******************************************************************************/ +void Cy_Crypto_Core_Hmac_Free(cy_stc_crypto_hmac_state_t *hmacStatePtr) +{ + /* Clear the memory buffer. */ + memset(hmacStatePtr->ipadPtr, 0x00u, CY_CRYPTO_HMAC_MAX_PAD_SIZE); + memset(hmacStatePtr->opadPtr, 0x00u, CY_CRYPTO_HMAC_MAX_PAD_SIZE); + memset(hmacStatePtr->m0KeyPtr, 0x00u, CY_CRYPTO_HMAC_MAX_M0_KEY_SIZE); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Hmac +****************************************************************************//** +* +* Performs HMAC calculation. +* +* This function available for CM0+ core only. +* +* \param cryptoShaContext +* The pointer to the stc_crypto_context_t structure which stores all internal variables +* for Crypto driver. +* +* \return +* A Crypto status \ref en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Hmac(cy_stc_crypto_context_sha_t *cryptoShaContext) +{ + uint32_t *messageTmpPtr = cryptoShaContext->messagePtr; + uint32_t messageSizeTmp = cryptoShaContext->messageSize; + uint32_t *hmacPtr = cryptoShaContext->dstPtr; + cy_en_crypto_sha_mode_t modeTmp = cryptoShaContext->mode; + uint32_t *keyTmpPtr = cryptoShaContext->keyPtr; + uint32_t keyLengthTmp = cryptoShaContext->keyLength; + + /* Allocating internal variables into the CRYPTO SRAM Buffer */ + uint32_t *blockPtr = (uint32_t*)CRYPTO->MEM_BUFF; + uint32_t *hashPtr = (uint32_t*)((uint8_t*)blockPtr + CY_CRYPTO_MAX_BLOCK_SIZE); + uint32_t *roundMemPtr = (uint32_t*)((uint8_t*)hashPtr + CY_CRYPTO_MAX_HASH_SIZE); + uint32_t *ipadPtr = (uint32_t*)((uint8_t*)roundMemPtr + CY_CRYPTO_MAX_ROUND_MEM_SIZE); + uint32_t *opadPtr = (uint32_t*)((uint8_t*)ipadPtr + CY_CRYPTO_HMAC_MAX_PAD_SIZE); + uint32_t *m0KeyPtr = (uint32_t*)((uint8_t*)opadPtr + CY_CRYPTO_HMAC_MAX_PAD_SIZE); + + cy_stc_crypto_hmac_state_t *hmacStatePtr = (cy_stc_crypto_hmac_state_t* )((uint8_t*)m0KeyPtr + CY_CRYPTO_MAX_BLOCK_SIZE); + cy_stc_crypto_sha_state_t *hashStatePtr = (cy_stc_crypto_sha_state_t* )((uint8_t*)hmacStatePtr + sizeof(cy_stc_crypto_hmac_state_t)); + + Cy_Crypto_Core_Sha_Init (hashStatePtr, (uint8_t*)blockPtr, hashPtr, roundMemPtr, modeTmp); + Cy_Crypto_Core_Hmac_Init (hmacStatePtr, ipadPtr, opadPtr, m0KeyPtr); + + Cy_Crypto_Core_Hmac_Calculate (hmacStatePtr, hashStatePtr, keyTmpPtr, keyLengthTmp, messageTmpPtr, messageSizeTmp, hmacPtr); + + Cy_Crypto_Core_Hmac_Free (hmacStatePtr); + Cy_Crypto_Core_Sha_Free (hashStatePtr); + + return (CY_CRYPTO_SUCCESS); +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_hmac.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_hmac.h new file mode 100644 index 0000000000..51f08e1b14 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_hmac.h @@ -0,0 +1,37 @@ +/***************************************************************************//** +* \file cy_crypto_cora_hmac.h +* \version 1.0 +* +* \brief +* This file provides constants and function prototypes +* for the API for the SHA method in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CORE_HMAC_H) +#define CY_CRYPTO_CORE_HMAC_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) + + +cy_en_crypto_status_t Cy_Crypto_Core_Hmac(cy_stc_crypto_context_sha_t *cryptoContext); + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_HMAC_H) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_instructions.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_instructions.h new file mode 100644 index 0000000000..2b91da82dc --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_instructions.h @@ -0,0 +1,180 @@ +/***************************************************************************//** +* \file cy_crypto_core_instructions.h +* \version 1.0 +* +* \brief +* This file provides internal (not public) constant and parameters +* for the Crypto server. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CORE_INSTRUCTIONS_H) +#define CY_CRYPTO_CORE_INSTRUCTIONS_H + +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if (CPUSS_CRYPTO_PRESENT == 1) + + +/*************************************** +* Crypto IP opcodes +***************************************/ + +#define CY_CRYPTO_REGFILE_R0 (0x00uL) +#define CY_CRYPTO_REGFILE_R1 (0x01uL) +#define CY_CRYPTO_REGFILE_R2 (0x02uL) +#define CY_CRYPTO_REGFILE_R3 (0x03uL) +#define CY_CRYPTO_REGFILE_R4 (0x04uL) +#define CY_CRYPTO_REGFILE_R5 (0x05uL) +#define CY_CRYPTO_REGFILE_R6 (0x06uL) +#define CY_CRYPTO_REGFILE_R7 (0x07uL) +#define CY_CRYPTO_REGFILE_R8 (0x08uL) +#define CY_CRYPTO_REGFILE_R9 (0x09uL) +#define CY_CRYPTO_REGFILE_R10 (0x0AuL) +#define CY_CRYPTO_REGFILE_R11 (0x0BuL) +#define CY_CRYPTO_REGFILE_R12 (0x0CuL) +#define CY_CRYPTO_REGFILE_R13 (0x0DuL) +#define CY_CRYPTO_REGFILE_R14 (0x0EuL) +#define CY_CRYPTO_REGFILE_R15 (0x0FuL) + + +#define CY_CRYPTO_SET_REG1_OPC (0x40u) +#define CY_CRYPTO_SET_REG2_OPC (0x41u) +#define CY_CRYPTO_SET_REG3_OPC (0x42u) +#define CY_CRYPTO_SET_REG4_OPC (0x43u) + +#define CY_CRYPTO_RSRC0_SHIFT (0u) +#define CY_CRYPTO_RSRC4_SHIFT (4u) +#define CY_CRYPTO_RSRC8_SHIFT (8u) +#define CY_CRYPTO_RSRC12_SHIFT (12u) +#define CY_CRYPTO_RSRC20_SHIFT (20u) +#define CY_CRYPTO_OPCODE_POS (24u) +#define CY_CRYPTO_RSRC26_SHIFT (26u) +#define CY_CRYPTO_RSRC30_SHIFT (30u) + +#define CY_CRYPTO_AES_BLOCK_OPC (0x44u) +#define CY_CRYPTO_AES_BLOCK_INV_OPC (0x45u) +#define CY_CRYPTO_AES_KEY_OPC (0x46u) +#define CY_CRYPTO_AES_KEY_INV_OPC (0x47u) +#define CY_CRYPTO_AES_XOR_OPC (0x48u) + +#define CY_CRYPTO_SHA_OPC (0x4cu) + +#define CY_CRYPTO_STR_MEMCPY_OPC (0x50u) +#define CY_CRYPTO_STR_MEMSET_OPC (0x51u) +#define CY_CRYPTO_STR_MEMCMP_OPC (0x52u) +#define CY_CRYPTO_STR_MEMXOR_OPC (0x53u) + +#define CY_CRYPTO_CRC_OPC (0x58u) + +#define CY_CRYPTO_PRNG_OPC (0x5cu) + +#define CY_CRYPTO_TRNG_OPC (0x60u) + +#define CY_CRYPTO_DES_BLOCK_OPC (0x70u) +#define CY_CRYPTO_DES_BLOCK_INV_OPC (0x71u) + +#define CY_CRYPTO_TDES_BLOCK_OPC (0x72u) +#define CY_CRYPTO_TDES_BLOCK_INV_OPC (0x73u) + +#define CY_CRYPTO_SYNC_OPC (0x7fu) + +#define CY_CRYPTO_FIFODEPTH (0x08u) + +/* Vector Unit instructions */ +#define CY_CRYPTO_VU_ALLOC_MEM_OPC (0x12u) +#define CY_CRYPTO_VU_FREE_MEM_OPC (0x13u) + +/* Instructions with register operand only, category I */ +#define CY_CRYPTO_VU_SET_REG_OPC (0x80u) +#define CY_CRYPTO_VU_MOV_REG_OPC (0x02u) +#define CY_CRYPTO_VU_LD_REG_OPC (0x00u) +#define CY_CRYPTO_VU_ST_REG_OPC (0x01u) + +/* Instructions with register operand only, category III */ +#define CY_CRYPTO_VU_SWAP_REG_OPC (0x03u) + +/* Instructions with register operand only, category IV */ +#define CY_CRYPTO_VU_MOV_REG_TO_STATUS_OPC (0x04u) + +/* Instructions with register operand only, category V */ +#define CY_CRYPTO_VU_MOV_STATUS_TO_REG_OPC (0x05u) + +/* Instructions with register operand only, category VI */ +#define CY_CRYPTO_VU_PUSH_REG_OPC (0x10u) +#define CY_CRYPTO_VU_POP_REG_OPC (0x11u) + +/* Instructions with register operand only, category VII */ +#define CY_CRYPTO_VU_ADD_REG_OPC (0x06u) +#define CY_CRYPTO_VU_SUB_REG_OPC (0x07u) +#define CY_CRYPTO_VU_OR_REG_OPC (0x08u) +#define CY_CRYPTO_VU_AND_REG_OPC (0x09u) +#define CY_CRYPTO_VU_XOR_REG_OPC (0x0Au) +#define CY_CRYPTO_VU_NOR_REG_OPC (0x0Bu) +#define CY_CRYPTO_VU_NAND_REG_OPC (0x0Cu) +#define CY_CRYPTO_VU_MIN_REG_OPC (0x0Du) +#define CY_CRYPTO_VU_MAX_REG_OPC (0x0Eu) + +/* Instructions with mixed operands, category I */ +#define CY_CRYPTO_VU_LSL_OPC (0x20u) +#define CY_CRYPTO_VU_LSR_OPC (0x24u) + +/* Instructions with mixed operands, category II */ +#define CY_CRYPTO_VU_LSL1_OPC (0x21u) +#define CY_CRYPTO_VU_LSL1_WITH_CARRY_OPC (0x22u) +#define CY_CRYPTO_VU_LSR1_OPC (0x25u) +#define CY_CRYPTO_VU_LSR1_WITH_CARRY_OPC (0x26u) + +/* Instructions with mixed operands, category III */ +#define CY_CRYPTO_VU_SET_BIT_OPC (0x2Cu) +#define CY_CRYPTO_VU_CLR_BIT_OPC (0x2Du) +#define CY_CRYPTO_VU_INV_BIT_OPC (0x2Eu) + +/* Instructions with mixed operands, category IV */ +#define CY_CRYPTO_VU_GET_BIT_OPC (0x2Fu) + +/* Instructions with mixed operands, category V */ +#define CY_CRYPTO_VU_CLSAME_OPC (0x28u) +#define CY_CRYPTO_VU_CTSAME_OPC (0x29u) + +/* Instructions with memory buffer operands, category I */ +#define CY_CRYPTO_VU_SET_TO_ZERO_OPC (0x34u) +#define CY_CRYPTO_VU_SET_TO_ONE_OPC (0x35u) + +/* Instructions with memory buffer operands, category II */ +#define CY_CRYPTO_VU_MOV_OPC (0x30u) +#define CY_CRYPTO_VU_XSQUARE_OPC (0x31u) + +/* Instructions with memory buffer operands, category III */ +#define CY_CRYPTO_VU_CMP_SUB_OPC (0x3Du) +#define CY_CRYPTO_VU_CMP_DEFREE_OPC (0x3Eu) + +/* Instructions with memory buffer operands, category IV */ +#define CY_CRYPTO_VU_TST_OPC (0x3fu) +#define CY_CRYPTO_VU_XMUL_OPC (0x32u) +#define CY_CRYPTO_VU_UMUL_OPC (0x33u) +#define CY_CRYPTO_VU_ADD_OPC (0x36u) +#define CY_CRYPTO_VU_SUB_OPC (0x37u) +#define CY_CRYPTO_VU_OR_OPC (0x38u) +#define CY_CRYPTO_VU_AND_OPC (0x39u) +#define CY_CRYPTO_VU_XOR_OPC (0x3Au) +#define CY_CRYPTO_VU_NOR_OPC (0x3Bu) +#define CY_CRYPTO_VU_NAND_OPC (0x3Cu) + + +#endif /* #if (CPUSS_CRYPTO_PRESENT == 1) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_INSTRUCTIONS_H) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_prng.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_prng.c new file mode 100644 index 0000000000..69e2dc1cf1 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_prng.c @@ -0,0 +1,99 @@ +/***************************************************************************//** +* \file cy_crypto_core_prng.c +* \version 1.0 +* +* \brief +* This file provides the source code to the API for the PRNG +* in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_prng.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "crypto/cy_crypto_core_util.h" +#include "syslib/cy_syslib.h" + + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) + + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Prng_Init +****************************************************************************//** +* +* Initializes the PRND parameters. +* Invoking this function causes a restart of the pseudo-random sequence. +* +* This function available for CM0+ core only. +* +* \param cryptoPrngContext +* The pointer to thestc_crypto_context_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Prng_Init(cy_stc_crypto_context_prng_t *cryptoPrngContext) +{ + CRYPTO->PR_LFSR_CTL0 = (uint32_t)(_VAL2FLD(CRYPTO_PR_LFSR_CTL0_LFSR32, + (uint32_t)cryptoPrngContext->lfsr32InitState)); + + CRYPTO->PR_LFSR_CTL1 = (uint32_t)(_VAL2FLD(CRYPTO_PR_LFSR_CTL1_LFSR31, + (uint32_t)cryptoPrngContext->lfsr31InitState)); + + CRYPTO->PR_LFSR_CTL2 = (uint32_t)(_VAL2FLD(CRYPTO_PR_LFSR_CTL2_LFSR29, + (uint32_t)cryptoPrngContext->lfsr29InitState)); + + return (CY_CRYPTO_SUCCESS); +} + +/******************************************************************************* +* Function Name: Crypto_Core_Prng +****************************************************************************//** +* +* Generates a Pseudo Random Number. +* +* This function available for CM0+ core only. +* +* \param cryptoPrngContext +* The pointer to the stc_crypto_context_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Prng(cy_stc_crypto_context_prng_t *cryptoPrngContext) +{ + CRYPTO->INSTR_FF_WR = (uint32_t)(CY_CRYPTO_SET_REG1_OPC << CY_CRYPTO_OPCODE_POS); + + CRYPTO->INSTR_FF_WR = (uint32_t)cryptoPrngContext->max; + + CRYPTO->INSTR_FF_WR = (uint32_t)((uint32_t)CY_CRYPTO_PRNG_OPC << CY_CRYPTO_OPCODE_POS); + + /* Wait until the PRNG instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_PR_BUSY, CRYPTO->STATUS)) + { + } + + *cryptoPrngContext->prngNumPtr = (uint32_t)_FLD2VAL(CRYPTO_PR_RESULT_DATA32, CRYPTO->PR_RESULT); + + return (CY_CRYPTO_SUCCESS); +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_prng.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_prng.h new file mode 100644 index 0000000000..44a211a5cd --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_prng.h @@ -0,0 +1,39 @@ +/***************************************************************************//** +* \file cy_crypto_core_prng.h +* \version 1.0 +* +* \brief +* This file provides provides constant and parameters for the API of the PRNG +* in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CORE_PRNG_H) +#define CY_CRYPTO_CORE_PRNG_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) + + +cy_en_crypto_status_t Cy_Crypto_Core_Prng_Init (cy_stc_crypto_context_prng_t *cryptoPrngContext); +cy_en_crypto_status_t Cy_Crypto_Core_Prng (cy_stc_crypto_context_prng_t *cryptoPrngContext); + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_PRNG_H) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_rsa.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_rsa.c new file mode 100644 index 0000000000..e3681c4b52 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_rsa.c @@ -0,0 +1,993 @@ +/***************************************************************************//** +* \file cy_crypto_core_rsa.c +* \version 1.0 +* +* \brief +* This file provides the source code to the API to calculate +* a signature by the RSA method in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_rsa.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_vu_hw.h" +#include "crypto/cy_crypto_core_vu.h" +#include "crypto/cy_crypto_core_sha.h" +#include "syslib/cy_syslib.h" +#include + + +#if (CY_CPU_CORTEX_M0P) + +#define CY_CRYPTO_SHA1_PADDING_SIZE (15u) +#define CY_CRYPTO_SHA256_512_PADDING_SIZE (19u) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) + +/* Functions prototypes */ +void Cy_Crypto_Core_Rsa_MontCoeff(uint32_t modDerReg, uint32_t modReg, uint32_t size); +void Cy_Crypto_Core_Rsa_BarrettGetU(uint32_t barrettUReg, uint32_t modReg, uint32_t size); +void Cy_Crypto_Core_Rsa_BarretRed(uint32_t resultReg, uint32_t aReg, uint32_t barrettUReg, uint32_t modReg, uint32_t size); +void Cy_Crypto_Core_Rsa_MontTransform(uint32_t z, uint32_t a, uint32_t barrett_u, uint32_t mod, uint32_t size); +void Cy_Crypto_Core_Rsa_MontMul(uint32_t z, uint32_t a, uint32_t b, uint32_t mont_mod_der, uint32_t mod, uint32_t size); + +void Cy_Crypto_Core_Rsa_expModByMont(uint32_t y, + uint32_t x, + uint32_t e, + uint32_t n, + uint32_t barretCoef, + uint32_t inverseModulo, + uint32_t rBar, + uint32_t size); + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CY_CRYPTO_USER_PKCS1_5 == 1)) + +/* Encodings for hash functions */ + +#if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) +static const uint8_t Sha1EncStr[CY_CRYPTO_SHA1_PADDING_SIZE] = +{ + 0x14u, 0x04u, 0x00u, 0x05u, + 0x1Au, 0x02u, 0x03u, 0x0Eu, 0x2Bu, 0x05u, 0x06u, 0x09u, + 0x30u, 0x21u, 0x30u +}; +#endif /* #if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) +static const uint8_t Sha224EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = +{ + 0x1Cu, 0x04u, 0x00u, 0x05u, 0x04u, 0x02u, 0x04u, 0x03u, + 0x65u, 0x01u, 0x48u, 0x86u, 0x60u, 0x09u, 0x06u, 0x0du, + 0x30u, 0x2Du, 0x30u +}; + +static const uint8_t Sha256EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = +{ + 0x20u, 0x04u, 0x00u, 0x05u, 0x01u, 0x02u, 0x04u, 0x03u, + 0x65u, 0x01u, 0x48u, 0x86u, 0x60u, 0x09u, 0x06u, 0x0du, + 0x30u, 0x31u, 0x30u +}; +#endif /* #if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) +static const uint8_t Sha384EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = +{ + 0x30u, 0x04u, 0x00u, 0x05u, 0x02u, 0x02u, 0x04u, 0x03u, + 0x65u, 0x01u, 0x48u, 0x86u, 0x60u, 0x09u, 0x06u, 0x0du, + 0x30u, 0x41u, 0x30u +}; + +static const uint8_t Sha512EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = +{ + 0x40u, 0x04u, 0x00u, 0x05u, 0x03u, 0x02u, 0x04u, 0x03u, + 0x65u, 0x01u, 0x48u, 0x86u, 0x60u, 0x09u, 0x06u, 0x0du, + 0x30u, 0x51u, 0x30u +}; + +static const uint8_t Sha512_224EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = +{ + 0x1Cu, 0x04u, 0x00u, 0x05u, 0x05u, 0x02u, 0x04u, 0x03u, + 0x65u, 0x01u, 0x48u, 0x86u, 0x60u, 0x09u, 0x06u, 0x0du, + 0x30u, 0x2Du, 0x30u +}; + +static const uint8_t Sha512_256EncStr[CY_CRYPTO_SHA256_512_PADDING_SIZE] = +{ + 0x20u, 0x04u, 0x00u, 0x05u, 0x06u, 0x02u, 0x04u, 0x03u, + 0x65u, 0x01u, 0x48u, 0x86u, 0x60u, 0x09u, 0x06u, 0x0du, + 0x30u, 0x31u, 0x30u +}; +#endif /* #if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) */ + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_RsaVerify +****************************************************************************//** +* +* RSA verification with checks for content, paddings and signature format. +* SHA digest of the message and decrypted message should be calculated before. +* Supports only PKCS1-v1_5 format, inside of this format supported padding +* using only SHA, cases with MD2 and MD5 are not supported. +* PKCS1-v1_5 described here, page 31: +* http://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf +* +* Returns the verification result \ref cy_en_crypto_rsa_ver_result_t. +* +* \param cryptoContextPtr +* Pointer to the RSA context +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_RsaVerify(cy_stc_crypto_context_rsa_ver_t *cryptoContextPtr) +{ + cy_en_crypto_status_t result = CY_CRYPTO_SUCCESS; + + cy_en_crypto_sha_mode_t _digestType = cryptoContextPtr->digestType; + uint8_t *_digestPtr = (uint8_t*)cryptoContextPtr->hashPtr; + uint8_t *_decryptedSignaturePtr = (uint8_t*)cryptoContextPtr->decryptedSignaturePtr; + uint32_t _decryptedSignatureLength = cryptoContextPtr->decryptedSignatureLength; + cy_en_crypto_rsa_ver_result_t *_verResult = cryptoContextPtr->verResult; + + uint8_t *psBeginPtr; + uint8_t *encodingArrPtr = NULL; + uint32_t encodingArrSize = 0; + uint32_t digestSize = 0; + uint32_t i; + int32_t psLength; + int32_t cmpRes = 0; + + + switch (_digestType) + { + +#if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) + case CY_CRYPTO_MODE_SHA1: + encodingArrPtr = (uint8_t*)Sha1EncStr; + encodingArrSize = sizeof(Sha1EncStr); + digestSize = CY_CRYPTO_SHA1_DIGEST_SIZE; + break; +#endif /* #if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) + case CY_CRYPTO_MODE_SHA224: + encodingArrPtr = (uint8_t*)Sha224EncStr; + encodingArrSize = sizeof(Sha224EncStr); + digestSize = CY_CRYPTO_SHA224_DIGEST_SIZE; + break; + + case CY_CRYPTO_MODE_SHA256: + encodingArrPtr = (uint8_t*)Sha256EncStr; + encodingArrSize = sizeof(Sha256EncStr); + digestSize = CY_CRYPTO_SHA256_DIGEST_SIZE; + break; +#endif /* #if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) + case CY_CRYPTO_MODE_SHA384: + encodingArrPtr = (uint8_t*)Sha384EncStr; + encodingArrSize = sizeof(Sha384EncStr); + digestSize = CY_CRYPTO_SHA384_DIGEST_SIZE; + break; + + case CY_CRYPTO_MODE_SHA512: + encodingArrPtr = (uint8_t*)Sha512EncStr; + encodingArrSize = sizeof(Sha512EncStr); + digestSize = CY_CRYPTO_SHA512_DIGEST_SIZE; + break; + + case CY_CRYPTO_MODE_SHA512_224: + encodingArrPtr = (uint8_t*)Sha512_224EncStr; + encodingArrSize = sizeof(Sha512_224EncStr); + digestSize = CY_CRYPTO_SHA512_224_DIGEST_SIZE; + break; + + case CY_CRYPTO_MODE_SHA512_256: + encodingArrPtr = (uint8_t*)Sha512_256EncStr; + encodingArrSize = sizeof(Sha512_256EncStr); + digestSize = CY_CRYPTO_SHA512_256_DIGEST_SIZE; + break; +#endif /* #if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) */ + + default: + break; + } + + /* Fail by default */ + *_verResult = CY_CRYPTO_RSA_VERIFY_FAIL; + + /* Check size of decrypted message */ + if (_decryptedSignatureLength < (encodingArrSize + digestSize + 11)) + { + cmpRes = 1; /* further checking is not needed */ + } + + psLength = _decryptedSignatureLength - digestSize - encodingArrSize - 3; + + /* Address of start of T string (0xFFs) in padding */ + psBeginPtr = _decryptedSignaturePtr + _decryptedSignatureLength - 3; + + /* Check whether the begin of message is 0x00, 0x01 and after PS string (before T string) is 0x00 byte.*/ + if ( (0 != cmpRes) || + (0x00 != *(psBeginPtr + 2)) || + (0x01 != *(psBeginPtr + 1)) || + (0x00 != *(_decryptedSignaturePtr + _decryptedSignatureLength - psLength - 3)) ) + { + cmpRes = 1; /* Further checking is not needed */ + } + + /* Check FFs */ + if (0 == cmpRes ) + { + for (i = psLength; i > 0; i--) + { + if (0xFF != *(psBeginPtr - i + 1)) + { + cmpRes = 1; /* Further checking is not needed */ + break; + } + } + } + + /* Check the padding (T string) */ + if (0 == cmpRes) + { + cmpRes = memcmp(encodingArrPtr, + (_decryptedSignaturePtr + digestSize), + encodingArrSize); + } + + /* Check the digest */ + if (0 == cmpRes) + { + _decryptedSignaturePtr = _decryptedSignaturePtr + digestSize - 1; + for (i = digestSize; i > 0; i--) + { + if( *_decryptedSignaturePtr != *_digestPtr ) + { + cmpRes = 1; /* Further checking is not needed */ + break; + } + _decryptedSignaturePtr--; + _digestPtr++; + } + } + + if (0 == cmpRes ) + { + *_verResult = CY_CRYPTO_RSA_VERIFY_SUCCESS; + } + + return (result); +} + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CY_CRYPTO_USER_PKCS1_5 == 1)) */ + + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Rsa_MontCoeff +****************************************************************************//** +* +* Calculation of Montgomery coefficients for Montgomery multiplication in GF(p). +* +* Reference: "Montgomery Multiplication", H. S. Warren, Jr., July 2012 +* Reference: http://www.hackersdelight.org/MontgomeryMultiplication.pdf +* +* GCD method is used, reference: +* https://en.wikipedia.org/wiki/Binary_GCD_algorithm +* +* Inputs: modulus n, k = number of bits in n; +* Outputs: R^-1 and n' which allows equation: R*R^-1 - n*n' = 1, +* where R = 1 << size. +* +* Leaf function. +* +* \param modDerReg +* Register index for Montgomery coefficient value. +* +* \param modReg +* Register index for modulo value. +* +* \param size +* Size of modulo, in Bits. +* +*******************************************************************************/ +void Cy_Crypto_Core_Rsa_MontCoeff(uint32_t modDerReg, uint32_t modReg, uint32_t size) +{ + uint32_t my_mod = 9; + uint32_t tmp = 10; + uint32_t a = 11; + uint32_t b = 12; + uint32_t u = 13; + uint32_t v = 14; + + uint16_t status; + uint16_t a_zero; + uint16_t u_even; + + CY_CRYPTO_VU_PUSH_REG (); + + CY_CRYPTO_VU_LD_REG (v, modDerReg); + CY_CRYPTO_VU_LD_REG (my_mod, modReg); + + CY_CRYPTO_VU_ALLOC_MEM (a, size); + CY_CRYPTO_VU_ALLOC_MEM (b, size); + CY_CRYPTO_VU_ALLOC_MEM (u, size); + + CY_CRYPTO_VU_SET_TO_ONE (u); + CY_CRYPTO_VU_SET_TO_ZERO (v); + + CY_CRYPTO_VU_SET_TO_ZERO (a); + CY_CRYPTO_VU_SET_REG (tmp, (size - 1), 1); + + CY_CRYPTO_VU_SET_BIT (a, tmp); + CY_CRYPTO_VU_MOV (b, my_mod); + + while(1) + { + Cy_Crypto_Core_WaitForReady(); + + CY_CRYPTO_VU_TST(a); + + status = Cy_Crypto_Core_Vu_StatusRead(); + a_zero = status & (1 << CY_CRYPTO_VU_STATUS_ZERO); + + if(a_zero != 0) + { + break; + } + + CY_CRYPTO_VU_LSR1(a, a); + + CY_CRYPTO_VU_TST(u); + status = Cy_Crypto_Core_Vu_StatusRead(); + u_even = status & (1 << CY_CRYPTO_VU_STATUS_EVEN); + + if(u_even != 0) + { + CY_CRYPTO_VU_LSR1(u, u); + CY_CRYPTO_VU_LSR1(v, v); + } + else + { + CY_CRYPTO_VU_ADD(u, u, b); + CY_CRYPTO_VU_LSR1_WITH_CARRY(u, u); + CY_CRYPTO_VU_LSR1(v, v); + CY_CRYPTO_VU_SET_BIT(v, tmp); + } + } + + CY_CRYPTO_VU_FREE_MEM((1 << a) | (1 << b) | (1 << u)); + + CY_CRYPTO_VU_POP_REG(); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Rsa_BarrettGetU +****************************************************************************//** +* +* Calculation of Barrett coefficient for Barrett reduction in GF(p). +* +* The function reduces the size of the Barrett coefficient by removing leading '0' bits. +* This improves the performance of the Barrett reduction (faster multiplication). +* (1 << bit_size) > mod > (1 << (bit_size-1)) +* +* barrett_u = (1 << (2 * size)) / mod NO!!! leading '1' Barrett bit. +* +* Leaf function. +* +* \param barrettUReg +* Register index for Barrett reduction value. +* +* \param modReg +* Register index for modulo value. +* +* \param +* Size modulo size in Bits. +* +*******************************************************************************/ +void Cy_Crypto_Core_Rsa_BarrettGetU(uint32_t barrettUReg, uint32_t modReg, uint32_t size) +{ + uint32_t dividend = 0; + uint32_t t = 1; + uint32_t temp = 2; + uint32_t sh = 3; + int32_t i; + + CY_CRYPTO_VU_ALLOC_MEM(dividend, size+1); + CY_CRYPTO_VU_ALLOC_MEM(t, size+1); + CY_CRYPTO_VU_ALLOC_MEM(temp, size+1); + + /* (1 << size) – there is probably a more efficient way to initialize this */ + CY_CRYPTO_VU_SET_REG (sh, size, 1); + CY_CRYPTO_VU_SET_TO_ZERO (dividend); + CY_CRYPTO_VU_SET_BIT (dividend, sh); + + CY_CRYPTO_VU_MOV (temp, dividend); + + CY_CRYPTO_VU_SET_TO_ZERO (barrettUReg); + + for (i = size; i >= 0; i--) + { + /* C = (a >= b) */ + CY_CRYPTO_VU_SUB (t, dividend, modReg); + CY_CRYPTO_VU_COND_SWAP_REG (CY_CRYPTO_VU_COND_CS, dividend, t); + CY_CRYPTO_VU_COND_XOR (CY_CRYPTO_VU_COND_CS, barrettUReg, barrettUReg, temp); + CY_CRYPTO_VU_LSL1 (dividend, dividend); + CY_CRYPTO_VU_LSR1 (temp, temp); + } + + CY_CRYPTO_VU_FREE_MEM((1 << dividend) | (1 << temp) | (1 << t)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Rsa_BarretRed +****************************************************************************//** +* +* Barrett reduction in GF(p). +* +* z = a_double mod modulo +* +* t[b-1:0] = z_double >> size +* t = t * barrett_u +* t = t + ((z_double >> size) << size) "for leading '1' Barrett bit" +* t = t >> size +* t = t * mod +* u = z_double - t +* u = IF (u >= mod) u = u - mod +* +* Leaf function. +* +* \param resultReg +* Register index for Barrett reduced value. +* +* \param aReg +* Register index for non reduced value. +* +* \param barrettUReg +* Register index for Barrett reduction value. +* +* \param modReg +* Register index for modulo value. +* +* \param size +* Bit size. +* +*******************************************************************************/ +void Cy_Crypto_Core_Rsa_BarretRed(uint32_t resultReg, uint32_t aReg, uint32_t barrettUReg, uint32_t modReg, uint32_t size) +{ + uint32_t sh = 0; + uint32_t t_double = 1; + uint32_t z_double = 2; + + CY_CRYPTO_VU_ALLOC_MEM (t_double, 2 * size); + CY_CRYPTO_VU_ALLOC_MEM (z_double, 2 * size); + + CY_CRYPTO_VU_SET_REG (sh, size, 1); + + + CY_CRYPTO_VU_LSR (t_double, aReg, sh); + + CY_CRYPTO_VU_UMUL (z_double, t_double, barrettUReg); + + CY_CRYPTO_VU_LSL (t_double, t_double, sh); + + CY_CRYPTO_VU_ADD (z_double, z_double, t_double); + + CY_CRYPTO_VU_LSR (z_double, z_double, sh); + + CY_CRYPTO_VU_UMUL (t_double, z_double, modReg); + + CY_CRYPTO_VU_SUB (z_double, aReg, t_double); + + /* C = (a >= b) */ + CY_CRYPTO_VU_CMP_SUB (z_double, modReg); + CY_CRYPTO_VU_COND_SUB (CY_CRYPTO_VU_COND_CS, z_double, z_double, modReg); + + CY_CRYPTO_VU_CMP_SUB (z_double, modReg); + CY_CRYPTO_VU_COND_SUB (CY_CRYPTO_VU_COND_CS, z_double, z_double, modReg); + + CY_CRYPTO_VU_MOV (resultReg, z_double); + + CY_CRYPTO_VU_FREE_MEM ((1 << z_double) | (1 << t_double)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Rsa_MontTransform +****************************************************************************//** +* +* \brief Conversion to Montgomery representation. +* +* z = (a << size) % mod +* +* \param z +* Register index for Montgomery representation value. +* +* \param a +* Register index for regular representation value. +* +* \param barrett_u +* Register index for Barrett reduction value. +* +* \param mod +* Register index for modulo value. +* +* \param size +* Bit size. +* +*******************************************************************************/ +void Cy_Crypto_Core_Rsa_MontTransform(uint32_t z, uint32_t a, uint32_t barrett_u, uint32_t mod, uint32_t size) +{ + uint32_t sh = 0; + uint32_t t1_plus2 = 1; + uint32_t t2_plus2 = 0; + uint32_t t_double = 2; + uint32_t a_double = 3; + + CY_CRYPTO_VU_ALLOC_MEM (t_double, 2 * size); + CY_CRYPTO_VU_ALLOC_MEM (a_double, 2 * size); + + CY_CRYPTO_VU_SET_REG (sh, size, 1); + + CY_CRYPTO_VU_UMUL (t_double, a, barrett_u); + CY_CRYPTO_VU_LSR (a_double, t_double, sh); + + CY_CRYPTO_VU_UMUL (t_double, a_double, mod); + + CY_CRYPTO_VU_LSL (a_double, a, sh); + + CY_CRYPTO_VU_ALLOC_MEM (t2_plus2, size + 2); + + CY_CRYPTO_VU_SUB (t2_plus2, a_double, t_double); + + CY_CRYPTO_VU_FREE_MEM ((1 << a_double) | (1 << t_double)); + CY_CRYPTO_VU_ALLOC_MEM (t1_plus2, size + 2); + + /* Check CARRY = (a >= b) */ + CY_CRYPTO_VU_SUB (t1_plus2, t2_plus2, mod); + CY_CRYPTO_VU_COND_SWAP_REG (CY_CRYPTO_VU_COND_CC, t1_plus2, t2_plus2); + + /* Check CARRY = (a >= b) */ + CY_CRYPTO_VU_SUB (t2_plus2, t1_plus2, mod); + CY_CRYPTO_VU_COND_MOV (CY_CRYPTO_VU_COND_CC, z, t1_plus2); + CY_CRYPTO_VU_COND_MOV (CY_CRYPTO_VU_COND_CS, z, t2_plus2); + + CY_CRYPTO_VU_FREE_MEM ((1 << t2_plus2) | (1 << t1_plus2)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Rsa_MontMul +****************************************************************************//** +* +* Montgomery multiplication in GF(p). +* +* z = a * b * r % mod +* +* t = mont_a * mont_b +* u = t * mont_mod_der "only lower 32 bits are needed" +* u = u * mod +* u = u + t +* u = u >> size +* u = IF (u >= mod) u = u - mod +* +* Leaf function. +* +* \param z +* Register index for product value. +* +* \param a +* Register index for multiplicand value. +* +* \param b +* Register index for multiplier value. +* +* \param mont_mod_der +* Register index for Montgomery coefficient value. +* +* \param mod +* Register index for modulo value. +* +* \param size +* Bit size. +* +*******************************************************************************/ +void Cy_Crypto_Core_Rsa_MontMul(uint32_t z, uint32_t a, uint32_t b, uint32_t mont_mod_der, uint32_t mod, uint32_t size) +{ + uint32_t sh = 0; + uint32_t t = 1; + uint32_t u_double = 2; + uint32_t t_double = 3; + + uint32_t status = 4; + + CY_CRYPTO_VU_ALLOC_MEM (t, size + 1); + CY_CRYPTO_VU_ALLOC_MEM (u_double, 2 * size); + CY_CRYPTO_VU_ALLOC_MEM (t_double, 2 * size); + + CY_CRYPTO_VU_SET_REG (sh, size, 1); + + CY_CRYPTO_VU_UMUL (t_double, a, b); + + /* Only lower 32 bits are needed */ + CY_CRYPTO_VU_UMUL (t, t_double, mont_mod_der); + + /* Clear the MSB bit (cut to size length) */ + CY_CRYPTO_VU_LSL1(t, t); + CY_CRYPTO_VU_LSR1(t, t); + + CY_CRYPTO_VU_UMUL (u_double, t, mod); + + CY_CRYPTO_VU_ADD (u_double, u_double, t_double); + + CY_CRYPTO_VU_MOV_STATUS_TO_REG (status); + + CY_CRYPTO_VU_LSR (u_double, u_double, sh); + + CY_CRYPTO_VU_SET_TO_ZERO (t); + CY_CRYPTO_VU_SET_REG (sh, 0, 1); + CY_CRYPTO_VU_SET_BIT (t, sh); + CY_CRYPTO_VU_SET_REG (sh, size, 1); + CY_CRYPTO_VU_LSL (t, t, sh); + + CY_CRYPTO_VU_MOV_REG_TO_STATUS (status); + Cy_Crypto_Core_WaitForReady(); + + CY_CRYPTO_VU_COND_XOR (CY_CRYPTO_VU_COND_CS, u_double, u_double, t); + + /* C = (a >= b) */ + CY_CRYPTO_VU_SUB (t_double, u_double, mod); + + CY_CRYPTO_VU_COND_SWAP_REG (CY_CRYPTO_VU_COND_CS, u_double, t_double); + + CY_CRYPTO_VU_MOV (z, u_double); + + CY_CRYPTO_VU_FREE_MEM ((1 << t_double) | (1 << u_double) | (1 << t)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Rsa_expModByMont +****************************************************************************//** +* +* Perform y = x^e mod n using Montgomery reduction technique to speed-up +* calculation. Suitable for cases with short e. +* +* \param y +* Register index for calculated value. +* +* \param x +* Register index for multiplicand value. +* +* \param e +* Register index for exponent value. +* +* \param n +* Register index for modulo value. +* +* \param size +* modulo size, in Bits +* +*******************************************************************************/ +void Cy_Crypto_Core_Rsa_expModByMont(uint32_t y, + uint32_t x, + uint32_t e, + uint32_t n, + uint32_t barretCoef, + uint32_t inverseModulo, + uint32_t rBar, + uint32_t size) +{ + int32_t i; + uint16_t j; + uint16_t status; + uint16_t carry; + uint16_t clsame; + + uint32_t my_y = 5; + uint32_t my_x = 6; + uint32_t my_e = 7; + uint32_t my_n = 8; + uint32_t R0_1 = 9; + uint32_t n_prime = 10; + uint32_t temp = 11; + uint32_t barrett_u = 12; + uint32_t x_bar = 13; + uint32_t REG = 14; + + + CY_CRYPTO_VU_PUSH_REG(); + + CY_CRYPTO_VU_LD_REG(my_x, x); + CY_CRYPTO_VU_LD_REG(my_y, y); + CY_CRYPTO_VU_LD_REG(my_e, e); + CY_CRYPTO_VU_LD_REG(my_n, n); + CY_CRYPTO_VU_LD_REG(n_prime, inverseModulo); + CY_CRYPTO_VU_LD_REG(barrett_u, barretCoef); + + CY_CRYPTO_VU_MOV(my_y, rBar); + + CY_CRYPTO_VU_ALLOC_MEM(R0_1, size); + CY_CRYPTO_VU_ALLOC_MEM(x_bar, size); + CY_CRYPTO_VU_ALLOC_MEM(temp, size); + + Cy_Crypto_Core_Rsa_MontTransform(x_bar, my_x, barrett_u, my_n, size); + Cy_Crypto_Core_WaitForReady(); + + CY_CRYPTO_VU_MOV(temp, my_e); + CY_CRYPTO_VU_SET_TO_ZERO(R0_1); + CY_CRYPTO_VU_CLSAME(REG, temp, R0_1); + + /* This is needed, otherwise clsame is wrong */ + Cy_Crypto_Core_WaitForReady(); + + clsame = Cy_Crypto_Core_Vu_RegDataPtrRead(REG); + j = Cy_Crypto_Core_Vu_RegSizeRead(temp) + 1 - clsame; + CY_CRYPTO_VU_SET_REG(REG, clsame, 1); + CY_CRYPTO_VU_LSL(temp, temp, REG); + + for (i = j; i > 0; i--) + { + + /* j is number of bits in exponent e */ + Cy_Crypto_Core_Rsa_MontMul(my_y, my_y, my_y, n_prime, my_n, size); + Cy_Crypto_Core_WaitForReady(); + + CY_CRYPTO_VU_LSL1(temp, temp); + status = Cy_Crypto_Core_Vu_StatusRead(); + carry = status & (1 << CY_CRYPTO_VU_STATUS_CARRY); + + if (carry != 0) + { + Cy_Crypto_Core_Rsa_MontMul(my_y, my_y, x_bar, n_prime, my_n, size); + } + } + + CY_CRYPTO_VU_SET_TO_ONE(R0_1); + Cy_Crypto_Core_Rsa_MontMul(my_y, my_y, R0_1, n_prime , my_n, size); + + CY_CRYPTO_VU_FREE_MEM((1 << R0_1) | (1 << x_bar) | (1 << temp)); + CY_CRYPTO_VU_POP_REG(); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Rsa_Proc +****************************************************************************//** +* +* RSA process algorithm based on the Montgomery algorithm +* using Barrett reduction +* +* https://en.wikipedia.org/wiki/RSA_%28cryptosystem%29 +* +* \param cryptoContextPtr +* Pointer to the RSA context +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Proc(cy_stc_crypto_context_rsa_t *cryptoContextPtr) +{ + cy_en_crypto_status_t result = CY_CRYPTO_SUCCESS; + + uint8_t *_expPtr = cryptoContextPtr->keyPtr->pubExpPtr; + uint32_t _expBitLength = cryptoContextPtr->keyPtr->pubExpLength; + uint8_t *_nPtr = cryptoContextPtr->keyPtr->moduloPtr; + uint32_t _nBitLength = cryptoContextPtr->keyPtr->moduloLength; + uint32_t *_messagePtr = (uint32_t*)cryptoContextPtr->messagePtr; + uint32_t _messageByteLength = cryptoContextPtr->messageLength; + uint32_t *_resultPtr = (uint32_t*)cryptoContextPtr->resultPtr; + uint8_t *_barretCoefPtr = cryptoContextPtr->keyPtr->barretCoefPtr; + uint8_t *_inverseModuloPtr = cryptoContextPtr->keyPtr->inverseModuloPtr; + uint8_t *_rBarPtr = cryptoContextPtr->keyPtr->rBarPtr; + + uint32_t _nByteLength = 0; + uint32_t _barretByteLength = 0; + uint32_t _expByteLength = 0; + + uint32_t yReg = 5; + uint32_t xReg = 6; + uint32_t eReg = 7; + uint32_t modReg = 8; + uint32_t inverseModuloReg = 9; + uint32_t barrettReg = 10; + uint32_t rBarReg = 11; + + + /* Clear all Crypto SRAM before operations */ + memset((void*)CRYPTO->MEM_BUFF, 0x00, CPUSS_CRYPTO_BUFF_SIZE * 4); + + CY_CRYPTO_VU_ALLOC_MEM(yReg, _nBitLength); + CY_CRYPTO_VU_ALLOC_MEM(xReg, _nBitLength); + CY_CRYPTO_VU_ALLOC_MEM(eReg, _nBitLength); + CY_CRYPTO_VU_ALLOC_MEM(modReg, _nBitLength); + CY_CRYPTO_VU_ALLOC_MEM(barrettReg, _nBitLength + 1); + CY_CRYPTO_VU_ALLOC_MEM(inverseModuloReg, _nBitLength); + CY_CRYPTO_VU_ALLOC_MEM(rBarReg, _nBitLength); + + _nByteLength = _nBitLength / 8; + if ((_nBitLength % 8) != 0) + { + _nByteLength += 1; + } + + _barretByteLength = (_nBitLength + 1) / 8; + if (((_nBitLength + 1) % 8) != 0) + { + _barretByteLength += 1; + } + + _expByteLength = _expBitLength / 8; + if ((_expBitLength % 8) != 0) + { + _expByteLength += 1; + } + + memcpy((void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(modReg)), _nPtr, _nByteLength); + memcpy((void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(eReg)), _expPtr, _expByteLength); + memcpy((void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(xReg)), _messagePtr, _messageByteLength); + + /* Check coefficients */ + if (_barretCoefPtr == NULL) + { + Cy_Crypto_Core_Rsa_BarrettGetU(barrettReg, modReg, _nBitLength); + Cy_Crypto_Core_WaitForReady(); + } + else + { + memcpy((void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(barrettReg)), + _barretCoefPtr, + _barretByteLength); + } + + if (_rBarPtr == NULL) + { + /* inverseModuloReg used here as temp variable */ + CY_CRYPTO_VU_SET_TO_ONE(inverseModuloReg); + Cy_Crypto_Core_Rsa_MontTransform(rBarReg, inverseModuloReg, barrettReg, modReg, _nBitLength); + Cy_Crypto_Core_WaitForReady(); + } + else + { + memcpy((void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(rBarReg)), + _rBarPtr, + _nByteLength); + } + + if (_inverseModuloPtr == NULL) + { + Cy_Crypto_Core_Rsa_MontCoeff(inverseModuloReg, modReg, _nBitLength); + Cy_Crypto_Core_WaitForReady(); + } + else + { + memcpy((void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(inverseModuloReg)), + _inverseModuloPtr, + _nByteLength); + } + + Cy_Crypto_Core_Rsa_expModByMont(yReg, + xReg, + eReg, + modReg, + barrettReg, + inverseModuloReg, + rBarReg, + _nBitLength); + + Cy_Crypto_Core_Vu_WaitForComplete(); + + /* Copy the result to output buffer */ + memcpy((void*)_resultPtr, (void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(yReg)), _nByteLength); + + CY_CRYPTO_VU_FREE_MEM((1 << yReg) | (1 << xReg) | (1 << eReg) | (1 << modReg) | + (1 << inverseModuloReg) | (1 << barrettReg) | (1 << rBarReg)); + + return (result); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Rsa_Coef +****************************************************************************//** +* +* Calculation constant coefficients to to speed-up Montgomery algorithm. +* These coefficients are: +* coefficient for Barrett reduction, +* binary inverse of the modulo, +* result of (2^moduloLength mod modulo) +* +* \param cryptoContextPtr +* Pointer to the RSA context +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Coef(cy_stc_crypto_context_rsa_t *cryptoContextPtr) +{ + cy_en_crypto_status_t result = CY_CRYPTO_SUCCESS; + + uint8_t *_nPtr = cryptoContextPtr->keyPtr->moduloPtr; + uint32_t _nBitLength = cryptoContextPtr->keyPtr->moduloLength; + uint8_t *_barretCoefPtr = cryptoContextPtr->keyPtr->barretCoefPtr; + uint8_t *_inverseModuloPtr = cryptoContextPtr->keyPtr->inverseModuloPtr; + uint8_t *_rBarPtr = cryptoContextPtr->keyPtr->rBarPtr; + uint32_t _nByteLength; + uint32_t _barretByteLength; + + uint32_t modReg = 11; + uint32_t inverseModuloReg = 12; + uint32_t barrettReg = 13; + uint32_t rBarReg = 14; + + + /* Clear all Crypto SRAM before operations */ + memset((void*)CRYPTO->MEM_BUFF, 0x00, CPUSS_CRYPTO_BUFF_SIZE * 4); + + CY_CRYPTO_VU_ALLOC_MEM(modReg, _nBitLength); + CY_CRYPTO_VU_ALLOC_MEM(barrettReg, _nBitLength + 1); + CY_CRYPTO_VU_ALLOC_MEM(inverseModuloReg, _nBitLength); + CY_CRYPTO_VU_ALLOC_MEM(rBarReg, _nBitLength); + + _nByteLength = _nBitLength / 8; + if ((_nBitLength % 8) != 0) + { + _nByteLength += 1; + } + + _barretByteLength = (_nBitLength + 1) / 8; + if (((_nBitLength + 1) % 8) != 0) + { + _barretByteLength += 1; + } + + /* Copy modulo to Crypto SRAM */ + memcpy((void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(modReg)), + _nPtr, + _nByteLength); + + Cy_Crypto_Core_Rsa_BarrettGetU(barrettReg, modReg, _nBitLength); + Cy_Crypto_Core_WaitForReady(); + + /* Copy calculated Barrett coefficient */ + memcpy((void*)_barretCoefPtr, + (void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(barrettReg)), + _barretByteLength); + + /* inverseModuloReg used here as temp variable */ + CY_CRYPTO_VU_SET_TO_ONE(inverseModuloReg); + Cy_Crypto_Core_Rsa_MontTransform(rBarReg, inverseModuloReg, barrettReg, modReg, _nBitLength); + Cy_Crypto_Core_WaitForReady(); + + /* Copy calculated r-bar = (1 << size) mod modulo */ + memcpy((void*)_rBarPtr, + (void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(rBarReg)), + _nByteLength); + + Cy_Crypto_Core_Rsa_MontCoeff(inverseModuloReg, modReg, _nBitLength); + Cy_Crypto_Core_WaitForReady(); + + /* Copy calculated inverse modulo */ + memcpy((void*)_inverseModuloPtr, + (void*)((uint32_t)CRYPTO->MEM_BUFF + 4 * Cy_Crypto_Core_Vu_RegDataPtrRead(inverseModuloReg)), + _nByteLength); + + CY_CRYPTO_VU_FREE_MEM((1 << modReg) | (1 << inverseModuloReg) | (1 << barrettReg) | (1 << rBarReg)); + + return (result); +} + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_rsa.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_rsa.h new file mode 100644 index 0000000000..86bc2c9e15 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_rsa.h @@ -0,0 +1,62 @@ +/***************************************************************************//** +* \file cy_crypto_core_rsa.h +* \version 1.0 +* +* \brief +* This file provides provides constant and parameters +* for the API of the RSA in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CORE_RSA_H) +#define CY_CRYPTO_CORE_RSA_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) + + +/* Crypto IP condition codes (vector unit) */ +#define CY_CRYPTO_VU_COND_ALWAYS (0x00u) +#define CY_CRYPTO_VU_COND_EQ (0x01u) +#define CY_CRYPTO_VU_COND_NE (0x02u) +#define CY_CRYPTO_VU_COND_CS (0x03u) +#define CY_CRYPTO_VU_COND_CC (0x04u) +#define CY_CRYPTO_VU_COND_HI (0x05u) +#define CY_CRYPTO_VU_COND_LS (0x06u) +#define CY_CRYPTO_VU_COND_EVEN (0x07u) +#define CY_CRYPTO_VU_COND_ODD (0x08u) + + +/* Crypto IP status (vector unit) */ +#define CY_CRYPTO_VU_STATUS_ONE (3u) +#define CY_CRYPTO_VU_STATUS_ZERO (2u) +#define CY_CRYPTO_VU_STATUS_EVEN (1u) +#define CY_CRYPTO_VU_STATUS_CARRY (0u) + + +cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Proc(cy_stc_crypto_context_rsa_t *cryptoContextPtr); +cy_en_crypto_status_t Cy_Crypto_Core_Rsa_Coef(cy_stc_crypto_context_rsa_t *cryptoContextPtr); + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +#if (CY_CRYPTO_USER_PKCS1_5 == 1) +cy_en_crypto_status_t Cy_Crypto_Core_RsaVerify(cy_stc_crypto_context_rsa_ver_t *cryptoContextPtr); +#endif /* #if (CY_CRYPTO_USER_PKCS1_5 == 1) */ + + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_RSA_H) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_sha.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_sha.c new file mode 100644 index 0000000000..e1acdc61f9 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_sha.c @@ -0,0 +1,442 @@ +/***************************************************************************//** +* \file cy_crypto_core_sha.c +* \version 1.0 +* +* \brief +* This file provides the source code to the API for the SHA method +* in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_sha.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_str.h" +#include "syslib/cy_syslib.h" +#include + + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) + + +/* Initialization vectors for different modes of the SHA algorithm */ +#if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) +static const uint32_t Sha1InitHash[] = +{ + 0x67452301uL, 0xEFCDAB89uL, 0x98BADCFEuL, 0x10325476uL, + 0xC3D2E1F0uL +}; +#endif /* #if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) +static const uint32_t Sha224InitHash[] = +{ + 0xC1059ED8uL, 0x367CD507uL, 0x3070DD17uL, 0xF70E5939uL, + 0xFFC00B31uL, 0x68581511uL, 0x64F98FA7uL, 0xBEFA4FA4uL +}; + +static const uint32_t Sha256InitHash[] = +{ + 0x6A09E667uL, 0xBB67AE85uL, 0x3C6EF372uL, 0xA54FF53AuL, + 0x510E527FuL, 0x9B05688CuL, 0x1F83D9ABuL, 0x5BE0CD19uL +}; +#endif /* #if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) +static const uint32_t Sha512_224InitHash[] = +{ + 0x8C3D37C8uL, 0x19544DA2uL, 0x73E19966uL, 0x89DCD4D6uL, + 0x1DFAB7AEuL, 0x32FF9C82uL, 0x679DD514uL, 0x582F9FCFuL, + 0x0F6D2B69uL, 0x7BD44DA8uL, 0x77E36F73uL, 0x04C48942uL, + 0x3F9D85A8uL, 0x6A1D36C8uL, 0x1112E6ADuL, 0x91D692A1uL +}; + +static const uint32_t Sha512_256InitHash[] = +{ + 0x22312194uL, 0xFC2BF72CuL, 0x9F555FA3uL, 0xC84C64C2uL, + 0x2393B86BuL, 0x6F53B151uL, 0x96387719uL, 0x5940EABDuL, + 0x96283EE2uL, 0xA88EFFE3uL, 0xBE5E1E25uL, 0x53863992uL, + 0x2B0199FCuL, 0x2C85B8AAuL, 0x0EB72DDCuL, 0x81C52CA2uL +}; + +static const uint32_t Sha384InitHash[] = +{ + 0xCBBB9D5DuL, 0xC1059ED8uL, 0x629A292AuL, 0x367CD507uL, + 0x9159015AuL, 0x3070DD17uL, 0x152FECD8uL, 0xF70E5939uL, + 0x67332667uL, 0xFFC00B31uL, 0x8EB44A87uL, 0x68581511uL, + 0xDB0C2E0DuL, 0x64F98FA7uL, 0x47B5481DuL, 0xBEFA4FA4uL +}; + +static const uint32_t Sha512InitHash[] = +{ + 0x6A09E667uL, 0xF3BCC908uL, 0xBB67AE85uL, 0x84CAA73BuL, + 0x3C6EF372uL, 0xFE94F82BuL, 0xA54FF53AuL, 0x5F1D36F1uL, + 0x510E527FuL, 0xADE682D1uL, 0x9B05688CuL, 0x2B3E6C1FuL, + 0x1F83D9ABuL, 0xFB41BD6BuL, 0x5BE0CD19uL, 0x137E2179uL +}; +#endif /* #if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) */ + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Sha_ProcessBlock +****************************************************************************//** +* +* Performs the SHA calculation on one block. +* All addresses must be 4-Byte aligned! +* +* This function available for CM0+ core only. +* +* \param hashStatePtr +* The pointer to a Hash State. +* +* \param blockPtr +* The pointer to the block whose Hash is being computed. +* +*******************************************************************************/ +void Cy_Crypto_Core_Sha_ProcessBlock(cy_stc_crypto_sha_state_t *hashStatePtr, uint32_t *blockPtr) +{ + Cy_Crypto_SetReg4Instr((uint32_t)blockPtr, + (uint32_t)hashStatePtr->hashPtr, /* Initial hash */ + (uint32_t)hashStatePtr->roundMemPtr, + (uint32_t)hashStatePtr->hashPtr); /* Digest */ + + /* Issue the SHA instruction */ + Cy_Crypto_Run4ParamInstr(CY_CRYPTO_SHA_OPC, + CY_CRYPTO_RSRC0_SHIFT, + CY_CRYPTO_RSRC4_SHIFT, + CY_CRYPTO_RSRC8_SHIFT, + CY_CRYPTO_RSRC12_SHIFT); + + /* Wait until the SHA instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_SHA_BUSY, CRYPTO->STATUS)) + { + } +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Sha_Init +****************************************************************************//** +* +* The function to initialize SHA operation. +* +* This function available for CM0+ core only. +* +* \param hashStatePtr +* The pointer to a Hash State. +* +* \param mode +* One of these: CY_CRYPTO_SHA256, CY_CRYPTO_SHA1, CY_CRYPTO_SHA256_224, CY_CRYPTO_SHA512, +* CY_CRYPTO_SHA384, CY_CRYPTO_SHA512_224, CY_CRYPTO_SHA512_256 +* +*******************************************************************************/ +void Cy_Crypto_Core_Sha_Init(cy_stc_crypto_sha_state_t *hashStatePtr, + uint8_t *blockPtr, + uint32_t *hashPtr, + uint32_t *roundMemPtr, + cy_en_crypto_sha_mode_t mode) +{ + cy_en_crypto_sha_hw_mode_t shaHwMode; + +#if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) + shaHwMode = CY_CRYPTO_SHA_CTL_MODE_SHA512; +#endif /* #if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) */ + + switch (mode) + { +#if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) + + case CY_CRYPTO_MODE_SHA1: + shaHwMode = CY_CRYPTO_SHA_CTL_MODE_SHA1; + hashStatePtr->initialHashPtr = Sha1InitHash; + hashStatePtr->blockSize = CY_CRYPTO_SHA1_BLOCK_SIZE; + hashStatePtr->hashSize = CY_CRYPTO_SHA1_HASH_SIZE; + hashStatePtr->digestSize = CY_CRYPTO_SHA1_DIGEST_SIZE; + hashStatePtr->roundMemSize = CY_CRYPTO_SHA1_ROUND_MEM_SIZE; + break; +#endif /* #if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) + + case CY_CRYPTO_MODE_SHA224: + shaHwMode = CY_CRYPTO_SHA_CTL_MODE_SHA256; + hashStatePtr->initialHashPtr = Sha224InitHash; + hashStatePtr->blockSize = CY_CRYPTO_SHA256_BLOCK_SIZE; + hashStatePtr->hashSize = CY_CRYPTO_SHA256_HASH_SIZE; + hashStatePtr->digestSize = CY_CRYPTO_SHA224_DIGEST_SIZE; + hashStatePtr->roundMemSize = CY_CRYPTO_SHA256_ROUND_MEM_SIZE; + break; + + case CY_CRYPTO_MODE_SHA256: + shaHwMode = CY_CRYPTO_SHA_CTL_MODE_SHA256; + hashStatePtr->initialHashPtr = Sha256InitHash; + hashStatePtr->blockSize = CY_CRYPTO_SHA256_BLOCK_SIZE; + hashStatePtr->hashSize = CY_CRYPTO_SHA256_HASH_SIZE; + hashStatePtr->digestSize = CY_CRYPTO_SHA256_DIGEST_SIZE; + hashStatePtr->roundMemSize = CY_CRYPTO_SHA256_ROUND_MEM_SIZE; + break; +#endif /* #if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) + + case CY_CRYPTO_MODE_SHA384: + hashStatePtr->initialHashPtr = Sha384InitHash; + hashStatePtr->blockSize = CY_CRYPTO_SHA512_BLOCK_SIZE; + hashStatePtr->hashSize = CY_CRYPTO_SHA512_HASH_SIZE; + hashStatePtr->digestSize = CY_CRYPTO_SHA384_DIGEST_SIZE; + hashStatePtr->roundMemSize = CY_CRYPTO_SHA512_ROUND_MEM_SIZE; + break; + + case CY_CRYPTO_MODE_SHA512: + hashStatePtr->initialHashPtr = Sha512InitHash; + hashStatePtr->blockSize = CY_CRYPTO_SHA512_BLOCK_SIZE; + hashStatePtr->hashSize = CY_CRYPTO_SHA512_HASH_SIZE; + hashStatePtr->digestSize = CY_CRYPTO_SHA512_DIGEST_SIZE; + hashStatePtr->roundMemSize = CY_CRYPTO_SHA512_ROUND_MEM_SIZE; + break; + + case CY_CRYPTO_MODE_SHA512_224: + hashStatePtr->initialHashPtr = Sha512_224InitHash; + hashStatePtr->blockSize = CY_CRYPTO_SHA512_BLOCK_SIZE; + hashStatePtr->hashSize = CY_CRYPTO_SHA512_HASH_SIZE; + hashStatePtr->digestSize = CY_CRYPTO_SHA512_224_DIGEST_SIZE; + hashStatePtr->roundMemSize = CY_CRYPTO_SHA512_ROUND_MEM_SIZE; + break; + + case CY_CRYPTO_MODE_SHA512_256: + hashStatePtr->initialHashPtr = Sha512_256InitHash; + hashStatePtr->blockSize = CY_CRYPTO_SHA512_BLOCK_SIZE; + hashStatePtr->hashSize = CY_CRYPTO_SHA512_HASH_SIZE; + hashStatePtr->digestSize = CY_CRYPTO_SHA512_256_DIGEST_SIZE; + hashStatePtr->roundMemSize = CY_CRYPTO_SHA512_ROUND_MEM_SIZE; + break; +#endif /* #if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) */ + + default: + break; + } + + hashStatePtr->mode = mode; + hashStatePtr->blockPtr = blockPtr; + hashStatePtr->hashPtr = hashPtr; + hashStatePtr->roundMemPtr = roundMemPtr; + + /* Set the SHA mode */ + CRYPTO->SHA_CTL = (uint32_t)(_VAL2FLD(CRYPTO_SHA_CTL_MODE, (uint32_t)shaHwMode)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Sha_Start +****************************************************************************//** +* +* Initializes the initial hash vector. +* +* This function available for CM0+ core only. +* +* \param hashStatePtr +* The pointer to the SHA context. +* +*******************************************************************************/ +void Cy_Crypto_Core_Sha_Start(cy_stc_crypto_sha_state_t *hashStatePtr) +{ + memcpy(hashStatePtr->hashPtr, hashStatePtr->initialHashPtr, hashStatePtr->hashSize); +} + +/******************************************************************************* +* Function Name: Crypto_Server_SHA_Update +****************************************************************************//** +* +* Performs the SHA calculation on one message. +* +* This function available for CM0+ core only. +* +* \param hashStatePtr +* The pointer to the SHA context. +* +* \param messagePtr +* The pointer to the message whose Hash is being computed. +* +* \param messageSize +* The size of the message whose Hash is being computed. +* +*******************************************************************************/ +void Cy_Crypto_Core_Sha_Update(cy_stc_crypto_sha_state_t *hashStatePtr, + uint32_t *messagePtr, + uint32_t messageSize) +{ + uint8_t *blockPtrTmp = hashStatePtr->blockPtr; + uint32_t blockSizeTmp = hashStatePtr->blockSize; + uint32_t blockIdx = messageSize & (blockSizeTmp - 1u); + hashStatePtr->messageSize = messageSize; + + if (messageSize >= blockSizeTmp) + { + while (messageSize >= blockSizeTmp) + { + Cy_Crypto_Core_Sha_ProcessBlock(hashStatePtr, messagePtr); + + /* Use /4 because the pointer is to uint32_t and blockSize is in Bytes */ + messagePtr += (blockSizeTmp / 4u); + messageSize -= blockSizeTmp; + } + } + + /* Copy the end of the message to the block */ + memcpy(blockPtrTmp, messagePtr, blockIdx); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Sha_Finish +****************************************************************************//** +* +* Completes SHA calculation. +* +* This function available for CM0+ core only. +* +* \param hashStatePtr +* The pointer to the SHA context. +* +* \param digestPtr +* The pointer to the calculated hash digest. +* +* \param finalMessageSize +* The final message size, can be different from the messageSize +* if you use command Cy_Crypto_Core_Sha_ProcessBlock() before. +* +*******************************************************************************/ +void Cy_Crypto_Core_Sha_Finish(cy_stc_crypto_sha_state_t *hashStatePtr, + uint32_t *digestPtr, + uint32_t finalMessageSize) +{ + uint32_t *hashTmpPtr = hashStatePtr->hashPtr; + uint8_t *blockTmpPtr = hashStatePtr->blockPtr; + uint32_t blockSizeTmp = hashStatePtr->blockSize; + uint32_t blockIdx = (uint32_t)(hashStatePtr->messageSize & (blockSizeTmp - 1u)); + uint32_t size; + + if (CY_CRYPTO_SHA512_BLOCK_SIZE == blockSizeTmp) + { + size = CY_CRYPTO_SHA512_PAD_SIZE; /* Pad size = 112 */ + } + else + { + size = CY_CRYPTO_SHA256_PAD_SIZE; /* Pad size = 56 */ + } + + /* Append 1 bit to the end of the message */ + blockTmpPtr[blockIdx] = 0x80u; + + /* Clear the rest of the block */ + memset((void* )&blockTmpPtr[blockIdx + 1u], 0x00u, (blockSizeTmp - blockIdx - 1u)); + + if (blockIdx >= size) + { + /* Here we need one additional last block to calculate SHA, prepare it: */ + Cy_Crypto_Core_Sha_ProcessBlock(hashStatePtr, (uint32_t*)blockTmpPtr); + + /* Clear the last block */ + memset(blockTmpPtr, 0x00u, blockSizeTmp); + } + + /* Write at the end length of the message, in Bits */ + blockTmpPtr[blockSizeTmp - 4u] = (uint8_t)((finalMessageSize * 8uL) >> 24u); + blockTmpPtr[blockSizeTmp - 3u] = (uint8_t)((finalMessageSize * 8uL) >> 16u); + blockTmpPtr[blockSizeTmp - 2u] = (uint8_t)((finalMessageSize * 8uL) >> 8u); + blockTmpPtr[blockSizeTmp - 1u] = (uint8_t)(finalMessageSize * 8uL); + + /* Process the last block */ + Cy_Crypto_Core_Sha_ProcessBlock(hashStatePtr, (uint32_t*)blockTmpPtr); + + /* Invert endians of the hash and copy it to digestPtr, re-use the size variable */ + size = (uint32_t)(hashStatePtr->digestSize / 4u); + + for(; size != 0u; size--) + { + *digestPtr = CY_SWAP_ENDIAN32(*hashTmpPtr); + digestPtr++; + hashTmpPtr++; + } + +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Sha_Free +****************************************************************************//** +* +* Clears the used memory buffers. +* +* This function available for CM0+ core only. +* +* \param hashStatePtr +* The pointer to the SHA context. +* +*******************************************************************************/ +void Cy_Crypto_Core_Sha_Free(cy_stc_crypto_sha_state_t *hashStatePtr) +{ + /* Clears the memory buffer. */ + memset(hashStatePtr->blockPtr, 0x00u, hashStatePtr->blockSize); + memset(hashStatePtr->hashPtr, 0x00u, hashStatePtr->hashSize); + memset(hashStatePtr->roundMemPtr, 0x00u, hashStatePtr->roundMemSize); +} + +/******************************************************************************* +* Function Name: Crypto_Core_Sha +****************************************************************************//** +* +* Performs the SHA Hash function. +* +* This function available for CM0+ core only. +* +* \param cryptoShaContext +* the pointer to the stc_crypto_context_t structure which stores all internal variables +* for Crypto driver. +* +* \return +* A Crypto status \ref en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Sha(cy_stc_crypto_context_sha_t *cryptoShaContext) +{ + uint32_t *messageTmpPtr = cryptoShaContext->messagePtr; + uint32_t messageSizeTmp = cryptoShaContext->messageSize; + uint32_t *digestPtr = cryptoShaContext->dstPtr; + cy_en_crypto_sha_mode_t modeTmp = cryptoShaContext->mode; + + /* Allocate CRYPTO_MAX_BLOCK_SIZE Bytes for blockPtr */ + uint8_t *blockPtr = (uint8_t*)CRYPTO->MEM_BUFF; + + /* Allocate CRYPTO_MAX_HASH_SIZE Bytes for hashPtr */ + uint32_t *hashPtr = (uint32_t*)(blockPtr + CY_CRYPTO_MAX_BLOCK_SIZE); + + /* Allocate CRYPTO_MAX_ROUND_MEM_SIZE Bytes for roundMemPtr */ + uint32_t *roundMemPtr = (uint32_t*)((uint8_t*)hashPtr + CY_CRYPTO_MAX_HASH_SIZE); + + /* Allocate space for the structure which stores the SHA context */ + cy_stc_crypto_sha_state_t *hashStatePtr = + (cy_stc_crypto_sha_state_t*)((uint8_t*)roundMemPtr + CY_CRYPTO_MAX_ROUND_MEM_SIZE); + + /* Initialize the hashStatePtr structure with zeros */ + memset(hashStatePtr, 0x00u, sizeof(cy_stc_crypto_sha_state_t)); + + Cy_Crypto_Core_Sha_Init (hashStatePtr, blockPtr, hashPtr, roundMemPtr, modeTmp); + Cy_Crypto_Core_Sha_Start (hashStatePtr); + Cy_Crypto_Core_Sha_Update (hashStatePtr, messageTmpPtr, messageSizeTmp); + Cy_Crypto_Core_Sha_Finish (hashStatePtr, digestPtr, messageSizeTmp); + Cy_Crypto_Core_Sha_Free (hashStatePtr); + + return (CY_CRYPTO_SUCCESS); +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_sha.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_sha.h new file mode 100644 index 0000000000..ce7f62dac0 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_sha.h @@ -0,0 +1,115 @@ +/***************************************************************************//** +* \file cy_crypto_core_sha.h +* \version 1.0 +* +* \brief +* This file provides constants and function prototypes +* for the API for the SHA method in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_CRYPTO_CORE_SHA_H) +#define CY_CRYPTO_CORE_SHA_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) + +/** \cond INTERNAL */ + +/* Defines for the SHA algorithm */ +#define CY_CRYPTO_SHA1_BLOCK_SIZE (64u) +#define CY_CRYPTO_SHA256_BLOCK_SIZE (64u) +#define CY_CRYPTO_SHA512_BLOCK_SIZE (128u) +#define CY_CRYPTO_MAX_BLOCK_SIZE (128u) + +#define CY_CRYPTO_SHA256_PAD_SIZE (56uL) +#define CY_CRYPTO_SHA512_PAD_SIZE (112uL) + +#define CY_CRYPTO_SHA1_HASH_SIZE (20u) +#define CY_CRYPTO_SHA256_HASH_SIZE (64u) +#define CY_CRYPTO_SHA512_HASH_SIZE (128u) +#define CY_CRYPTO_MAX_HASH_SIZE (128u) + +#define CY_CRYPTO_SHA1_ROUND_MEM_SIZE (320uL) +#define CY_CRYPTO_SHA256_ROUND_MEM_SIZE (256uL) +#define CY_CRYPTO_SHA512_ROUND_MEM_SIZE (640uL) +#define CY_CRYPTO_MAX_ROUND_MEM_SIZE (640uL) + +/* The structure for storing the SHA context */ +typedef struct +{ + cy_en_crypto_sha_mode_t mode; + uint8_t *blockPtr; + uint32_t blockSize; + uint32_t *hashPtr; + uint32_t hashSize; + uint32_t *roundMemPtr; + uint32_t roundMemSize; + uint32_t messageSize; + uint32_t digestSize; + const uint32_t *initialHashPtr; +} cy_stc_crypto_sha_state_t; + + +typedef enum +{ + +#if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) + CY_CRYPTO_SHA_CTL_MODE_SHA1 = 0u, +#endif /* #if ((CPUSS_CRYPTO_SHA1 == 1) && (CY_CRYPTO_USER_SHA1 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) + CY_CRYPTO_SHA_CTL_MODE_SHA256 = 1u, +#endif /* #if ((CPUSS_CRYPTO_SHA256 == 1) && (CY_CRYPTO_USER_SHA256 == 1)) */ + +#if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) + CY_CRYPTO_SHA_CTL_MODE_SHA512 = 2u, +#endif /* #if ((CPUSS_CRYPTO_SHA512 == 1) && (CY_CRYPTO_USER_SHA512 == 1)) */ + +} cy_en_crypto_sha_hw_mode_t; + + +void Cy_Crypto_Core_Sha_Init(cy_stc_crypto_sha_state_t *hashStatePtr, + uint8_t *blockPtr, + uint32_t *hashPtr, + uint32_t *roundMemPtr, + cy_en_crypto_sha_mode_t mode); + +void Cy_Crypto_Core_Sha_ProcessBlock(cy_stc_crypto_sha_state_t *hashStatePtr, + uint32_t *blockPtr); + +void Cy_Crypto_Core_Sha_Start(cy_stc_crypto_sha_state_t *hashStatePtr); + +void Cy_Crypto_Core_Sha_Update(cy_stc_crypto_sha_state_t *hashStatePtr, + uint32_t *messagePtr, + uint32_t messageSize); + +void Cy_Crypto_Core_Sha_Finish(cy_stc_crypto_sha_state_t *hashStatePtr, + uint32_t *digestPtr, + uint32_t finalMessageSize); + +void Cy_Crypto_Core_Sha_Free(cy_stc_crypto_sha_state_t *hashStatePtr); + +cy_en_crypto_status_t Cy_Crypto_Core_Sha(cy_stc_crypto_context_sha_t *cryptoShaContext); + +/** \endcond */ + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_SHA_H) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_str.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_str.c new file mode 100644 index 0000000000..1852ff670e --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_str.c @@ -0,0 +1,194 @@ +/***************************************************************************//** +* \file cy_crypto_core_str.c +* \version 1.0 +* +* \brief +* This file provides the source code for the string management API +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_crypto_common.h" +#include "cy_crypto_core_str.h" +#include "cy_crypto_core_instructions.h" +#include "cy_crypto_core_util.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) + + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Str_MemCpy +****************************************************************************//** +* +* Function MemCpy uses Crypto HW. +* Memory structures should not overlap! +* There is no alignment restriction. +* +* This function available for CM0+ core only. +* +* \param src +* The pointer to the source of MemCpy. +* +* \param dst +* The pointer to the destination of MemCpy. +* +* \param size +* The size in bytes of the copy operation. +* +*******************************************************************************/ +void Cy_Crypto_Core_Str_MemCpy(void* dstPtr, void const *srcPtr, uint16_t size) +{ + /* Prepare data in the register file for next instruction */ + Cy_Crypto_SetReg3Instr((uint32_t)srcPtr, + (uint32_t)dstPtr, + (uint32_t)size); + + /* Issue the STR_MEMCPY instruction */ + Cy_Crypto_Run3ParamInstr(CY_CRYPTO_STR_MEMCPY_OPC, + CY_CRYPTO_RSRC0_SHIFT, + CY_CRYPTO_RSRC4_SHIFT, + CY_CRYPTO_RSRC8_SHIFT); + + /* Wait until the STR instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_STR_BUSY, CRYPTO->STATUS)) + { + } +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Str_MemSet +****************************************************************************//** +* +* Function MemSet uses Crypto HW. +* There is no alignment restriction. +* +* This function available for CM0+ core only. +* +* \param dst +* The pointer to the destination of MemSet. + +* \param data +* The value to be set. + +* \param size +* The size in bytes of the set operation. +* +*******************************************************************************/ +void Cy_Crypto_Core_Str_MemSet(void* dstPtr, uint8_t data, uint16_t size) +{ + Cy_Crypto_SetReg3Instr((uint32_t)dstPtr, + (uint32_t)size, + (uint32_t)data); + + /* Issue the STR_MEMSET instruction */ + Cy_Crypto_Run3ParamInstr(CY_CRYPTO_STR_MEMSET_OPC, + CY_CRYPTO_RSRC0_SHIFT, + CY_CRYPTO_RSRC8_SHIFT, + CY_CRYPTO_RSRC12_SHIFT); + + /* Wait until the STR instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_STR_BUSY, CRYPTO->STATUS)) + { + } +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Str_MemCmp +****************************************************************************//** +* +* Function MemCmp uses Crypto HW. +* There is no alignment restriction. +* +* This function available for CM0+ core only. +* +* \param src0 +* The pointer to the first source of MemCmp. + +* \param src1 +* The pointer to the second source of MemCmp. + +* \param size +* the size in bytes of the compare operation. +* +* \return +* 0 - if Source 1 = Source 2, 1 - if not. +* +*******************************************************************************/ +uint32_t Cy_Crypto_Core_Str_MemCmp(void const *src0Ptr, void const *src1Ptr, uint16_t size) +{ + Cy_Crypto_SetReg3Instr((uint32_t)src0Ptr, + (uint32_t)src1Ptr, + (uint32_t)size); + + /* Issue the STR_MEMCMP instruction */ + Cy_Crypto_Run3ParamInstr(CY_CRYPTO_STR_MEMCMP_OPC, + CY_CRYPTO_RSRC0_SHIFT, + CY_CRYPTO_RSRC4_SHIFT, + CY_CRYPTO_RSRC8_SHIFT); + + /* Wait until the STR instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_STR_BUSY, CRYPTO->STATUS)) + { + } + + return((uint32_t)(CRYPTO->STR_RESULT)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Str_MemXor +****************************************************************************//** +* +* Function MemXor uses Crypto HW. +* Memory structures should not overlap! +* There is no alignment restriction. +* +* This function available for CM0+ core only. +* +* \param src0 +* The pointer to the first source of MemXor. + +* \param src1 +* The pointer to the second source of MemXor. + +* \param dest +* The pointer to the destination of MemXor. +* +* \param size +* The size in bytes of the compare operation. +* +*******************************************************************************/ +void Cy_Crypto_Core_Str_MemXor(void const *src0Ptr, void const *src1Ptr, void* dstPtr, uint16_t size) +{ + Cy_Crypto_SetReg4Instr((uint32_t)src0Ptr, + (uint32_t)src1Ptr, + (uint32_t)size, + (uint32_t)dstPtr); + + /* Issue the STR_MEMXOR instruction */ + Cy_Crypto_Run4ParamInstr(CY_CRYPTO_STR_MEMXOR_OPC, + CY_CRYPTO_RSRC0_SHIFT, + CY_CRYPTO_RSRC4_SHIFT, + CY_CRYPTO_RSRC8_SHIFT, + CY_CRYPTO_RSRC12_SHIFT); + + /* Wait until the STR instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_STR_BUSY, CRYPTO->STATUS)) + { + } +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_str.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_str.h new file mode 100644 index 0000000000..7f0c4e5e84 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_str.h @@ -0,0 +1,43 @@ +/***************************************************************************//** +* \file cy_crypto_core_str.h +* \version 1.0 +* +* \brief +* This file provides the headers for the string management API +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_CRYPTO_CORE_STR_H) +#define CY_CRYPTO_CORE_STR_H + +#include "cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_STR == 1) & (CY_CRYPTO_USER_STR == 1)) + + +void Cy_Crypto_Core_Str_MemCpy(void* dstPtr, void const *srcPtr, uint16_t size); +void Cy_Crypto_Core_Str_MemSet(void* dstPtr, uint8_t data, uint16_t size); +uint32_t Cy_Crypto_Core_Str_MemCmp(void const *src0Ptr, void const *src1Ptr, uint16_t size); +void Cy_Crypto_Core_Str_MemXor(void const *src0Ptr, void const *src1Ptr, void* dstPtr, uint16_t size); + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_STR == 1) & (CY_CRYPTO_USER_STR == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_STR_H) */ + + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng.c new file mode 100644 index 0000000000..0360d8ee16 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng.c @@ -0,0 +1,93 @@ +/***************************************************************************//** +* \file cy_crypto_core_trng.c +* \version 1.0 +* +* \brief +* This file provides the source code to the API for the TRNG +* in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_trng.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_trng_config.h" +#include "syslib/cy_syslib.h" + + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) + +/******************************************************************************* +* Function Name: Crypto_Server_Trng_Init +****************************************************************************//** +* +* Initializes the TRND parameters. +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +void Cy_Crypto_Server_Trng_Init(void) +{ + CRYPTO->TR_CTL0 = CY_CRYPTO_TR_CTL0_VAL; + CRYPTO->TR_CTL1 = CY_CRYPTO_TR_CTL1_VAL; + CRYPTO->TR_MON_CTL = CY_CRYPTO_TR_BTSTR_SEL; + CRYPTO->TR_MON_CMD = CY_CRYPTO_TR_START_MON; + CRYPTO->TR_MON_RC_CTL = CY_CRYPTO_TR_RC_CUTOFF; + CRYPTO->TR_MON_AP_CTL = CY_CRYPTO_TR_AC_CUTOFF; +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Trng +****************************************************************************//** +* +* Generates a True Random Number and returns it in the +* cryptoTrngContext->trngNumPtr. +* +* This function available for CM0+ core only. +* +* \param cryptoTrngContext +* The pointer to the stc_crypto_context_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Trng(cy_stc_crypto_context_trng_t *cryptoTrngContext) +{ + Cy_Crypto_Server_Trng_Init(); + + CRYPTO->TR_GARO_CTL = (uint32_t)cryptoTrngContext->GAROPol; + CRYPTO->TR_FIRO_CTL = (uint32_t)cryptoTrngContext->FIROPol; + + CRYPTO->INSTR_FF_WR = (uint32_t)(CY_CRYPTO_SET_REG1_OPC << CY_CRYPTO_OPCODE_POS); + + CRYPTO->INSTR_FF_WR = (uint32_t)cryptoTrngContext->max; + + CRYPTO->INSTR_FF_WR = (uint32_t)((uint32_t)CY_CRYPTO_TRNG_OPC << CY_CRYPTO_OPCODE_POS); + + /* Wait until the TRNG instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_TR_BUSY, CRYPTO->STATUS)) + { + } + + *cryptoTrngContext->trngNumPtr = (uint32_t)_FLD2VAL(CRYPTO_TR_RESULT_DATA32, CRYPTO->TR_RESULT); + + return (CY_CRYPTO_SUCCESS); +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng.h new file mode 100644 index 0000000000..40678e30f7 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng.h @@ -0,0 +1,37 @@ +/***************************************************************************//** +* \file cy_crypto_core_trng.h +* \version 1.0 +* +* \brief +* This file provides provides constant and parameters +* for the API of the TRNG in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CORE_TRNG_H) +#define CY_CRYPTO_CORE_TRNG_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) + + +cy_en_crypto_status_t Cy_Crypto_Core_Trng(cy_stc_crypto_context_trng_t *cryptoTrngContext); + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) */ +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_TRNG_H) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng_config.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng_config.h new file mode 100644 index 0000000000..1600d040f9 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng_config.h @@ -0,0 +1,239 @@ +/***************************************************************************//** +* \file cy_crypto_core_trng_config.h +* \version 1.0 +* +* \brief +* This file provides internal (not public) constant and parameters +* for the Crypto TRNG driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CORE_TRNG_CONFIG_H) +#define CY_CRYPTO_CORE_TRNG_CONFIG_H + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_TR == 1)) + + +/** TRNG Configuration default values */ +/** +* Specifies the clock divider that is used to sample oscillator data. +* This clock divider is wrt. "clk_sys". +* "0": sample clock is "clk_sys". +* "1": sample clock is "clk_sys"/2. +* ... +* "255": sample clock is "clk_sys"/256. +*/ +#define CY_CRYPTO_TR_SAMPLE_CLOCK_DIV (0UL) + +/** +* Specifies the clock divider used to produce reduced bits. +* "0": 1 reduced bit is produced for each sample. +* "1": 1 reduced bit is produced for each 2 samples. +* ... +* "255": 1 reduced bit is produced for each 256 samples. +* +* The reduced bits are considered random bits and shifted into TR_RESULT0.DATA32. +*/ +#define CY_CRYPTO_TR_RED_CLOCK_DIV (0UL) + +/** +* Specifies an initialization delay: a number of removed/dropped samples before +* reduced bits are generated. This field should be programmed in the range [1, 255]. +* After starting the oscillators, at least the first 2 samples should be +* removed/dropped to clear the state of internal synchronizers. In addition, +* it is advised to drop at least the second 2 samples from the oscillators +* (to circumvent the semi-predictable oscillator start-up behavior). This results +* in the default field value of "3". the field encoding is as follows: +* "0": 1 sample is dropped. +* "1": 2 samples are dropped. +* ... +* "255": 256 samples are dropped. +* +* The TR_INITIALIZED interrupt cause is set to '1', when the initialization delay is passed. +*/ +#define CY_CRYPTO_TR_INIT_DELAY (3UL) + +/** +* Specifies if the "von Neumann corrector" is disabled or enabled: +* '0': disabled. +* '1': enabled. +* The "von Neumann corrector" post-processes the reduced bits to remove a '0' or '1' bias. +* The corrector operates on reduced bit pairs ("oldest bit, newest bit"): +* "00": no bit is produced. +* "01": '0' bit is produced (oldest bit). +* "10": '1' bit is produced (oldest bit). +* "11": no bit is produced. +* NOTE: The corrector produces bits at a random pace and at a frequency that +* is 1/4 of the reduced bit frequency (reduced bits are processed in pairs, +* and half of the pairs do NOT produce a bit). +*/ +#define CY_CRYPTO_TR_VON_NEUMANN_CORR (1UL) + +/** +* Specifies if the TRNG functionality is stopped on an adaptive proportion test +* detection (when HW sets INTR.TR_AP_DETECT to '1'): +* '0': Functionality is stopped (TR_CTL1 fields are set to '0' by HW). +* '1': Functionality is NOT stopped. +*/ +#define CY_CRYPTO_TR_STOP_ON_AP_DETECT (1UL) + +/** +* Specifies if the TRNG functionality is stopped on a repetition count test detection +* (when HW sets INTR.TR_RC_DETECT to '1'): +* '0': Functionality is stopped (TR_CTL1 fields are set to '0' by HW). +* '1': Functionality is NOT stopped. +*/ +#define CY_CRYPTO_TR_STOP_ON_RC_DETECT (1UL) + +/** FW sets this field to '1' to enable the ring oscillator with 11 inverters. */ +#define CY_CRYPTO_TR_RO11_EN (1UL) + +/** FW sets this field to '1' to enable the ring oscillator with 15 inverters. */ +#define CY_CRYPTO_TR_RO15_EN (1UL) + +/** +* FW sets this field to '1' to enable the fixed Galois ring oscillator +* with 15 inverters. +*/ +#define CY_CRYPTO_TR_GARO15_EN (1UL) + +/** +* FW sets this field to '1' to enable the programmable Galois ring oscillator with up +* to 31 inverters. The TR_GARO_CTL register specifies the programmable polynomial. +*/ +#define CY_CRYPTO_TR_GARO31_EN (1UL) + +/** FW sets this field to '1' to enable the fixed Fibonacci ring oscillator with 15 inverters. */ +#define CY_CRYPTO_TR_FIRO15_EN (1UL) + +/** +* FW sets this field to '1' to enable the programmable Fibonacci ring oscillator +* with up to 31 inverters. The TR_FIRO_CTL register specifies the programmable polynomial. +*/ +#define CY_CRYPTO_TR_FIRO31_EN (1UL) + +/** +* The polynomial for programmable Galois ring oscillator. The polynomial is represented +* WITHOUT the high order bit (this bit is always assumed '1'). The polynomial should be aligned +* so that the more significant bits (bit 30 and down) contain the polynomial and the less +* significant bits (bit 0 and up) contain padding '0's. +*/ +#define CY_CRYPTO_TR_GARO (1UL) + +/** +* The polynomial for the programmable Fibonacci ring oscillator. The polynomial is represented +* WITHOUT the high order bit (this bit is always assumed '1'). The polynomial should +* be aligned so that the more significant bits (bit 30 and down) contain the polynomial +* and the less significant bits (bit 0 and up) contain padding '0's. +*/ +#define CY_CRYPTO_TR_FIRO (1UL) + +/** +* Selection of the bit stream: +* "0": DAS bit stream. +* "1": RED bit stream. +* "2": TR bit stream. +* "3": Undefined. +*/ +#define CY_CRYPTO_TR_BITSTREAM_SEL (0UL) + +/** +* Adaptive proportion (AP) test enable: +* '0': Stopped. +* '1': Started. +* +* On AP detection, HW sets this field to '0' and sets INTR.TR_AP_DETECT to '1. +*/ +#define CY_CRYPTO_TR_START_AP (0UL) + +/** +* Repetition count (RC) test enable: +* '0': Disabled. +* '1': Enabled. +* +* On RC detection, HW sets this field to '0' and sets INTR.TR_RC_DETECT to '1. +*/ +#define CY_CRYPTO_TR_START_RC (0UL) + +/** +* Cut-off count (legal range is [1, 255]): +* "0": Illegal. +* "1": 1 repetition. +* ... +* "255": 255 repetitions. +*/ +#define CY_CRYPTO_TR_CUTOFF_COUNT8 (1UL) + +/** +Cut-off count (legal range is [1, 65535]). +"0": Illegal. +"1": 1 occurrence. +... +"65535": 65535 occurrences. +*/ +#define CY_CRYPTO_TR_CUTOFF_COUNT16 (1UL) + +/** +* The window size (minus 1) : +* "0": 1 bit. +* ... +* "65535": 65536 bits. +*/ +#define CY_CRYPTO_TR_WINDOW_SIZE (1uL) + +/** the composed value for the TR_CTL0 register */ +#define CY_CRYPTO_TR_CTL0_VAL (_VAL2FLD(CRYPTO_TR_CTL0_SAMPLE_CLOCK_DIV, CY_CRYPTO_TR_SAMPLE_CLOCK_DIV) | \ + _VAL2FLD(CRYPTO_TR_CTL0_RED_CLOCK_DIV, CY_CRYPTO_TR_RED_CLOCK_DIV) | \ + _VAL2FLD(CRYPTO_TR_CTL0_INIT_DELAY, CY_CRYPTO_TR_INIT_DELAY) | \ + _VAL2FLD(CRYPTO_TR_CTL0_VON_NEUMANN_CORR, CY_CRYPTO_TR_VON_NEUMANN_CORR) | \ + _VAL2FLD(CRYPTO_TR_CTL0_STOP_ON_AP_DETECT, CY_CRYPTO_TR_STOP_ON_AP_DETECT) | \ + _VAL2FLD(CRYPTO_TR_CTL0_STOP_ON_RC_DETECT, CY_CRYPTO_TR_STOP_ON_RC_DETECT)) + +/** The composed value for the TR_CTL1 register */ +#define CY_CRYPTO_TR_CTL1_VAL (_VAL2FLD(CRYPTO_TR_CTL1_RO11_EN, CY_CRYPTO_TR_RO11_EN) | \ + _VAL2FLD(CRYPTO_TR_CTL1_RO15_EN, CY_CRYPTO_TR_RO15_EN) | \ + _VAL2FLD(CRYPTO_TR_CTL1_GARO15_EN, CY_CRYPTO_TR_GARO15_EN) | \ + _VAL2FLD(CRYPTO_TR_CTL1_GARO31_EN, CY_CRYPTO_TR_GARO31_EN) | \ + _VAL2FLD(CRYPTO_TR_CTL1_FIRO15_EN, CY_CRYPTO_TR_FIRO15_EN) | \ + _VAL2FLD(CRYPTO_TR_CTL1_FIRO31_EN, CY_CRYPTO_TR_FIRO31_EN)) + +/** The composed value for the TR_MON_CTL register */ +#define CY_CRYPTO_TR_BTSTR_SEL (_VAL2FLD(CRYPTO_TR_MON_CTL_BITSTREAM_SEL, CY_CRYPTO_TR_BITSTREAM_SEL)) + +/** The composed value for the TR_MON_CMD register */ +#define CY_CRYPTO_TR_START_MON (_VAL2FLD(CRYPTO_TR_MON_CMD_START_AP, CY_CRYPTO_TR_START_AP) | \ + _VAL2FLD(CRYPTO_TR_MON_CMD_START_RC, CY_CRYPTO_TR_START_RC)) + +/** The composed value for the TR_MON_RC_CTL register */ +#define CY_CRYPTO_TR_RC_CUTOFF (_VAL2FLD(CRYPTO_TR_MON_RC_CTL_CUTOFF_COUNT8, CY_CRYPTO_TR_CUTOFF_COUNT8)) + +/** The composed value for the TR_MON_AP_CTL register */ +#define CY_CRYPTO_TR_AC_CUTOFF (_VAL2FLD(CRYPTO_TR_MON_AP_CTL_CUTOFF_COUNT16, CY_CRYPTO_TR_CUTOFF_COUNT16) | \ + _VAL2FLD(CRYPTO_TR_MON_AP_CTL_WINDOW_SIZE, CY_CRYPTO_TR_WINDOW_SIZE)) + +/** Default TRNG configuration */ +#define CY_CRYPTO_TR_DEFAULT_CONFIG \ +{ \ + CY_CRYPTO_TR_CTL0_VAL, \ + CY_CRYPTO_TR_CTL1_VAL, \ + CY_CRYPTO_TR_GARO, \ + CY_CRYPTO_TR_FIRO, \ + CY_CRYPTO_TR_BITSTREAM_SEL,\ + CY_CRYPTO_TR_START_MON, \ + CY_CRYPTO_TR_RC_CUTOFF, \ + CY_CRYPTO_TR_AC_CUTOFF \ +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_TR == 1)) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_TRNG_CONFIG_H) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_util.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_util.c new file mode 100644 index 0000000000..814940c544 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_util.c @@ -0,0 +1,485 @@ +/***************************************************************************//** +* \file cy_crypto_core_util.c +* \version 1.0 +* +* \brief +* This file provides the source code to the API for the utils +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "crypto/cy_crypto_core_vu_hw.h" +#include "syslib/cy_syslib.h" +#include + + +#if (CY_CPU_CORTEX_M0P) + +#if (CPUSS_CRYPTO_PRESENT == 1) + +/* The flag to state that an HW error occurred */ +bool cy_crypto_IsHwErrorOccured = false; + +void Cy_Crypto_Core_ErrorHandler(void); + + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Enable +****************************************************************************//** +* +* The function to enable the Crypto hardware. +* +* This function available for CM0+ core only. +* +* \return +* Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Enable(void) +{ + /* Enable Crypto HW */ + CRYPTO->CTL = (uint32_t)(_VAL2FLD(CRYPTO_CTL_ISOLATE, 1uL) | + _VAL2FLD(CRYPTO_CTL_RETAIN, 0uL) | + _VAL2FLD(CRYPTO_CTL_POWER, 1uL) | + _VAL2FLD(CRYPTO_CTL_ENABLED, 1uL)); + + CRYPTO->CTL = (uint32_t)(_VAL2FLD(CRYPTO_CTL_ISOLATE, 0uL) | + _VAL2FLD(CRYPTO_CTL_RETAIN, 0uL) | + _VAL2FLD(CRYPTO_CTL_POWER, 1uL) | + _VAL2FLD(CRYPTO_CTL_ENABLED, 1uL)); + +#if (CPUSS_CRYPTO_VU == 1) + + CRYPTO->VU_CTL1 = (uint32_t)CRYPTO->MEM_BUFF; + + /* Set the stack pointer to the Crypto buff size, in words */ + CY_CRYPTO_VU_SET_REG(15, CPUSS_CRYPTO_BUFF_SIZE, 1); + + /* Clear whole register file */ + CY_CRYPTO_VU_SET_REG(14, 0, 1); + CY_CRYPTO_VU_SET_REG(13, 0, 1); + CY_CRYPTO_VU_SET_REG(12, 0, 1); + CY_CRYPTO_VU_SET_REG(11, 0, 1); + CY_CRYPTO_VU_SET_REG(10, 0, 1); + CY_CRYPTO_VU_SET_REG(9, 0, 1); + CY_CRYPTO_VU_SET_REG(8, 0, 1); + CY_CRYPTO_VU_SET_REG(7, 0, 1); + CY_CRYPTO_VU_SET_REG(6, 0, 1); + CY_CRYPTO_VU_SET_REG(5, 0, 1); + CY_CRYPTO_VU_SET_REG(4, 0, 1); + CY_CRYPTO_VU_SET_REG(3, 0, 1); + CY_CRYPTO_VU_SET_REG(2, 0, 1); + CY_CRYPTO_VU_SET_REG(1, 0, 1); + CY_CRYPTO_VU_SET_REG(0, 0, 1); + +#endif /* #if (CPUSS_CRYPTO_VU == 1) */ + + return (CY_CRYPTO_SUCCESS); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Disable +****************************************************************************//** +* +* Disables the operation of the CRYPTO block. +* +* This function available for CM0+ core only. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_Disable(void) +{ + CRYPTO->CTL = (uint32_t)(_VAL2FLD(CRYPTO_CTL_ISOLATE, 0uL) | + _VAL2FLD(CRYPTO_CTL_RETAIN, 0uL) | + _VAL2FLD(CRYPTO_CTL_POWER, 0uL) | + _VAL2FLD(CRYPTO_CTL_ENABLED, 0uL)); + + return (CY_CRYPTO_SUCCESS); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_CheckHwForErrors +****************************************************************************//** +* +* The function checks if a Crypto HW error occurred. If yes, copy the error +* information from the Crypto registers to the communication structure. +* +* This function available for CM0+ core only. +* +* \param cryptoContext +* The pointer to vcy_stc_crypto_context_t structure which stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Core_CheckHwForErrors(cy_stc_crypto_context_t *cryptoContext) +{ + cy_en_crypto_status_t result = CY_CRYPTO_SUCCESS; + + if (cy_crypto_IsHwErrorOccured) + { + result = CY_CRYPTO_HW_ERROR; + + } + + cryptoContext->hwErrorStatus.errorStatus0 = _FLD2VAL(CRYPTO_ERROR_STATUS0_DATA32, CRYPTO->ERROR_STATUS0); + + cryptoContext->hwErrorStatus.errorStatus1 = (_FLD2VAL(CRYPTO_ERROR_STATUS1_DATA23, CRYPTO->ERROR_STATUS1) | + _FLD2VAL(CRYPTO_ERROR_STATUS1_IDX, CRYPTO->ERROR_STATUS1) | + _FLD2VAL(CRYPTO_ERROR_STATUS1_VALID, CRYPTO->ERROR_STATUS1)); + return (result); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_SetReg1Instr +****************************************************************************//** +* +* Writes one 32-Bit data word into Crypto FIFO. +* +* This function available for CM0+ core only. +* +* \param data0 +* The address of data to be placed into Crypto FIFO +* on the address CRYPTO_REGFILE_R0. +* +*******************************************************************************/ +void Cy_Crypto_SetReg1Instr(uint32_t data0) +{ + /* Check whether FIFO has enough space for 1 instruction */ + while(Cy_Crypto_Core_GetFIFOUsed() >= (CY_CRYPTO_FIFODEPTH - 1u)) + { + } + + CRYPTO->INSTR_FF_WR = (uint32_t)(((uint32_t)CY_CRYPTO_SET_REG1_OPC << CY_CRYPTO_OPCODE_POS) | + (uint32_t)CY_CRYPTO_REGFILE_R0); + + CRYPTO->INSTR_FF_WR = data0; +} + +/******************************************************************************* +* Function Name: Cy_Crypto_SetReg2Instr +****************************************************************************//** +* +* Writes two 32-Bit data words into Crypto FIFO. +* +* This function available for CM0+ core only. +* +* \param data0 +* The address of data to be placed into Crypto FIFO +* on the address CRYPTO_REGFILE_R0. +* +* \param data1 +* The address of data to be placed into Crypto FIFO +* on the address CRYPTO_REGFILE_R1. +* +*******************************************************************************/ +void Cy_Crypto_SetReg2Instr(uint32_t data0, uint32_t data1) +{ + /* Check whether FIFO has enough space for 2 instructions */ + while(Cy_Crypto_Core_GetFIFOUsed() >= (CY_CRYPTO_FIFODEPTH - 2u)) + { + } + + CRYPTO->INSTR_FF_WR = (uint32_t)(((uint32_t)CY_CRYPTO_SET_REG2_OPC << CY_CRYPTO_OPCODE_POS) | + ((uint32_t)CY_CRYPTO_REGFILE_R1 << CY_CRYPTO_RSRC4_SHIFT) | + (uint32_t)CY_CRYPTO_REGFILE_R0); + + CRYPTO->INSTR_FF_WR = data0; + CRYPTO->INSTR_FF_WR = data1; +} + +/******************************************************************************* +* Function Name: Cy_Crypto_SetReg3Instr +****************************************************************************//** +* +* Writes three 32-Bit data words into Crypto FIFO. +* +* This function available for CM0+ core only. +* +* \param data0 +* The address of data to be placed into Crypto FIFO +* on the address CRYPTO_REGFILE_R0. +* +* \param data1 +* The address of data to be placed into Crypto FIFO +* on the address CRYPTO_REGFILE_R1. +* +* \param data2 +* The address of data to be be placed into Crypto FIFO +* on the address CRYPTO_REGFILE_R2. +* +*******************************************************************************/ +void Cy_Crypto_SetReg3Instr(uint32_t data0, uint32_t data1, uint32_t data2) +{ + /* Check whether FIFO has enough space for 3 instructions */ + while(Cy_Crypto_Core_GetFIFOUsed() >= (CY_CRYPTO_FIFODEPTH - 3u)) + { + } + + CRYPTO->INSTR_FF_WR = (uint32_t)( ((uint32_t)CY_CRYPTO_SET_REG3_OPC << CY_CRYPTO_OPCODE_POS) | + ((uint32_t)CY_CRYPTO_REGFILE_R2 << CY_CRYPTO_RSRC8_SHIFT) | + ((uint32_t)CY_CRYPTO_REGFILE_R1 << CY_CRYPTO_RSRC4_SHIFT) | + (uint32_t)CY_CRYPTO_REGFILE_R0 ); + + CRYPTO->INSTR_FF_WR = data0; + CRYPTO->INSTR_FF_WR = data1; + CRYPTO->INSTR_FF_WR = data2; +} + +/******************************************************************************* +* Function Name: Cy_Crypto_SetReg4Instr +****************************************************************************//** +* +* Writes four 32-Bit data words into Crypto FIFO. +* +* This function available for CM0+ core only. +* +* \param data0 +* The address of data to be placed into Crypto FIFO +* on the address CRYPTO_REGFILE_R0. +* +* \param data1 +* The address of data to be placed into Crypto FIFO +* on the address CRYPTO_REGFILE_R1. +* +* \param data2 +* The address of data to be placed into Crypto FIFO +* on the address CRYPTO_REGFILE_R2. +* +* \param data3 +* The address of data to be placed into Crypto FIFO +* on the address CRYPTO_REGFILE_R3. +* +*******************************************************************************/ +void Cy_Crypto_SetReg4Instr(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3) +{ + /* Check whether FIFO has enough space for 4 instructions */ + while(Cy_Crypto_Core_GetFIFOUsed() >= (CY_CRYPTO_FIFODEPTH - 4u)) + { + } + + CRYPTO->INSTR_FF_WR = (uint32_t)(((uint32_t)CY_CRYPTO_SET_REG4_OPC << CY_CRYPTO_OPCODE_POS) | + ((uint32_t)CY_CRYPTO_REGFILE_R3 << CY_CRYPTO_RSRC12_SHIFT) | + ((uint32_t)CY_CRYPTO_REGFILE_R2 << CY_CRYPTO_RSRC8_SHIFT) | + ((uint32_t)CY_CRYPTO_REGFILE_R1 << CY_CRYPTO_RSRC4_SHIFT) | + (uint32_t)CY_CRYPTO_REGFILE_R0); + + CRYPTO->INSTR_FF_WR = data0; + CRYPTO->INSTR_FF_WR = data1; + CRYPTO->INSTR_FF_WR = data2; + CRYPTO->INSTR_FF_WR = data3; +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Run0ParamInstr +*****************************************************************************//** +* +* Run the Crypto instruction without parameters. +* +* This function available for CM0+ core only. +* +* \param instr +* The Opcode of the called instruction. +* +*******************************************************************************/ +void Cy_Crypto_Run0ParamInstr(uint8_t instr) +{ + /* Check whether FIFO has enough space for 1 instruction */ + while(Cy_Crypto_Core_GetFIFOUsed() >= CY_CRYPTO_FIFODEPTH) + { + } + + CRYPTO->INSTR_FF_WR = (uint32_t)((uint32_t)instr << CY_CRYPTO_OPCODE_POS); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Run1ParamInstr +*****************************************************************************//** +* +* Run the Crypto instruction with one parameter. +* The parameter must be placed into register 0 +* +* This function available for CM0+ core only. +* +* \param instr +* The Opcode of the called instruction. +* +* \param rdst0Shift +* The shift for the instruction operand. +* +*******************************************************************************/ +void Cy_Crypto_Run1ParamInstr(uint8_t instr, + uint32_t rdst0Shift) +{ + /* Check whether FIFO has enough space for 1 instruction */ + while(Cy_Crypto_Core_GetFIFOUsed() >= CY_CRYPTO_FIFODEPTH) + { + } + + CRYPTO->INSTR_FF_WR = (uint32_t)(((uint32_t)instr << CY_CRYPTO_OPCODE_POS) | + ((uint32_t)CY_CRYPTO_REGFILE_R0 << rdst0Shift)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Run2ParamInstr +*****************************************************************************//** +* +* Run the Crypto instruction with two parameters. +* The zero parameter must be placed into register 0, +* the first parameter must be placed into register 1. +* +* This function available for CM0+ core only. +* +* \param instr +* The Opcode of the called instruction. +* +* \param rdst0Shift +* The shift for the zero instruction operand. +* +* \param rdst1Shift +* The shift for the second instruction operand. +* +*******************************************************************************/ +void Cy_Crypto_Run2ParamInstr(uint8_t instr, + uint32_t rdst0Shift, + uint32_t rdst1Shift) +{ + /* Check whether FIFO has enough space for 1 instruction */ + while(Cy_Crypto_Core_GetFIFOUsed() >= CY_CRYPTO_FIFODEPTH) + { + } + + CRYPTO->INSTR_FF_WR = (uint32_t)(((uint32_t)instr << CY_CRYPTO_OPCODE_POS) | + ((uint32_t)CY_CRYPTO_REGFILE_R1 << rdst1Shift) | + ((uint32_t)CY_CRYPTO_REGFILE_R0 << rdst0Shift)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Run3ParamInstr +*****************************************************************************//** +* +* Run the Crypto instruction with three parameters. +* The zero parameter must be placed into register 0, +* the first parameter must be placed into register 1, +* the second parameter must be placed into register 2. +* +* This function available for CM0+ core only. +* +* \param instr +* The Opcode of the called instruction. +* +* \param rdst0Shift +* The shift for the zero instruction operand. +* +* \param rdst1Shift +* The shift for the second instruction operand. +* +** \param rdst2Shift +* The shift for the second instruction operand. +* +*******************************************************************************/ +void Cy_Crypto_Run3ParamInstr(uint8_t instr, + uint8_t rdst0Shift, + uint8_t rdst1Shift, + uint8_t rdst2Shift) +{ + /* Check whether FIFO has enough space for 1 instruction */ + while(Cy_Crypto_Core_GetFIFOUsed() >= CY_CRYPTO_FIFODEPTH) + { + } + + CRYPTO->INSTR_FF_WR = (uint32_t)(((uint32_t)instr << CY_CRYPTO_OPCODE_POS) | + ((uint32_t)CY_CRYPTO_REGFILE_R2 << rdst2Shift) | + ((uint32_t)CY_CRYPTO_REGFILE_R1 << rdst1Shift) | + ((uint32_t)CY_CRYPTO_REGFILE_R0 << rdst0Shift)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Run4ParamInstr +*****************************************************************************//** +* +* Run the Crypto instruction with four parameters. +* The zero parameter must be placed into register 0, +* the first parameter must be placed into register 1, +* the second parameter must be placed into register 2, +* the third parameter must be placed into register 3. +* +* This function available for CM0+ core only. +* +* \param instr +* The Opcode of the called instruction. +* +* \param rdst0Shift +* The shift for the zero instruction operand. +* +* \param rdst1Shift +* The shift for the first instruction operand. +* +* \param rdst2Shift +* The shift for the second instruction operand. +* +* \param rdst3Shift +* The shift for the third instruction operand. +* +*******************************************************************************/ +void Cy_Crypto_Run4ParamInstr(uint8_t instr, + uint32_t rdst0Shift, + uint32_t rdst1Shift, + uint32_t rdst2Shift, + uint32_t rdst3Shift) +{ + /* Check whether FIFO has enough space for 1 instruction */ + while(Cy_Crypto_Core_GetFIFOUsed() >= CY_CRYPTO_FIFODEPTH) + { + } + + CRYPTO->INSTR_FF_WR = (uint32_t)(((uint32_t)instr << CY_CRYPTO_OPCODE_POS) | + ((uint32_t)CY_CRYPTO_REGFILE_R3 << rdst3Shift) | + ((uint32_t)CY_CRYPTO_REGFILE_R2 << rdst2Shift) | + ((uint32_t)CY_CRYPTO_REGFILE_R1 << rdst1Shift) | + ((uint32_t)CY_CRYPTO_REGFILE_R0 << rdst0Shift)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_InvertEndian8 +*****************************************************************************//** +* +* Inverts endianness for eight bytes. +* +* This function available for CM0+ core only. +* +* \param srcVal +* The input data whose endianness will be inverted. +* +* \return +* An input value with inverted endianness. +* +*******************************************************************************/ +uint64_t Cy_Crypto_InvertEndian8(uint64_t srcVal) +{ + uint64_t tmpVal; + + tmpVal = ((srcVal << 8u) & 0xFF00FF00FF00FF00ULL) | ((srcVal >> 8u) & 0x00FF00FF00FF00FFULL); + tmpVal = ((tmpVal << 16u) & 0xFFFF0000FFFF0000ULL) | ((tmpVal >> 16u) & 0x0000FFFF0000FFFFULL); + + return ((tmpVal << 32u) | (tmpVal >> 32u)); +} + +#endif /* #if (CPUSS_CRYPTO_PRESENT == 1) */ +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_util.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_util.h new file mode 100644 index 0000000000..c6254378a6 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_util.h @@ -0,0 +1,132 @@ +/***************************************************************************//** +* \file cy_crypto_core_util.h +* \version 1.0 +* +* \brief +* This file provides the headers to the API for the utils +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_CRYPTO_CORE_UTIL_H) +#define CY_CRYPTO_CORE_UTIL_H + +#include "cy_crypto_common.h" +#include "syslib/cy_syslib.h" +#include + + +#if (CY_CPU_CORTEX_M0P) + +#if (CPUSS_CRYPTO_PRESENT == 1) + + +extern bool cy_crypto_IsHwErrorOccured; + +typedef enum { + CY_CRYPTO_CTL_ENABLED_DISABLED = 0u, + CY_CRYPTO_CTL_ENABLED_ENABLED = 1u, +} cy_en_crypto_hw_enable_t; + + +cy_en_crypto_status_t Cy_Crypto_Core_Enable(void); + +cy_en_crypto_status_t Cy_Crypto_Core_Disable(void); + +cy_en_crypto_status_t Cy_Crypto_Core_CheckHwForErrors(cy_stc_crypto_context_t *cryptoContext); + +void Cy_Crypto_SetReg1Instr(uint32_t data0); + +void Cy_Crypto_SetReg2Instr(uint32_t data0, uint32_t data1); + +void Cy_Crypto_SetReg3Instr(uint32_t data0, uint32_t data1, uint32_t data2); + +void Cy_Crypto_SetReg4Instr(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3); + +void Cy_Crypto_Run0ParamInstr(uint8_t instr); + +void Cy_Crypto_Run1ParamInstr(uint8_t instr, + uint32_t rdst0Shift); + +void Cy_Crypto_Run2ParamInstr(uint8_t instr, + uint32_t rdst0Shift, + uint32_t rdst1Shift); + +void Cy_Crypto_Run3ParamInstr(uint8_t instr, + uint8_t rdst0Shift, + uint8_t rdst1Shift, + uint8_t rdst2Shift); + +void Cy_Crypto_Run4ParamInstr(uint8_t instr, + uint32_t rdst0Shift, + uint32_t rdst1Shift, + uint32_t rdst2Shift, + uint32_t rdst3Shift); + +uint64_t Cy_Crypto_InvertEndian8(uint64_t srcVal); + +/******************************************************************************* +* Function Name: Crypto_Server_GetFIFOUsed +****************************************************************************//** +* +* Returns the number of instructions in the instruction FIFO. +* The value of this field ranges from 0 to 8 +* +*******************************************************************************/ +__STATIC_INLINE uint8_t Cy_Crypto_Core_GetFIFOUsed(void) +{ + return((uint8_t)_FLD2VAL(CRYPTO_INSTR_FF_STATUS_USED, CRYPTO->INSTR_FF_STATUS)); +} + +/******************************************************************************* +* Function Name: Crypto_Server_WaitForFifoAvailable +*****************************************************************************//** +* +* Waits until number of entries in the instruction FIFO is less than +* specified in EVENT_LEVEL field in FF_CTL register, an event is generated: +* "event" = INSTR_FF_STATUS.USED < EVENT_LEVEL. +* By default EVENT_LEVEL = 0; +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_Crypto_Core_WaitForFifoAvailable(void) +{ + while((_FLD2VAL(CRYPTO_INSTR_FF_STATUS_EVENT, CRYPTO->INSTR_FF_STATUS)) == 0) + { + } +} + +/******************************************************************************* +* Function Name: Crypto_Server_WaitForFifoAvailable ??? +*****************************************************************************//** +* +* Waits until all instruction in FIFO will be completed +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_Crypto_Core_WaitForReady(void) +{ + while((_FLD2VAL(CRYPTO_INSTR_FF_STATUS_BUSY, CRYPTO->INSTR_FF_STATUS)) == 1) + { + } +} + + +#endif /* #if (CPUSS_CRYPTO_PRESENT == 1) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_UTIL_H) */ + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu.c new file mode 100644 index 0000000000..61ac07a75c --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu.c @@ -0,0 +1,66 @@ +/***************************************************************************//** +* \file cy_crypto_core_vu.c +* \version 1.0 +* +* \brief +* This file provides the source code to the API for the Vector Unit functions +* in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "crypto/cy_crypto_core_vu.h" +#include "crypto/cy_crypto_core_util.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) + + +/******************************************************************************* +* Function Name: Cy_Crypto_Wait_Vu_ForComplete +****************************************************************************//** +* +* Waits until VU instruction will be completed +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +void Cy_Crypto_Core_Vu_WaitForComplete(void) +{ + /* Wait until the VU instruction is complete */ + while(0uL != _FLD2VAL(CRYPTO_STATUS_VU_BUSY, CRYPTO->STATUS)) + { + } +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Vu_StatusRead +****************************************************************************//** +* +* Returns value of the VU status register +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +uint16_t Cy_Crypto_Core_Vu_StatusRead(void) +{ + Cy_Crypto_Core_WaitForReady(); + + return((uint16_t)CRYPTO->VU_STATUS); +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu.h new file mode 100644 index 0000000000..1bfb726191 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu.h @@ -0,0 +1,136 @@ +/***************************************************************************//** +* \file cy_crypto_core_vu.h +* \version 1.0 +* +* \brief +* This file provides constants and function prototypes +* for the Vector Unit functions in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CORE_VU_H) +#define CY_CRYPTO_CORE_VU_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) + + +/* Function Prototypes */ +void Cy_Crypto_Core_Vu_WaitForComplete(void); +uint16_t Cy_Crypto_Core_Vu_StatusRead(void); + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Vu_RegRead +****************************************************************************//** +* +* Returns size of the data pointed in given register, +* it is lower 14Bit of the 32Bit word +* +* \param srcReg +* +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_Crypto_Core_Vu_RegRead(uint8_t srcReg) +{ + return ((uint32_t)_FLD2VAL(CRYPTO_RF_DATA_DATA32, CRYPTO->RF_DATA[srcReg])); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Vu_RegSizeRead +****************************************************************************//** +* +* Returns size of the data pointed in given register, +* it is lower 14Bit of the 32Bit word +* +* \param srcReg +* +* +*******************************************************************************/ +__STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegSizeRead(uint8_t srcReg) +{ + return ((uint16_t)(_FLD2VAL(CRYPTO_RF_DATA_DATA32, CRYPTO->RF_DATA[srcReg]) & 0x00000fff)); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Vu_RegBitSizeRead +****************************************************************************//** +* +* Returns size of the data pointed in given register, in Bits. +* It is lower 14Bit of the 32Bit word +* +* \param srcReg +* +* +*******************************************************************************/ +__STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegBitSizeRead(uint8_t srcReg) +{ + return ((uint16_t)(_FLD2VAL(CRYPTO_RF_DATA_DATA32, CRYPTO->RF_DATA[srcReg]) & 0x00000fff) + 1); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Vu_RegByteSizeRead +****************************************************************************//** +* +* Returns size of the data pointed in given register, in Bytes. +* It is lower 14Bit of the 32Bit word +* +* \param srcReg +* +* +*******************************************************************************/ +__STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegByteSizeRead(uint8_t srcReg) +{ + return ((uint16_t)(_FLD2VAL(CRYPTO_RF_DATA_DATA32, CRYPTO->RF_DATA[srcReg]) & 0x00000fff) >> 3); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Vu_RegWordRead +****************************************************************************//** +* +* Returns size of the data pointed in given register, in words (uint32_t). +* It is lower 14Bit of the 32Bit word +* +* \param srcReg +* +* +*******************************************************************************/ +__STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegWordSizeRead(uint8_t srcReg) +{ + return ((uint16_t)(_FLD2VAL(CRYPTO_RF_DATA_DATA32, CRYPTO->RF_DATA[srcReg]) & 0x00000fff) >> 5); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Core_Vu_RegDataRead +****************************************************************************//** +* +* Returns the data pointer, in 14-bit format of the data pointed in given register, +* it is upper 16Bit of the 32Bir word. Pointer is in words (uint32_t). +* +* \param srcReg +* +* +*******************************************************************************/ +__STATIC_INLINE uint16_t Cy_Crypto_Core_Vu_RegDataPtrRead(uint8_t srcReg) +{ + return ((uint16_t)(_FLD2VAL(CRYPTO_RF_DATA_DATA32, CRYPTO->RF_DATA[srcReg]) >> 16) & 0x00003fff); +} + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +#endif /* #if (CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_VU_H) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu_hw.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu_hw.h new file mode 100644 index 0000000000..672f8f17e4 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu_hw.h @@ -0,0 +1,380 @@ +/***************************************************************************//** +* \file cy_crypto_core_vu_hw.h +* \version 1.0 +* +* \brief +* This file provides constants and function prototypes +* for the Vector Unit functions in the Crypto block driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_CRYPTO_CORE_VU_HW_H) +#define CY_CRYPTO_CORE_VU_HW_H + +#include "cy_device_headers.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "syslib/cy_syslib.h" + + +#if (CY_CPU_CORTEX_M0P) + +#if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1)) + + +/* VU Instructions */ +#define CY_CRYPTO_VU_ALLOC_MEM(rdst, size) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_ALLOC_MEM_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)size - 1))) + +#define CY_CRYPTO_VU_CALLOC_MEM(rdst, size) \ +\ + {CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_ALLOC_MEM_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)size - 1)); \ +memset( (CRYPTO->MEM_BUFF + (((CRYPTO->RF_DATA[rdst] >> 16) & 0x00003fff) >> 2)), 0x00, 4 * (size + 31) / 32); } + +#define CY_CRYPTO_VU_FREE_MEM(reg_mask) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_FREE_MEM_OPC << 24) | \ + (uint32_t)reg_mask)) + +#define CY_CRYPTO_VU_SET_REG(rdst, data, size) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_SET_REG_OPC << 24) | \ + ((uint32_t)rdst << 26) | \ + ((uint32_t)data << 12) | \ + ((uint32_t)size - 1))) + +#define CY_CRYPTO_VU_MOV_REG(rdst, rsrc) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_MOV_REG_TO_STATUS_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc << 0))) + +#define CY_CRYPTO_VU_LD_REG(rdst, rsrc) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_LD_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc << 0))) + +#define CY_CRYPTO_VU_ST_REG(rdst, rsrc) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_ST_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc << 0))) + +#define CY_CRYPTO_VU_SWAP_REG(rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_SWAP_REG_OPC << 24) | \ + ((uint32_t)rsrc1 << 4) | \ + ((uint32_t)rsrc0 << 0))) + +#define CY_CRYPTO_VU_COND_SWAP_REG(cc, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_SWAP_REG_OPC << 24) | \ + ((uint32_t)cc << 20) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_MOV_REG_TO_STATUS(rsrc) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_MOV_REG_TO_STATUS_OPC << 24) | (uint32_t)rsrc)) + +#define CY_CRYPTO_VU_MOV_STATUS_TO_REG(rdst) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_MOV_STATUS_TO_REG_OPC << 24) | ((uint32_t)rdst << 12))) + +#define CY_CRYPTO_VU_PUSH_REG() (CRYPTO->INSTR_FF_WR = ((uint32_t)CY_CRYPTO_VU_PUSH_REG_OPC << 24)) + +#define CY_CRYPTO_VU_POP_REG() (CRYPTO->INSTR_FF_WR = ((uint32_t)CY_CRYPTO_VU_POP_REG_OPC << 24)) + +#define CY_CRYPTO_VU_ADD_REG(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_ADD_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_SUB_REG(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_SUB_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_OR_REG(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_OR_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_AND_REG(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_AND_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_XOR_REG(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_XOR_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_NOR_REG(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_NOR_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_NAND_REG(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_NAND_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_MIN_REG(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_MIN_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_MAX_REG(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_MAX_REG_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_LSL(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_LSL_OPC << 24) |\ + ((uint32_t)rdst << 12) |\ + ((uint32_t)rsrc1 << 4) |\ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_LSR(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_LSR_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_LSL1(rdst, rsrc1) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_LSL1_OPC << 24) |\ + ((uint32_t)rdst << 12) |\ + ((uint32_t)rsrc1 << 4))) + +#define CY_CRYPTO_VU_LSL1_WITH_CARRY(rdst, rsrc1) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_LSL1_WITH_CARRY_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4))) + +#define CY_CRYPTO_VU_LSR1(rdst, rsrc1) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_LSR1_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4))) + +#define CY_CRYPTO_VU_LSR1_WITH_CARRY(rdst, rsrc1) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_LSR1_WITH_CARRY_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4))) + +#define CY_CRYPTO_VU_SET_BIT(rdst, rsrc) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_SET_BIT_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + (uint32_t)rsrc)) + +#define CY_CRYPTO_VU_CLR_BIT(rdst, rsrc) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_CLR_BIT_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + (uint32_t)rsrc)) + +#define CY_CRYPTO_VU_INV_BIT(rdst, rsrc) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_INV_BIT_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + (uint32_t)rsrc)) + +#define CY_CRYPTO_VU_GET_BIT(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_GET_BIT_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_CLSAME(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_CLSAME_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_CTSAME(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_CTSAME_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_SET_TO_ZERO(rdst) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_SET_TO_ZERO_OPC << 24) | ((uint32_t)rdst << 12))) + +#define CY_CRYPTO_VU_SET_TO_ONE(rdst) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_SET_TO_ONE_OPC << 24) | ((uint32_t)rdst << 12))) + +#define CY_CRYPTO_VU_MOV(rdst, rsrc) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_MOV_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + (uint32_t)rsrc)) + +#define CY_CRYPTO_VU_COND_MOV(cc, rdst, rsrc) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_MOV_OPC << 24) | \ + ((uint32_t)cc << 20) | \ + ((uint32_t)rdst << 12) | \ + (uint32_t)rsrc)) + +#define CY_CRYPTO_VU_XSQUARE(rdst, rsrc) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_XSQUARE_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + (uint32_t)rsrc)) + +#define CY_CRYPTO_VU_CMP_SUB(rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_CMP_SUB_OPC << 24) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_COND_CMP_SUB(cc, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_CMP_SUB_OPC << 24) | \ + ((uint32_t)cc << 20) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_CMP_DEGREE(rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_CMP_DEGREE_OPC << 24) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_TST(rsrc0) (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_TST_OPC << 24) | (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_XMUL(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_XMUL_OPC << 24) |\ + ((uint32_t)rdst << 12) |\ + ((uint32_t)rsrc1 << 4) |\ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_UMUL(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_UMUL_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_ADD(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_ADD_OPC << 24) |\ + ((uint32_t)rdst << 12) |\ + ((uint32_t)rsrc1 << 4) |\ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_COND_ADD(cc, rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_ADD_OPC << 24) | \ + ((uint32_t)cc << 20) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_SUB(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_SUB_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_COND_SUB(cc, rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_SUB_OPC << 24) | \ + ((uint32_t)cc << 20) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_OR(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_OR_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_AND(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_AND_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_XOR(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_XOR_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_COND_XOR(cc, rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_XOR_OPC << 24) | \ + ((uint32_t)cc << 20) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_NOR(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_NOR_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + +#define CY_CRYPTO_VU_NAND(rdst, rsrc1, rsrc0) \ +\ + (CRYPTO->INSTR_FF_WR = (((uint32_t)CY_CRYPTO_VU_NAND_OPC << 24) | \ + ((uint32_t)rdst << 12) | \ + ((uint32_t)rsrc1 << 4) | \ + (uint32_t)rsrc0)) + + +#endif /* #if ((CPUSS_CRYPTO_PRESENT == 1) && (CPUSS_CRYPTO_VU == 1)) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_CORE_VU_HW_H) */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_server.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_server.c new file mode 100644 index 0000000000..34f7b95d7f --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_server.c @@ -0,0 +1,409 @@ +/***************************************************************************//** +* \file cy_crypto_server.c +* \version 1.0 +* +* \brief +* This file provides the source code to the API for Crypto Server +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_device_headers.h" +#include "ipc/cy_ipc_drv.h" +#include "sysint/cy_sysint.h" +#include "syslib/cy_syslib.h" +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_server.h" +#include "crypto/cy_crypto_core_aes.h" +#include "crypto/cy_crypto_core_sha.h" +#include "crypto/cy_crypto_core_hmac.h" +#include "crypto/cy_crypto_core_cmac.h" +#include "crypto/cy_crypto_core_prng.h" +#include "crypto/cy_crypto_core_trng.h" +#include "crypto/cy_crypto_core_rsa.h" +#include "crypto/cy_crypto_core_str.h" +#include "crypto/cy_crypto_core_crc.h" +#include "crypto/cy_crypto_core_des.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_instructions.h" +#include + + +#if (CY_CPU_CORTEX_M0P) + +#if (CPUSS_CRYPTO_PRESENT == 1) + + +/* The number of the interrupt to catch Crypto HW errors */ +IRQn_CM0P_Type cy_crypto_ErrorIrqNum; + +/* + * The global variables to store a pointers on the customer callback functions. + * This variable is global because it is called from an interrupt. + */ +cy_israddress cy_cryptoGetDataHandlerPtr = NULL; +cy_israddress cy_cryptoErrorHandlerPtr = NULL; + +/* + * The global variable to store a pointer to crypto processing context data. + */ +cy_stc_crypto_context_t *processData = NULL; + +/* Functions Prototypes */ +void Cy_Crypto_Server_PopulateHwErrInfo(cy_stc_crypto_context_t *cryptoContextPtr); +void Cy_Crypto_Server_Run(cy_stc_crypto_context_t* data); +void Cy_Crypto_Server_Invoke(void); +void Cy_Crypto_Server_ErrorHandler(void); + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_Start +****************************************************************************//** +* +* Starts the Crypto server on the M0 core, sets up an interrupt +* for the IPC Crypto channel on the M0 core, sets up an interrupt +* to catch Crypto HW errors. Should be invoked only on CM0. +* +* This function available for CM0+ core only. +* +* \param configStruct +* The Crypto configuration structure. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Server_Start(cy_stc_crypto_config_t const *configStruct) +{ + /* Initialize the interrupt controller for M0 and IPC Interrupt */ + cy_stc_sysint_t intrCfg; + + intrCfg.intrSrc = (IRQn_Type)(cpuss_interrupts_ipc0_IRQn + CY_CRYPTO_NOTIFY_INTR); + + intrCfg.intrCm0p = (IRQn_CM0P_Type)(configStruct->cm0NotifyIntrNum); + + intrCfg.intrPriority = configStruct->notifyIntrPrior; + + if (configStruct->userGetDataHandler != NULL) + { + Cy_SysInt_Init(&intrCfg, configStruct->userGetDataHandler); + cy_cryptoGetDataHandlerPtr = configStruct->userGetDataHandler; + } + else + { + Cy_SysInt_Init(&intrCfg, &Cy_Crypto_Server_GetDataHandler); + } + + NVIC_EnableIRQ((IRQn_Type)intrCfg.intrCm0p); + + /* Do not bring up an IPC release interrupt here, only set up a notify interrupt */ + Cy_IPC_DRV_SetIntrMask(Cy_IPC_DRV_GetIntrBaseAddr(CY_CRYPTO_NOTIFY_INTR), CY_IPC_NO_NOTIFIFICATION, (1uL << CY_IPC_CHAN_CRYPTO)); + + /* Initialize and enable an interrupt to handle possible Crypto HW errors */ + intrCfg.intrSrc = (IRQn_Type)(cpuss_interrupt_crypto_IRQn); + + /* Initialize an interrupt to check a Crypto HW error*/ + cy_crypto_ErrorIrqNum = (IRQn_CM0P_Type)(configStruct->cm0CryptoErrorIntrNum); + + intrCfg.intrCm0p = cy_crypto_ErrorIrqNum; + + intrCfg.intrPriority = configStruct->cryptoErrorIntrPrior; + + if (configStruct->userErrorHandler != NULL) + { + Cy_SysInt_Init(&intrCfg, configStruct->userErrorHandler); + cy_cryptoErrorHandlerPtr = configStruct->userErrorHandler; + } + else + { + Cy_SysInt_Init(&intrCfg, &Cy_Crypto_Server_ErrorHandler); + } + + NVIC_ClearPendingIRQ((IRQn_Type)intrCfg.intrCm0p); + NVIC_EnableIRQ((IRQn_Type)intrCfg.intrCm0p); + + return (CY_CRYPTO_SUCCESS); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_Stop +****************************************************************************//** +* +* Stops the Crypto server by disabling the IPC notify interrupt +* and Crypto error interrupt. Should be invoked only on CM0. +* +* This function available for CM0+ core only. +* +* \param configStruct +* The Crypto configuration structure. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Server_Stop(cy_stc_crypto_config_t const *configStruct) +{ + uint32_t interruptMask; + + /* Disable the Notify interrupt from IPC */ + NVIC_DisableIRQ((IRQn_Type)configStruct->cm0NotifyIntrNum); + NVIC_ClearPendingIRQ((IRQn_Type)configStruct->cm0NotifyIntrNum); + + /* Disable the Error interrupt from Crypto */ + NVIC_DisableIRQ((IRQn_Type)configStruct->cm0CryptoErrorIntrNum); + NVIC_ClearPendingIRQ((IRQn_Type)configStruct->cm0CryptoErrorIntrNum); + + /* Disable CRYPTO IPC interrupt */ + interruptMask = Cy_IPC_DRV_GetIntrMask(Cy_IPC_DRV_GetIntrBaseAddr(CY_CRYPTO_NOTIFY_INTR)); + + Cy_IPC_DRV_SetIntrMask(Cy_IPC_DRV_GetIntrBaseAddr(CY_CRYPTO_NOTIFY_INTR), CY_IPC_NO_NOTIFIFICATION, interruptMask & ~(1uL << CY_IPC_CHAN_CRYPTO)); + + cy_cryptoGetDataHandlerPtr = NULL; + cy_cryptoErrorHandlerPtr = NULL; + + return (CY_CRYPTO_SUCCESS); +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_ErrorHandler +****************************************************************************//** +* +* The routine to handle an interrupt caused by the Crypto hardware error. +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +void Cy_Crypto_Server_ErrorHandler(void) +{ + NVIC_ClearPendingIRQ((IRQn_Type)cy_crypto_ErrorIrqNum); + cy_crypto_IsHwErrorOccured = true; +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_Process +****************************************************************************//** +* +* Parses input data received from the Crypto Client +* and runs the appropriate Crypto function. +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +void Cy_Crypto_Server_Process(void) +{ + cy_stc_crypto_context_t* data = processData; + + if (data != NULL) + { + /* Default error */ + data->resp = CY_CRYPTO_HW_NOT_ENABLED; + + if (CY_CRYPTO_INSTR_ENABLE == data->instr) + { + data->resp = Cy_Crypto_Core_Enable(); + } + else + { + /* Check if Crypto HW is enabled */ + if(1uL == (uint32_t)_FLD2VAL(CRYPTO_CTL_ENABLED, CRYPTO->CTL)) + { + data->resp = CY_CRYPTO_SUCCESS; + + switch(data->instr) + { + case CY_CRYPTO_INSTR_DISABLE: + data->resp = Cy_Crypto_Core_Disable(); + break; + +#if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) + case CY_CRYPTO_INSTR_PRNG_INIT: + data->resp = Cy_Crypto_Core_Prng_Init((cy_stc_crypto_context_prng_t*)data->xdata); + break; + + case CY_CRYPTO_INSTR_PRNG: + data->resp = Cy_Crypto_Core_Prng((cy_stc_crypto_context_prng_t*)data->xdata); + break; +#endif /* #if ((CPUSS_CRYPTO_PR == 1) && (CY_CRYPTO_USER_PR == 1)) */ + +#if ((CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) + case CY_CRYPTO_INSTR_TRNG: + data->resp = Cy_Crypto_Core_Trng((cy_stc_crypto_context_trng_t*)data->xdata); + break; +#endif /* #if ((CPUSS_CRYPTO_TR == 1) && (CY_CRYPTO_USER_TR == 1)) */ + +#if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) + case CY_CRYPTO_INSTR_AES_INIT: + data->resp = Cy_Crypto_Core_Aes_Init((cy_stc_crypto_context_aes_t *)data->xdata); + break; + +#if (CY_CRYPTO_USER_AES_ECB == 1) + case CY_CRYPTO_INSTR_AES_ECB: + data->resp = Cy_Crypto_Core_Aes_Ecb((cy_stc_crypto_context_aes_t *)data->xdata); + break; +#endif /* #if (CRYPTO_USER_AES_ECB == 1) */ + +#if (CY_CRYPTO_USER_AES_CBC == 1) + case CY_CRYPTO_INSTR_AES_CBC: + data->resp = Cy_Crypto_Core_Aes_Cbc((cy_stc_crypto_context_aes_t *)data->xdata); + break; +#endif /* #if (CRYPTO_USER_AES_CBC == 1) */ + +#if (CY_CRYPTO_USER_AES_CFB == 1) + case CY_CRYPTO_INSTR_AES_CFB: + data->resp = Cy_Crypto_Core_Aes_Cfb((cy_stc_crypto_context_aes_t *)data->xdata); + break; +#endif /* #if (CRYPTO_USER_AES_CFB == 1) */ + +#if (CY_CRYPTO_USER_AES_CTR == 1) + case CY_CRYPTO_INSTR_AES_CTR: + data->resp = Cy_Crypto_Core_Aes_Ctr((cy_stc_crypto_context_aes_t *)data->xdata); + break; +#endif /* #if (CRYPTO_USER_AES_CTR == 1) */ + +#if (CY_CRYPTO_USER_CMAC == 1) + case CY_CRYPTO_INSTR_CMAC: + data->resp = Cy_Crypto_Core_Cmac((cy_stc_crypto_context_aes_t *)data->xdata); + break; +#endif /* #if (CRYPTO_USER_CMAC == 1) */ + +#endif /* #if ((CPUSS_CRYPTO_AES == 1) && (CY_CRYPTO_USER_AES_ENABLE == 1)) */ + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) + case CY_CRYPTO_INSTR_SHA: + data->resp = Cy_Crypto_Core_Sha((cy_stc_crypto_context_sha_t *)data->xdata); + break; +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_SHA_ENABLE == 1)) */ + +#if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) + case CY_CRYPTO_INSTR_HMAC: + data->resp = Cy_Crypto_Core_Hmac((cy_stc_crypto_context_sha_t *)data->xdata); + break; +#endif /* #if ((CPUSS_CRYPTO_SHA == 1) && (CY_CRYPTO_USER_HMAC == 1)) */ + +#if ((CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) + case CY_CRYPTO_INSTR_MEM_CPY: + Cy_Crypto_Core_Str_MemCpy(((cy_stc_crypto_context_str_t* )data->xdata)->dstPtr, + ((cy_stc_crypto_context_str_t* )data->xdata)->srcPtr0, + (uint16_t)((cy_stc_crypto_context_str_t* )data->xdata)->dataSize ); + break; + + case CY_CRYPTO_INSTR_MEM_SET: + Cy_Crypto_Core_Str_MemSet(((cy_stc_crypto_context_str_t*)data->xdata)->dstPtr, + ((cy_stc_crypto_context_str_t*)data->xdata)->data, + (uint16_t)(((cy_stc_crypto_context_str_t*)data->xdata)->dataSize) ); + break; + + case CY_CRYPTO_INSTR_MEM_CMP: + *(uint32_t* )(((cy_stc_crypto_context_str_t* )data->xdata)->dstPtr) = + Cy_Crypto_Core_Str_MemCmp(((cy_stc_crypto_context_str_t* )data->xdata)->srcPtr0, + ((cy_stc_crypto_context_str_t* )data->xdata)->srcPtr1, + (uint16_t)((cy_stc_crypto_context_str_t* )data->xdata)->dataSize ); + break; + + case CY_CRYPTO_INSTR_MEM_XOR: + Cy_Crypto_Core_Str_MemXor(((cy_stc_crypto_context_str_t* )data->xdata)->srcPtr0, + ((cy_stc_crypto_context_str_t* )data->xdata)->srcPtr1, + ((cy_stc_crypto_context_str_t* )data->xdata)->dstPtr, + (uint16_t)((cy_stc_crypto_context_str_t* )data->xdata)->dataSize ); + break; +#endif /* #if ((CPUSS_CRYPTO_STR == 1) && (CY_CRYPTO_USER_STR == 1)) */ + +#if ((CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) + case CY_CRYPTO_INSTR_CRC_INIT: + data->resp = Cy_Crypto_Core_Crc_Init((cy_stc_crypto_context_crc_t*)data->xdata); + break; + + case CY_CRYPTO_INSTR_CRC: + data->resp = Cy_Crypto_Core_Crc((cy_stc_crypto_context_crc_t*)data->xdata); + break; +#endif /* #if ((CPUSS_CRYPTO_CRC == 1) && (CY_CRYPTO_USER_CRC == 1)) */ + +#if ((CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) + case CY_CRYPTO_INSTR_DES: + data->resp = Cy_Crypto_Core_Des((cy_stc_crypto_context_des_t *)data->xdata); + break; + + case CY_CRYPTO_INSTR_3DES: + data->resp = Cy_Crypto_Core_Tdes((cy_stc_crypto_context_des_t *)data->xdata); + break; +#endif /* #if ((CPUSS_CRYPTO_DES == 1) && (CY_CRYPTO_USER_DES == 1)) */ + +#if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) + case CY_CRYPTO_INSTR_RSA_PROC: + data->resp = Cy_Crypto_Core_Rsa_Proc((cy_stc_crypto_context_rsa_t *)data->xdata); + break; + + case CY_CRYPTO_INSTR_RSA_COEF: + data->resp = Cy_Crypto_Core_Rsa_Coef((cy_stc_crypto_context_rsa_t *)data->xdata); + break; +#endif /* #if ((CPUSS_CRYPTO_VU == 1) && (CY_CRYPTO_USER_VU == 1)) */ + +#if (CY_CRYPTO_USER_PKCS1_5 == 1) + case CY_CRYPTO_INSTR_RSA_VER: + data->resp = Cy_Crypto_Core_RsaVerify((cy_stc_crypto_context_rsa_ver_t *)data->xdata); + break; +#endif /* #if (CY_CRYPTO_USER_PKCS1_5 == 1) */ + + default: + data->resp = CY_CRYPTO_NOT_SUPPORTED; + break; + } + + if (CY_CRYPTO_SUCCESS == data->resp) + { + data->resp = Cy_Crypto_Core_CheckHwForErrors(data); + } + } + } + } +} + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_GetDataHandler +****************************************************************************//** +* +* The IPC Crypto channel notify interrupt-routine, +* receives information from the Crypto client, runs the process +* (if user not setup own handler), +* releases the Crypto IPC channel after the Crypto server completes. +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +void Cy_Crypto_Server_GetDataHandler() +{ + uint32_t interruptMasked; + + interruptMasked = Cy_IPC_DRV_GetIntrStatusMasked(Cy_IPC_DRV_GetIntrBaseAddr(CY_CRYPTO_NOTIFY_INTR)); + + /* + * Check that there is really the IPC Crypto Notify interrupt, + * because the same line can be used for the IPC Crypto Release interrupt. + */ + if((1uL << (CY_IPC_CHAN_CRYPTO + IPC_INTR_STRUCT_INTR_MASKED_NOTIFY_Pos)) == (interruptMasked & IPC_INTR_STRUCT_INTR_MASKED_NOTIFY_Msk)) + { + Cy_IPC_DRV_ClearIntr(Cy_IPC_DRV_GetIntrBaseAddr(CY_CRYPTO_NOTIFY_INTR), CY_IPC_NO_NOTIFIFICATION, interruptMasked >> IPC_INTR_STRUCT_INTR_MASKED_NOTIFY_Pos); + + if(CY_IPC_DRV_SUCCESS == Cy_IPC_DRV_ReadMsgPtr(Cy_IPC_DRV_GetIpcBaseAddress(CY_IPC_CHAN_CRYPTO), (void**)&processData)) + { + if (cy_cryptoGetDataHandlerPtr == NULL) + { + Cy_Crypto_Server_Process(); + } + + /* Release the Crypto IPC channel with the Release interrupt */ + (void)Cy_IPC_DRV_Release(Cy_IPC_DRV_GetIpcBaseAddress(CY_IPC_CHAN_CRYPTO), (1uL << CY_CRYPTO_RELEASE_INTR)); + } + } +} + +#endif /* #if (CPUSS_CRYPTO_PRESENT == 1) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_server.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_server.h new file mode 100644 index 0000000000..bcc6ccf74a --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_server.h @@ -0,0 +1,51 @@ +/***************************************************************************//** +* \file cy_crypto_server.h +* \version 1.0 +* +* \brief +* This file provides the prototypes for common API +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_CRYPTO_SERVER_H) +#define CY_CRYPTO_SERVER_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CPU_CORTEX_M0P) + +#if (CPUSS_CRYPTO_PRESENT == 1) + + +/** +* \addtogroup group_crypto_functions +* \{ +*/ + +cy_en_crypto_status_t Cy_Crypto_Server_Start(cy_stc_crypto_config_t const *configStruct); + +cy_en_crypto_status_t Cy_Crypto_Server_Stop(cy_stc_crypto_config_t const *configStruct); + +void Cy_Crypto_Server_Process(void); + +void Cy_Crypto_Server_GetDataHandler(void); +void Cy_Crypto_Server_ErrorHandler(void); + +/** \} group_crypto_functions */ + +#endif /* #if (CPUSS_CRYPTO_PRESENT == 1) */ + +#endif /* #if (CY_CPU_CORTEX_M0P) */ + +#endif /* #if !defined(CY_CRYPTO_SERVER_H) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.c new file mode 100644 index 0000000000..7f5f9922df --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.c @@ -0,0 +1,470 @@ +/***************************************************************************//** +* \file cy_flash.c +* \version 1.0 +* +* \brief +* Provides the public functions for the API for the PSoC 6 Flash Driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_flash.h" + + +/******************************************************************************* +* Function Name: Cy_Flash_WriteRow +****************************************************************************//** +* +* This function writes an array of data to a single row of flash. Reports success or +* or a reason for failure. Does not return until the Write operation is complete. +* Returns immediately and reports a CY_FLASH_DRV_IPC_BUSY error in the case when another +* process is writing to flash. User firmware should not enter the hibernate +* mode until flash Write is complete. The Flash operation is allowed in Sleep and +* Deep-sleep modes. During the Flash operation, the device should not be reset, +* including the XRES pin, a software reset, and watchdog reset sources. Also, +* low-voltage detect circuits should be configured to generate an interrupt instead +* of a reset. Otherwise, portions of flash may undergo unexpected changes. +* +* \param rowAddr Address of the flash row number. The number of the flash rows +* is defined by the \ref CY_FLASH_NUMBER_ROWS macro for the selected device. +* The Read-while-Write violation occurs when the flash read operation is +* initiated in the same flash sector where the flash write operation is +* performing. Refer to the device datasheet for the details. +* Address must match row start address. +* +* \param data The pointer to the data which has to be written to flash. The size +* of the data array must be equal to the flash row size. The flash row size for +* the selected device is defined by the \ref CY_FLASH_SIZEOF_ROW macro. Refer to +* the device datasheet for the details. +* +* \param contextPtr The pointer to the Flash driver context defined by the user. +* The flash driver context contains configuration data for flash operation. +* +* \return Returns the status of the Flash operation (see \ref cy_en_flashdrv_status_t). +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_WriteRow(uint32_t rowAddr, const uint32_t* data, cy_stc_flash_context_t* contextPtr) +{ + uint32_t result; + cy_en_flashdrv_status_t retVal = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + +#if (CY_CPU_CORTEX_M0P) + uint32_t interruptState; + uint32_t regVal; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + regVal = Cy_IPC_DRV_GetIntrMask(IPC_INTR_STRUCT0); + Cy_IPC_DRV_SetIntrMask(IPC_INTR_STRUCT0, ((regVal >> IPC_INTR_STRUCT_INTR_NOTIFY_Pos) | 0x07u), \ + ((regVal & IPC_INTR_STRUCT_INTR_MASK_RELEASE_Msk) | 0x07u)); + + result = Cy_Flash_StartWrite (rowAddr, data, contextPtr); + + /* Check whether the Flash operation was successfully initiated */ + if (result == CY_FLASH_DRV_OPERATION_STARTED) + { + /* Polls whether IPC is released and the Flash operation is performed */ + do + { + result = Cy_Flash_IsWriteComplete(contextPtr); + } + while (result == CY_FLASH_DRV_OPCODE_BUSY); + } + + Cy_SysLib_ExitCriticalSection(interruptState); +#else + if (Cy_Flash_PrepeareContext(rowAddr, data, contextPtr) != CY_FLASH_DRV_INVALID_INPUT_PARAMETERS) + { + Cy_Flash_Proxy Cy_Flash_Cm4Proxy; + Cy_Flash_Cm4Proxy = (Cy_Flash_Proxy)CY_FLASH_CM4_FLASH_PROXY_ADDR; + result = Cy_Flash_Cm4Proxy(contextPtr); + } + else + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } +#endif /* (CY_CPU_CORTEX_M0P) */ + + /* Invalidates the flash cache and buffer */ + FLASHC->FLASH_CMD = FLASHC_FLASH_CMD_INV_Msk; + + retVal = Cy_Flash_ProcessOpcode(result); + + return (retVal); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_StartWrite +****************************************************************************//** +* +* Starts writing an array of data to a single row of flash. Returns immediately +* and reports a successful start or reason for failure. Returns immediately and +* reports a CY_FLASH_IPC_BUSY error in the case when another process is writing +* to flash. User firmware should not enter the hibernate mode until flash Write +* is complete. The Flash operation is allowed in Sleep and Deep-sleep modes. +* During the flash operation, the device should not be reset, including the +* XRES pin, a software reset, and watchdog reset sources. Also, the low-voltage +* detect circuits should be configured to generate an interrupt instead of a reset. +* Otherwise, portions of flash may undergo unexpected changes. +* +* \param rowAddr Address of the flash row number. The number of the flash rows +* is defined by the \ref CY_FLASH_NUMBER_ROWS macro for the selected device. +* The Read-while-Write violation occurs when the flash read operation is +* initiated in the same flash sector where the flash write operation is +* performing. Refer to the device datasheet for the details. +* Address must row start address. +* +* \param data The pointer to the data to be written to flash. The size +* of the data array must be equal to the flash row size. The flash row size for +* the selected device is defined by the \ref CY_FLASH_SIZEOF_ROW macro. Refer to +* the device datasheet for the details. +* +* \param contextPtr The pointer to the Flash driver context defined by the user. +* The Flash driver context contains configuration data for the Flash operation. +* +* \return Returns the status of the Flash operation (see \ref cy_en_flashdrv_status_t). +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_StartWrite(uint32_t rowAddr, const uint32_t* data, cy_stc_flash_context_t *contextPtr) +{ + cy_en_flashdrv_status_t result; + + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + /* Checks whether the input parameters are valid */ + if (Cy_Flash_PrepeareContext(rowAddr, data, contextPtr) != CY_FLASH_DRV_INVALID_INPUT_PARAMETERS) + { + /* Tries to acquire the IPC structure and pass the arguments to SROM API */ + if (Cy_IPC_DRV_SendMsgPtr(CY_FLASH_IPC_STRUCT, CY_FLASH_IPC_NOTIFY_STRUCT0, (void*)contextPtr) == CY_IPC_DRV_SUCCESS) + { + /* The Flash operation is successfully initiated */ + result = CY_FLASH_DRV_OPERATION_STARTED; + } + else + { + /* The IPC structure is already locked by another process */ + result = CY_FLASH_DRV_IPC_BUSY; + } + } + else + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_IsWriteComplete +****************************************************************************//** +* +* Reports a successful Write, reason of failure or busy status (CY_FLASH_DRV_OPCODE_BUSY). +* +* \param contextPtr The pointer to the Flash driver context defined by the user. +* +* \return Returns the status of the Flash operation (see \ref cy_en_flashdrv_status_t). +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_IsWriteComplete(const cy_stc_flash_context_t* contextPtr) +{ + cy_en_flashdrv_status_t retVal = CY_FLASH_DRV_OPCODE_BUSY; + + /* Checks if the IPC structure is not locked */ + if (Cy_IPC_DRV_GetLockStatus(CY_FLASH_IPC_STRUCT) == CY_IPC_DRV_RELEASED) + { + /* The result of SROM API calling is returned to the driver context */ + retVal = Cy_Flash_ProcessOpcode(contextPtr->opcode); + } + + return (retVal); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_RowChecksum +****************************************************************************//** +* +* Returns a checksum value of the specified flash row. +* +* \param rowNum The Cheksum is calculated to the flash row. +* +* \param contextPtr The pointer to the Flash driver context defined by the user. +* +* \param cheksumPtr The pointer to the address whire cheksum is to be stored +* +* \return Returns the status of the Flash operation. +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_RowChecksum (uint32_t rowNum, cy_stc_flash_context_t* contextPtr, uint32_t* cheksumPtr) +{ + cy_en_flashdrv_status_t result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + uint32_t resTmp; + + /* Checks whether the input parameters are valid */ + if ((rowNum >= CY_FLASH_NUMBER_ROWS) || (contextPtr == NULL)) + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + else + { + /* Prepares arguments to be passed to SROM API */ + contextPtr->opcode = CY_FLASH_OPCODE_CHECKSUM | (rowNum << CY_FLASH_OPCODE_CHECKSUM_ROW_SHIFT); + + /* Tries to acquire the IPC structure and pass the arguments to SROM API */ + if (Cy_IPC_DRV_SendMsgPtr(CY_FLASH_IPC_STRUCT, CY_FLASH_IPC_NOTIFY_STRUCT0, (void*)contextPtr) == CY_IPC_DRV_SUCCESS) + { + /* Polls whether IPC is released and the Flash operation is performed */ + while (Cy_IPC_DRV_GetLockStatus(CY_FLASH_IPC_STRUCT) != CY_IPC_DRV_RELEASED) + { + /* Wait till IPC is released */ + } + + resTmp = contextPtr->opcode; + + if((resTmp >> CY_FLASH_ERROR_SHIFT) == CY_FLASH_ERROR_NO_ERROR) + { + result = CY_FLASH_DRV_SUCCESS; + *cheksumPtr = contextPtr->opcode & CY_FLASH_RESULT_MASK; + } + else + { + result = Cy_Flash_ProcessOpcode(result); + } + } + else + { + /* The IPC structure is already locked by another process */ + result = CY_FLASH_DRV_IPC_BUSY; + } + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_CalculateHash +****************************************************************************//** +* +* Returns a hash value of the specified region of flash. +* +* \param data Start the data address. +* +* \param numberOfBytes The hash value is calculated for the number of bytes after the +* start data address (0 – 1 byte,1- 2 bytes etc). +* +* \param contextPtr The pointer to the Flash driver context defined by the user. +* +* \param hashPtr The pointer to the address whire hash is to be stored +* +* \return Returns the status of the Flash operation. +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_CalculateHash (const uint32_t* data, uint32 numberOfBytes, cy_stc_flash_context_t* contextPtr, uint32_t* hashPtr) +{ + cy_en_flashdrv_status_t result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + uint32_t resTmp; + + /* Checks whether the input parameters are valid */ + if ((data == NULL) || (contextPtr == NULL)) + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + else + { + /* Prepares arguments to be passed to SROM API */ + contextPtr->opcode = CY_FLASH_OPCODE_HASH; + contextPtr->arg1 = (uint32_t)data; + contextPtr->arg2 = numberOfBytes; + + /* Tries to acquire the IPC structure and pass the arguments to SROM API */ + if (Cy_IPC_DRV_SendMsgPtr(CY_FLASH_IPC_STRUCT, CY_FLASH_IPC_NOTIFY_STRUCT0, (void*)contextPtr) == CY_IPC_DRV_SUCCESS) + { + /* Polls whether IPC is released and the Flash operation is performed */ + while (Cy_IPC_DRV_GetLockStatus(CY_FLASH_IPC_STRUCT) != CY_IPC_DRV_RELEASED) + { + /* Wait till IPC is released */ + } + + resTmp = contextPtr->opcode; + + if((resTmp >> CY_FLASH_ERROR_SHIFT) == CY_FLASH_ERROR_NO_ERROR) + { + result = CY_FLASH_DRV_SUCCESS; + *hashPtr = contextPtr->opcode & CY_FLASH_RESULT_MASK; + } + else + { + result = Cy_Flash_ProcessOpcode(result); + } + } + else + { + /* The IPC structure is already locked by another process */ + result = CY_FLASH_DRV_IPC_BUSY; + } + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_BoundsCheck +****************************************************************************//** +* +* Returns 1 if Flash addres is out of boundary, otherwise returns 0. +* +* \param flashAddr Address to be checked +* +* \return 1 - out of bound, 0 - in flash bounds +* +*******************************************************************************/ +uint32_t Cy_Flash_BoundsCheck(uint32_t flashAddr) +{ + uint32_t result = 1u; + + if ((flashAddr < CY_FLASH_BASE) || (flashAddr >= (CY_FLASH_BASE + CY_FLASH_SIZE))) + { + if ((flashAddr < CY_WFLASH_BASE) || (flashAddr >= (CY_WFLASH_BASE + CY_WFLASH_SIZE))) + { + if ((flashAddr < SFLASH_BASE) || (flashAddr >= (SFLASH_BASE + SFLASH_SECTION_SIZE))) + { + result = 0u; + } + } + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_PrepeareContext +****************************************************************************//** +* +* Returns 1 if parameters are correct and initialises contextPtr, otherwise returns +* CY_FLASH_DRV_INVALID_INPUT_PARAMETERS. +* +* \param rowAddr Address of the flash row number. The number of the flash rows +* is defined by the \ref CY_FLASH_NUMBER_ROWS macro for the selected device. +* The Read-while-Write violation occurs when the flash read operation is +* initiated in the same flash sector where the flash write operation is +* performing. Refer to the device datasheet for the details. +* Address must match row start address. +* +* \param data The pointer to the data which has to be written to flash. The size +* of the data array must be equal to the flash row size. The flash row size for +* the selected device is defined by the \ref CY_FLASH_SIZEOF_ROW macro. Refer to +* the device datasheet for the details. +* +* \param contextPtr The pointer to the Flash driver context defined by the user. +* The flash driver context contains configuration data for flash operation. +* +* \return 1 - Context ready, CY_FLASH_DRV_INVALID_INPUT_PARAMETERS - Wrong arguments +* +*******************************************************************************/ +uint32_t Cy_Flash_PrepeareContext(uint32_t rowAddr, const uint32_t* data, cy_stc_flash_context_t *contextPtr) +{ + uint32_t result; + + if ((Cy_Flash_BoundsCheck(rowAddr) == 0) || (data == NULL) || (contextPtr == NULL)) + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + else + { + if (rowAddr%CY_FLASH_SIZEOF_ROW != 0) + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + else + { + /* Prepares arguments to be passed to SROM API */ + contextPtr->opcode = CY_FLASH_OPCODE_WRITE_ROW; + contextPtr->arg1 = CY_FLASH_CONFIG_DATASIZE; + contextPtr->arg2 = rowAddr; + contextPtr->arg3 = (uint32_t)data; + + result = 1u; + } + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_ProcessOpcode +****************************************************************************//** +* +* Converts System Call returns to the Flash driver return defines. +* +* \param opcode The value retuned by the System Call. +* +* \return Flash driver return. +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_ProcessOpcode(uint32_t opcode) +{ + cy_en_flashdrv_status_t retVal; + + switch (opcode) + { + case 0UL: + { + retVal = CY_FLASH_DRV_SUCCESS; + break; + } + case CY_FLASH_ROMCODE_SUCCESS: + { + retVal = CY_FLASH_DRV_SUCCESS; + break; + } + case CY_FLASH_ROMCODE_INVALID_PROTECTION: + { + retVal = CY_FLASH_DRV_INV_PROT; + break; + } + case CY_FLASH_ROMCODE_INVALID_FM_PL: + { + retVal = CY_FLASH_DRV_INVALID_FM_PL; + break; + } + case CY_FLASH_ROMCODE_INVALID_FLASH_ADDR: + { + retVal = CY_FLASH_DRV_INVALID_FLASH_ADDR; + break; + } + case CY_FLASH_ROMCODE_ROW_PROTECTED: + { + retVal = CY_FLASH_DRV_ROW_PROTECTED; + break; + } + case CY_FLASH_ROMCODE_IN_PROGRESS_NO_ERROR: + { + retVal = CY_FLASH_DRV_PROGRESS_NO_ERROR; + break; + } + case CY_FLASH_DRV_INVALID_INPUT_PARAMETERS: + { + retVal = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + break; + } + default: + { + retVal = CY_FLASH_DRV_ERR_UNC; + } + } + + return (retVal); +} + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.h new file mode 100644 index 0000000000..c9cb738718 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.h @@ -0,0 +1,283 @@ +/***************************************************************************//** +* \file cy_flash.h +* \version 1.0 +* +* Provides the API declarations of the Flash driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_FLASH_H) +#define CY_FLASH_H + +/** +* \defgroup group_flash Flash System Routine (Flash) +* \{ +* Internal flash memory programming +* +* Flash memory in PSoC devices provides non-volatile storage for user firmware, +* user configuration data, and bulk data storage. +* +* Flash operations are implemented as system calls. System calls are executed +* out of SROM in the privileged mode of operation. Users have no access to read +* or modify the SROM code. The driver API requests the system call by acquiring +* the Inter-processor communication (IPC) and writing the SROM function opcode +* and parameters to its input registers. As a result, an NMI interrupt is invoked +* and the requested SROM API is executed. The operation status is returned to the +* driver context and a release interrupt is triggered. +* +* Writing to flash can take up to 20 milliseconds. During this time, +* the device should not be reset (including XRES pin, software reset, and +* watchdog) or unexpected changes may be made to portions of the flash. +* Also, the low-voltage detect circuits should be configured to generate an +* interrupt instead of a reset. +* +* The Read while Write violation occurs when the flash Read operation is initiated +* in the same flash sector where the flash Write operation is performing. The +* violation leads to the exception generation. To avoid the Read while Write +* violation, the user has to carefully split the Read and Write operation from the +* same flash sector considering both cores in the multi-processor device. +* Use different flash sectors for code and data storage. The flash is divided +* into four equal sectors. +* +* \section group_flash_configuration Configuration Considerations +* +* There are no specific configuration parameters for the flash operations +* outside the driver API input parameters. +* +* \section group_flash_more_information More Information +* +* See the technical reference manual (TRM) for more information about the Flash architecture. +* +* \section group_flash_MISRA MISRA-C Compliance +* +* The Flash driver has the following specific deviations: +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
19.7AA function shall be used in preference to a function-like macroMacro is used because of performance reasons
+* +* \section group_flash_changelog Changelog +* +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_flash_macro Macro +* \defgroup group_flash_functions Functions +* \defgroup group_flash_data_structure Data Structures +*/ + +#include +#include +#include + +/*************************************** +* Macro definitions +***************************************/ +/** +* \addtogroup group_flash_macro +* \{ +*/ + +/** Driver major version */ +#define CY_FLASH_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_FLASH_DRV_VERSION_MINOR 0 + +/** +* \defgroup group_flash_returns Flash return values +* \{ +* Specifies return values meaning +*/ +#define CY_FLASH_ID (CY_PDL_DRV_ID(0x14u)) /**< FLASH PDL ID */ + +#define CY_FLASH_ID_INFO (uint32_t)( CY_FLASH_ID | CY_PDL_STATUS_INFO ) /**< Return prefix for FLASH driver function status codes */ +#define CY_FLASH_ID_WARNING (uint32_t)( CY_FLASH_ID | CY_PDL_STATUS_WARNING) /**< Return prefix for FLASH driver function warning return values */ +#define CY_FLASH_ID_ERROR (uint32_t)( CY_FLASH_ID | CY_PDL_STATUS_ERROR) /**< Return prefix for FLASH driver function error return values */ + +/** This enum has the return values of the Flash driver */ +typedef enum +{ + CY_FLASH_DRV_SUCCESS = 0x00ul, /**< Success */ + CY_FLASH_DRV_INV_PROT = ( CY_FLASH_ID_ERROR + 0ul), /**< Invalid device protection state */ + CY_FLASH_DRV_INVALID_FM_PL = ( CY_FLASH_ID_ERROR + 1ul), /**< Invalid flash page latch address */ + CY_FLASH_DRV_INVALID_FLASH_ADDR = ( CY_FLASH_ID_ERROR + 2ul), /**< Invalid flash address */ + CY_FLASH_DRV_ROW_PROTECTED = ( CY_FLASH_ID_ERROR + 3ul), /**< Row is write protected */ + CY_FLASH_DRV_IPC_BUSY = ( CY_FLASH_ID_ERROR + 5ul), /**< IPC structure is already locked by another process */ + CY_FLASH_DRV_INVALID_INPUT_PARAMETERS = ( CY_FLASH_ID_ERROR + 6ul), /**< Input parameters passed to Flash API are not valid */ + CY_FLASH_DRV_ERR_UNC = ( CY_FLASH_ID_ERROR + 0xFul),/**< Unknown error */ + CY_FLASH_DRV_PROGRESS_NO_ERROR = ( CY_FLASH_ID_INFO + 0ul), /**< Command in progress; no error */ + CY_FLASH_DRV_OPERATION_STARTED = ( CY_FLASH_ID_INFO + 1ul), /**< Flash operation is successfully initiated */ + CY_FLASH_DRV_OPCODE_BUSY = ( CY_FLASH_ID_INFO + 2ul), /**< Flash is under operation */ +} cy_en_flashdrv_status_t; + +/** \} group_flash_returns */ + +/** \cond INTERNAL */ +/** Command completed with no errors */ +#define CY_FLASH_ROMCODE_SUCCESS (0xA0000000UL) +/** Invalid device protection state */ +#define CY_FLASH_ROMCODE_INVALID_PROTECTION (0xF0000001UL) +/** Invalid flash page latch address */ +#define CY_FLASH_ROMCODE_INVALID_FM_PL (0xF0000003UL) +/** Invalid flash address */ +#define CY_FLASH_ROMCODE_INVALID_FLASH_ADDR (0xF0000004UL) +/** Row is write protected */ +#define CY_FLASH_ROMCODE_ROW_PROTECTED (0xF0000005UL) +/** Command in progress; no error */ +#define CY_FLASH_ROMCODE_IN_PROGRESS_NO_ERROR (0xA0000009UL) +/** Flash operation is successfully initiated */ +#define CY_FLASH_IS_OPERATION_STARTED (0x00000010UL) +/** Flash is under operation */ +#define CY_FLASH_IS_BUSY (0x00000040UL) +/** IPC structure is already locked by another process */ +#define CY_FLASH_IS_IPC_BUSY (0x00000080UL) +/** Input parameters passed to Flash API are not valid */ +#define CY_FLASH_IS_INVALID_INPUT_PARAMETERS (0x00000100UL) + +/** Result mask */ +#define CY_FLASH_RESULT_MASK (0xFFFFFFFUL) +/** Error shift */ +#define CY_FLASH_ERROR_SHIFT (28UL) +/** No error */ +#define CY_FLASH_ERROR_NO_ERROR (0xAUL) +/** \endcond */ + + +/** +* \addtogroup group_flash_config_macro Flash configuration +* \{ +* Specifies the parameter values passed to SROM API +*/ + +/** SROM API opcode for flash write operation */ +#if (CY_CPU_CORTEX_M0P) && (!defined(CY8C622PSVP) && !defined(CY8C622PSVP_DUAL)) + #define CY_FLASH_OPCODE_WRITE_ROW (((0x05UL) << 24u) | ((0x01UL) << 8UL)) +#else + #define CY_FLASH_OPCODE_WRITE_ROW ((0x05UL) << 24u) +#endif + +/** SROM API opcode for flash checksum operation */ +#define CY_FLASH_OPCODE_CHECKSUM ((0x0BUL) << 24u) +/** SROM API opcode for flash hash operation */ +#define CY_FLASH_OPCODE_HASH ((0x0DUL) << 24u) +/** SROM API flash row shift for flash checksum operation */ +#define CY_FLASH_OPCODE_CHECKSUM_ROW_SHIFT (8u) +/** SROM API flash data size parameter for flash write operation */ +#define CY_FLASH_CONFIG_DATASIZE (0x06UL) +/** SROM API flash verification option for flash write operation */ +#define CY_FLASH_CONFIG_VERIFICATION_EN ((0x01UL) << 16u) + +/** \} group_flash_config_macro */ + + +/** +* \addtogroup group_flash_general_macro Flash general parameters +* \{ +* Provides general information about flash and IPC +*/ + +/** Flash row size */ +#define CY_FLASH_SIZEOF_ROW (CPUSS_FLASHC_PA_SIZE * 4u) +/** Number of flash rows */ +#define CY_FLASH_NUMBER_ROWS (CY_FLASH_SIZE / CY_FLASH_SIZEOF_ROW) +/** Long words flash row size */ +#define CY_FLASH_SIZEOF_ROW_LONG_UNITS (CY_FLASH_SIZEOF_ROW / sizeof(uint32_t)) +/** Calculates the flash address for a given row of flash */ +#define CY_CALCULATE_FLASH_ADDRESS(rowNum) (CY_FLASH_BASE + ((rowNum) * CY_FLASH_SIZEOF_ROW)) +/** IPC channel to be used */ +#define CY_FLASH_IPC_STRUCT ((IPC_STRUCT_Type*) &IPC->STRUCT[CY_IPC_CHAN_SYSCALL]) +/** IPC notify bit for IPC_STRUCT0 (dedicated to flash operation) */ +#define CY_FLASH_IPC_NOTIFY_STRUCT0 (0x1UL) +/** \cond INTERNAL */ +#define CY_FLASH_CM4_FLASH_PROXY_ADDR (0x16001101UL) +/** \endcond */ + +/** \} group_flash_general_macro */ + +/** \} group_flash_macro */ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*************************************** +* Data Structure definitions +***************************************/ + +/** +* \addtogroup group_flash_data_structure +* \{ +*/ + +/** Flash driver context */ +typedef struct +{ + uint32_t opcode; /**< Specifies the code of flash operation */ + uint32_t arg1; /**< Specifies the configuration of flash operation */ + uint32_t arg2; /**< Specifies the configuration of flash operation */ + uint32_t arg3; /**< Specifies the configuration of flash operation */ +}cy_stc_flash_context_t; + +/** \} group_flash_data_structure */ + + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_flash_functions +* \{ +*/ +cy_en_flashdrv_status_t Cy_Flash_WriteRow(uint32_t rowAddr, const uint32_t* data, cy_stc_flash_context_t* contextPtr); +cy_en_flashdrv_status_t Cy_Flash_StartWrite(uint32_t rowAddr, const uint32_t* data, cy_stc_flash_context_t* contextPtr); +cy_en_flashdrv_status_t Cy_Flash_IsWriteComplete(const cy_stc_flash_context_t* contextPtr); +cy_en_flashdrv_status_t Cy_Flash_RowChecksum (uint32_t rowNum, cy_stc_flash_context_t* contextPtr, uint32_t* cheksumPtr); +cy_en_flashdrv_status_t Cy_Flash_CalculateHash (const uint32_t* data, uint32 numberOfBytes, cy_stc_flash_context_t* contextPtr, uint32_t* hashPtr); +/** \cond INTERNAL */ +uint32_t Cy_Flash_BoundsCheck(uint32_t flashAddr); +uint32_t Cy_Flash_PrepeareContext(uint32_t rowAddr, const uint32_t* data, cy_stc_flash_context_t *contextPtr); +cy_en_flashdrv_status_t Cy_Flash_ProcessOpcode(uint32_t opcode); + +typedef cy_en_flashdrv_status_t (*Cy_Flash_Proxy)(cy_stc_flash_context_t *contextPtr); +/** \endcond */ + +/** \} group_flash_functions */ + +#if defined(__cplusplus) +} +#endif + + +#endif /* #if !defined(CY_FLASH_H) */ +/** \endcond */ + + +/** \} group_flash */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.c new file mode 100644 index 0000000000..43c939f4da --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.c @@ -0,0 +1,137 @@ +/***************************************************************************//** +* \file cy_gpio.c +* \version 1.0 +* +* \brief +* Provides an API implementation of the GPIO driver +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_gpio.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************************* +* Function Name: Cy_GPIO_Pin_Init +****************************************************************************//** +* +* \brief Initialize all pin configuration setting for the pin. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param config +* Pointer to the pin config structure base address +* +* \return +* void +* +* \note +* This function modifies port registers in read-modify-write operations. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +cy_en_gpio_status_t Cy_GPIO_Pin_Init(GPIO_PRT_Type *base, uint32_t pinNum, const cy_stc_gpio_pin_config_t *config) +{ + cy_en_gpio_status_t status = CY_GPIO_SUCCESS; + uint32_t maskCfgOut; + uint32_t tempReg; + + if((NULL != base) && (NULL != config)) + { + Cy_GPIO_Write(base, pinNum, config->outVal); + Cy_GPIO_SetDrivemode(base, pinNum, config->driveMode); + Cy_GPIO_SetHSIOM(base, pinNum, config->hsiom); + + Cy_GPIO_SetInterruptEdge(base, pinNum, config->intEdge); + Cy_GPIO_SetInterruptMask(base, pinNum, config->intMask); + Cy_GPIO_SetVtrip(base, pinNum, config->vtrip); + + /* Slew rate and Driver strength */ + maskCfgOut = (CY_GPIO_CFG_OUT_SLOW_MASK << pinNum) | (CY_GPIO_CFG_OUT_DRIVE_SEL_MASK << (pinNum + CY_GPIO_CFG_OUT_DRIVE_OFFSET)); + tempReg = base->CFG_OUT & ~(maskCfgOut); + base->CFG_OUT = tempReg | ((config->slewRate & CY_GPIO_CFG_OUT_SLOW_MASK) << pinNum) + | ((config->driveSel & CY_GPIO_CFG_OUT_DRIVE_SEL_MASK) << (pinNum + CY_GPIO_CFG_OUT_DRIVE_OFFSET)); + + /* SIO specific configuration */ + tempReg = base->CFG_SIO & ~(CY_GPIO_SIO_PIN_MASK); + base->CFG_SIO = tempReg | (((config->vregEn & CY_GPIO_VREG_EN_MASK) + | ((config->ibufMode & CY_GPIO_IBUF_MASK) << CY_GPIO_IBUF_SHIFT) + | ((config->vtripSel & CY_GPIO_VTRIP_SEL_MASK) << CY_GPIO_VTRIP_SEL_SHIFT) + | ((config->vrefSel & CY_GPIO_VREF_SEL_MASK) << CY_GPIO_VREF_SEL_SHIFT) + | ((config->vohSel & CY_GPIO_VOH_SEL_MASK) << CY_GPIO_VOH_SEL_SHIFT)) + << ((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET)); + } + else + { + status = CY_GPIO_BAD_PARAM; + } + + return(status); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_Port_Init +****************************************************************************//** +* +* \brief Initialize a complete port of pins from a single init structure. +* +* \param base +* Pointer to the pin's port register base address +* +* \param config +* Pointer to the pin config structure base address +* +* \return +* void +* +*******************************************************************************/ +cy_en_gpio_status_t Cy_GPIO_Port_Init(GPIO_PRT_Type* base, const cy_stc_gpio_prt_config_t *config) +{ + cy_en_gpio_status_t status = CY_GPIO_SUCCESS; + uint32_t portNum; + HSIOM_PRT_Type* baseHSIOM; + + if((NULL != base) && (NULL != config)) + { + portNum = ((uint32_t)(base) - GPIO_BASE) / GPIO_PRT_SECTION_SIZE; + baseHSIOM = (HSIOM_PRT_Type*)(HSIOM_BASE + (HSIOM_PRT_SECTION_SIZE * portNum)); + + base->OUT = config->out; + base->CFG = config->cfg; + base->CFG_IN = config->cfgIn; + base->CFG_OUT = config->cfgOut; + base->INTR_CFG = config->intrCfg; + base->INTR_MASK = config->intrMask; + base->CFG_SIO = config->cfgSIO; + baseHSIOM->PORT_SEL0 = config->sel0Active; + baseHSIOM->PORT_SEL1 = config->sel1Active; + } + else + { + status = CY_GPIO_BAD_PARAM; + } + + return(status); +} + + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.h new file mode 100644 index 0000000000..f25c54beeb --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.h @@ -0,0 +1,1719 @@ +/***************************************************************************//** +* \file cy_gpio.h +* \version 1.0 +* +* \brief +* Provides an API declaration of the GPIO driver +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_gpio General Purpose Input Output (GPIO) +* \{ +* The GPIO driver provides an API to configure and access device Input/Output pins. +* IO pins include all general purpose types such as GPIO, SIO, HSIO, AUXIO, and +* their variants. +* +* Initialization can be performed either at the port level or by configuring the +* individual pins. For efficient use of code space, port +* configuration should be used in the field. Refer to the product device header files +* for the list of supported ports and pins. +* +* - Single pin configuration is performed by using \ref Cy_GPIO_Pin_FastInit +* (provide specific values) or \ref Cy_GPIO_Pin_Init (provide a filled +* cy_stc_gpio_pin_config_t structure). +* - An entire port can be configured using \ref Cy_GPIO_Port_Init. Provide a filled +* cy_stc_gpio_prt_config_t structure. The values in the structure are +* bitfields representing the desired value for each pin in the port. +* - Pin configuration and management is based on the port address and pin number. +* \ref Cy_GPIO_PortToAddr function can optionally be used to calculate the port +* address from the port number at run-time. +* +* Once the pin/port initialization is complete, each pin can be accessed by +* specifying the port (GPIO_PRT_Type) and the pin (0-7) in the provided API +* functions. +* +* \section group_gpio_configuration Configuration Considerations +* +* 1. Pin muxing is controlled through the High-Speed IO Matrix (HSIOM) selection. +* This allows the pin to connect to signal sources/sinks throughout the device, +* as defined by the pin HSIOM selection options (en_hsiom_sel_t). +* 2. All pins are initialized to High-Z drive mode with HSIOM connected to CPU (SW +* control digital pin only) at Power-On-Reset(POR). +* 3. Some API functions perform read-modify-write operations on shared port +* registers. These functions are not thread safe and care must be taken when +* called by the application. +* +* \section group_gpio_more_information More Information +* +* Refer to the technical reference manual (TRM) and the device datasheet. +* +* \section group_gpio_MISRA MISRA-C Compliance] +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA ruleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
14.1RStatic Function '' is not used within this translation unit.
16.7RThe object addressed by the pointer parameter 'base' is not modified +* and so the pointer could be of type 'pointer to const'.
+* +* \section group_gpio_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_gpio_macro Macro +* \defgroup group_gpio_functions Functions +* \{ +* \defgroup group_gpio_functions_init Initialization Functions +* \defgroup group_gpio_functions_gpio GPIO Functions +* \defgroup group_gpio_functions_sio SIO Functions +* \defgroup group_gpio_functions_interrupt Port Interrupt Functions +* \} +* \defgroup group_gpio_data_structures Data structures +* \defgroup group_gpio_enums Enumerated types +*/ + +#if !defined(CY_GPIO_H) +#define CY_GPIO_H + +#include +#include "syslib/cy_syslib.h" +#include "cy_device_headers.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** \addtogroup group_gpio_macro +* \{ +*/ + +/** Driver major version */ +#define CY_GPIO_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_GPIO_DRV_VERSION_MINOR 0 + +/** GPIO driver ID */ +#define CY_GPIO_ID CY_PDL_DRV_ID(0x16u) + +/** \} group_gpio_macro */ + + +/*************************************** +* Enumerations +***************************************/ +/** +* \addtogroup group_gpio_enums +* \{ +*/ + +/** +* GPIO Driver error codes +*/ +typedef enum +{ + CY_GPIO_SUCCESS = 0x00u, /**< Returned successful */ + CY_GPIO_BAD_PARAM = CY_GPIO_ID | CY_PDL_STATUS_ERROR | 0x01u, /**< Bad parameter was passed */ +} cy_en_gpio_status_t; + +/** \} group_gpio_enums */ + + +/*************************************** +* Configuration Structures +***************************************/ + +/** +* \addtogroup group_gpio_data_structures +* \{ +*/ + +/** This structure is used to initialize a port of GPIO pins */ +typedef struct { + uint32_t out; /**< Initial output data for the IO pins in the port */ + uint32_t intrMask; /**< Interrupt enable mask for the port interrupt */ + uint32_t intrCfg; /**< Port pin interrupt edge detection configuration */ + uint32_t cfg; /**< Port pin drive modes and input buffer enable configuration */ + uint32_t cfgIn; /**< Port pin input buffer configuration */ + uint32_t cfgOut; /**< Port pin output buffer configuration */ + uint32_t cfgSIO; /**< Port SIO pins configuration */ + uint32_t sel0Active; /**< HSIOM selection for port pins 0,1,2,3 */ + uint32_t sel1Active; /**< HSIOM selection for port pins 4,5,6,7 */ +} cy_stc_gpio_prt_config_t; + +/** This structure is used to initialize a single GPIO pin */ +typedef struct { + uint32_t outVal; /**< Pin output state */ + uint32_t driveMode; /**< Drive mode */ + en_hsiom_sel_t hsiom; /**< HSIOM selection */ + uint32_t intEdge; /**< Interrupt Edge type */ + uint32_t intMask; /**< Interrupt enable mask */ + uint32_t vtrip; /**< Input buffer voltage trip type */ + uint32_t slewRate; /**< Output buffer slew rate */ + uint32_t driveSel; /**< Drive strength */ + uint32_t vregEn; /**< SIO pair output buffer mode */ + uint32_t ibufMode; /**< SIO pair input buffer mode */ + uint32_t vtripSel; /**< SIO pair input buffer trip point */ + uint32_t vrefSel; /**< SIO pair reference voltage for input buffer trip point */ + uint32_t vohSel; /**< SIO pair regulated voltage output level */ +} cy_stc_gpio_pin_config_t; + +/** \} group_gpio_data_structures */ + +/*************************************** +* Constants +***************************************/ + +/** \cond INTERNAL */ + +/* General Constants */ +#define CY_GPIO_PRT_HALF (4UL) /**< Half-way point of a GPIO port */ +#define CY_GPIO_PRT_DEINIT (0UL) /**< De-init value for port registers */ + +/* GPIO Masks */ +#define CY_GPIO_HSIOM_MASK (0x1FUL) /**< HSIOM selection mask */ +#define CY_GPIO_OUT_MASK (0x01UL) /**< Single pin mask for OUT register */ +#define CY_GPIO_IN_MASK (0x01UL) /**< Single pin mask for IN register */ +#define CY_GPIO_CFG_DM_MASK (0x0FUL) /**< Single pin mask for drive mode in CFG register */ +#define CY_GPIO_CFG_IN_VTRIP_SEL_MASK (0x01UL) /**< Single pin mask for VTRIP selection in CFG IN register */ +#define CY_GPIO_CFG_OUT_SLOW_MASK (0x01UL) /**< Single pin mask for slew rate in CFG OUT register */ +#define CY_GPIO_CFG_OUT_DRIVE_SEL_MASK (0x03UL) /**< Single pin mask for drive strength in CFG OUT register */ +#define CY_GPIO_INTR_STATUS_MASK (0x01UL) /**< Single pin mask for interrupt status in INTR register */ +#define CY_GPIO_INTR_EN_MASK (0x01UL) /**< Single pin mask for interrupt status in INTR register */ +#define CY_GPIO_INTR_MASKED_MASK (0x01UL) /**< Single pin mask for masked interrupt status in INTR_MASKED register */ +#define CY_GPIO_INTR_SET_MASK (0x01UL) /**< Single pin mask for setting the interrupt in INTR_MASK register */ +#define CY_GPIO_INTR_EDGE_MASK (0x03UL) /**< Single pin mask for interrupt edge type in INTR_EDGE register */ +#define CY_GPIO_INTR_FLT_EDGE_MASK (0x07UL) /**< Single pin mask for setting filtered interrupt */ + +/* SIO Masks */ +#define CY_GPIO_VREG_EN_MASK (0x01UL) /**< Single SIO pin mask for voltage regulation enable */ +#define CY_GPIO_IBUF_MASK (0x01UL) /**< Single SIO pin mask for input buffer */ +#define CY_GPIO_IBUF_SHIFT (0x01UL) /**< Single SIO pin shift for input buffer */ +#define CY_GPIO_VTRIP_SEL_MASK (0x01UL) /**< Single SIO pin mask for the input buffer trip point */ +#define CY_GPIO_VTRIP_SEL_SHIFT (0x02UL) /**< Single SIO pin shift for the input buffer trip point */ +#define CY_GPIO_VREF_SEL_MASK (0x03UL) /**< Single SIO pin mask for voltage reference */ +#define CY_GPIO_VREF_SEL_SHIFT (0x03UL) /**< Single SIO pin shift for voltage reference */ +#define CY_GPIO_VOH_SEL_MASK (0x07UL) /**< Single SIO pin mask for VOH */ +#define CY_GPIO_VOH_SEL_SHIFT (0x05UL) /**< Single SIO pin shift for VOH */ + +/* Special mask for SIO pin pair setting */ +#define CY_GPIO_SIO_ODD_PIN_MASK (0x00FEUL) /**< SIO pin pair selection mask */ +#define CY_GPIO_SIO_PIN_MASK (0x00FFUL) /**< SIO pin pair mask */ + +/* Offsets */ +#define CY_GPIO_HSIOM_OFFSET (3UL) /**< Offset for HSIOM */ +#define CY_GPIO_DRIVE_MODE_OFFSET (2UL) /**< Offset for Drive mode */ +#define CY_GPIO_INBUF_OFFSET (3UL) /**< Offset for input buffer */ +#define CY_GPIO_CFG_OUT_DRIVE_OFFSET (16UL) /**< Offset for drive strength */ +#define CY_GPIO_INTR_CFG_OFFSET (1UL) /**< Offset for interrupt config */ +#define CY_GPIO_INTR_FILT_OFFSET (18UL) /**< Offset for filtered interrupt config */ +#define CY_GPIO_CFG_SIO_OFFSET (2UL) /**< Offset for SIO config */ + +#define CY_GPIO_ZERO (0UL) /**< Constant zero */ + +/** \endcond */ + + +/*************************************** +* Function Constants +***************************************/ + +/** +* \addtogroup group_gpio_macro +* \{ +*/ + +/** +* \defgroup group_gpio_driveModes Pin drive mode +* \{ +* Constants to be used for setting the drive mode of the pin. +*/ +#define CY_GPIO_DM_ANALOG (0x00UL) /**< \brief Analog High-Z. Input buffer off */ +#define CY_GPIO_DM_PULLUP_IN_OFF (0x02UL) /**< \brief Resistive Pull-Up. Input buffer off */ +#define CY_GPIO_DM_PULLDOWN_IN_OFF (0x03UL) /**< \brief Resistive Pull-Down. Input buffer off */ +#define CY_GPIO_DM_OD_DRIVESLOW_IN_OFF (0x04UL) /**< \brief Open Drain, Drives Low. Input buffer off */ +#define CY_GPIO_DM_OD_DRIVESHIGH_IN_OFF (0x05UL) /**< \brief Open Drain, Drives High. Input buffer off */ +#define CY_GPIO_DM_STRONG_IN_OFF (0x06UL) /**< \brief Strong Drive. Input buffer off */ +#define CY_GPIO_DM_PULLUP_DOWN_IN_OFF (0x07UL) /**< \brief Resistive Pull-Up/Down. Input buffer off */ +#define CY_GPIO_DM_HIGHZ (0x08UL) /**< \brief Digital High-Z. Input buffer on */ +#define CY_GPIO_DM_PULLUP (0x0AUL) /**< \brief Resistive Pull-Up. Input buffer on */ +#define CY_GPIO_DM_PULLDOWN (0x0BUL) /**< \brief Resistive Pull-Down. Input buffer on */ +#define CY_GPIO_DM_OD_DRIVESLOW (0x0CUL) /**< \brief Open Drain, Drives Low. Input buffer on */ +#define CY_GPIO_DM_OD_DRIVESHIGH (0x0DUL) /**< \brief Open Drain, Drives High. Input buffer on */ +#define CY_GPIO_DM_STRONG (0x0EUL) /**< \brief Strong Drive. Input buffer on */ +#define CY_GPIO_DM_PULLUP_DOWN (0x0FUL) /**< \brief Resistive Pull-Up/Down. Input buffer on */ +/** \} */ + +/** +* \defgroup group_gpio_vtrip Voltage trip mode +* \{ +* Constants to be used for setting the voltage trip type on the pin. +*/ +#define CY_GPIO_VTRIP_CMOS (0x00UL) /**< \brief Input buffer compatible with CMOS and I2C interfaces */ +#define CY_GPIO_VTRIP_TTL (0x01UL) /**< \brief Input buffer compatible with TTL and MediaLB interfaces */ +/** \} */ + +/** +* \defgroup group_gpio_slewRate Slew Rate Mode +* \{ +* Constants to be used for setting the slew rate of the pin. +*/ +#define CY_GPIO_SLEW_FAST (0x00UL) /**< \brief Fast slew rate */ +#define CY_GPIO_SLEW_SLOW (0x01UL) /**< \brief Slow slew rate */ +/** \} */ + +/** +* \defgroup group_gpio_driveStrength Pin drive strength +* \{ +* Constants to be used for setting the drive strength of the pin. +*/ +#define CY_GPIO_DRIVE_FULL (0x00UL) /**< \brief Full drive strength: Max drive current */ +#define CY_GPIO_DRIVE_1_2 (0x01UL) /**< \brief 1/2 drive strength: 1/2 drive current */ +#define CY_GPIO_DRIVE_1_4 (0x02UL) /**< \brief 1/4 drive strength: 1/4 drive current */ +#define CY_GPIO_DRIVE_1_8 (0x03UL) /**< \brief 1/8 drive strength: 1/8 drive current */ +/** \} */ + +/** +* \defgroup group_gpio_interruptTrigger Interrupt trigger type +* \{ +* Constants to be used for setting the interrupt trigger type on the pin. +*/ +#define CY_GPIO_INTR_DISABLE (0x00UL) /**< \brief Disable the pin interrupt generation */ +#define CY_GPIO_INTR_RISING (0x01UL) /**< \brief Rising-Edge interrupt */ +#define CY_GPIO_INTR_FALLING (0x02UL) /**< \brief Falling-Edge interrupt */ +#define CY_GPIO_INTR_BOTH (0x03UL) /**< \brief Both-Edge interrupt */ +/** \} */ + +/** +* \defgroup group_gpio_sioVreg SIO output buffer mode +* \{ +* Constants to be used for setting the SIO output buffer mode on the pin. +*/ +#define CY_SIO_VREG_UNREGULATED (0x00UL) /**< \brief Unregulated output buffer */ +#define CY_SIO_VREG_REGULATED (0x01UL) /**< \brief Regulated output buffer */ +/** \} */ + +/** +* \defgroup group_gpio_sioIbuf SIO input buffer mode +* \{ +* Constants to be used for setting the SIO input buffer mode on the pin. +*/ +#define CY_SIO_IBUF_SINGLEENDED (0x00UL) /**< \brief Single ended input buffer */ +#define CY_SIO_IBUF_DIFFERENTIAL (0x01UL) /**< \brief Differential input buffer */ +/** \} */ + +/** +* \defgroup group_gpio_sioVtrip SIO input buffer trip-point +* \{ +* Constants to be used for setting the SIO input buffer trip-point of the pin. +*/ +#define CY_SIO_VTRIP_CMOS (0x00UL) /**< \brief CMOS input buffer (single-ended) */ +#define CY_SIO_VTRIP_TTL (0x01UL) /**< \brief TTL input buffer (single-ended) */ +#define CY_SIO_VTRIP_0_5VDDIO_0_5VOH (0x00UL) /**< \brief 0.5xVddio or 0.5xVoh (differential) */ +#define CY_SIO_VTRIP_0_4VDDIO_1_0VREF (0x01UL) /**< \brief 0.4xVddio or 0.4xVoh (differential) */ +/** \} */ + +/** +* \defgroup group_gpio_sioVref SIO reference voltage for input buffer trip-point +* \{ +* Constants to be used for setting the reference voltage of SIO input buffer trip-point. +*/ +#define CY_SIO_VREF_PINREF (0x00UL) /**< \brief Vref from analog pin */ +#define CY_SIO_VREF_1_2V (0x01UL) /**< \brief Vref from internal 1.2V reference */ +#define CY_SIO_VREF_AMUX_A (0x02UL) /**< \brief Vref from AMUXBUS_A */ +#define CY_SIO_VREF_AMUX_B (0x03UL) /**< \brief Vref from AMUXBUS_B */ +/** \} */ + +/** +* \defgroup group_gpio_sioVoh Regulated output voltage level (Voh) and input buffer trip-point of an SIO pair +* \{ +* Constants to be used for setting the Voh and input buffer trip-point of an SIO pair +*/ +#define CY_SIO_VOH_1_00 (0x00UL) /**< \brief Voh = 1 x Reference */ +#define CY_SIO_VOH_1_25 (0x01UL) /**< \brief Voh = 1.25 x Reference */ +#define CY_SIO_VOH_1_49 (0x02UL) /**< \brief Voh = 1.49 x Reference */ +#define CY_SIO_VOH_1_67 (0x03UL) /**< \brief Voh = 1.67 x Reference */ +#define CY_SIO_VOH_2_08 (0x04UL) /**< \brief Voh = 2.08 x Reference */ +#define CY_SIO_VOH_2_50 (0x05UL) /**< \brief Voh = 2.50 x Reference */ +#define CY_SIO_VOH_2_78 (0x06UL) /**< \brief Voh = 2.78 x Reference */ +#define CY_SIO_VOH_4_16 (0x07UL) /**< \brief Voh = 4.16 x Reference */ +/** \} */ + +/** \} group_gpio_macro */ + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_gpio_functions +* \{ +*/ + +/** +* \addtogroup group_gpio_functions_init +* \{ +*/ + +cy_en_gpio_status_t Cy_GPIO_Pin_Init(GPIO_PRT_Type* base, uint32_t pinNum, const cy_stc_gpio_pin_config_t *config); +cy_en_gpio_status_t Cy_GPIO_Port_Init(GPIO_PRT_Type* base, const cy_stc_gpio_prt_config_t *config); +__STATIC_INLINE void Cy_GPIO_Pin_FastInit(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t driveMode, + uint32_t outVal, en_hsiom_sel_t hsiom); +__STATIC_INLINE void Cy_GPIO_Port_Deinit(GPIO_PRT_Type* base); +__STATIC_INLINE void Cy_GPIO_SetHSIOM(GPIO_PRT_Type* base, uint32_t pinNum, en_hsiom_sel_t value); +__STATIC_INLINE en_hsiom_sel_t Cy_GPIO_GetHSIOM(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE GPIO_PRT_Type* Cy_GPIO_PortToAddr(uint32_t portNum); + +/** \} group_gpio_functions_init */ + +/** +* \addtogroup group_gpio_functions_gpio +* \{ +*/ + +__STATIC_INLINE uint32_t Cy_GPIO_Read(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_Write(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_ReadOut(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_Set(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_Clr(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_Inv(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetDrivemode(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetDrivemode(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetVtrip(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetVtrip(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetSlewRate(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetSlewRate(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetDriveSel(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetDriveSel(GPIO_PRT_Type* base, uint32_t pinNum); + +/** \} group_gpio_functions_gpio */ + +/** +* \addtogroup group_gpio_functions_sio +* \{ +*/ + +__STATIC_INLINE void Cy_GPIO_SetVregEn(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetVregEn(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetIbufMode(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetIbufMode(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetVtripSel(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetVtripSel(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetVrefSel(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetVrefSel(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetVohSel(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetVohSel(GPIO_PRT_Type* base, uint32_t pinNum); + +/** \} group_gpio_functions_sio */ + +/** +* \addtogroup group_gpio_functions_interrupt +* \{ +*/ + +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptStatus(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_ClearInterrupt(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetInterruptMask(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptMask(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptStatusMasked(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetSwInterrupt(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetInterruptEdge(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptEdge(GPIO_PRT_Type* base, uint32_t pinNum); +__STATIC_INLINE void Cy_GPIO_SetFilter(GPIO_PRT_Type* base, uint32_t value); +__STATIC_INLINE uint32_t Cy_GPIO_GetFilter(GPIO_PRT_Type* base); + +#if (IOSS_GPIO_GPIO_PORT_NR_0_31 != 0) +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause0(void); +#endif /* (IOSS_GPIO_GPIO_PORT_NR_0_31 != 0) */ + +#if (IOSS_GPIO_GPIO_PORT_NR_32_63 != 0) +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause1(void); +#endif /* (IOSS_GPIO_GPIO_PORT_NR_32_63 != 0) */ + +#if (IOSS_GPIO_GPIO_PORT_NR_64_95 != 0) +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause2(void); +#endif /* (IOSS_GPIO_GPIO_PORT_NR_64_95 != 0) */ + +#if (IOSS_GPIO_GPIO_PORT_NR_96_127 != 0) +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause3(void); +#endif /* (IOSS_GPIO_GPIO_PORT_NR_96_127 != 0) */ + +/** \} group_gpio_functions_interrupt */ + + +/******************************************************************************* +* Function Name: Cy_GPIO_Pin_FastInit +****************************************************************************//** +* +* \brief Initialize the most common configuration settings for all pin types. +* +* These include, drive mode, initial output value, and HSIOM connection. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param driveMode +* Pin drive mode. Options are detailed in \ref group_gpio_driveModes macros +* +* \param outVal +* Logic state of the output buffer driven to the pin (1 or 0) +* +* \param hsiom +* HSIOM input selection +* +* \return +* void +* +* \note +* This function modifies port registers in read-modify-write operations. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_Pin_FastInit(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t driveMode, + uint32_t outVal, en_hsiom_sel_t hsiom) +{ + uint32_t tempReg; + uint32_t portNum; + HSIOM_PRT_Type* portAddrHSIOM; + + tempReg = (base->OUT & ~(CY_GPIO_OUT_MASK << pinNum)); + base->OUT = tempReg | ((outVal & CY_GPIO_OUT_MASK) << pinNum); + + tempReg = (base->CFG & ~(CY_GPIO_CFG_DM_MASK << (pinNum << CY_GPIO_DRIVE_MODE_OFFSET))); + base->CFG = tempReg | ((driveMode & CY_GPIO_CFG_DM_MASK) << (pinNum << CY_GPIO_DRIVE_MODE_OFFSET)); + + portNum = ((uint32_t)(base) - GPIO_BASE) / GPIO_PRT_SECTION_SIZE; + portAddrHSIOM = (HSIOM_PRT_Type*)(HSIOM_BASE + (HSIOM_PRT_SECTION_SIZE * portNum)); + + if(pinNum < CY_GPIO_PRT_HALF) + { + tempReg = portAddrHSIOM->PORT_SEL0 & ~(CY_GPIO_HSIOM_MASK << (pinNum << CY_GPIO_HSIOM_OFFSET)); + portAddrHSIOM->PORT_SEL0 = tempReg | ((hsiom & CY_GPIO_HSIOM_MASK) << (pinNum << CY_GPIO_HSIOM_OFFSET)); + } + else + { + pinNum -= CY_GPIO_PRT_HALF; + tempReg = portAddrHSIOM->PORT_SEL1 & ~(CY_GPIO_HSIOM_MASK << (pinNum << CY_GPIO_HSIOM_OFFSET)); + portAddrHSIOM->PORT_SEL1 = tempReg | ((hsiom & CY_GPIO_HSIOM_MASK) << (pinNum << CY_GPIO_HSIOM_OFFSET)); + } +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_Port_Deinit +****************************************************************************//** +* +* \brief Reset a complete port of pins back to power on reset defaults. +* +* \param base +* Pointer to the pin's port register base address +* +* \return +* void +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_Port_Deinit(GPIO_PRT_Type* base) +{ + uint32_t portNum; + HSIOM_PRT_Type* portAddrHSIOM; + + portNum = ((uint32_t)(base) - GPIO_BASE) / GPIO_PRT_SECTION_SIZE; + portAddrHSIOM = (HSIOM_PRT_Type*)(HSIOM_BASE + (HSIOM_PRT_SECTION_SIZE * portNum)); + + base->OUT = CY_GPIO_PRT_DEINIT; + base->CFG = CY_GPIO_PRT_DEINIT; + base->CFG_IN = CY_GPIO_PRT_DEINIT; + base->CFG_OUT = CY_GPIO_PRT_DEINIT; + base->INTR_CFG = CY_GPIO_PRT_DEINIT; + base->INTR_MASK = CY_GPIO_PRT_DEINIT; + base->CFG_SIO = CY_GPIO_PRT_DEINIT; + portAddrHSIOM->PORT_SEL0 = CY_GPIO_PRT_DEINIT; + portAddrHSIOM->PORT_SEL1 = CY_GPIO_PRT_DEINIT; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetHSIOM +****************************************************************************//** +* +* \brief Configures the HSIOM connection to the pin. +* +* Connects the specified High-Speed Input Output Multiplexer (HSIOM) selection +* to the pin. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* HSIOM input selection +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetHSIOM(GPIO_PRT_Type* base, uint32_t pinNum, en_hsiom_sel_t value) +{ + uint32_t portNum; + uint32_t tempReg; + HSIOM_PRT_Type* portAddrHSIOM; + + portNum = ((uint32_t)(base) - GPIO_BASE) / GPIO_PRT_SECTION_SIZE; + portAddrHSIOM = (HSIOM_PRT_Type*)(HSIOM_BASE + (HSIOM_PRT_SECTION_SIZE * portNum)); + + if(pinNum < CY_GPIO_PRT_HALF) + { + tempReg = portAddrHSIOM->PORT_SEL0 & ~(CY_GPIO_HSIOM_MASK << (pinNum << CY_GPIO_HSIOM_OFFSET)); + portAddrHSIOM->PORT_SEL0 = tempReg | ((value & CY_GPIO_HSIOM_MASK) << (pinNum << CY_GPIO_HSIOM_OFFSET)); + } + else + { + pinNum -= CY_GPIO_PRT_HALF; + tempReg = portAddrHSIOM->PORT_SEL1 & ~(CY_GPIO_HSIOM_MASK << (pinNum << CY_GPIO_HSIOM_OFFSET)); + portAddrHSIOM->PORT_SEL1 = tempReg | ((value & CY_GPIO_HSIOM_MASK) << (pinNum << CY_GPIO_HSIOM_OFFSET)); + } +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetHSIOM +****************************************************************************//** +* +* \brief Returns the current HSIOM multiplexer connection to the pin. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* HSIOM input selection +* +*******************************************************************************/ +__STATIC_INLINE en_hsiom_sel_t Cy_GPIO_GetHSIOM(GPIO_PRT_Type* base, uint32_t pinNum) +{ + uint32_t returnValue; + uint32_t portNum; + HSIOM_PRT_Type* portAddrHSIOM; + + portNum = ((uint32_t)(base) - GPIO_BASE) / GPIO_PRT_SECTION_SIZE; + portAddrHSIOM = (HSIOM_PRT_Type*)(HSIOM_BASE + (HSIOM_PRT_SECTION_SIZE * portNum)); + + if(pinNum < CY_GPIO_PRT_HALF) + { + returnValue = (portAddrHSIOM->PORT_SEL0 >> (pinNum << CY_GPIO_HSIOM_OFFSET)) & CY_GPIO_HSIOM_MASK; + } + else + { + pinNum -= CY_GPIO_PRT_HALF; + returnValue = (portAddrHSIOM->PORT_SEL1 >> (pinNum << CY_GPIO_HSIOM_OFFSET)) & CY_GPIO_HSIOM_MASK; + } + + return (en_hsiom_sel_t)returnValue; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_PortToAddr +****************************************************************************//** +* +* \brief Retrieves the port address based on the given port number. +* +* This is a helper function to calculate the port base address when given a port +* number. It is to be used when pin access needs to be calculated at runtime. +* +* \param portNum +* Port number +* +* \return +* Base address of the port register structure +* +*******************************************************************************/ +__STATIC_INLINE GPIO_PRT_Type* Cy_GPIO_PortToAddr(uint32_t portNum) +{ + GPIO_PRT_Type* base; + + if(portNum < (uint32_t)IOSS_GPIO_GPIO_PORT_NR) + { + base = (GPIO_PRT_Type *)(GPIO_BASE + (GPIO_PRT_SECTION_SIZE * portNum)); + } + else + { + /* Error: Return default base address */ + base = (GPIO_PRT_Type *)(GPIO_BASE); + } + + return (base); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_Read +****************************************************************************//** +* +* \brief Reads the current logic level on the input buffer of the pin. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* Logic level present on the pin +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_Read(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->IN >> (pinNum)) & CY_GPIO_IN_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_Write +****************************************************************************//** +* +* \brief Write a logic 0 or logic 1 state to the output driver. +* +* This function should be used only for software driven pins. It does not have +* any effect on peripheral driven pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* Logic level to drive out on the pin +* +* \return +* void +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_Write(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + /* Thread-safe: Directly access the pin registers instead of base->OUT */ + if(CY_GPIO_ZERO == value) + { + base->OUT_CLR = CY_GPIO_OUT_MASK << pinNum; + } + else + { + base->OUT_SET = CY_GPIO_OUT_MASK << pinNum; + } +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_ReadOut +****************************************************************************//** +* +* \brief Reads the current logic level on the pin output driver. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* Logic level on the pin output driver +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_ReadOut(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->OUT >> pinNum) & CY_GPIO_OUT_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_Set +****************************************************************************//** +* +* \brief Set a pin output to logic state high. +* +* This function should be used only for software driven pins. It does not have +* any effect on peripheral driven pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* void +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_Set(GPIO_PRT_Type* base, uint32_t pinNum) +{ + base->OUT_SET = CY_GPIO_OUT_MASK << pinNum; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_Clr +****************************************************************************//** +* +* \brief Set a pin output to logic state Low. +* +* This function should be used only for software driven pins. It does not have +* any effect on peripheral driven pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* void +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_Clr(GPIO_PRT_Type* base, uint32_t pinNum) +{ + base->OUT_CLR = CY_GPIO_OUT_MASK << pinNum; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_Inv +****************************************************************************//** +* +* \brief Set a pin output logic state to the inverse of the current output +* logic state. +* +* This function should be used only for software driven pins. It does not have +* any effect on peripheral driven pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* void +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_Inv(GPIO_PRT_Type* base, uint32_t pinNum) +{ + base->OUT_INV = CY_GPIO_OUT_MASK << pinNum; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetDrivemode +****************************************************************************//** +* +* \brief Configures the pin output buffer drive mode and input buffer enable. +* +* The output buffer drive mode and input buffer enable are combined into a single +* parameter. The drive mode controls the behavior of the pin in general. +* Enabling the input buffer allows the digital pin state to be read but also +* contributes to extra current consumption. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* Pin drive mode. Options are detailed in \ref group_gpio_driveModes macros +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetDrivemode(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + uint32_t pinLoc; + + pinLoc = pinNum << CY_GPIO_DRIVE_MODE_OFFSET; + tempReg = (base->CFG & ~(CY_GPIO_CFG_DM_MASK << pinLoc)); + base->CFG = tempReg | ((value & CY_GPIO_CFG_DM_MASK) << pinLoc); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetDrivemode +****************************************************************************//** +* +* \brief Returns the pin output buffer drive mode and input buffer enable state. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* Pin drive mode. Options are detailed in \ref group_gpio_driveModes macros +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetDrivemode(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->CFG >> (pinNum << CY_GPIO_DRIVE_MODE_OFFSET)) & CY_GPIO_CFG_DM_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetVtrip +****************************************************************************//** +* +* \brief Configures the GPIO pin input buffer voltage threshold mode. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* Pin voltage threshold mode. Options are detailed in \ref group_gpio_vtrip macros +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetVtrip(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + + tempReg = base->CFG_IN & ~(CY_GPIO_CFG_IN_VTRIP_SEL_MASK << pinNum); + base->CFG_IN = tempReg | ((value & CY_GPIO_CFG_IN_VTRIP_SEL_MASK) << pinNum); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetVtrip +****************************************************************************//** +* +* \brief Returns the pin input buffer voltage threshold mode. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* Pin voltage threshold mode. Options are detailed in \ref group_gpio_vtrip macros +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetVtrip(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->CFG_IN >> pinNum) & CY_GPIO_CFG_IN_VTRIP_SEL_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetSlewRate +****************************************************************************//** +* +* \brief Configures the pin output buffer slew rate. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* Pin slew rate. Options are detailed in \ref group_gpio_slewRate macros +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetSlewRate(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + + tempReg = base->CFG_OUT & ~(CY_GPIO_CFG_OUT_SLOW_MASK << pinNum); + base->CFG_OUT = tempReg | ((value & CY_GPIO_CFG_OUT_SLOW_MASK) << pinNum); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetSlewRate +****************************************************************************//** +* +* \brief Returns the pin output buffer slew rate. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* Pin slew rate. Options are detailed in \ref group_gpio_slewRate macros +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetSlewRate(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->CFG_OUT >> pinNum) & CY_GPIO_CFG_OUT_SLOW_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetDriveSel +****************************************************************************//** +* +* \brief Configures the pin output buffer drive strength. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* Pin drive strength. Options are detailed in \ref group_gpio_driveStrength macros +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetDriveSel(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + uint32_t pinLoc; + + pinLoc = pinNum + CY_GPIO_CFG_OUT_DRIVE_OFFSET; + tempReg = base->CFG_OUT & ~(CY_GPIO_CFG_OUT_DRIVE_SEL_MASK << pinLoc); + base->CFG_OUT = tempReg | ((value & CY_GPIO_CFG_OUT_DRIVE_SEL_MASK) << pinLoc); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetDriveSel +****************************************************************************//** +* +* \brief Returns the pin output buffer drive strength. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* Pin drive strength. Options are detailed in \ref group_gpio_driveStrength macros +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetDriveSel(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->CFG_OUT >> (pinNum + CY_GPIO_CFG_OUT_DRIVE_OFFSET)) & CY_GPIO_CFG_OUT_DRIVE_SEL_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetVregEn +****************************************************************************//** +* +* \brief Configures the SIO pin pair output buffer regulation mode. +* +* Note that this function has no effect on non-SIO pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* SIO pair output buffer regulator mode. Options are detailed in \ref group_gpio_sioVreg macros +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetVregEn(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + uint32_t pinLoc; + + pinLoc = (pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET; + tempReg = base->CFG_SIO & ~(CY_GPIO_VREG_EN_MASK << pinLoc); + base->CFG_SIO = tempReg | ((value & CY_GPIO_VREG_EN_MASK) << pinLoc); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetVregEn +****************************************************************************//** +* +* \brief Returns the SIO pin pair output buffer regulation mode. +* +* Note that this function has no effect on non-SIO pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* SIO pair output buffer regulator mode. Options are detailed in \ref group_gpio_sioVreg macros +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetVregEn(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->CFG_SIO >> ((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET)) & CY_GPIO_VREG_EN_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetIbufMode +****************************************************************************//** +* +* \brief Configures the SIO pin pair input buffer mode. +* +* Note that this function has no effect on non-SIO pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* SIO pair input buffer mode. Options are detailed in \ref group_gpio_sioIbuf macros +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetIbufMode(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + uint32_t pinLoc; + + pinLoc = ((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET) + CY_GPIO_IBUF_SHIFT; + tempReg = (base->CFG_SIO & ~(CY_GPIO_IBUF_MASK << pinLoc)); + base->CFG_SIO = tempReg | ((value & CY_GPIO_IBUF_MASK) << pinLoc); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetIbufMode +****************************************************************************//** +* +* \brief Returns the SIO pin pair input buffer mode. +* +* Note that this function has no effect on non-SIO pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* SIO pair input buffer mode. Options are detailed in \ref group_gpio_sioIbuf macros +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetIbufMode(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->CFG_SIO >> (((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET) + CY_GPIO_IBUF_SHIFT)) & CY_GPIO_IBUF_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetVtripSel +****************************************************************************//** +* +* \brief Configures the SIO pin pair input buffer trip point. +* +* Note that this function has no effect on non-SIO pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* SIO pair input buffer trip point. Options are detailed in \ref group_gpio_sioVtrip macros +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetVtripSel(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + uint32_t pinLoc; + + pinLoc = ((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET) + CY_GPIO_VTRIP_SEL_SHIFT; + tempReg = (base->CFG_SIO & ~(CY_GPIO_VTRIP_SEL_MASK << pinLoc)); + base->CFG_SIO = tempReg | ((value & CY_GPIO_VTRIP_SEL_MASK) << pinLoc); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetVtripSel +****************************************************************************//** +* +* \brief Returns the SIO pin pair input buffer trip point. +* +* Note that this function has no effect on non-SIO pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* SIO pair input buffer trip point. Options are detailed in \ref group_gpio_sioVtrip macros +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetVtripSel(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->CFG_SIO >> (((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET) + CY_GPIO_VTRIP_SEL_SHIFT)) & CY_GPIO_VTRIP_SEL_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetVrefSel +****************************************************************************//** +* +* \brief Configures the SIO reference voltage for the input buffer trip point. +* +* Note that this function has no effect on non-SIO pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* SIO pair reference voltage. Options are detailed in \ref group_gpio_sioVref macros +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetVrefSel(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + uint32_t pinLoc; + + pinLoc = ((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET) + CY_GPIO_VREF_SEL_SHIFT; + tempReg = (base->CFG_SIO & ~(CY_GPIO_VREF_SEL_MASK << pinLoc)); + base->CFG_SIO = tempReg | ((value & CY_GPIO_VREF_SEL_MASK) << pinLoc); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetVrefSel +****************************************************************************//** +* +* \brief Returns the SIO reference voltage for the input buffer trip point. +* +* Note that this function has no effect on non-SIO pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* SIO pair reference voltage. Options are detailed in \ref group_gpio_sioVref macros +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetVrefSel(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->CFG_SIO >> (((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET) + CY_GPIO_VREF_SEL_SHIFT)) & CY_GPIO_VREF_SEL_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetVohSel +****************************************************************************//** +* +* \brief Configures the regulated output reference multiplier for the SIO pin pair. +* +* The regulated output reference controls both the output level of digital output +* pin and the input trip point of digital input pin in the SIO pair. +* +* Note that this function has no effect on non-SIO pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* SIO pair reference voltage. Options are detailed in \ref group_gpio_sioVoh macros +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetVohSel(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + uint32_t pinLoc; + + pinLoc = ((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET) + CY_GPIO_VOH_SEL_SHIFT; + tempReg = (base->CFG_SIO & ~(CY_GPIO_VOH_SEL_MASK << pinLoc)); + base->CFG_SIO = tempReg | ((value & CY_GPIO_VOH_SEL_MASK) << pinLoc); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetVohSel +****************************************************************************//** +* +* \brief Returns the regulated output reference multiplier for the SIO pin pair. +* +* Note that this function has no effect on non-SIO pins. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* SIO pair reference voltage. Options are detailed in \ref group_gpio_sioVoh macros +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetVohSel(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->CFG_SIO >> (((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET) + CY_GPIO_VOH_SEL_SHIFT)) & CY_GPIO_VOH_SEL_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetInterruptStatus +****************************************************************************//** +* +* \brief Return the current interrupt state of the pin. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* 0 = Pin interrupt condition not detected +* 1 = Pin interrupt condition detected +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptStatus(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->INTR >> pinNum) & CY_GPIO_INTR_STATUS_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_ClearInterrupt +****************************************************************************//** +* +* \brief Clears the triggered pin interrupt. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* void +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_ClearInterrupt(GPIO_PRT_Type* base, uint32_t pinNum) +{ + /* Any INTR MMIO registers AHB clearing must be preceded with an AHB read access */ + (void)base->INTR; + + base->INTR = CY_GPIO_INTR_STATUS_MASK << pinNum; + + /* This read ensures that the initial write has been flushed out to the hardware */ + (void)base->INTR; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetInterruptMask +****************************************************************************//** +* +* \brief Configures the pin interrupt to be forwarded to the CPU NVIC. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* 0 = Pin interrupt not forwarded to CPU interrupt controller +* 1 = Pin interrupt masked and forwarded to CPU interrupt controller +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetInterruptMask(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + + tempReg= base->INTR_MASK & ~(CY_GPIO_INTR_EN_MASK << pinNum); + base->INTR_MASK = tempReg | ((value & CY_GPIO_INTR_EN_MASK) << pinNum); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetInterruptMask +****************************************************************************//** +* +* \brief Returns the state of the pin interrupt mask to determine whether it is +* configured to be forwarded to the CPU interrupt controller. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* 0 = Pin interrupt not forwarded to CPU interrupt controller +* 1 = Pin interrupt masked and forwarded to CPU interrupt controller +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptMask(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->INTR_MASK >> pinNum) & CY_GPIO_INTR_EN_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetInterruptStatusMasked +****************************************************************************//** +* +* \brief Return the pin's current interrupt state after being masked. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* 0 = Pin interrupt not detected or not forwarded to CPU interrupt controller +* 1 = Pin interrupt detected and forwarded to CPU interrupt controller +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptStatusMasked(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->INTR_MASKED >> pinNum) & CY_GPIO_INTR_MASKED_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetSwInterrupt +****************************************************************************//** +* +* \brief Force a pin interrupt to trigger. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* void +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetSwInterrupt(GPIO_PRT_Type* base, uint32_t pinNum) +{ + base->INTR_SET = CY_GPIO_INTR_SET_MASK << pinNum; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetInterruptEdge +****************************************************************************//** +* +* \brief Configures the type of edge that will trigger a pin interrupt. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \param value +* Pin interrupt mode. Options are detailed in \ref group_gpio_interruptTrigger macros +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetInterruptEdge(GPIO_PRT_Type* base, uint32_t pinNum, uint32_t value) +{ + uint32_t tempReg; + uint32_t pinLoc; + + pinLoc = pinNum << CY_GPIO_INTR_CFG_OFFSET; + tempReg = base->INTR_CFG & ~(CY_GPIO_INTR_EDGE_MASK << pinLoc); + base->INTR_CFG = tempReg | ((value & CY_GPIO_INTR_EDGE_MASK) << pinLoc); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetInterruptEdge +****************************************************************************//** +* +* \brief Returns the current pin interrupt edge type. +* +* \param base +* Pointer to the pin's port register base address +* +* \param pinNum +* Position of the pin bit-field within the port register +* +* \return +* Pin interrupt mode. Options are detailed in \ref group_gpio_interruptTrigger macros +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptEdge(GPIO_PRT_Type* base, uint32_t pinNum) +{ + return (base->INTR_CFG >> (pinNum << CY_GPIO_INTR_CFG_OFFSET)) & CY_GPIO_INTR_EDGE_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_SetFilter +****************************************************************************//** +* +* \brief Configures which pin on the port connects to the port filter. +* +* \param base +* Pointer to the pin's port register base address +* +* \param value +* The number of the port pin to route to the port filter (0...7) +* +* \return +* void +* +* \note +* This function modifies a port register in a read-modify-write operation. It is +* not thread safe as the resource is shared among multiple pins on a port. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_GPIO_SetFilter(GPIO_PRT_Type* base, uint32_t value) +{ + uint32_t tempReg; + + tempReg = base->INTR_CFG & ~(CY_GPIO_INTR_FLT_EDGE_MASK << CY_GPIO_INTR_FILT_OFFSET); + base->INTR_CFG = tempReg | ((value & CY_GPIO_INTR_FLT_EDGE_MASK) << CY_GPIO_INTR_FILT_OFFSET); +} + + +/******************************************************************************* +* Function Name: Cy_GPIO_GetFilter +****************************************************************************//** +* +* \brief Returns which pin is currently configured to connect to the port filter. +* +* \param base +* Pointer to the pin's port register base address +* +* \return +* The number of the port pin routed to the port filter (0...7) +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetFilter(GPIO_PRT_Type* base) +{ + return (base->INTR_CFG >> CY_GPIO_INTR_FILT_OFFSET) & CY_GPIO_INTR_FLT_EDGE_MASK; +} + + +#if (IOSS_GPIO_GPIO_PORT_NR_0_31 != 0) || defined (CY_DOXYGEN) + +/******************************************************************************* +* Function Name: Cy_GPIO_GetInterruptCause0 +****************************************************************************//** +* +* \brief Returns the interrupt status for ports 0 to 31. +* +* \return +* 0 = Interrupt not detected on port +* 1 = Interrupt detected and sent to CPU interrupt controller on port +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause0(void) +{ + return GPIO->INTR_CAUSE0; +} + +#endif + +#if (IOSS_GPIO_GPIO_PORT_NR_32_63 != 0) || defined (CY_DOXYGEN) + +/******************************************************************************* +* Function Name: Cy_GPIO_GetInterruptCause1 +****************************************************************************//** +* +* \brief Returns the interrupt status for ports 32 to 63. +* +* \return +* 0 = Interrupt not detected on port +* 1 = Interrupt detected and sent to CPU interrupt controller on port +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause1(void) +{ + return GPIO->INTR_CAUSE1; +} + +#endif + +#if (IOSS_GPIO_GPIO_PORT_NR_64_95 != 0) || defined (CY_DOXYGEN) + +/******************************************************************************* +* Function Name: Cy_GPIO_GetInterruptCause2 +****************************************************************************//** +* +* \brief Returns the interrupt status for ports 64 to 95. +* +* \return +* 0 = Interrupt not detected on port +* 1 = Interrupt detected and sent to CPU interrupt controller on port +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause2(void) +{ + return GPIO->INTR_CAUSE2; +} + +#endif + +#if (IOSS_GPIO_GPIO_PORT_NR_96_127 != 0) || defined (CY_DOXYGEN) + +/******************************************************************************* +* Function Name: Cy_GPIO_GetInterruptCause3 +****************************************************************************//** +* +* \brief Returns the interrupt status for ports 96 to 127. +* +* \return +* 0 = Interrupt not detected on port +* 1 = Interrupt detected and sent to CPU interrupt controller on port +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause3(void) +{ + return GPIO->INTR_CAUSE3; +} + +#endif + +/** \} group_gpio_functions */ + + +#if defined(__cplusplus) +} +#endif + +#endif /* CY_GPIO_H */ + +/** \} group_gpio */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_drv.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_drv.c new file mode 100644 index 0000000000..62cb66b28f --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_drv.c @@ -0,0 +1,464 @@ +/***************************************************************************//** +* \file +* \version 1.0 +* +* \breif +* IPC Driver - This source file contains the low level driver code for +* the IPC hardware. +* +******************************************************************************** +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_ipc_drv.h" + + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_LockAcquire +****************************************************************************//** +* +* This function is used to acquire the IPC lock. The function acquires the lock corresponding to the ipcPtr passed. +* +* \param ipcPtr +* This parameter is a handle which represents the base address of the registers of the IPC channel. +* The parameter is generally returned from a call to the \ref Cy_IPC_DRV_GetIpcBaseAddress +* +* \return +* Status for the function: +* CY_IPC_DRV_SUCCESS: The IPC was successfully acquired +* CY_IPC_DRV_ERROR: The IPC was not acquired since it was already acquired by another master +* +*******************************************************************************/ +cy_en_ipcdrv_status_t Cy_IPC_DRV_LockAcquire (IPC_STRUCT_Type const * ipcPtr) +{ + cy_en_ipcdrv_status_t retStatus; + + if( 0ul != (IPC_STRUCT_ACQUIRE_SUCCESS_Msk & ipcPtr->ACQUIRE)) + { + retStatus = CY_IPC_DRV_SUCCESS; + } + else + { + retStatus = CY_IPC_DRV_ERROR; + } + return(retStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_GetLockStatus +****************************************************************************//** +* +* The function is used to read the lock status of an IPC channel. The function tells the reader if the IPC was in the locked or released state. +* +* \param ipcPtr +* This parameter is a handle which represents the base address of the registers of the IPC channel. +* The parameter is generally returned from a call to the \ref Cy_IPC_DRV_GetIpcBaseAddress +* +* \return +* Status for the function: +* CY_IPC_DRV_LOCKED: The IPC is in the Locked state +* CY_IPC_DRV_RELEASED: The IPC is in the Released state +* +*******************************************************************************/ +cy_en_ipcdrv_status_t Cy_IPC_DRV_GetLockStatus (IPC_STRUCT_Type const * ipcPtr) +{ + cy_en_ipcdrv_status_t retStatus; + + if( IPC_STRUCT_ACQUIRE_SUCCESS_Msk == (IPC_STRUCT_ACQUIRE_SUCCESS_Msk & ipcPtr->LOCK_STATUS) ) + { + retStatus = CY_IPC_DRV_LOCKED; + } + else + { + retStatus = CY_IPC_DRV_RELEASED; + } + return(retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_Release +****************************************************************************//** +* +* The function is used to release an IPC from the locked state. +* The function also has a way to specify through a parameter, which IPC interrupts need to be notified during the release event. +* +* \param ipcPtr +* This parameter is a handle which represents the base address of the registers of the IPC channel. +* The parameter is generally returned from a call to the \ref Cy_IPC_DRV_GetIpcBaseAddress +* +* \param releaseEventIntr +* Bit encoded list of IPC interrupt lines that are triggered by a release event +* +* \return +* Status for the function: +* CY_IPC_DRV_SUCCESS: The function executed successfully and the IPC was released +* CY_IPC_DRV_NOT_ACQUIRED: The IPC channel was not acquired before the function call. +* +*******************************************************************************/ +cy_en_ipcdrv_status_t Cy_IPC_DRV_Release (IPC_STRUCT_Type* ipcPtr, uint32_t releaseEventIntr) +{ + cy_en_ipcdrv_status_t retStatus; + + /* Check to make sure the IPC is Acquired */ + if( IPC_STRUCT_ACQUIRE_SUCCESS_Msk == ( IPC_STRUCT_ACQUIRE_SUCCESS_Msk & ipcPtr->LOCK_STATUS) ) + { + /* The IPC was acquired, release the IPC channel */ + ipcPtr->RELEASE = (IPC_INTR_STRUCT_INTR_RELEASE_Msk & releaseEventIntr); + retStatus = CY_IPC_DRV_SUCCESS; + } + else /* The IPC channel was already released (not acquired) */ + { + retStatus = CY_IPC_DRV_NOT_ACQUIRED; + } + + return(retStatus); +} + + + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_Notify +****************************************************************************//** +* +* The function generates a notify event to an IPC interrupt structure. +* +* \param ipcPtr +* This parameter is a handle which represents the base address of the registers of the IPC channel. +* The parameter is generally returned from a call to the \ref Cy_IPC_DRV_GetIpcBaseAddress +* +* \param notifyEventIntr +* Bit encoded list of IPC interrupt lines that are triggered by a notification +* +* \return +* void +* +*******************************************************************************/ +void Cy_IPC_DRV_Notify (IPC_STRUCT_Type* ipcPtr, uint32_t notifyEventIntr) +{ + ipcPtr->NOTIFY = (IPC_STRUCT_NOTIFY_INTR_NOTIFY_Msk & notifyEventIntr); +} + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_SendMsgWord +****************************************************************************//** +* +* This function is used to send a 32 bit word message through an IPC channel. +* The function also has an associated notification field that will let the message notify one or multiple IPC interrupts. +* The IPC channel is locked and remains locked after the function returns. The receiver +* of the message should release the channel. +* +* \param ipcPtr +* This parameter is a handle which represents the base address of the registers of the IPC channel. +* The parameter is generally returned from a call to the \ref Cy_IPC_DRV_GetIpcBaseAddress. +* +* \param notifyEventIntr +* Bit encoded list of IPC interrupt lines that are triggered by a notification. +* +* \param message +* The message word that is the data placed in the IPC data register. +* +* \return +* Status for the function: +* CY_IPC_DRV_SUCCESS: The send operation was successful +* CY_IPC_DRV_ERROR: The IPC channel is unavailable since it is already locked. +* +*******************************************************************************/ +cy_en_ipcdrv_status_t Cy_IPC_DRV_SendMsgWord (IPC_STRUCT_Type* ipcPtr, uint32_t notifyEventIntr, uint32_t message) +{ + cy_en_ipcdrv_status_t retStatus; + + if( CY_IPC_DRV_SUCCESS == Cy_IPC_DRV_LockAcquire(ipcPtr) ) + { + /* If the channel was acquired, send the message. */ + ipcPtr->DATA = message; + ipcPtr->NOTIFY = (IPC_STRUCT_NOTIFY_INTR_NOTIFY_Msk & notifyEventIntr); + retStatus = CY_IPC_DRV_SUCCESS; + } + else + { + /* Channel was already acquired, return Error */ + retStatus = CY_IPC_DRV_ERROR; + } + return(retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_ReadMsgWord +****************************************************************************//** +* +* This function is used to read a 32 bit word message through an IPC channel. +* This function assumes that the channel is locked (in order for a valid message). If +* the channel is not locked the message is invalid. The user needs to call +* Cy_IPC_DRV_Release() function after reading the message, to release the lock. +* +* \param ipcPtr +* This parameter is a handle which represents the base address of the registers of the IPC channel. +* The parameter is generally returned from a call to the \ref Cy_IPC_DRV_GetIpcBaseAddress. +* +* \param message +* A variable where the read data is copied. +* +* \return +* Status for the function +* CY_IPC_DRV_SUCCESS: The function executed successfully and the IPC was released. +* CY_IPC_DRV_ERROR: The function encountered an error since the IPC channel was already in a released state meaning the data may be invalid +* +*******************************************************************************/ +cy_en_ipcdrv_status_t Cy_IPC_DRV_ReadMsgWord (IPC_STRUCT_Type* ipcPtr, uint32_t * message) +{ + cy_en_ipcdrv_status_t retStatus; + + if( CY_IPC_DRV_LOCKED == Cy_IPC_DRV_GetLockStatus(ipcPtr) ) + { + /* The channel is locked, message is valid. */ + *message = ipcPtr->DATA; + retStatus = CY_IPC_DRV_SUCCESS; + } + else + { + /* The channel is not locked so channel is invalid. */ + retStatus = CY_IPC_DRV_ERROR; + } + return(retStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_SendMsgPtr +****************************************************************************//** +* +* This function is used to send a message pointer through an IPC channel. +* The message structure may hold a generic pointer which may contain the address of +* any user data type or structure. This parameter could be a pointer to a 32 bit integer, an +* array or even a data structure defined in the user code. This function acts +* as a transfer engine for sending the pointer. Any memory management of the pointer +* allocation and deallocation is up to the application code. +* The function also has an associated notification field that will let the message +* notify one or multiple interrupts. +* +* \param ipcPtr +* This parameter is a handle which represents the base address of the registers of the IPC channel. +* The parameter is generally returned from a call to the \ref Cy_IPC_DRV_GetIpcBaseAddress +* +* \param notifyEventIntr +* Bit encoded list of IPC interrupt lines that are triggered during the release action. +* +* \param msgPtr +* The message pointer that is being sent over the IPC channel +* +* \return +* Status for the function: +* CY_IPC_DRV_SUCCESS: The send operation was successful +* CY_IPC_DRV_ERROR: The IPC channel is unavailable since it is already locked +* +*******************************************************************************/ +cy_en_ipcdrv_status_t Cy_IPC_DRV_SendMsgPtr(IPC_STRUCT_Type* ipcPtr, uint32_t notifyEventIntr, void const * msgPtr) +{ + cy_en_ipcdrv_status_t retStatus; + + if( CY_IPC_DRV_SUCCESS == Cy_IPC_DRV_LockAcquire(ipcPtr) ) + { + /* If the channel was acquired, send the message. */ + ipcPtr->DATA = (uint32_t)msgPtr; + ipcPtr->NOTIFY = ((uint32_t)IPC_STRUCT_NOTIFY_INTR_NOTIFY_Msk & notifyEventIntr); + retStatus = CY_IPC_DRV_SUCCESS; + } + else + { + /* Chaneel was already acquired, Error */ + retStatus = CY_IPC_DRV_ERROR; + } + return(retStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_ReadMsgPtr +****************************************************************************//** +* +* This function is used to read a 32 bit pointer message through an IPC channel. +* +* \param ipcPtr +* This parameter is a handle which represents the base address of the registers of the IPC channel. +* The parameter is generally returned from a call to the \ref Cy_IPC_DRV_GetIpcBaseAddress +* +* \param msgPtr +* Pointer variable to hold the data pointer that is being read from the IPC channel +* +* +* \return +* Status for the function +* CY_IPC_DRV_SUCCESS: The function executed successfully and the IPC was released +* CY_IPC_DRV_ERROR: The function encountered an error since the IPC channel was already in a released state meaning the data in it is invalid +* +*******************************************************************************/ +cy_en_ipcdrv_status_t Cy_IPC_DRV_ReadMsgPtr (IPC_STRUCT_Type* ipcPtr, void ** msgPtr) +{ + cy_en_ipcdrv_status_t retStatus; + + if( CY_IPC_DRV_LOCKED == Cy_IPC_DRV_GetLockStatus(ipcPtr) ) + { + /* The channel is locked, message is valid. */ + *msgPtr = (void *)(ipcPtr->DATA); + retStatus = CY_IPC_DRV_SUCCESS; + } + else + { + /* The channel is not locked so channel is invalid. */ + retStatus = CY_IPC_DRV_ERROR; + } + return(retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_SetIntrMask +****************************************************************************//** +* +* This function is used to set the interrupt mask for an IPC Interrupt. +* The mask can be set for release or notification events of all available IPC ports. +* +* \param ipcIntrPtr +* This is a handle to the IPC interrupt. This handle can be calculated from the IPC interrupt number using \ref Cy_IPC_DRV_GetIntrBaseAddr +* +* \param ipcReleaseMask +* An encoded list of all IPC structures that can trigger the interrupt on a release event +* +* \param ipcNotifyMask +* An encoded list of all IPC structures that can trigger the interrupt on a notify event. +* +* \return +* void +* +*******************************************************************************/ +void Cy_IPC_DRV_SetIntrMask (IPC_INTR_STRUCT_Type* ipcIntrPtr, uint32_t ipcReleaseMask, uint32_t ipcNotifyMask) +{ + ipcIntrPtr->INTR_MASK = ( ipcNotifyMask << IPC_INTR_STRUCT_INTR_NOTIFY_Pos) | ( ipcReleaseMask & IPC_INTR_STRUCT_INTR_MASK_RELEASE_Msk); +} + + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_GetIntrMask +****************************************************************************//** +* +* This function is used to read the interrupt mask. + +* \param ipcIntrPtr +* This is a handle to the IPC interrupt. This handle can be calculated from the IPC interrupt number using \ref Cy_IPC_DRV_GetIntrBaseAddr +* +* \return +* The return value is encoded as follows +* +*
Interrupt sources Value +*
Ipc_PORTX_RELEASE Xth bit set +*
Ipc_PORTX_NOTIFY X+16 th bit set +*
+* +*******************************************************************************/ +uint32_t Cy_IPC_DRV_GetIntrMask(IPC_INTR_STRUCT_Type const * ipcIntrPtr) +{ + return(ipcIntrPtr->INTR_MASK); +} + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_GetIntrStatusMasked +****************************************************************************//** +* +* This function is used to read the active unmasked interrupt. This function can be used in the interrupt service routine to +* find which source triggered the interrupt. +* +* \param ipcIntrPtr +* This is a handle to the IPC interrupt. This handle can be calculated from the IPC interrupt number using \ref Cy_IPC_DRV_GetIntrBaseAddr +* +* \return +* The return value is encoded as follows +* +*
Interrupt sources Value +*
Ipc_PORTX_RELEASE Xth bit set +*
Ipc_PORTX_NOTIFY X+16 th bit set +*
+* +*******************************************************************************/ +uint32_t Cy_IPC_DRV_GetIntrStatusMasked (IPC_INTR_STRUCT_Type const * ipcIntrPtr) +{ + return(ipcIntrPtr->INTR_MASKED); +} + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_GetIntrStatus +****************************************************************************//** +* +* This function is used to read the pending interrupts. Note that this read is an unmasked read of the interrupt status +* Interrupt sources read as active by this function would generate interrupts only if they were not masked + +* \param ipcIntrPtr +* This is a handle to the IPC interrupt. This handle can be calculated from the IPC interrupt number using \ref Cy_IPC_DRV_GetIntrBaseAddr +* +* \return +* The return value is encoded as follows +* +*
Interrupt sources Value +*
Ipc_PORTX_RELEASE Xth bit set +*
Ipc_PORTX_NOTIFY X+16 th bit set +*
+* +*******************************************************************************/ +uint32_t Cy_IPC_DRV_GetIntrStatus(IPC_INTR_STRUCT_Type const * ipcIntrPtr) +{ + return(ipcIntrPtr->INTR); +} + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_SetIntr +****************************************************************************//** +* +* This function is used to set the interrupt source. This function can be used to activate interrupts through software. +* Note that interrupt sources set using this interrupt would generate interrupts only if they are not masked +* +* \param ipcIntrPtr +* This is a handle to the IPC interrupt. This handle can be calculated from the IPC interrupt number using \ref Cy_IPC_DRV_GetIntrBaseAddr +* +* \param ipcReleaseMask +* An encoded list of all IPC structures that can trigger the interrupt on a release event +* +* \param ipcNotifyMask +* An encoded list of all IPC structures that can trigger the interrupt on a notify event. +* +* \return +* void +* +*******************************************************************************/ +void Cy_IPC_DRV_SetIntr(IPC_INTR_STRUCT_Type* ipcIntrPtr, uint32_t ipcReleaseMask, uint32_t ipcNotifyMask) +{ + ipcIntrPtr->INTR_SET = (ipcNotifyMask << IPC_INTR_STRUCT_INTR_NOTIFY_Pos) | ( ipcReleaseMask & IPC_INTR_STRUCT_INTR_MASK_RELEASE_Msk) ; +} + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_ClearIntr +****************************************************************************//** +* +* This function is used to clear the interrupt source. Use this function to clear a pending interrupt source in the interrupt status +* +* \param ipcIntrPtr +* This is a handle to the IPC interrupt. This handle can be calculated from the IPC interrupt number using \ref Cy_IPC_DRV_GetIntrBaseAddr +* +* \param ipcReleaseMask +* An encoded list of all IPC structures that can trigger the interrupt on a release event +* +* \param ipcNotifyMask +* An encoded list of all IPC structures that can trigger the interrupt on a notify event. +* +* \return +* void +* +*******************************************************************************/ +void Cy_IPC_DRV_ClearIntr(IPC_INTR_STRUCT_Type* ipcIntrPtr, uint32_t ipcReleaseMask, uint32_t ipcNotifyMask) +{ + ipcIntrPtr->INTR = (ipcNotifyMask << IPC_INTR_STRUCT_INTR_NOTIFY_Pos) | ( ipcReleaseMask & IPC_INTR_STRUCT_INTR_MASK_RELEASE_Msk) ; + (void)ipcIntrPtr->INTR; /* Read the register to flush the cache */ +} + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_drv.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_drv.h new file mode 100644 index 0000000000..3d686ae350 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_drv.h @@ -0,0 +1,288 @@ +/***************************************************************************//** +* \file cy_ipc_drv.h +* \version 1.0 +* +* Provides an API declaration of the IPC driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_IPC_DRV_H) +#define CY_IPC_DRV_H + + +/** +* \defgroup group_ipc Inter Process Communication (IPC) +* \{ +* Contains the driver API for low level IPC interface as well as Lock and Pipe +* upper level interfaces. +* +* The IPC driver provides a safe and reliable method to transfer data between +* CPUs or processes in a single device. Hardware locking provides a reliable +* method to ensure that only one device can acquire and transfer data at one +* time so no data is lost or over written by asynchronous processes or CPUs. +* +* The Lock functions made use of a single IPC channel to allow multiple locks +* that can be used by system or user function calls. By default there are +* 128 locks provided, although the user may modify the default value to any +* number, limited only by SRAM. +* +* The Pipe functions provide a method to transfer one or more words of data +* between CPUs or tasks. The data can be defined as a single 32-bit unsigned +* word, an array of data, or a user defined structure. The only limitation is +* that the first word in the array or structure must be a 32-bit unsigned word +* in which a client ID number is passed. The client ID dictates the callback +* function that will be called by the receiver of the message. After the +* callback function returns by the receiver, it will invoke a release callback +* function defined by the sender of the message. +* +* A User Pipe is provided for the user to transfer data between CPUs and +* tasks. +* +* \section group_ipc_configuration Configuration Considerations +* +* All IPC channels have been defined by the system. Users should not +* call any of the low level IPC functions. Only the Lock and Pipe functions +* are accessible by the user. The CyPipe is reserved for system level +* functions such as BLE and CapSense at this time. +* +* \section group_ipc_more_information More Information +* +* See TRM (Technical Reference Manual) for more information on IPC. +* +* \section group_ipc_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
8.8RAn external object or function shall be declared in one and only one +* file.This rule is violated in the following files: +* cy_ipc_pipe.c, cy_ipc_lock.c, cy_ipc_config.c
10.1RThe value of an expression of integer type shall not be +* implicitly converted to a different underlying type.Implicit conversion from signed to unsigned is present in the +* following files: cy_ipc_pipe.c, cy_ipc_config.c
11.4AA cast should not be performed between a pointer to object type +* and a different pointer to object type.In file cy_ipc_pipe.c, the message pointer is set to a void pointer +* because the message structure is defined by the user and is unknown. +*
14.10RAll if ... else if constructs shall be terminated with an else clause. +* In file cy_ipc_pipe.c this rule is violated intentionally and safely. +*
16.7AA pointer parameter in a function prototype should be declared as +* pointer to const if the pointer is not used to modify the addressed +* object.In file cy_ipc_drv.c this rule is violated because the API +* implementation is expected in future to modify the parameter.
16.9RA function identifier shall only be used with either a preceding &, +* or with a parenthesised parameter list, which may be empty.In file cy_ipc_config.c this rule is violated intentionally.
16.10RIf a function returns error information, then that error information +* shall be tested.In file cy_ipc_pipe.c this rule is violated intentionally.
+* +* \section group_ipc_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_ipc_macro Macro +* \defgroup group_ipc_functions Functions +* \defgroup group_ipc_data_structures Data Structures +* \defgroup group_ipc_enums Enumerated Types +* +*/ + +/******************************************************************************/ +/* Include files */ +/******************************************************************************/ +#include "syslib/cy_syslib.h" +#include "cy_device_headers.h" + + +/** +* \addtogroup group_ipc_data_structures +* \{ +*/ + +/** \} group_ipc_data_structures */ + +/** +* \addtogroup group_ipc_macro +* \{ +*/ + +/** Driver major version */ +#define CY_IPC_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_IPC_DRV_VERSION_MINOR 0 + +/* defined in the device.h */ + + +/* Constants for ACQUIRE register */ +#define CY_IPC_ACQ_NOT_ACQUIRED (uint32_t)(0x00000000ul) /**< Used to determine if lock was not acquired */ +#define CY_IPC_NO_NOTIFIFICATION (uint32_t)(0x00000000ul) /**< Return value when no notifications have occurred or will be forced */ + +/* Error Code constants */ + + +#define CY_IPC_ID CY_PDL_DRV_ID(0x22u) /**< Software PDL driver ID for IPC */ +#define CY_IPC_ID_INFO (uint32_t)( CY_IPC_ID | CY_PDL_STATUS_INFO ) /**< Return prefix for IPC driver function status codes */ +#define CY_IPC_ID_WARNING (uint32_t)( CY_IPC_ID | CY_PDL_STATUS_WARNING) /**< Return prefix for IPC driver function warning return values */ +#define CY_IPC_ID_ERROR (uint32_t)( CY_IPC_ID | CY_PDL_STATUS_ERROR) /**< Return prefix for IPC driver function error return values */ + + +/** \} group_ipc_macro */ + +/* end of definition in device.h */ + + +/** +* \addtogroup group_ipc_enums +* \{ +*/ + +/** +* This is a list of ENUMs used for function return status. +*/ +typedef enum +{ + CY_IPC_DRV_SUCCESS = 0x00u, /**< Function was successfully executed */ + CY_IPC_DRV_ERROR = ( CY_IPC_ID_ERROR + 1ul), /**< Function was not executed due to an error. Typical conditions for the error explained in the function description */ + CY_IPC_DRV_NOT_ACQUIRED = ( CY_IPC_ID_ERROR + 2ul), /**< IPC was not previously acquired */ + CY_IPC_DRV_RELEASED = ( CY_IPC_ID_INFO + 0ul), /**< IPC was in a released state */ + CY_IPC_DRV_LOCKED = ( CY_IPC_ID_INFO + 1ul) /**< IPC was in a locked/acquired state */ +} cy_en_ipcdrv_status_t; + +/** \} group_ipc_enums */ + +/******************************************************************************/ +/* Global function prototypes (definition in C source) */ +/******************************************************************************/ + +/** +* \addtogroup group_ipc_functions +* \{ +*/ + +#ifdef __cplusplus +extern "C" { +#endif +cy_en_ipcdrv_status_t Cy_IPC_DRV_LockAcquire (IPC_STRUCT_Type const * ipcPtr); +cy_en_ipcdrv_status_t Cy_IPC_DRV_GetLockStatus (IPC_STRUCT_Type const * ipcPtr); +cy_en_ipcdrv_status_t Cy_IPC_DRV_Release (IPC_STRUCT_Type* ipcPtr, uint32_t releaseEventIntr); +void Cy_IPC_DRV_Notify (IPC_STRUCT_Type* ipcPtr, uint32_t notifyEventIntr); +cy_en_ipcdrv_status_t Cy_IPC_DRV_SendMsgWord (IPC_STRUCT_Type* ipcPtr, uint32_t notifyEventIntr, uint32_t message); +cy_en_ipcdrv_status_t Cy_IPC_DRV_ReadMsgWord (IPC_STRUCT_Type* ipcPtr, uint32_t * message); +cy_en_ipcdrv_status_t Cy_IPC_DRV_SendMsgPtr (IPC_STRUCT_Type* ipcPtr, uint32_t notifyEventIntr, void const * msgPtr); +cy_en_ipcdrv_status_t Cy_IPC_DRV_ReadMsgPtr (IPC_STRUCT_Type* ipcPtr, void** msgPtr); + +void Cy_IPC_DRV_SetIntrMask (IPC_INTR_STRUCT_Type* ipcIntrPtr, uint32_t ipcReleaseMask, uint32_t ipcNotifyMask); +uint32_t Cy_IPC_DRV_GetIntrMask(IPC_INTR_STRUCT_Type const * ipcIntrPtr); +uint32_t Cy_IPC_DRV_GetIntrStatusMasked (IPC_INTR_STRUCT_Type const * ipcIntrPtr); +uint32_t Cy_IPC_DRV_GetIntrStatus(IPC_INTR_STRUCT_Type const * ipcIntrPtr); +void Cy_IPC_DRV_SetIntr(IPC_INTR_STRUCT_Type* ipcIntrPtr, uint32_t ipcReleaseMask, uint32_t ipcNotifyMask); +void Cy_IPC_DRV_ClearIntr(IPC_INTR_STRUCT_Type* ipcIntrPtr, uint32_t ipcReleaseMask, uint32_t ipcNotifyMask); + +__STATIC_INLINE IPC_STRUCT_Type* Cy_IPC_DRV_GetIpcBaseAddress (uint32_t ipcIndex); +__STATIC_INLINE IPC_INTR_STRUCT_Type* Cy_IPC_DRV_GetIntrBaseAddr (uint32_t ipcIntrIndex); + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_GetIpcBaseAddress +****************************************************************************//** +* +* This function takes an IPC index as a parameter and returns the base address the IPC registers corresponding to the IPC channel. +* The function returns a zero value if the ipcIndex passed was invalid. +* +* \param ipcIndex +* Represents the hardware IPC index. This is converted to base address of the IPC channel registers. +* +* \return +* Returns a pointer to the base of the IPC registers. If the ipcIndex passed was invalid the function returns zero +* +*******************************************************************************/ +__STATIC_INLINE IPC_STRUCT_Type* Cy_IPC_DRV_GetIpcBaseAddress (uint32_t ipcIndex) +{ + CY_ASSERT((uint32_t)CPUSS_IPC_IPC_NR > ipcIndex); + return ( (IPC_STRUCT_Type*) ( &IPC->STRUCT[ipcIndex] ) ); +} + +/******************************************************************************* +* Function Name: Cy_IPC_DRV_GetIntrBaseAddr +****************************************************************************//** +* +* This function takes an IPC index and returns the base address of the IPC interrupt registers corresponding to the IPC Interrupt. +* The function returns a zero value if the ipcIntrIndex passed was invalid. +* +* \param ipcIntrIndex +* Represents the hardware IPC interrupt number. This is converted to the base address of the IPC interrupt registers. +* +* \return +* Returns a pointer to the base of the IPC interrupt registers. If the IpcIntIndex passed was invalid, the function returns zero +* +*******************************************************************************/ +__STATIC_INLINE IPC_INTR_STRUCT_Type* Cy_IPC_DRV_GetIntrBaseAddr (uint32_t ipcIntrIndex) +{ + CY_ASSERT((uint32_t)CPUSS_IPC_IPC_IRQ_NR > ipcIntrIndex); + return ( (IPC_INTR_STRUCT_Type*) ( &IPC->INTR_STRUCT[ipcIntrIndex] ) ); +} + +/** \} group_ipc_functions */ + +#ifdef __cplusplus +} +#endif + +/** \} group_ipc */ + +#endif /* !defined(CY_IPC_DRV_H) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_lock.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_lock.c new file mode 100644 index 0000000000..7550fc96b3 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_lock.c @@ -0,0 +1,268 @@ +/***************************************************************************//** +* \file +* \version 1.0 +* +* Description: +* IPC Lock Driver - This source file contains the source code for the lock +* level APIs for the IPC interface. +* +******************************************************************************** +* Copyright2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_ipc_drv.h" +#include "cy_ipc_lock.h" + + +/* Assign the IPC structure used for Lock functions */ +IPC_STRUCT_Type* CY_IPC_LOCK_Ptr = (IPC_STRUCT_Type*) &IPC->STRUCT[CY_IPC_CHAN_LOCK]; /**< Pointer to IPC structure used for locks */ + +struct CY_IPC_LOCK_STRUCT { + uint32_t maxLocks; /* Maximum locks in system */ + uint32_t *arrayPtr; /* Pointer to lock array */ +} CY_IPC_LOCK_data; +typedef struct CY_IPC_LOCK_STRUCT CY_IPC_LOCK_STRUCT; + + +/******************************************************************************* +* Function Name: Cy_IPC_LOCK_Init +****************************************************************************//** +* +* This function initializes the lock subsystem. The user must create an array of +* unsigned 32-bit words to hold the lock bits. The amount of locks will be +* the size of the array * 32. The total lock count will always be a multiple of 32. +* Note that only one of the CPUs in a multi-CPU system should call this +* init function and provide a pointer to SRAM that can be shared between all +* the CPUs in the system that will use locks. +* +* \param count +* The maximum number of locks to be supported (multiple of 32). +* +* \param memPtr +* This points to the array of (count/32) words that contain the lock data. +* +* \return +* CY_IPC_LOCK_SUCCESS: Sucessfully initialized +* CY_IPC_LOCK_INIT_ERROR: Init error, count value was zero, or greater than 31 and not a multiple of 32. +* +* +*******************************************************************************/ +cy_en_ipclock_status_t Cy_IPC_LOCK_Init(uint32_t count, uint32_t memPtr[]) +{ + extern IPC_STRUCT_Type* CY_IPC_LOCK_Ptr; + cy_en_ipclock_status_t retStatus = CY_IPC_LOCK_INIT_ERROR; + uint32_t cnt; + + CY_IPC_LOCK_data.maxLocks = count; + CY_IPC_LOCK_data.arrayPtr = memPtr; + + /* Initialize all locks to released */ + for(cnt= 0u ; cnt < (count/CY_IPC_LOCKS_PER_WORD); cnt++) + { + CY_IPC_LOCK_data.arrayPtr[cnt] = (uint32_t)0x00000000ul; + } + + /* Make sure locks start out released */ + (void) Cy_IPC_DRV_Release (CY_IPC_LOCK_Ptr, CY_IPC_NO_NOTIFIFICATION); + + /* Set the IPC Data with the pointer to the array. */ + + if( CY_IPC_DRV_SUCCESS == Cy_IPC_DRV_SendMsgPtr (CY_IPC_LOCK_Ptr, CY_IPC_NO_NOTIFIFICATION, &CY_IPC_LOCK_data)) + { + if(CY_IPC_DRV_SUCCESS == Cy_IPC_DRV_Release (CY_IPC_LOCK_Ptr, CY_IPC_NO_NOTIFIFICATION)) + { + retStatus = CY_IPC_LOCK_SUCCESS; + } + } + + return(retStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_LOCK_Acquire +****************************************************************************//** +* +* This functions tries to acquire a lock. If the lock is available, this +* function returns immediately with CY_IPC_LOCK_ERROR_NONE. If the lock is not +* available, this function returns immediately with CY_IPC_LOCK_ERROR_LOCKED. +* +* \param lockNumber +* The lock number to acquire. +* +* \return +* CY_IPC_LOCK_SUCCESS: The lock was acquired +* CY_IPC_LOCK_LOCKED: The lock channel is busy or locked by another process +* CY_IPC_LOCK_NOT_ACQUIRED: Lock was already acquired +* CY_IPC_LOCK_OUT_OF_RANGE: The lock number is not valid +* +* +*******************************************************************************/ +cy_en_ipclock_status_t Cy_IPC_LOCK_Acquire(uint32_t lockNumber) +{ + uint32_t lockIndex, lockMask; + cy_en_ipclock_status_t retStatus = CY_IPC_LOCK_LOCKED; + CY_IPC_LOCK_STRUCT *lockStructPtr; + + /* Check to make sure the Lock channel is released */ + /* If so, check is specific channel can be locked. */ + if(CY_IPC_DRV_SUCCESS == Cy_IPC_DRV_LockAcquire (CY_IPC_LOCK_Ptr)) + { + /* Get the index into the lock array and calculate the mask */ + lockIndex = lockNumber / CY_IPC_LOCKS_PER_WORD; + lockMask = (0x00000001ul) << (lockNumber - (lockIndex * CY_IPC_LOCKS_PER_WORD) ); + + /* Get pointer to structure */ + lockStructPtr = (CY_IPC_LOCK_STRUCT *)CY_IPC_LOCK_Ptr->DATA; + if(lockNumber < lockStructPtr->maxLocks) + { + if((lockStructPtr->arrayPtr[lockIndex] & lockMask) == (uint32_t)0) + { + lockStructPtr->arrayPtr[lockIndex] |= lockMask; + retStatus = CY_IPC_LOCK_SUCCESS; + } + else + { + retStatus = CY_IPC_LOCK_NOT_ACQUIRED; + } + } + else + { + retStatus = CY_IPC_LOCK_OUT_OF_RANGE; + } + /* Do not send an event on a lock acquire when the lock channel */ + /* is released, since the lock was just acquired. */ + (void) Cy_IPC_DRV_Release (CY_IPC_LOCK_Ptr, CY_IPC_NO_NOTIFIFICATION); + } + + return(retStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_LOCK_Status +****************************************************************************//** +* +* This function returns the status of any given lock. +* +* \param lockNumber +* The index of the lock to return status. +* +* \return +* CY_IPC_LOCK_STATUS_LOCKED: The lock is in the acquired state. (return a 1) +* CY_IPC_LOCK_STATUS_UNLOCKED: The lock is in the released state. ( return 0) +* CY_IPC_LOCK_OUT_OF_RANGE: The lock number is not valid +* +* +*******************************************************************************/ +cy_en_ipclock_status_t Cy_IPC_LOCK_Status(uint32_t lockNumber) +{ + cy_en_ipclock_status_t retStatus; + uint32_t lockIndex, lockMask; + CY_IPC_LOCK_STRUCT *lockStructPtr; + + lockStructPtr = (CY_IPC_LOCK_STRUCT *)CY_IPC_LOCK_Ptr->DATA; + if(lockNumber < lockStructPtr->maxLocks) + { + /* Get the index into the lock array and calculate the mask */ + lockIndex = lockNumber / CY_IPC_LOCKS_PER_WORD; + lockMask = (0x00000001ul) << (lockNumber - (lockIndex * CY_IPC_LOCKS_PER_WORD) ); + + if((lockStructPtr->arrayPtr[lockIndex] & lockMask) != (uint32_t)0) + { + retStatus = CY_IPC_LOCK_STATUS_LOCKED; + } + else + { + retStatus = CY_IPC_LOCK_STATUS_UNLOCKED; + } + } + else + { + retStatus = CY_IPC_LOCK_OUT_OF_RANGE; + } + return(retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_IPC_LOCK_Release +****************************************************************************//** +* +* This functions tries to releases a lock. +* +* \param lockNumber +* The index of the lock in which to release. +* +* \return +* CY_IPC_LOCK_SUCCESS: The lock was released +* CY_IPC_LOCK_NOT_ACQUIRED: The lock was already released +* CY_IPC_LOCK_LOCKED: The lock channel was locked or busy +* CY_IPC_LOCK_OUT_OF_RANGE: The lock number is not valid +* +* +*******************************************************************************/ +cy_en_ipclock_status_t Cy_IPC_LOCK_Release(uint32_t lockNumber) +{ + uint32_t lockIndex, lockMask; + cy_en_ipclock_status_t retStatus = CY_IPC_LOCK_LOCKED; + CY_IPC_LOCK_STRUCT *lockStructPtr; + + /* Check to make sure the Lock channel is released */ + /* If so, check is specific channel can be locked. */ + if(CY_IPC_DRV_SUCCESS == Cy_IPC_DRV_LockAcquire (CY_IPC_LOCK_Ptr)) + { + lockIndex = lockNumber / CY_IPC_LOCKS_PER_WORD; + lockMask = (0x00000001ul) << (lockNumber - (lockIndex * CY_IPC_LOCKS_PER_WORD) ); + + /* Get pointer to structure */ + lockStructPtr = (CY_IPC_LOCK_STRUCT *)CY_IPC_LOCK_Ptr->DATA; + if(lockNumber < lockStructPtr->maxLocks) + { + if((lockStructPtr->arrayPtr[lockIndex] & lockMask) != (uint32_t)0u) + { + lockStructPtr->arrayPtr[lockIndex] &= ~lockMask; + retStatus = CY_IPC_LOCK_SUCCESS; + } + else + { + retStatus = CY_IPC_LOCK_NOT_ACQUIRED; + } + } + else + { + retStatus = CY_IPC_LOCK_OUT_OF_RANGE; + } + /* Release, but do not trigger a release event */ + (void) Cy_IPC_DRV_Release (CY_IPC_LOCK_Ptr, CY_IPC_NO_NOTIFIFICATION); + } + return(retStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_LOCK_GetMaxLocks +****************************************************************************//** +* +* This function returns the maximum lock count. +* +* \param +* +* \return +* Returns the maximum lock count as configured. +* +* +*******************************************************************************/ +uint32_t Cy_IPC_LOCK_GetMaxLocks(void) +{ + + CY_IPC_LOCK_STRUCT *lockStructPtr; + + lockStructPtr = (CY_IPC_LOCK_STRUCT *)CY_IPC_LOCK_Ptr->DATA; + + return(lockStructPtr->maxLocks); +} + + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_lock.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_lock.h new file mode 100644 index 0000000000..dc350ac55a --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_lock.h @@ -0,0 +1,84 @@ +/***************************************************************************//** +* \file +* \version 1.0 +* +* \brief +* Header file for IPC LOCK functions +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CY_IPC_LOCK_H_ +#define _CY_IPC_LOCK_H_ + +/******************************************************************************/ +/* Include files */ +/******************************************************************************/ +#include "cy_ipc_drv.h" + +/** +* \addtogroup group_ipc_macro +* \{ +*/ + +#define CY_IPC_LOCK_RTN 0x0100ul /**< Software PDL driver ID for IPC lock functions */ +#define CY_IPC_LOCK_ID_INFO (uint32_t)( CY_IPC_ID_INFO | CY_IPC_LOCK_RTN) /**< Return prefix for IPC lock function status codes */ +#define CY_IPC_LOCK_ID_WARNING (uint32_t)( CY_IPC_ID_WARNING | CY_IPC_LOCK_RTN) /**< Return prefix for IPC lock function warning return values */ +#define CY_IPC_LOCK_ID_ERROR (uint32_t)( CY_IPC_ID_ERROR | CY_IPC_LOCK_RTN) /**< Return prefix for IPC lock function error return values */ + +/**< Return constants for IPC lock functions. */ +typedef enum +{ + CY_IPC_LOCK_SUCCESS = (uint32_t)0x00u, /**< No error has occured */ + CY_IPC_LOCK_ERROR_LOCKED = (uint32_t)(CY_IPC_LOCK_ID_ERROR | 1ul), /**< Lock has already been locked */ + CY_IPC_LOCK_ERROR_UNLOCKED = (uint32_t)(CY_IPC_LOCK_ID_ERROR | 2ul), /**< Lock is unlocked */ + CY_IPC_LOCK_INIT_ERROR = (uint32_t)(CY_IPC_LOCK_ID_ERROR | 3ul), /**< Lock API return when the init function has failed */ + CY_IPC_LOCK_OUT_OF_RANGE = (uint32_t)(CY_IPC_LOCK_ID_ERROR | 4ul), /**< Lock API return when lock is out of the range of valid locks */ + + CY_IPC_LOCK_NOT_ACQUIRED = (uint32_t)(CY_IPC_LOCK_ID_INFO | 2ul), /**< Lock API return when lock was not acquired */ + CY_IPC_LOCK_LOCKED = (uint32_t)(CY_IPC_LOCK_ID_INFO | 3ul), /**< Lock API return status when lock was already locked */ + CY_IPC_LOCK_STATUS_LOCKED = (uint32_t)(CY_IPC_LOCK_ID_INFO | 1ul), /**< Lock status return that the channel is locked */ + CY_IPC_LOCK_STATUS_UNLOCKED = (uint32_t)(CY_IPC_LOCK_ID_INFO | 0ul) /**< Lock status return that the channel is unlocked */ +} cy_en_ipclock_status_t; + +#define CY_IPC_LOCKS_PER_WORD (uint32_t)32u /**< 32 locks per word */ + + + +/** \} group_ipc_macro */ + + + +/** \} group_ipc_data_structures */ + +/******************************************************************************/ +/* Global function prototypes (definition in C source) */ +/******************************************************************************/ + +/** +* \addtogroup group_ipc_functions +* \{ +*/ + +#ifdef __cplusplus +extern "C" { +#endif +cy_en_ipclock_status_t Cy_IPC_LOCK_Init(uint32_t count, uint32_t mem_p[]); +cy_en_ipclock_status_t Cy_IPC_LOCK_Acquire(uint32_t lockNumber); +cy_en_ipclock_status_t Cy_IPC_LOCK_Release(uint32_t lockNumber); +cy_en_ipclock_status_t Cy_IPC_LOCK_Status(uint32_t lockNumber); +uint32_t Cy_IPC_LOCK_GetMaxLocks(void); +#ifdef __cplusplus +} +#endif + +/** \} group_ipc_functions */ + +#endif /* _CY_IPC_LOCK_H_ */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_pipe.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_pipe.c new file mode 100644 index 0000000000..731c38a48c --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_pipe.c @@ -0,0 +1,345 @@ +/***************************************************************************//** +* \file +* \version 1.0 +* +* Description: +* IPC Pipe Driver - This source file includes code for the Pipe layer on top +* of the IPC driver. +* +******************************************************************************** +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_ipc_pipe.h" + +/* Define a pointer to array of endPoints. */ +cy_stc_ipc_pipe_ep_t * cy_ipc_pipe_epArray; + +/******************************************************************************* +* Function Name: Cy_IPC_PIPE_Config +****************************************************************************//** +* +* This function stores a copy of a pointer to the array of endpoints. All +* access to endpoints will be via the index of the endpoint in this array. +* +* \param theEpArray +* This is the pointer to an array of endpoint structures that the designer +* created and will be used to reference all endpoints. +* +* +* \return +* void +* +*******************************************************************************/ +void Cy_IPC_PIPE_Config(cy_stc_ipc_pipe_ep_t * theEpArray) +{ + /* Keep copy of this endpoint */ + cy_ipc_pipe_epArray = theEpArray; +} + +/******************************************************************************* +* Function Name: Cy_IPC_PIPE_Init +****************************************************************************//** +* +* This function initializes the endpoint of a pipe for the current CPU. An +* endpoint of a pipe is IPC channel that receives a message for the current +* CPU. The current CPU is the CPU that is executing the code. +* After this function is called, the callbackArray needs to be populated +* with the callback functions for that endpoint using the Cy_IPC_PIPE_RegisterCallback() +* function. +* +* \param epAddr +* This parameter is the address (or index in the array of endpoint structure) +* that designates the endpoint in which you want to initialize. +* +* \param cbArray +* This is a pointer to the callback function array. Based on the client ID, one +* of the functions in this array is called to process the message. +* +* \param cbCnt +* This is the size of the callback array, or the number of defined clients. +* +* \param epConfig +* This value defines the IPC channel, IPC interrupt number, and the interrupt +* mask for the entire pipe. +* The format of the endPoint configuration +* Bits[31:16] Interrupt Mask +* Bits[15:8 ] IPC interrupt +* Bits[ 7:0 ] IPC channel +* +* \return +* void +* +*******************************************************************************/ +void Cy_IPC_PIPE_Init(uint32_t epAddr, cy_ipc_pipe_callback_array_ptr_t cbArray, uint32_t cbCnt, uint32_t epConfig) +{ + cy_stc_ipc_pipe_ep_t * endPoint; + + endPoint = &cy_ipc_pipe_epArray[epAddr]; + + /* Extract the channel, interrupt and interrupt mask */ + endPoint->ipcChan = (epConfig & CY_IPC_PIPE_CFG_CHAN_MASK) >> CY_IPC_PIPE_CFG_CHAN_SHIFT ; + endPoint->intrChan = (epConfig & CY_IPC_PIPE_CFG_INTR_MASK) >> CY_IPC_PIPE_CFG_INTR_SHIFT; + endPoint->pipeIntMask = (epConfig & CY_IPC_PIPE_CFG_IMASK_MASK) >> CY_IPC_PIPE_CFG_IMASK_SHIFT; + + /* Assign IPC channel to this endpoint */ + endPoint->ipcPtr = Cy_IPC_DRV_GetIpcBaseAddress (endPoint->ipcChan); + + /* Assign interrupt structure to endpoint and Initialize the interrupt mask for this endpoint */ + endPoint->ipcIntrPtr = Cy_IPC_DRV_GetIntrBaseAddr(endPoint->intrChan); + endPoint->ipcIntrPtr->INTR_MASK = endPoint->pipeIntMask | (endPoint->pipeIntMask << 16); /* Only allow notify and release interrupts */ + /* from endpoints in this pipe. */ + /* Save the Client count and the callback array pointer */ + endPoint->clientCount = cbCnt; + endPoint->callbackArray = cbArray; + endPoint->busy = CY_IPC_PIPE_ENDPOINT_NOTBUSY; +} + + +/******************************************************************************* +* Function Name: Cy_IPC_PIPE_SendMessage +****************************************************************************//** +* +* This function is used to send a message from one endpoint to another. It +* generates an interrupt on the endpoint that receives the message and a +* release interrupt to the sender to acknowledge the message has been processed. +* +* \param toAddr +* This parameter is the address (or index in the array of endpoint structures) +* of the endpoint to which you are sending the message. +* +* \param fromAddr +* This parameter is the address (or index in the array of endpoint structures) +* of the endpoint to which the message is being sent. +* +* \param msgPtr +* Pointer to the message structure to be sent. +* +* \param callBackPtr +* Pointer to the Release callback function. +* +* +* \return +* CY_IPC_PIPE_SUCCESS: Message was sent to the other end of the pipe +* CY_IPC_PIPE_BAD_HANDLE: The handle provided for the pipe was not valid +* CY_IPC_PIPE_SEND_BUSY: The pipe is already busy sending a message +* CY_IPC_PIPE_DIR_ERROR: Tried to send on the "to" end of a unidirectional pipe +*******************************************************************************/ +cy_en_ipc_pipe_status_t Cy_IPC_PIPE_SendMessage(uint32_t toAddr, uint32_t fromAddr, void * msgPtr, cy_ipc_pipe_relcallback_ptr_t callBackPtr) +{ + cy_en_ipc_pipe_status_t returnStatus; + uint32_t releaseMask; + uint32_t notifyMask; + + cy_stc_ipc_pipe_ep_t * fromEp; + cy_stc_ipc_pipe_ep_t * toEp; + + toEp = &(cy_ipc_pipe_epArray[toAddr]); + fromEp = &cy_ipc_pipe_epArray[fromAddr]; + + /* Check if IPC channel valid */ + if( toEp->ipcPtr != (void *)0u) + { + if(fromEp->busy == CY_IPC_PIPE_ENDPOINT_NOTBUSY) + { + /* Attempt to acquire the channel */ + if( CY_IPC_DRV_SUCCESS == Cy_IPC_DRV_LockAcquire(toEp->ipcPtr) ) + { + /* Create the release mask for the "fromAddr" channel's interrupt channel */ + releaseMask = (0x0001 << fromEp->intrChan); + + * (uint32_t *) msgPtr &= ~(CY_IPC_PIPE_MSG_RELEASE_MASK); /* Mask out the release mask area */ + releaseMask = ((releaseMask << CY_IPC_PIPE_MSG_RELEASE_SHIFT) & CY_IPC_PIPE_MSG_RELEASE_MASK); /* shift into position */ + * (uint32_t *) msgPtr |= releaseMask; /* OR in the release mask */ + + /* If the channel was acquired, write the message. */ + toEp->ipcPtr->DATA = (uint32_t) msgPtr; + + /* The last thing to do is create the notify event that causes the interrupt */ + /* Create the notify mask for the "toAddr" channel's interrupt channel */ + notifyMask = (0x0001 << toEp->intrChan); + + fromEp->busy = CY_IPC_PIPE_ENDPOINT_BUSY; /* Set the busy flag. The ISR clears this after the release */ + + /* Setup release callback function */ + fromEp->releaseCallbackPtr = callBackPtr; /* Set the callback function */ + + /* Cause notify event/interrupt */ + toEp->ipcPtr->NOTIFY = (IPC_STRUCT_NOTIFY_INTR_NOTIFY_Msk & notifyMask); + returnStatus = CY_IPC_PIPE_SUCCESS; + } + else + { + /* Channel was already acquired, return Error */ + returnStatus = CY_IPC_PIPE_ERROR_SEND_BUSY; + } + } + else + { + /* Channel may not be acquired, but the release interrupt has not executed yet */ + returnStatus = CY_IPC_PIPE_ERROR_SEND_BUSY; + } + } + else + { + /* Null pipe handle. */ + returnStatus = CY_IPC_PIPE_ERROR_BAD_HANDLE; + } + return(returnStatus); +} + + + +/******************************************************************************* +* Function Name: Cy_IPC_PIPE_RegisterCallback +****************************************************************************//** +* +* This function registers a callback when a message is received on a pipe. +* The client_ID is the same as the index of the callback function array. The callback +* may be a real function pointer or NULL if no callback is required. +* +* \param epAddr +* This parameter is the address (or index in the array of endpoint structures) +* that designates the endpoint to which you want to add callback functions. +* +* \param callBackPtr +* Pointer to the callback function called when the endpoint has received a message. +* +* \param clientId +* The index in the callback array (Client ID) where the function pointer is saved. +* +* +* \return +* CY_IPC_PIPE_SUCCESS: Callback registered successfully +* CY_IPC_PIPE_ERROR_BAD_CLIENT: Client ID out of range, callback not registered. +*******************************************************************************/ +cy_en_ipc_pipe_status_t Cy_IPC_PIPE_RegisterCallback(uint32_t epAddr, cy_ipc_pipe_callback_ptr_t callBackPtr, uint32_t clientId) +{ + cy_en_ipc_pipe_status_t returnStatus; /* Return Status */ + cy_stc_ipc_pipe_ep_t * thisEp; + + thisEp = &cy_ipc_pipe_epArray[epAddr]; + + /* Check if clientId is between 0 and less than client count */ + if(clientId <= thisEp->clientCount) + { + /* Copy callback function into callback function pointer array */ + thisEp->callbackArray[clientId] = callBackPtr; + returnStatus = CY_IPC_PIPE_SUCCESS; + } + else + { + returnStatus = CY_IPC_PIPE_ERROR_BAD_CLIENT; + } + return(returnStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_PIPE_RegisterRecvCallbackRel +****************************************************************************//** +* +* This function registers a default callback if a release interrupt +* is generated but the current release callback function is null. +* +* +* \param epAddr +* This parameter is the address (or index in the array of endpoint structures) +* that designates the endpoint to which you want to add a release callback function. +* +* \param callBackPtr +* Pointer to the callback executed when the endpoint has received a message. +* +* \return +* None +*******************************************************************************/ +void Cy_IPC_PIPE_RegisterCallbackRel(uint32_t epAddr, cy_ipc_pipe_relcallback_ptr_t callBackPtr) +{ + cy_stc_ipc_pipe_ep_t * endPoint; + + endPoint = &cy_ipc_pipe_epArray[epAddr]; + /* Copy callback function into callback function pointer array */ + endPoint->defaultReleaseCbPtr = callBackPtr; +} + +/******************************************************************************* +* Function Name: Cy_IPC_PIPE_ExecCallback +****************************************************************************//** +* +* This function is called by the ISR for a given pipe endpoint to dispatch +* the appropriate callback function based on the client ID for that endpoint. +* +* \param endPoint +* Pointer to endpoint structure. +* +* \return +* None +*******************************************************************************/ +void Cy_IPC_PIPE_ExecCallback(cy_stc_ipc_pipe_ep_t * endPoint) +{ + uint32_t * msgPtr = (void *)0uL; + uint32_t clientID; + uint32_t shadowIntr; + uint32_t releaseMask = (uint32_t)0; + cy_ipc_pipe_callback_ptr_t callbackPtr; + + /* Check to make sure the interrupt was a notify interrupt */ + shadowIntr = endPoint->ipcIntrPtr->INTR_MASKED; + if( 0 != (shadowIntr & IPC_INTR_STRUCT_INTR_MASK_NOTIFY_Msk)) + { + /* Clear the notify interrupt. */ + endPoint->ipcIntrPtr->INTR = (shadowIntr & IPC_INTR_STRUCT_INTR_MASK_NOTIFY_Msk); + + if( CY_IPC_DRV_LOCKED == Cy_IPC_DRV_GetLockStatus (endPoint->ipcPtr) ) + { + /* Extract Client ID */ + if( CY_IPC_DRV_SUCCESS == Cy_IPC_DRV_ReadMsgPtr (endPoint->ipcPtr, (void **)&msgPtr)) + { + /* Get release mask */ + releaseMask = (uint32_t)((*msgPtr & CY_IPC_PIPE_MSG_RELEASE_MASK) >> CY_IPC_PIPE_MSG_RELEASE_SHIFT); + + clientID = *msgPtr & CY_IPC_PIPE_MSG_CLIENT_MASK; + /* Make sure client ID is within valid range */ + if(endPoint->clientCount > clientID) + { + callbackPtr = endPoint->callbackArray[clientID]; /* Get the callback function */ + if(callbackPtr != (void *)0) + { + callbackPtr(msgPtr); /* Call the function pointer for "clientID" */ + } + } + } + /* Must always release the IPC channel */ + Cy_IPC_DRV_Release (endPoint->ipcPtr, releaseMask); + } + } + /* Check to make sure the interrupt was a release interrupt */ + if( 0 != (shadowIntr & IPC_INTR_STRUCT_INTR_MASK_RELEASE_Msk)) /* Check for a Release interrupt */ + { + /* Clear the release callback function */ + endPoint->ipcIntrPtr->INTR = (shadowIntr & IPC_INTR_STRUCT_INTR_MASK_RELEASE_Msk); + + if(endPoint->releaseCallbackPtr != (void *)0) + { + endPoint->releaseCallbackPtr(); + + /* Clear the pointer after it was called */ + endPoint->releaseCallbackPtr = (void *)0; + } + else if( endPoint->defaultReleaseCbPtr != (void *)0) + { + endPoint->defaultReleaseCbPtr(); + } + /* Clear the busy flag when release is detected */ + endPoint->busy = CY_IPC_PIPE_ENDPOINT_NOTBUSY; + } + + (void)endPoint->ipcIntrPtr->INTR; +} + + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_pipe.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_pipe.h new file mode 100644 index 0000000000..d7368903cf --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_pipe.h @@ -0,0 +1,191 @@ +/***************************************************************************//** +* \file +* \version 1.0 +* +* Description: +* IPC Pipe Driver - This header file contains all the function prototypes, +* structure definitions, pipe constants, and pipe endpoint address definitions. +* +* Warning: The API for the pipe level functions are preliminary and may change +* prior to release. +* +******************************************************************************** +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ +#ifndef CY_IPC_PIPE_H +#define CY_IPC_PIPE_H + +/******************************************************************************/ +/* Include files */ +/******************************************************************************/ +#include "syslib/cy_syslib.h" +#include "cy_ipc_drv.h" + + +/* + * This section defines the system level constants required to define + * callback arrays for the Cypress pipe and the user pipe. These defines + * are used for both the max callback count and maximum clients. +*/ + +typedef void (* cy_ipc_pipe_callback_ptr_t)(uint32_t * msgPtr); /**< Typedef for pipe callback function pointer */ +typedef void (* cy_ipc_pipe_relcallback_ptr_t)(void); /**< Typedef for a pipe release callback function pointer */ +typedef void (** cy_ipc_pipe_callback_array_ptr_t)(uint32_t * msgPtr); /**< Typedef for array of callback function pointers */ + + +/** +* \addtogroup group_ipc_macro +* \{ +*/ + +/* + * The System pipe address is what is used to send a message to one of the + * endpoints of a pipe. Currently the Cypress pipe and the User pipe + * are supported. For parts with extra IPC channels users may create + * their own custom pipes and create their own pipe addresses. + * + * The format of the endPoint configuration + * Bits[31:16] Interrupt Mask + * Bits[15:8 ] IPC interrupt + * Bits[ 7:0 ] IPC channel + */ +#define CY_IPC_PIPE_CFG_IMASK_SHIFT (16UL) /**< Interrupt mask shift value for Pipe functions */ +#define CY_IPC_PIPE_CFG_IMASK_MASK (0xFFFF0000UL) /**< Interrupt mask for endpoint address */ +#define CY_IPC_PIPE_CFG_INTR_SHIFT (8UL) /**< Interrupt shift Pipe functions */ +#define CY_IPC_PIPE_CFG_INTR_MASK (0x0000FF00UL) /**< Interrupt mask for endpoint address */ +#define CY_IPC_PIPE_CFG_CHAN_SHIFT (0UL) /**< Interrupt shift Pipe functions */ +#define CY_IPC_PIPE_CFG_CHAN_MASK (0x000000FFUL) /**< Pipe channel address for endpoint address */ + + + +#define CY_IPC_PIPE_MSG_CLIENT_MASK (0x000000FFul) /**< Client mask for first word of Pipe message */ +#define CY_IPC_PIPE_MSG_USR_MASK (0x0000FF00ul) /**< User data mask for first word of Pipe message */ +#define CY_IPC_PIPE_MSG_RELEASE_MASK (0xFFFF0000ul) /**< Mask for message release mask */ +#define CY_IPC_PIPE_MSG_RELEASE_SHIFT (16UL) /**< Shift require to line up mask to LSb */ + +#define CY_IPC_PIPE_ENDPOINT_BUSY (1UL) /**< Use to set the busy flag when waiting for a release interrupt */ +#define CY_IPC_PIPE_ENDPOINT_NOTBUSY (0UL) /**< Denotes that a release interrupt is not pending */ + +/** \} group_ipc_macro */ + +/** +* \addtogroup group_ipc_data_structures +* \{ +*/ + +/* + * This is the definition of a pipe endpoint. There is one endpoint structure for each CPU in + * a pipe. It contains all the information to process a message sent from one of the other + * CPUs in the pipe. + */ +/** +* This is the definition of a pipe endpoint. There is one endpoint structure for each CPU in +* a pipe. It contains all the information to process a message send from one of the other +* CPUs in the pipe. +*/ +typedef struct +{ + uint32_t ipcChan; /**< IPC channel number used for this endpoint to receive messages */ + uint32_t intrChan; /**< IPC interrupt channel number used for this endpoint to receive interrupts */ + uint32_t pipeIntMask; /**< Release/Notify interrupt mask that includes all endpoints on pipe */ + IPC_STRUCT_Type * ipcPtr; /**< Pointer to receive IPC channel ( If ptr == NULL, cannot receive ) */ + IPC_INTR_STRUCT_Type * ipcIntrPtr; /**< Pointer to IPC interrupt, needed to clear the interrupt */ + uint32_t busy; /**< Endpoint busy flag. If sent no messages can be sent from this endpoint */ + uint32_t clientCount; /**< Client count and size of MsgCallback array */ + cy_ipc_pipe_callback_array_ptr_t callbackArray; /**< Pointer to array of callback functions, one for each Client */ + cy_ipc_pipe_relcallback_ptr_t releaseCallbackPtr; /**< Pointer to release callback function */ + cy_ipc_pipe_relcallback_ptr_t defaultReleaseCbPtr; /**< Pointer to default release callback function */ +} cy_stc_ipc_pipe_ep_t; + +/** \} goup_ipc_data_structures */ + +/** +* \addtogroup group_ipc_macro +* \{ +*/ +/* Status and error types */ +#define CY_IPC_PIPE_RTN 0x0200ul /**< Software PDL driver ID for IPC pipe functions */ +#define CY_IPC_PIPE_ID_INFO (uint32_t)( CY_IPC_ID_INFO | CY_IPC_PIPE_RTN) /**< Return prefix for IPC pipe function status codes */ +#define CY_IPC_PIPE_ID_WARNING (uint32_t)( CY_IPC_ID_WARNING | CY_IPC_PIPE_RTN) /**< Return prefix for IPC pipe function warning return values */ +#define CY_IPC_PIPE_ID_ERROR (uint32_t)( CY_IPC_ID_ERROR | CY_IPC_PIPE_RTN) /**< Return prefix for IPC pipe function error return values */ + + +/**< Return constants for IPC pipe functions. */ +typedef enum +{ + CY_IPC_PIPE_SUCCESS =(uint32_t)0x00u, /**< Pipe API return for no error */ + CY_IPC_PIPE_ERROR_NO_IPC =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 1ul), /**< Pipe API return for no valid IPC channel */ + CY_IPC_PIPE_ERROR_NO_INTR =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 2ul), /**< Pipe API return for no valid interrupt */ + CY_IPC_PIPE_ERROR_BAD_PRIORITY =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 3ul), /**< Pipe API return for bad priority parameter */ + CY_IPC_PIPE_ERROR_BAD_HANDLE =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 4ul), /**< Pipe API return for bad pipe handle */ + CY_IPC_PIPE_ERROR_BAD_ID =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 5ul), /**< Pipe API return for bad pipe ID */ + CY_IPC_PIPE_ERROR_DIR_ERROR =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 6ul), /**< Pipe API return for invalid direction (Not used at this time) */ + CY_IPC_PIPE_ERROR_SEND_BUSY =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 7ul), /**< Pipe API return for pipe is currently busy */ + CY_IPC_PIPE_ERROR_NO_MESSAGE =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 8ul), /**< Pipe API return for no message indicated */ + CY_IPC_PIPE_ERROR_BAD_CPU =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 9ul), /**< Pipe API return for invalid CPU value */ + CY_IPC_PIPE_ERROR_BAD_CLIENT =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 10ul) /**< Pipe API return for client out of range */ +} cy_en_ipc_pipe_status_t; + +/** \} group_ipc_macro */ + + + +/** +* \addtogroup group_ipc_data_structures +* \{ +*/ + + + +/** \cond +* NOTE: This doxygen comment must be placed before some code entity, or else +* it will belong to a random entity that follows it, e.g. group_ipc_functions +* +* Client identifier for a message. +* For a given pipe, traffic across the pipe can be multiplexed with multiple +* senders on one end and multiple receivers on the other end. +* +* The first 32-bit word of the message is used to identify the client that owns +* the message. +* +* The upper 16 bits are the client ID. +* +* The lower 16 bits are for use by the client in any way desired. +* +* The lower 16 bits are preserved (not modified) and not interpreted in any way. +* \endcond +*/ + +/** \} group_ipc_data_structures */ + +/******************************************************************************/ +/* Global function prototypes (definition in C source) */ +/******************************************************************************/ + +/** +* \addtogroup group_ipc_functions +* \{ +*/ + +#ifdef __cplusplus +extern "C" { +#endif +/* The API for the pipes level functions are preliminary and may change prior to release */ +void Cy_IPC_PIPE_Init(uint32_t epAddr, cy_ipc_pipe_callback_array_ptr_t cbArray, uint32_t cbCnt, uint32_t epConfig); +cy_en_ipc_pipe_status_t Cy_IPC_PIPE_SendMessage(uint32_t toAddr, uint32_t fromAddr, void *msg_ptr, cy_ipc_pipe_relcallback_ptr_t callBack_ptr); +cy_en_ipc_pipe_status_t Cy_IPC_PIPE_RegisterCallback(uint32_t epAddr, cy_ipc_pipe_callback_ptr_t callBack_ptr, uint32_t clientID); +void Cy_IPC_PIPE_ExecCallback(cy_stc_ipc_pipe_ep_t * endPoint); +void Cy_IPC_PIPE_RegisterCallbackRel(uint32_t epAddr, cy_ipc_pipe_relcallback_ptr_t callBack_ptr); +void Cy_IPC_PIPE_Config(cy_stc_ipc_pipe_ep_t * theEpArray); +#ifdef __cplusplus +} +#endif + +/** \} group_ipc_functions */ + +#endif /* _CY_IPC_PIPE_H_ */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/profile/cy_profile.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/profile/cy_profile.c new file mode 100644 index 0000000000..80bc3f02b6 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/profile/cy_profile.c @@ -0,0 +1,374 @@ +/***************************************************************************//** +* \file cy_profile.c +* \version 1.0 +* +* Provides an API implementation of the energy profiler (EP) driver. +* +******************************************************************************** +* \copyright +* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_profile.h" +#include + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/* # of elements in an array */ +#define CY_N_ELMTS(a) (sizeof(a)/sizeof((a)[0])) + +static uint32_t Cy_Profile_IsPtrValid(const cy_stc_profile_ctr_ptr_t ctrAddr); + +/* control and status information for each counter */ +static cy_stc_profile_ctr_t cy_ep_ctrs[PROFILE_PRFL_CNT_NR]; + + +/* ========================================================================== */ +/* ===================== LOCAL FUNCTIONS SECTION ====================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_Profile_IsPtrValid +****************************************************************************//** +* +* Local utility function: reports (1) whether or not a given pointer points into +* the cy_ep_ctrs[] array, and (2) whether the counter has been assigned. +* +* \param ctrAddr The handle to (address of) the assigned counter +* +* \return CY_PROFILE_SUCCESS, or CY_PROFILE_BAD_PARAM for invalid ctrAddr or counter not +* in use. +* +*******************************************************************************/ +static uint32_t Cy_Profile_IsPtrValid(const cy_stc_profile_ctr_ptr_t ctrAddr) +{ + uint32_t retVal = CY_PROFILE_BAD_PARAM; + /* check for valid ctrAddr */ + uint32_t p_epCtrs = (uint32_t)cy_ep_ctrs; + if ((p_epCtrs <= (uint32_t)ctrAddr) && ((uint32_t)ctrAddr < (p_epCtrs + (uint32_t)sizeof(cy_ep_ctrs)))) + { + if (ctrAddr->used != 0u) /* check for counter being used */ + { + retVal = CY_PROFILE_SUCCESS; + } + } + return (retVal); +} + + +/* ========================================================================== */ +/* ==================== INTERRUPT FUNCTION SECTION ==================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_Profile_ISR +****************************************************************************//** +* +* EP interrupt handler: Increments the overflow member of the counter structure, +* for each counter that is in use and has an overflow. +* +* This handler is not configured or used automatically. You must configure the +* interrupt handler for the EP, using Cy_SysInt_Init(). Typically you configure +* the system to use \ref Cy_Profile_ISR() as the overflow interrupt handler. You +* can provide a custom interrupt handler to perform additional operations if +* required. Your handler can call \ref Cy_Profile_ISR() to handle counter +* overflow. +* +*******************************************************************************/ +void Cy_Profile_ISR(void) +{ + uint32_t ctr; + + /* Grab a copy of the overflow register. Each bit in the register indicates + whether or not the respective counter has overflowed. */ + uint32_t ovflowBits = _FLD2VAL(PROFILE_INTR_MASKED_CNT_OVFLW, PROFILE->INTR_MASKED); + + PROFILE->INTR = ovflowBits; /* clear the sources of the interrupts */ + + /* scan through the overflow bits, i.e., for each counter */ + for (ctr = 0UL; (ctr < (uint32_t)(PROFILE_PRFL_CNT_NR)) && (ovflowBits != 0UL); ctr++) + { + /* Increment the overflow bit only if the counter is being used. + (Which should always be the case.) */ + if (((ovflowBits & 1UL) != 0UL) && (cy_ep_ctrs[ctr].used != 0u)) + { + cy_ep_ctrs[ctr].overflow++; + } + ovflowBits >>= 1; /* check the next bit, by shifting it into the LS position */ + } +} + + +/* ========================================================================== */ +/* ================== GENERAL EP FUNCTIONS SECTION ==================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_Profile_StartProfiling +****************************************************************************//** +* +* Starts profiling. +* +* \note Before calling this function, the user must enable the EP interrupt. +*******************************************************************************/ +void Cy_Profile_StartProfiling(void) +{ + uint32_t i; + + /* clear all of the counter array overflow variables */ + for (i = 0UL; i < CY_N_ELMTS(cy_ep_ctrs); cy_ep_ctrs[i++].overflow = 0UL){} + /* send the hardware command */ + PROFILE->CMD = CY_PROFILE_START_TR; +} + + +/* ========================================================================== */ +/* =================== COUNTER FUNCTIONS SECTION ====================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_Profile_ClearConfiguration +****************************************************************************//** +* +* Clears all counter configuration and sets all counters and overflow counters to 0. +* Calls Cy_Profile_ClearCounters() to clear counter registers. +* +*******************************************************************************/ +void Cy_Profile_ClearConfiguration(void) +{ + (void)memset((void *)cy_ep_ctrs, 0, sizeof(cy_ep_ctrs)); + Cy_Profile_ClearCounters(); +} + +/******************************************************************************* +* Function Name: Cy_Profile_ConfigureCounter +****************************************************************************//** +* +* Assigns a given monitor source to a counter, and loads the CTL register +* bitfields of an assigned counter. +* +* \param monitor The monitor source # +* +* \param duration Events are monitored (0), or duration is monitored (1) +* +* \param refClk The reference clock to use; see \ref cy_en_profile_ref_clk_t. +* In general, it is recommended to use CY_PROFILE_CLK_HF to maximize resolution. +* +* \param weight Weighting factor for the counter value +* +* \return A pointer to the counter data structure. NULL if no counter is +* available. +* +* \note The counter is not enabled by this function. See functions +* \ref Cy_Profile_EnableCounter() and \ref Cy_Profile_DisableCounter(). See the +* Technical Reference Manual chapter on the EP for reference clock considerations. +* +*******************************************************************************/ +cy_stc_profile_ctr_ptr_t Cy_Profile_ConfigureCounter(en_ep_mon_sel_t monitor, uint32_t duration, + cy_en_profile_ref_clk_t refClk, uint32_t weight) +{ + cy_stc_profile_ctr_ptr_t retVal = NULL; /* error value if no counter is available */ + volatile uint8_t i; + /* scan through the counters for an unused one */ + for (i = 0u; (cy_ep_ctrs[i].used != 0u) && (i < CY_N_ELMTS(cy_ep_ctrs)); i++){} + if (i < CY_N_ELMTS(cy_ep_ctrs)) + { /* found one, fill in its data structure */ + cy_ep_ctrs[i].ctrNum = i; + cy_ep_ctrs[i].used = 1u; + cy_ep_ctrs[i].cntAddr = (PROFILE_CNT_STRUCT_Type *)&(PROFILE->CNT_STRUCT[i]); + cy_ep_ctrs[i].ctlRegVals.cntDuration = (uint8_t)duration; + cy_ep_ctrs[i].ctlRegVals.refClkSel = refClk; + cy_ep_ctrs[i].ctlRegVals.monSel = monitor; + cy_ep_ctrs[i].overflow = 0UL; + cy_ep_ctrs[i].weight = weight; + /* pass back the handle to (address of) the counter data structure */ + retVal = &cy_ep_ctrs[i]; + + /* Load the CTL register bitfields of the assigned counter. */ + retVal->cntAddr->CTL = + _VAL2FLD(PROFILE_CNT_STRUCT_CTL_CNT_DURATION, retVal->ctlRegVals.cntDuration) | + _VAL2FLD(PROFILE_CNT_STRUCT_CTL_REF_CLK_SEL, retVal->ctlRegVals.refClkSel) | + _VAL2FLD(PROFILE_CNT_STRUCT_CTL_MON_SEL, retVal->ctlRegVals.monSel); + + } + return (retVal); +} + +/******************************************************************************* +* Function Name: Cy_Profile_FreeCounter +****************************************************************************//** +* +* Frees up a counter from a previously-assigned monitor source. +* \ref Cy_Profile_ConfigureCounter() must have been called for this counter before +* calling this function. +* +* \param ctrAddr The handle to (address of) the assigned counter, which is +* obtained by a call to \ref Cy_Profile_ConfigureCounter() +* +* \return \ref CY_PROFILE_SUCCESS, or \ref CY_PROFILE_BAD_PARAM for counter not in use. +* +* \note The counter is not disabled by this function. See functions +* \ref Cy_Profile_EnableCounter() and \ref Cy_Profile_DisableCounter(). +*******************************************************************************/ +uint32_t Cy_Profile_FreeCounter(cy_stc_profile_ctr_ptr_t ctrAddr) +{ + uint32_t retVal = Cy_Profile_IsPtrValid(ctrAddr); + if (retVal == CY_PROFILE_SUCCESS) + { + ctrAddr->used = 0u; + } + return (retVal); +} + +/******************************************************************************* +* Function Name: Cy_Profile_EnableCounter +****************************************************************************//** +* +* Enables an assigned counter. \ref Cy_Profile_ConfigureCounter() must have been +* called for this counter before calling this function. +* +* \param ctrAddr The handle to (address of) the assigned counter, which is +* obtained by a call to \ref Cy_Profile_ConfigureCounter() +* +* \return \ref CY_PROFILE_SUCCESS, or \ref CY_PROFILE_BAD_PARAM for counter not in use. +* +*******************************************************************************/ +uint32_t Cy_Profile_EnableCounter(cy_stc_profile_ctr_ptr_t ctrAddr) +{ + uint32_t retVal = Cy_Profile_IsPtrValid(ctrAddr); + if (retVal == CY_PROFILE_SUCCESS) + { + /* set the ENABLED bit */ + ctrAddr->cntAddr->CTL |= _VAL2FLD(PROFILE_CNT_STRUCT_CTL_ENABLED, 1UL); + /* set the INTR_MASK bit for the counter being used */ + PROFILE->INTR_MASK |= (1UL << (ctrAddr->ctrNum)); + } + return (retVal); +} + +/******************************************************************************* +* Function Name: Cy_Profile_DisableCounter +****************************************************************************//** +* +* Disables an assigned counter. \ref Cy_Profile_ConfigureCounter() must have been +* called for this counter before calling this function. +* +* \param ctrAddr The handle to (address of) the assigned counter, which is +* obtained by a call to \ref Cy_Profile_ConfigureCounter() +* +* \return \ref CY_PROFILE_SUCCESS, or \ref CY_PROFILE_BAD_PARAM for counter not in use. +* +*******************************************************************************/ +uint32_t Cy_Profile_DisableCounter(cy_stc_profile_ctr_ptr_t ctrAddr) +{ + uint32_t retVal = Cy_Profile_IsPtrValid(ctrAddr); + if (retVal == CY_PROFILE_SUCCESS) + { + /* clear the ENABLED bit */ + ctrAddr->cntAddr->CTL &= ~(_VAL2FLD(PROFILE_CNT_STRUCT_CTL_ENABLED, 1UL)); + /* clear the INTR_MASK bit for the counter being used */ + PROFILE->INTR_MASK &= ~(1UL << (ctrAddr->ctrNum)); + } + return (retVal); +} + + +/* ========================================================================== */ +/* ================== CALCULATION FUNCTIONS SECTION =================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_Profile_GetRawCount +****************************************************************************//** +* +* Reports the count value for a specified counter. +* +* \param ctrAddr the handle to (address of) the assigned counter, which is +* obtained by a call to \ref Cy_Profile_ConfigureCounter() +* +* \param result the address to which to write the result +* +* \return \ref CY_PROFILE_SUCCESS, or \ref CY_PROFILE_BAD_PARAM for counter not in use. +* +*******************************************************************************/ +uint32_t Cy_Profile_GetRawCount(cy_stc_profile_ctr_ptr_t ctrAddr, uint64_t *result) +{ + uint32_t retVal = Cy_Profile_IsPtrValid(ctrAddr); + if (retVal == CY_PROFILE_SUCCESS) + { + /* read the counter control register, and the counter current value */ + ctrAddr->ctlReg = ctrAddr->cntAddr->CTL; + ctrAddr->cntReg = ctrAddr->cntAddr->CNT; + + /* report the count with overflow */ + *result = ((uint64_t)(ctrAddr->overflow) << 32) | (uint64_t)(ctrAddr->cntReg); + } + return (retVal); +} + +/******************************************************************************* +* Function Name: Cy_Profile_GetWeightedCount +****************************************************************************//** +* +* Reports the count value for a specified counter, multiplied by the weight +* factor set in \ref Cy_Profile_ConfigureCounter() for that counter. +* +* \param ctrAddr the handle to (address of) the assigned counter, which is +* obtained by a call to \ref Cy_Profile_ConfigureCounter() +* +* \param result the address to which to write the result +* +* \return \ref CY_PROFILE_SUCCESS, or \ref CY_PROFILE_BAD_PARAM for counter not in use. +* +*******************************************************************************/ +uint32_t Cy_Profile_GetWeightedCount(cy_stc_profile_ctr_ptr_t ctrAddr, uint64_t *result) +{ + uint64_t temp; + uint32_t retVal = Cy_Profile_GetRawCount(ctrAddr, &temp); + if (retVal == CY_PROFILE_SUCCESS) + { + /* calculate weighted count */ + *result = temp * (uint64_t)(ctrAddr->weight); + } + return (retVal); +} + +/******************************************************************************* +* Function Name: Cy_Profile_GetSumWeightedCounts +****************************************************************************//** +* +* Calls \ref Cy_Profile_GetWeightedCount() for all specified counters. Reports the sum +* across all valid counters. +* +* \param ptrsArray array of handles to (addresses of) assigned counters +* +* \param numCounters number of scanned elements in ptrsArray[] +* +* \return The sum +* +*******************************************************************************/ +uint64_t Cy_Profile_GetSumWeightedCounts(const cy_stc_profile_ctr_ptr_t ptrsArray[], + uint32_t numCounters) +{ + uint64_t daSum = (uint64_t)0ul; + uint64_t num; + uint32_t i; + + for (i = 0ul; i < numCounters; i++) + { + /* ignore error reported by Ep_GetWeightedCount() */ + if (Cy_Profile_GetWeightedCount(ptrsArray[i], &num) == CY_PROFILE_SUCCESS) + { + daSum += num; + } + } + + return (daSum); +} + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/profile/cy_profile.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/profile/cy_profile.h new file mode 100644 index 0000000000..0f9be7375a --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/profile/cy_profile.h @@ -0,0 +1,540 @@ +/***************************************************************************//** +* \file cy_profile.h +* \version 1.0 +* +* Provides an API declaration of the energy profiler (EP) driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_energy_profiler Energy Profiler (Profile) +* \{ +* +* The energy profiler (EP) driver contains an API for configuring and using the +* energy profiler hardware. The profiler enables measurement of the relative +* amount of energy consumed by particular peripherals. Traditional energy +* profilers correlate energy consumption to the program counter, which helps you +* understand when power is consumed. The EP provides additional insight into the +* device so you can identify an asynchronous activity that causes energy +* consumption. In other words, the EP helps you understand where power is consumed. +* +* The EP does not measure or report actual energy consumption. It measures either +* clock cycles or the number of events that have occurred in the profiling window. +* To derive relative energy consumption for each source, you can multiply the +* absolute count (clock cycles or events) for that source by a coefficient. +* +* Many of the sources available for monitoring are asynchronous operations where +* the cause of energy consumption may be difficult to identify using external hardware. +* +* \section group_profile_configuration Configuration Considerations +* +* There is no PSoC Creator component for this peripheral. To use the profiler you +* include the header file and configure the counters by writing code and calling +* the Profiler API functions. +* +* At the highest level, you perform these tasks: +* - Initialize the profiling block +* - Set up the profiling interrupt +* - Configure, initialize, and enable the counters +* - Start and stop profiling +* - Get the results +* - Exit gracefully +* +* The EP manages a set of counters. For each counter you use, you assign the source +* you want monitored, a reference clock, and a coefficient used to calculate results. +* You can also get the raw count for any counter. +* +* Each counter is a 32-bit register that counts either a number of clock cycles, +* or a number of events. It is possible to overflow the 32-bit register. The +* firmware implements a 32-bit overflow counter. Combined with the 32-bit register, +* this gives you a 64-bit counter for each monitored source. The profiler generates +* an interrupt when an overflow occurs. You must configure the interrupt handler +* using Cy_SysInt_Init(). You can use Cy_Profile_ISR() as the interrupt handler. It +* increments the overflow counter for each profiling counter that is in use. +* +* See notes on individual function definitions. +* +* \section group_profile_more_information More Information +* +* See the EP chapter of the device technical reference manual (TRM). +* +* \section group_profile_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
10.1RThe value of an expression of integer type shall not be implicitly converted to a different, underlying type +* if the expression is complex.Using a Cypress defined macro to access memory mapped objects. +* Checking that a function pointer points to within the correct memory region. +* Calculating address of register structure.
10.5RIf the bitwise operators ~ and << are applied to an operand of underlying type uint8 or uint16, the result +* shall be immediately cast to the underlying type of the operand.Using a Cypress-defined macro to access memory-mapped objects.
11.5RDangerous pointer cast results in loss of volatile qualification.Using a Cypress-defined macro to access memory-mapped objects.
12.4RRight hand operand of '&&' or '||' is an expression with possible side effects.Function-like macros are used to achieve more efficient code.
12.7RBitwise operator applied to signed underlying type.Using a Cypress-defined macro to access memory-mapped objects.
16.7AA pointer parameter can be of type 'pointer to const'.The pointer is cast for comparison purposes and thus can't be a const.
19.7AA function shall be used in preference to a function-like macro.Function-like macros are used to achieve more efficient code.
+* +* \section group_profile_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_profile_macro Macro +* \{ +* \defgroup group_profile_macro_return Function return values +* \} +* \defgroup group_profile_functions Functions +* \{ +* \defgroup group_profile_functions_interrupt Interrupt Functions +* \defgroup group_profile_functions_general General Functions +* \defgroup group_profile_functions_counter Counter Functions +* \defgroup group_profile_functions_calculation Calculation Functions +* \} +* \defgroup group_profile_data_structures Data Structures +* \defgroup group_profile_enums Enumerated Types +*/ + +#if !defined(CY_PROFILE_H) +#define CY_PROFILE_H + +#include "cy_device_headers.h" +#include "syslib/cy_syslib.h" +#include + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/** \addtogroup group_profile_macro +* \{ +*/ + +/** Driver major version */ +#define CY_PROFILE_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_PROFILE_DRV_VERSION_MINOR 0 + +/** Start profiling command for the CMD register */ +#define CY_PROFILE_START_TR 1UL + +/** Stop profiling command for the CMD register */ +#define CY_PROFILE_STOP_TR 2UL + +/** Command to clear all counter registers to 0 */ +#define CY_PROFILE_CLR_ALL_CNT 0x100UL + +/** +* \addtogroup group_profile_returns +* \{ +* Specifies return values meaning +*/ +/** Command completed with no errors */ +#define CY_PROFILE_SUCCESS 0ul +/** Invalid function input parameter */ +#define CY_PROFILE_BAD_PARAM 1ul +/** \} group_profile_returns */ + +/** \} group_profile_macro */ + + +/** +* \addtogroup group_profile_enums +* \{ +*/ + +/** +* The possible values for CTR register, REF_CLK_SEL bitfield. See the +* technical reference manual (TRM) for reference clock considerations. +*/ +typedef enum +{ + CY_PROFILE_CLK_TIMER = 0, /**< See SRSS register CLK_TIMER_CTL.TIMER_SEL */ + CY_PROFILE_CLK_IMO = 1, /**< Internal main oscillator */ + CY_PROFILE_CLK_ECO = 2, /**< External crystal oscillator */ + CY_PROFILE_CLK_LF = 3, /**< See SRSS register CLK_SELECT.LFCLK_SEL */ + CY_PROFILE_CLK_HF = 4, /**< See SRSS registers CLK_ROOT_SELECT[0].ROOT_MUX and CLK_ROOT_SELECT[0].ROOT_DIV */ + CY_PROFILE_CLK_PERI = 5, /**< See CPUSS register CM0_CLOCK_CTL.PERI_INT_DIV */ +} cy_en_profile_ref_clk_t; +/** \} group_profile_enums */ + +/** +* \addtogroup group_profile_data_structures +* \{ +*/ + +/** +* EP counter control register structure. For each counter, holds the CTL register fields. +*/ +typedef struct +{ + uint8_t cntDuration; /**< 0 = events are monitored; 1 = duration is monitored */ + cy_en_profile_ref_clk_t refClkSel; /**< The reference clock used by this counter; 3 bits */ + en_ep_mon_sel_t monSel; /**< The monitor signal to be observed by this counter; # bits = PROFILE_CNT_STRUCT_PRFL_MONITOR_NR_LOG2 */ +} cy_stc_profile_ctr_ctl_t; + +/** +* Structure holding all information for an EP counter. +*/ +typedef struct +{ + uint8_t ctrNum; /**< hardware counter # */ + uint8_t used; /**< used 0 = available, 1 = being used */ + cy_stc_profile_ctr_ctl_t ctlRegVals; /**< counter CTL reg bitfield values */ + PROFILE_CNT_STRUCT_Type * cntAddr; /**< base MMIO addr of counter registers */ + uint32_t ctlReg; /**< also includes enabled/disabled status */ + uint32_t cntReg; /**< current counter value */ + uint32_t overflow; /**< this register and cntReg form a 64-bit counter value */ + uint32_t weight; /**< counter weighting factor */ +} cy_stc_profile_ctr_t; +/** +* Pointer to structure holding all information for an EP counter. +*/ +typedef cy_stc_profile_ctr_t * cy_stc_profile_ctr_ptr_t; +/** \} group_profile_data_structures */ + +/** +* \addtogroup group_profile_functions +* \{ +*/ + +/** +* \addtogroup group_profile_functions_interrupt +* \{ +*/ + + +/* ========================================================================== */ +/* ==================== INTERRUPT FUNCTION SECTION ==================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_Profile_ISR +****************************************************************************//** +* +* EP interrupt handler: Increments the overflow member of the counter structure, +* for each counter that is in use and has an overflow. +* +* This handler is not configured or used automatically. You must configure the +* interrupt handler for the EP, using Cy_SysInt_Init(). Typically you configure +* the system to use \ref Cy_Profile_ISR() as the overflow interrupt handler. You +* can provide a custom interrupt handler to perform additional operations if +* required. Your handler can call \ref Cy_Profile_ISR() to handle counter +* overflow. +* +*******************************************************************************/ +void Cy_Profile_ISR(void); +/** \} group_profile_functions_interrupt */ + +/** +* \addtogroup group_profile_functions_general +* \{ +*/ + + +/* ========================================================================== */ +/* ================== GENERAL EP FUNCTIONS SECTION ==================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_Profile_Init +****************************************************************************//** +* +* Turns on the EP for profiling. It must be called once when energy profiling is +* desired. This does not start a profiling session. Use Cy_Profile_StartProfiling() +* to start a profiling session. +* +* \note Before calling this function, the user must configure the EP interrupt +* so that \ref Cy_Profile_ISR() is executed. +*******************************************************************************/ +__STATIC_INLINE void Cy_Profile_Init(void) +{ + PROFILE->CTL = _VAL2FLD(PROFILE_CTL_ENABLED, 1UL/*enabled */) | + _VAL2FLD(PROFILE_CTL_WIN_MODE, 0UL/*start/stop mode*/); + PROFILE->INTR_MASK = 0UL; /* clear all counter interrupt mask bits */ +} + + +/******************************************************************************* +* Function Name: Cy_Profile_DeInit +****************************************************************************//** +* +* Turns off the EP. It should be called when energy profiling is no longer +* desired. +* +* \note When calling this function, the user should consider also unconfiguring +* the EP interrupt. +*******************************************************************************/ +__STATIC_INLINE void Cy_Profile_DeInit(void) +{ + PROFILE->CTL = _VAL2FLD(PROFILE_CTL_ENABLED, 0UL/*disabled */); + PROFILE->INTR_MASK = 0UL; /* clear all counter interrupt mask bits */ +} + +/******************************************************************************* +* Function Name: Cy_Profile_StartProfiling +****************************************************************************//** +* +* Starts profiling. +* +* \note Before calling this function, the user must enable the EP interrupt. +*******************************************************************************/ +void Cy_Profile_StartProfiling(void); + +/******************************************************************************* +* Function Name: Cy_Profile_StopProfiling +****************************************************************************//** +* +* Stops profiling. +* +* \note When calling this function, the user should also disable the EP +* interrupt. +*******************************************************************************/ +__STATIC_INLINE void Cy_Profile_StopProfiling(void) +{ + PROFILE->CMD = CY_PROFILE_STOP_TR; +} + +/******************************************************************************* +* Function Name: Cy_Profile_IsProfiling +****************************************************************************//** +* +* Reports whether or not profiling is active. +* +* \return 0 = profiling is not active; 1 = profiling is active +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_Profile_IsProfiling(void) +{ + return _FLD2VAL(PROFILE_STATUS_WIN_ACTIVE, PROFILE->STATUS); +} +/** \} group_profile_functions_general */ + +/** +* \addtogroup group_profile_functions_counter +* \{ +*/ + + +/* ========================================================================== */ +/* =================== COUNTER FUNCTIONS SECTION ====================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_Profile_ClearConfiguration +****************************************************************************//** +* +* Clears all counter configuration and sets all counters and overflow counters to 0. +* Calls Cy_Profile_ClearCounters() to clear counter registers. +* +*******************************************************************************/ +void Cy_Profile_ClearConfiguration(void); + +/******************************************************************************* +* Function Name: Cy_Profile_ClearCounters +****************************************************************************//** +* +* Clears all hardware counters to 0. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_Profile_ClearCounters(void) +{ + PROFILE->CMD = CY_PROFILE_CLR_ALL_CNT; +} + +/******************************************************************************* +* Function Name: Cy_Profile_ConfigureCounter +****************************************************************************//** +* +* Assigns a given monitor source to a counter, and loads the CTL register +* bitfields of an assigned counter. +* +* \param monitor The monitor source # +* +* \param duration Events are monitored (0), or duration is monitored (1) +* +* \param refClk The reference clock to use; see \ref cy_en_profile_ref_clk_t. +* In general, you should use CY_PROFILE_CLK_HF to maximize resolution. +* +* \param weight Weighting factor for the counter value +* +* \return A pointer to the counter data structure. NULL if no counter is +* available. +* +* \note The counter is not enabled by this function. See functions +* \ref Cy_Profile_EnableCounter() and \ref Cy_Profile_DisableCounter(). See the +* technical reference manual (TRM) chapter on the EP for reference clock considerations. +* +*******************************************************************************/ +cy_stc_profile_ctr_ptr_t Cy_Profile_ConfigureCounter(en_ep_mon_sel_t monitor, uint32_t duration, + cy_en_profile_ref_clk_t refClk, uint32_t weight); + +/******************************************************************************* +* Function Name: Cy_Profile_FreeCounter +****************************************************************************//** +* +* Frees up a counter from a previously-assigned monitor source. +* \ref Cy_Profile_ConfigureCounter() must have been called for this counter before +* calling this function. +* +* \param ctrAddr The handle to (address of) the assigned counter, which is +* obtained by a call to \ref Cy_Profile_ConfigureCounter(). +* +* \return \ref CY_PROFILE_SUCCESS, or \ref CY_PROFILE_BAD_PARAM for counter not in use. +* +* \note The counter is not disabled by this function. See functions +* \ref Cy_Profile_EnableCounter() and \ref Cy_Profile_DisableCounter(). +*******************************************************************************/ +uint32_t Cy_Profile_FreeCounter(cy_stc_profile_ctr_ptr_t ctrAddr); + +/******************************************************************************* +* Function Name: Cy_Profile_EnableCounter +****************************************************************************//** +* +* Enables an assigned counter. \ref Cy_Profile_ConfigureCounter() must have been +* called for this counter before calling this function. +* +* \param ctrAddr The handle to (address of) the assigned counter, which is +* obtained by a call to \ref Cy_Profile_ConfigureCounter(). +* +* \return \ref CY_PROFILE_SUCCESS, or \ref CY_PROFILE_BAD_PARAM for counter not in use. +* +*******************************************************************************/ +uint32_t Cy_Profile_EnableCounter(cy_stc_profile_ctr_ptr_t ctrAddr); + +/******************************************************************************* +* Function Name: Cy_Profile_DisableCounter +****************************************************************************//** +* +* Disables an assigned counter. \ref Cy_Profile_ConfigureCounter() must have been +* called for this counter before calling this function. +* +* \param ctrAddr The handle to (address of) the assigned counter, which is +* obtained by a call to \ref Cy_Profile_ConfigureCounter(). +* +* \return \ref CY_PROFILE_SUCCESS, or \ref CY_PROFILE_BAD_PARAM for counter not in use. +* +*******************************************************************************/ +uint32_t Cy_Profile_DisableCounter(cy_stc_profile_ctr_ptr_t ctrAddr); +/** \} group_profile_functions_counter */ + +/** +* \addtogroup group_profile_functions_calculation +* \{ +*/ + + +/* ========================================================================== */ +/* ================== CALCULATION FUNCTIONS SECTION =================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_Profile_GetRawCount +****************************************************************************//** +* +* Reports the count value for a specified counter. +* +* \param ctrAddr the handle to (address of) the assigned counter, which is +* obtained by a call to \ref Cy_Profile_ConfigureCounter(). +* +* \param result The address to which to write the result. +* +* \return \ref CY_PROFILE_SUCCESS, or \ref CY_PROFILE_BAD_PARAM for counter not in use. +* +*******************************************************************************/ +uint32_t Cy_Profile_GetRawCount(cy_stc_profile_ctr_ptr_t ctrAddr, uint64_t *result); + +/******************************************************************************* +* Function Name: Cy_Profile_GetWeightedCount +****************************************************************************//** +* +* Reports the count value for a specified counter, multiplied by the weight +* factor set in \ref Cy_Profile_ConfigureCounter() for that counter. +* +* \param ctrAddr the handle to (address of) the assigned counter, which is +* obtained by a call to \ref Cy_Profile_ConfigureCounter(). +* +* \param result The address to which to write the result. +* +* \return \ref CY_PROFILE_SUCCESS, or \ref CY_PROFILE_BAD_PARAM for counter not in use. +* +*******************************************************************************/ +uint32_t Cy_Profile_GetWeightedCount(cy_stc_profile_ctr_ptr_t ctrAddr, uint64_t *result); + +/******************************************************************************* +* Function Name: Cy_Profile_GetSumWeightedCounts +****************************************************************************//** +* +* Calls \ref Cy_Profile_GetWeightedCount() for all specified counters. Reports the sum +* across all valid counters. +* +* \param ptrsArray Array of handles to (addresses of) assigned counters +* +* \param numCounters Number of scanned elements in ptrsArray[] +* +* \return The sum +* +*******************************************************************************/ +uint64_t Cy_Profile_GetSumWeightedCounts(const cy_stc_profile_ctr_ptr_t ptrsArray[], + uint32_t numCounters); +/** \} group_profile_functions_calculation */ + +/** \} group_profile_functions */ + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* CY_PROFILE_H */ + +/** \} group_profile */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/prot/cy_prot.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/prot/cy_prot.c new file mode 100644 index 0000000000..c719ec7ab1 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/prot/cy_prot.c @@ -0,0 +1,1587 @@ +/***************************************************************************//** +* \file cy_prot.c +* \version 1.0 +* +* \brief +* Provides an API implementation of the Protection Unit driver +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_prot.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigBusMaster +****************************************************************************//** +* +* \brief Configures the allowed protection contexts, security (secure/non-secure) +* and privilege level of the bus transaction created by the specified master. +* +* \param busMaster +* Indicates which master needs to be configured. Refer to the CY_PROT_MASTER_X +* defines. +* +* \param privileged +* Boolean to define the privilege level of all subsequent bus transfers. +* True - privileged, False - not privileged. +* Note that this is an inherited value. If not inherited, then this bit will +* be used. +* +* \param secure +* Security setting for the master. True - Secure, False - Not secure. +* +* \param pcMask +* This is a 16 bit value of the allowed contexts, it is an OR'ed (|) field of the +* provided defines in cy_prot.h. For example: (PROT_PC1 | PROT_PC3 | PROT_PC4) +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The function completed successfully +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigBusMaster(en_prot_master_t busMaster, bool privileged, bool secure, uint32_t pcMask) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t regVal; + uint32_t * addrMsCtl = (uint32_t *)(PROT_BASE + (uint32_t)(busMaster << CY_PROT_MSX_CTL_SHIFT)); + + if((uint32_t)(pcMask & CY_PROT_MPU_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + regVal = _VAL2FLD(PROT_SMPU_MS0_CTL_NS, !secure) + | _VAL2FLD(PROT_SMPU_MS0_CTL_P, privileged) + | _VAL2FLD(PROT_SMPU_MS0_CTL_PC_MASK_15_TO_1, pcMask); + *addrMsCtl = regVal; + status = (*addrMsCtl != regVal) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_SetActivePC +****************************************************************************//** +* +* \brief Sets the current/active protection context of the specified bus master. +* +* Allowed PC values are 1-15. If this value is not inherited from another bus +* master, the value set through this function is used. +* +* \param busMaster +* The bus master to configure. Refer to the CY_PROT_MASTER_X defines. +* +* \param pc +* Active protection context of the specified master. Note that only those +* protection contexts allowed by the pcMask will take effect. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The function completed successfully +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_SetActivePC(en_prot_master_t busMaster, uint32_t pc) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + PROT_MPU_Type* addrMpu = (PROT_MPU_Type*)(&PROT->CYMPU[busMaster]); + + if(pc >= (uint32_t)CPUSS_PROT_SMPU_MS0_PC_NR_MINUS1) + { + /* Invalid PC value - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + addrMpu->MS_CTL = _VAL2FLD(PROT_MPU_MS_CTL_PC, pc); + status = (addrMpu->MS_CTL != pc) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_GetActivePC +****************************************************************************//** +* +* \brief Returns the active protection context of a master. +* +* \param busMaster +* The bus master, whose protection context is being read. Refer to the +* CY_PROT_MASTER_X defines. +* +* \return +* Active protection context of the master +* +*******************************************************************************/ +uint32_t Cy_Prot_GetActivePC(en_prot_master_t busMaster) +{ + PROT_MPU_Type* addrMpu = (PROT_MPU_Type*)(&PROT->CYMPU[busMaster]); + + return ((uint32_t)_FLD2VAL(PROT_MPU_MS_CTL_PC, addrMpu->MS_CTL)); +} + + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigMpuStruct +****************************************************************************//** +* +* \brief This function configures a memory protection unit (MPU) struct with its +* protection attributes. +* +* The protection structs act like the gatekeepers for a master's accesses to +* memory, allowing only the permitted transactions to go through. +* +* \param base +* The base address for the MPU struct being configured. +* +* \param config +* Initialization structure containing all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The MPU struct was configured +* CY_PROT_FAILURE | Configuration failed due to a protection violation +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigMpuStruct(PROT_MPU_MPU_STRUCT_Type* base, const cy_stc_mpu_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t addrReg; + uint32_t attReg; + + addrReg = _VAL2FLD(PROT_MPU_MPU_STRUCT_ADDR_SUBREGION_DISABLE, config->subregions) + | _VAL2FLD(PROT_MPU_MPU_STRUCT_ADDR_ADDR24, (uint32_t)((uint32_t)config->address >> CY_PROT_ADDR_SHIFT)); + attReg = ((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK) + | (((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PROT_MPU_MPU_STRUCT_ATT_NS, !(config->secure)) + | _VAL2FLD(PROT_MPU_MPU_STRUCT_ATT_REGION_SIZE, config->regionSize); + base->ATT = attReg; + base->ADDR = addrReg; + status = ((base->ADDR != addrReg) || (base->ATT != attReg)) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnableMpuStruct +****************************************************************************//** +* +* \brief Enables the MPU struct, which allows the MPU protection attributes to +* take effect. +* +* \param base +* The base address of the MPU struct being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The MPU struct was enabled +* CY_PROT_FAILURE | The MPU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnableMpuStruct(PROT_MPU_MPU_STRUCT_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT |= _VAL2FLD(PROT_MPU_MPU_STRUCT_ATT_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PROT_MPU_MPU_STRUCT_ATT_ENABLED, base->ATT) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisableMpuStruct +****************************************************************************//** +* +* \brief Disbles the MPU struct, which prevents the MPU protection attributes +* from taking effect. +* +* \param base +* The base address of the MPU struct being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The MPU struct was disabled +* CY_PROT_FAILURE | The MPU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisableMpuStruct(PROT_MPU_MPU_STRUCT_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT &= ~_VAL2FLD(PROT_MPU_MPU_STRUCT_ATT_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PROT_MPU_MPU_STRUCT_ATT_ENABLED, base->ATT) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigSmpuMasterStruct +****************************************************************************//** +* +* \brief Configures a Shared Memory Protection Unit (SMPU) master protection +* struct with its protection attributes. +* +* This function configures the master struct governing the corresponding slave +* struct pair. It is a mechanism to protect the slave SMPU struct. Since the +* memory location of the slave struct is known, the address, regionSize and +* subregions of the configuration struct are not applicable. +* +* Note that only the user/privileged write permissions are configurable. The +* read and execute permissions are read-only and cannot be configured. +* +* \param base +* The register base address of the protection struct being configured. +* +* \param config +* Initialization structure with all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | SMPU master struct was successfully configured +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigSmpuMasterStruct(PROT_SMPU_SMPU_STRUCT_Type* base, const cy_stc_smpu_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t attReg; + + if(((uint32_t)config->pcMask & CY_PROT_SMPU_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + /* ADDR1 is read only. Only configure ATT1 */ + attReg = ((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK) + | (uint32_t)(((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT1_NS, !(config->secure)) + | _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT1_PC_MASK_15_TO_1, config->pcMask) + /* No region size - read only for master structs */ + | _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT1_PC_MATCH, config->pcMatch); + if ((attReg & CY_PROT_SMPU_ATT1_MASK) != attReg) + { + /* Invalid parameter was passed */ + status = CY_PROT_BAD_PARAM; + } + else + { + base->ATT1 = attReg; + status = ((base->ATT1 & CY_PROT_SMPU_ATT1_MASK) != attReg) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + } + + return status; +} + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigSmpuSlaveStruct +****************************************************************************//** +* +* \brief Configures a Shared Memory Protection Unit (SMPU) slave protection +* struct with its protection attributes. +* +* This function configures the slave struct of an SMPU pair, which can protect +* any memory region in a device from invalid bus master accesses. +* +* \param base +* The register base address of the protection structure being configured. +* +* \param config +* Initialization structure with all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | SMPU slave struct was successfully configured +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigSmpuSlaveStruct(PROT_SMPU_SMPU_STRUCT_Type* base, const cy_stc_smpu_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t addrReg; + uint32_t attReg; + + if(((uint32_t)config->pcMask & CY_PROT_SMPU_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + addrReg= _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ADDR0_SUBREGION_DISABLE, config->subregions) + | _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ADDR0_ADDR24, (uint32_t)((uint32_t)config->address >> CY_PROT_ADDR_SHIFT)); + attReg= ((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK) + | (uint32_t)(((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT0_NS, !(config->secure)) + | _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT0_PC_MASK_15_TO_1, config->pcMask) + | _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT0_REGION_SIZE, config->regionSize) + | _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT0_PC_MATCH, config->pcMatch); + base->ATT0 = attReg; + base->ADDR0 = addrReg; + status = ((base->ADDR0 != addrReg) || ((base->ATT0 & CY_PROT_SMPU_ATT0_MASK) != attReg)) + ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnableSmpuMasterStruct +****************************************************************************//** +* +* \brief Enables the Master SMPU structure. +* +* This is an SMPU master struct enable function. The SMPU protection settings +* will take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Master PU struct was enabled +* CY_PROT_FAILURE | The Master PU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnableSmpuMasterStruct(PROT_SMPU_SMPU_STRUCT_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT1 |= _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT1_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PROT_SMPU_SMPU_STRUCT_ATT1_ENABLED, base->ATT1) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisableSmpuMasterStruct +****************************************************************************//** +* +* \brief Disables the Master SMPU structure. +* +* This is an SMPU master struct disable function. The SMPU protection settings +* will seize to take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Master PU struct was disabled +* CY_PROT_FAILURE | The Master PU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisableSmpuMasterStruct(PROT_SMPU_SMPU_STRUCT_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT1 &= ~_VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT1_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PROT_SMPU_SMPU_STRUCT_ATT1_ENABLED, base->ATT1) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnableSmpuSlaveStruct +****************************************************************************//** +* +* \brief Enables the Slave SMPU structure. +* +* This is an SMPU slave struct enable function. The SMPU protection settings +* will take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Slave PU struct was enabled +* CY_PROT_FAILURE | The Slave PU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnableSmpuSlaveStruct(PROT_SMPU_SMPU_STRUCT_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT0 |= _VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT0_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PROT_SMPU_SMPU_STRUCT_ATT0_ENABLED, base->ATT0) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisableSmpuSlaveStruct +****************************************************************************//** +* +* \brief Disables the Slave SMPU structure. +* +* This is an SMPU slave struct disable function. The SMPU protection settings +* will seize to take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Slave PU struct was disabled +* CY_PROT_FAILURE | The Slave PU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisableSmpuSlaveStruct(PROT_SMPU_SMPU_STRUCT_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT0 &= ~_VAL2FLD(PROT_SMPU_SMPU_STRUCT_ATT0_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PROT_SMPU_SMPU_STRUCT_ATT0_ENABLED, base->ATT0) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigPpuProgMasterStruct +****************************************************************************//** +* +* \brief Configures a Programmable Peripheral Protection Unit (PPU PROG) master +* protection struct with its protection attributes. +* +* This function configures the master struct governing the corresponding slave +* struct pair. It is a mechanism to protect the slave PPU PROG struct. Since +* the memory location of the slave struct is known, the address, regionSize and +* subregions of the configuration struct are not applicable. +* +* Note that only the user/privileged write permissions are configurable. The +* read and execute permissions are read-only and cannot be configured. +* +* \param base +* The register base address of the protection struct being configured. +* +* \param config +* Initialization structure with all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | PPU PROG master struct was successfully configured +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigPpuProgMasterStruct(PERI_PPU_PR_Type* base, const cy_stc_ppu_prog_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t attReg; + + if(((uint32_t)config->pcMask & CY_PROT_PPU_PROG_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + /* ADDR1 is read only. Only configure ATT1 */ + attReg = ((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK) + | (uint32_t)(((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PERI_PPU_PR_ATT1_NS, !(config->secure)) + | _VAL2FLD(PERI_PPU_PR_ATT1_PC_MASK_15_TO_1, config->pcMask) + /* No region size - read only for master structs */ + | _VAL2FLD(PERI_PPU_PR_ATT1_PC_MATCH, config->pcMatch); + if ((attReg & CY_PROT_PPU_PROG_ATT1_MASK) != attReg) + { + /* Invalid parameter was passed */ + status = CY_PROT_BAD_PARAM; + } + else + { + base->ATT1 = attReg; + status = ((base->ATT1 & CY_PROT_PPU_PROG_ATT1_MASK) != attReg) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + } + + return status; +} + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigPpuProgSlaveStruct +****************************************************************************//** +* +* \brief Configures a Programmable Peripheral Protection Unit (PPU PROG) slave +* protection struct with its protection attributes. +* +* This function configures the slave struct of a PPU PROG pair, which can +* protect any peripheral memory region in a device from invalid bus master +* accesses. +* +* Note that the user/privileged execute accesses are read-only and are always +* enabled. +* +* \param base +* The register base address of the protection structure being configured. +* +* \param config +* Initialization structure with all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | PPU PROG slave struct was successfully configured +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigPpuProgSlaveStruct(PERI_PPU_PR_Type* base, const cy_stc_ppu_prog_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t addrReg; + uint32_t attReg; + + if(((uint32_t)config->pcMask & CY_PROT_PPU_PROG_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + addrReg= _VAL2FLD(PERI_PPU_PR_ADDR0_SUBREGION_DISABLE, config->subregions) + | _VAL2FLD(PERI_PPU_PR_ADDR0_ADDR24, (uint32_t)((uint32_t)config->address >> CY_PROT_ADDR_SHIFT)); + attReg= ((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK) + | (uint32_t)(((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PERI_PPU_PR_ATT0_NS, !(config->secure)) + | _VAL2FLD(PERI_PPU_PR_ATT0_PC_MASK_15_TO_1, config->pcMask) + | _VAL2FLD(PERI_PPU_PR_ATT0_REGION_SIZE, config->regionSize) + | _VAL2FLD(PERI_PPU_PR_ATT0_PC_MATCH, config->pcMatch); + if ((attReg & CY_PROT_PPU_PROG_ATT0_MASK) != attReg) + { + /* Invalid parameter was passed */ + status = CY_PROT_BAD_PARAM; + } + else + { + base->ATT0 = attReg; + base->ADDR0 = addrReg; + status = ((base->ADDR0 != addrReg) || ((base->ATT0 & CY_PROT_PPU_PROG_ATT0_MASK) != attReg)) + ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + } + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnablePpuProgMasterStruct +****************************************************************************//** +* +* \brief Enables the Master PPU PROG structure. +* +* This is a PPU PROG master struct enable function. The PPU PROG protection +* settings will take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Master PU struct was enabled +* CY_PROT_FAILURE | The Master PU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnablePpuProgMasterStruct(PERI_PPU_PR_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT1 |= _VAL2FLD(PERI_PPU_PR_ATT1_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_PPU_PR_ATT1_ENABLED, base->ATT1) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisablePpuProgMasterStruct +****************************************************************************//** +* +* \brief Disables the Master PPU PROG structure. +* +* This is a PPU PROG master struct disable function. The PPU PROG protection +* settings will seize to take effect after successful completion of this +* function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Master PU struct was disabled +* CY_PROT_FAILURE | The Master PU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisablePpuProgMasterStruct(PERI_PPU_PR_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT1 &= ~_VAL2FLD(PERI_PPU_PR_ATT1_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_PPU_PR_ATT1_ENABLED, base->ATT1) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnablePpuProgSlaveStruct +****************************************************************************//** +* +* \brief Enables the Slave PPU PROG structure. +* +* This is a PPU PROG slave struct enable function. The PPU PROG protection +* settings will take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Slave PU struct was enabled +* CY_PROT_FAILURE | The Slave PU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnablePpuProgSlaveStruct(PERI_PPU_PR_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT0 |= _VAL2FLD(PERI_PPU_PR_ATT0_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_PPU_PR_ATT0_ENABLED, base->ATT0) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisablePpuProgSlaveStruct +****************************************************************************//** +* +* \brief Disables the Slave PPU PROG structure. +* +* This is a PPU PROG slave struct disable function. The PPU PROG protection +* settings will seize to take effect after successful completion of this +* function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Slave PU struct was disabled +* CY_PROT_FAILURE | The Slave PU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisablePpuProgSlaveStruct(PERI_PPU_PR_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT0 &= ~_VAL2FLD(PERI_PPU_PR_ATT0_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_PPU_PR_ATT0_ENABLED, base->ATT0) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigPpuFixedGrMasterStruct +****************************************************************************//** +* +* \brief Configures a Fixed Peripheral Group Protection Unit (PPU GR) master +* protection struct with its protection attributes. +* +* This function configures the master struct governing the corresponding slave +* struct pair. It is a mechanism to protect the slave PPU GR struct. Since +* the memory location of the slave struct is known, the address, regionSize and +* subregions of the configuration struct are not applicable. +* +* Note that only the user/privileged write permissions are configurable. The +* read and execute permissions are read-only and cannot be configured. +* +* \param base +* The register base address of the protection struct being configured. +* +* \param config +* Initialization structure with all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | PPU GR master struct was successfully configured +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedGrMasterStruct(PERI_PPU_GR_Type* base, const cy_stc_ppu_gr_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t attReg; + + if(((uint32_t)config->pcMask & CY_PROT_PPU_FIXED_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + /* ADDR1 is read only. Only configure ATT1 */ + attReg = (((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK)) + | (uint32_t)(((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PERI_PPU_GR_ATT1_NS, !(config->secure)) + | _VAL2FLD(PERI_PPU_GR_ATT1_PC_MASK_15_TO_1, config->pcMask) + /* No region size - read only for master structs */ + | _VAL2FLD(PERI_PPU_GR_ATT1_PC_MATCH, config->pcMatch); + if ((attReg & CY_PROT_PPU_GR_ATT1_MASK) != attReg) + { + /* Invalid parameter was passed */ + status = CY_PROT_BAD_PARAM; + } + else + { + base->ATT1 = attReg; + status = ((base->ATT1 & CY_PROT_PPU_GR_ATT1_MASK) != attReg) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + } + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigPpuFixedGrSlaveStruct +****************************************************************************//** +* +* \brief Configures a Fixed Peripheral Group Protection Unit (PPU GR) slave +* protection struct with its protection attributes. +* +* This function configures the slave struct of a PPU GR pair, which can +* protect an entire peripheral MMIO group from invalid bus master accesses. +* Refer to the device Technical Reference manual for details on peripheral +* MMIO grouping and which peripherals belong to which groups. +* +* Each fixed PPU GR is devoted to a defined MMIO group. Hence the address, +* regionSize and subregions of the configuration struct are not applicable. +* +* Note that the user/privileged execute accesses are read-only and are always +* enabled. +* +* \param base +* The register base address of the protection structure being configured. +* +* \param config +* Initialization structure with all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | PPU GR slave struct was successfully configured +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedGrSlaveStruct(PERI_PPU_GR_Type* base, const cy_stc_ppu_gr_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t attReg; + + if(((uint32_t)config->pcMask & CY_PROT_PPU_FIXED_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + /* ADDR0 is read only. Only configure ATT0 */ + attReg = (uint32_t)(((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK)) + | (uint32_t)(((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PERI_PPU_GR_ATT0_NS, !(config->secure)) + | _VAL2FLD(PERI_PPU_GR_ATT0_PC_MASK_15_TO_1, config->pcMask) + /* No region size - read only */ + | _VAL2FLD(PERI_PPU_GR_ATT0_PC_MATCH, config->pcMatch); + if ((attReg & CY_PROT_PPU_GR_ATT0_MASK) != attReg) + { + /* Invalid parameter was passed */ + status = CY_PROT_BAD_PARAM; + } + else + { + base->ATT0 = attReg; + status = ((base->ATT0 & CY_PROT_PPU_GR_ATT0_MASK) != attReg) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + } + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnablePpuFixedGrMasterStruct +****************************************************************************//** +* +* \brief Enables the Master PPU GR structure. +* +* This is a PPU GR master struct enable function. The PPU GR protection +* settings will take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Master PU struct was enabled +* CY_PROT_FAILURE | The Master PU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnablePpuFixedGrMasterStruct(PERI_PPU_GR_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT1 |= _VAL2FLD(PERI_PPU_GR_ATT1_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_PPU_GR_ATT1_ENABLED, base->ATT1) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisablePpuFixedGrMasterStruct +****************************************************************************//** +* +* \brief Disables the Master PPU GR structure. +* +* This is a PPU GR master struct disable function. The PPU GR protection +* settings will seize to take effect after successful completion of this +* function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Master PU struct was disabled +* CY_PROT_FAILURE | The Master PU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisablePpuFixedGrMasterStruct(PERI_PPU_GR_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT1 &= ~_VAL2FLD(PERI_PPU_GR_ATT1_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_PPU_GR_ATT1_ENABLED, base->ATT1) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnablePpuFixedGrSlaveStruct +****************************************************************************//** +* +* \brief Enables the Slave PPU GR structure. +* +* This is a PPU GR slave struct enable function. The PPU GR protection +* settings will take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Slave PU struct was enabled +* CY_PROT_FAILURE | The Slave PU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnablePpuFixedGrSlaveStruct(PERI_PPU_GR_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT0 |= _VAL2FLD(PERI_PPU_GR_ATT0_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_PPU_GR_ATT0_ENABLED, base->ATT0) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisablePpuFixedGrSlaveStruct +****************************************************************************//** +* +* \brief Disables the Slave PPU GR structure. +* +* This is a PPU GR slave struct disable function. The PPU GR protection +* settings will seize to take effect after successful completion of this +* function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Slave PU struct was disabled +* CY_PROT_FAILURE | The Slave PU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisablePpuFixedGrSlaveStruct(PERI_PPU_GR_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT0 &= ~_VAL2FLD(PERI_PPU_GR_ATT0_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_PPU_GR_ATT0_ENABLED, base->ATT0) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigPpuFixedSlMasterStruct +****************************************************************************//** +* +* \brief Configures a Fixed Peripheral Slave Protection Unit (PPU SL) master +* protection struct with its protection attributes. +* +* This function configures the master struct governing the corresponding slave +* struct pair. It is a mechanism to protect the slave PPU SL struct. Since +* the memory location of the slave struct is known, the address, regionSize and +* subregions of the configuration struct are not applicable. +* +* Note that only the user/privileged write permissions are configurable. The +* read and execute permissions are read-only and cannot be configured. +* +* \param base +* The register base address of the protection struct being configured. +* +* \param config +* Initialization structure with all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | PPU SL master struct was successfully configured +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedSlMasterStruct(PERI_GR_PPU_SL_Type* base, const cy_stc_ppu_sl_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t attReg; + + if(((uint32_t)config->pcMask & CY_PROT_PPU_FIXED_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + /* ADDR1 is read only. Only configure ATT1 */ + attReg = ((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK) + | (uint32_t)(((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PERI_GR_PPU_SL_ATT1_NS, !(config->secure)) + | _VAL2FLD(PERI_GR_PPU_SL_ATT1_PC_MASK_15_TO_1, config->pcMask) + /* No region size - read only for master structs */ + | _VAL2FLD(PERI_GR_PPU_SL_ATT1_PC_MATCH, config->pcMatch); + if ((attReg & CY_PROT_PPU_SL_ATT1_MASK) != attReg) + { + /* Invalid parameter was passed */ + status = CY_PROT_BAD_PARAM; + } + else + { + base->ATT1 = attReg; + status = ((base->ATT1 & CY_PROT_PPU_SL_ATT1_MASK) != attReg) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + } + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigPpuFixedSlSlaveStruct +****************************************************************************//** +* +* \brief Configures a Fixed Peripheral Slave Protection Unit (PPU SL) slave +* protection struct with its protection attributes. +* +* This function configures the slave struct of a PPU SL pair, which can +* protect an entire peripheral slave instance from invalid bus master accesses. +* For example, TCPWM0, TCPWM1, SCB0 and SCB1 etc. +* +* Each fixed PPU SL is devoted to a defined peripheral slave. Hence the address, +* regionSize and subregions of the configuration struct are not applicable. +* +* Note that the user/privileged execute accesses are read-only and are always +* enabled. +* +* \param base +* The register base address of the protection structure being configured. +* +* \param config +* Initialization structure with all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | PPU SL slave struct was successfully configured +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedSlSlaveStruct(PERI_GR_PPU_SL_Type* base, const cy_stc_ppu_sl_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t attReg; + + if(((uint32_t)config->pcMask & CY_PROT_PPU_FIXED_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + /* ADDR0 is read only. Only configure ATT0 */ + attReg = ((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK) + | (uint32_t)(((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PERI_GR_PPU_SL_ATT0_NS, !(config->secure)) + | _VAL2FLD(PERI_GR_PPU_SL_ATT0_PC_MASK_15_TO_1, config->pcMask) + /* No region size - read only */ + | _VAL2FLD(PERI_GR_PPU_SL_ATT0_PC_MATCH, config->pcMatch); + if ((attReg & CY_PROT_PPU_SL_ATT0_MASK) != attReg) + { + /* Invalid parameter was passed */ + status = CY_PROT_BAD_PARAM; + } + else + { + base->ATT0 = attReg; + status = ((base->ATT0 & CY_PROT_PPU_SL_ATT0_MASK) != attReg) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + } + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnablePpuFixedSlMasterStruct +****************************************************************************//** +* +* \brief Enables the Master PPU SL structure. +* +* This is a PPU SL master struct enable function. The PPU SL protection +* settings will take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Master PU struct was enabled +* CY_PROT_FAILURE | The Master PU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnablePpuFixedSlMasterStruct(PERI_GR_PPU_SL_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT1 |= _VAL2FLD(PERI_GR_PPU_SL_ATT1_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_GR_PPU_SL_ATT1_ENABLED, base->ATT1) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisablePpuFixedSlMasterStruct +****************************************************************************//** +* +* \brief Disables the Master PPU SL structure. +* +* This is a PPU SL master struct disable function. The PPU SL protection +* settings will seize to take effect after successful completion of this +* function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Master PU struct was disabled +* CY_PROT_FAILURE | The Master PU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisablePpuFixedSlMasterStruct(PERI_GR_PPU_SL_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT1 &= ~_VAL2FLD(PERI_GR_PPU_SL_ATT1_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_GR_PPU_SL_ATT1_ENABLED, base->ATT1) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnablePpuFixedSlSlaveStruct +****************************************************************************//** +* +* \brief Enables the Slave PPU SL structure. +* +* This is a PPU SL slave struct enable function. The PPU SL protection +* settings will take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Slave PU struct was enabled +* CY_PROT_FAILURE | The Slave PU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnablePpuFixedSlSlaveStruct(PERI_GR_PPU_SL_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT0 |= _VAL2FLD(PERI_GR_PPU_SL_ATT0_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_GR_PPU_SL_ATT0_ENABLED, base->ATT0) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisablePpuFixedSlSlaveStruct +****************************************************************************//** +* +* \brief Disables the Slave PPU SL structure. +* +* This is a PPU SL slave struct disable function. The PPU SL protection +* settings will seize to take effect after successful completion of this +* function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Slave PU struct was disabled +* CY_PROT_FAILURE | The Slave PU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisablePpuFixedSlSlaveStruct(PERI_GR_PPU_SL_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT0 &= ~_VAL2FLD(PERI_GR_PPU_SL_ATT0_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_GR_PPU_SL_ATT0_ENABLED, base->ATT0) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigPpuFixedRgMasterStruct +****************************************************************************//** +* +* \brief Configures a Fixed Peripheral Region Protection Unit (PPU RG) master +* protection struct with its protection attributes. +* +* This function configures the master struct governing the corresponding slave +* struct pair. It is a mechanism to protect the slave PPU RG struct. Since +* the memory location of the slave struct is known, the address, regionSize and +* subregions of the configuration struct are not applicable. +* +* Note that only the user/privileged write permissions are configurable. The +* read and execute permissions are read-only and cannot be configured. +* +* \param base +* The register base address of the protection struct being configured. +* +* \param config +* Initialization structure with all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | PPU RG master struct was successfully configured +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedRgMasterStruct(PERI_GR_PPU_RG_Type* base, const cy_stc_ppu_rg_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t attReg; + + if(((uint32_t)config->pcMask & CY_PROT_PPU_FIXED_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + /* ADDR1 is read only. Only configure ATT1 */ + attReg = ((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK) + | (uint32_t)(((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PERI_GR_PPU_RG_ATT1_NS, !(config->secure)) + | _VAL2FLD(PERI_GR_PPU_RG_ATT1_PC_MASK_15_TO_1, config->pcMask) + /* No region size - read only for master structs */ + | _VAL2FLD(PERI_GR_PPU_RG_ATT1_PC_MATCH, config->pcMatch); + if ((attReg & CY_PROT_PPU_RG_ATT1_MASK) != attReg) + { + /* Invalid parameter was passed */ + status = CY_PROT_BAD_PARAM; + } + else + { + base->ATT1 = attReg; + status = ((base->ATT1 & CY_PROT_PPU_RG_ATT1_MASK) != attReg) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + } + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_ConfigPpuFixedRgSlaveStruct +****************************************************************************//** +* +* \brief Configures a Fixed Peripheral Region Protection Unit (PPU RG) slave +* protection struct with its protection attributes. +* +* This function configures the slave struct of a PPU RG pair, which can +* protect specified regions of peripheral instances. For example, individual +* DW channel structs, SMPU structs, and IPC structs etc. +* +* Each fixed PPU RG is devoted to a defined peripheral region. Hence the address, +* regionSize and subregions of the configuration struct are not applicable. +* +* Note that the user/privileged execute accesses are read-only and are always +* enabled. +* +* \param base +* The register base address of the protection structure being configured. +* +* \param config +* Initialization structure with all the protection attributes. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | PPU RG slave struct was successfully configured +* CY_PROT_FAILURE | The resource is locked +* CY_PROT_BAD_PARAM | An incorrect/invalid parameter was passed +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedRgSlaveStruct(PERI_GR_PPU_RG_Type* base, const cy_stc_ppu_rg_cfg_t* config) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + uint32_t attReg; + + if(((uint32_t)config->pcMask & CY_PROT_PPU_FIXED_PC_LIMIT_MASK) != 0UL) + { + /* PC mask out of range - not supported in device */ + status = CY_PROT_BAD_PARAM; + } + else + { + /* ADDR0 is read only. Only configure ATT0 */ + attReg = ((uint32_t)config->userPermission & CY_PROT_ATT_PERMISSION_MASK) + | (uint32_t)(((uint32_t)config->privPermission & CY_PROT_ATT_PERMISSION_MASK) << CY_PROT_ATT_PRIV_PERMISSION_SHIFT) + | _VAL2FLD(PERI_GR_PPU_RG_ATT0_NS, !(config->secure)) + | _VAL2FLD(PERI_GR_PPU_RG_ATT0_PC_MASK_15_TO_1, config->pcMask) + /* No region size - read only */ + | _VAL2FLD(PERI_GR_PPU_RG_ATT0_PC_MATCH, config->pcMatch); + if ((attReg & CY_PROT_PPU_RG_ATT0_MASK) != attReg) + { + /* Invalid parameter was passed */ + status = CY_PROT_BAD_PARAM; + } + else + { + base->ATT0 = attReg; + status = ((base->ATT0 & CY_PROT_PPU_RG_ATT0_MASK) != attReg) ? CY_PROT_FAILURE : CY_PROT_SUCCESS; + } + } + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnablePpuFixedRgMasterStruct +****************************************************************************//** +* +* \brief Enables the Master PPU RG structure. +* +* This is a PPU RG master struct enable function. The PPU RG protection +* settings will take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Master PU struct was enabled +* CY_PROT_FAILURE | The Master PU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnablePpuFixedRgMasterStruct(PERI_GR_PPU_RG_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT1 |= _VAL2FLD(PERI_GR_PPU_RG_ATT1_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_GR_PPU_RG_ATT1_ENABLED, base->ATT1) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisablePpuFixedRgMasterStruct +****************************************************************************//** +* +* \brief Disables the Master PPU RG structure. +* +* This is a PPU RG master struct disable function. The PPU RG protection +* settings will seize to take effect after successful completion of this +* function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Master PU struct was disabled +* CY_PROT_FAILURE | The Master PU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisablePpuFixedRgMasterStruct(PERI_GR_PPU_RG_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT1 &= ~_VAL2FLD(PERI_GR_PPU_RG_ATT1_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_GR_PPU_RG_ATT1_ENABLED, base->ATT1) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_EnablePpuFixedRgSlaveStruct +****************************************************************************//** +* +* \brief Enables the Slave PPU RG structure. +* +* This is a PPU RG slave struct enable function. The PPU RG protection +* settings will take effect after successful completion of this function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Slave PU struct was enabled +* CY_PROT_FAILURE | The Slave PU struct is disabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_EnablePpuFixedRgSlaveStruct(PERI_GR_PPU_RG_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT0 |= _VAL2FLD(PERI_GR_PPU_RG_ATT0_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_GR_PPU_RG_ATT0_ENABLED, base->ATT0) != CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +/******************************************************************************* +* Function Name: Cy_Prot_DisablePpuFixedRgSlaveStruct +****************************************************************************//** +* +* \brief Disables the Slave PPU RG structure. +* +* This is a PPU RG slave struct disable function. The PPU RG protection +* settings will seize to take effect after successful completion of this +* function call. +* +* \param base +* The base address for the protection unit structure being configured. +* +* \return +* Status of the function call. +* +* Status | Description +* ------------ | ----------- +* CY_PROT_SUCCESS | The Slave PU struct was disabled +* CY_PROT_FAILURE | The Slave PU struct is enabled and possibly locked +* +*******************************************************************************/ +cy_en_prot_status_t Cy_Prot_DisablePpuFixedRgSlaveStruct(PERI_GR_PPU_RG_Type* base) +{ + cy_en_prot_status_t status = CY_PROT_SUCCESS; + + base->ATT0 &= ~_VAL2FLD(PERI_GR_PPU_RG_ATT0_ENABLED, CY_PROT_STRUCT_ENABLE); + status = (_FLD2VAL(PERI_GR_PPU_RG_ATT0_ENABLED, base->ATT0) == CY_PROT_STRUCT_ENABLE) ? + CY_PROT_FAILURE : CY_PROT_SUCCESS; + + return status; +} + + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/prot/cy_prot.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/prot/cy_prot.h new file mode 100644 index 0000000000..f4001797f1 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/prot/cy_prot.h @@ -0,0 +1,558 @@ +/***************************************************************************//** +* \file cy_prot.h +* \version 1.0 +* +* \brief +* Provides an API declaration of the Protection Unit driver +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_prot Protection Unit (Prot) +* \{ +* +* The Protection Unit driver provides an API to configure the Memory Protection +* Units (MPU), Shared Memory Protection Units (SMPU), and Peripheral Protection +* Units (PPU). These are separate from the ARM Core MPUs and provide additional +* mechanisms for securing resource accesses. The Protection units address the +* following concerns in an embedded design: +* - Security requirements. This includes the prevention of malicious attacks +* to access secure memory or peripherals. +* - Safety requirements. This includes detection of accidental (non-malicious) +* SW errors and random HW errors. It is important to enable failure analysis +* to investigate the root cause of a safety violation. +* +* \n +* Memory Protection +* +* Memory protection is provided by MPUs and SMPUs and allows control of +* memory accesses by bus masters (e.g., CM0+, CM4, Crypto): +* - MPUs are used to distinguish user and privileged accesses from a single bus +* master such as task switching in an OS/kernel. For ARM core MPUs, the +* assigned Cypress MPUs for those cores provide additional functionality +* such as protection contexts (PC) and security attributes. +* - SMPUs are used to distinguish memory accesses between bus masters. This is +* achieved by using protection contexts and secure-/non-secure attributes. +* +* \n +* Peripheral Protection +* +* Peripheral protection is provided by PPUs and allows control of peripheral +* register accesses by bus masters. Four types of PPUs are available. +* - Programmable (PROG) PPUs are used to protect any peripheral memory region +* in a device from invalid bus master accesses. It is the most versatile +* type of peripheral protection unit. +* - Fixed Group (GR) PPUs are used to protect an entire peripheral MMIO group +* from invalid bus master accesses. The MMIO grouping information and which +* resource belongs to which group is device specific and can be obtained +* from the device technical reference manual (TRM). +* - Fixed Region (RG) PPUs are used to protect an entire peripheral slave +* instance from invalid bus master accesses. For example, TCPWM0, TCPWM1, +* SCB0, and SCB1, etc. +* - Fixed Slave (SL) PPUs are used to protect specified regions of peripheral +* instances. For example, individual DW channel structs, SMPU structs, and +* IPC structs, etc. +* +* \n +* Driver Usage +* +* Each protection unit is distinguished by its type (e.g. +* PROT_MPU_MPU_STRUCT_Type). The list of supported protection units can be +* obtained from the device header file. Choose a protection unit of interest, +* and call its corresponding Cy_Prot_ConfigStruct() function with its +* software protection unit configuration structure populated. Then enable the +* protection unit by calling the Cy_Prot_EnableStruct() function. +* +* Each bus master can be configured to allow/disallow certain types of accesses +* by calling the Cy_Prot_ConfigBusMaster() function. For example, CM0+ core +* is a bus master. By configuring it to allow only protection contexts (PC) +* 2 and 3, the bus master will be able to set its protection context only to +* 2 or 3. In a thread execution, the CM0+ core can set its protection context +* to 2 by calling Cy_Prot_SetActivePC() and access all regions of memory that +* allow PC=2. A fault will be triggered if a resource is protected with different +* protection settings. +* +* \section group_prot_configuration Configuration Considerations +* +* With the exception of MPUs, Protection structures are implemented in +* hardware as master and slave pairs. The master protection structure protects +* the slave protection structure. The slave protection structure protects the +* memory region that is to be protected. +* For example, a slave protection structure is configured to allow protection +* contexts 3 and 4 to access a set of peripheral registers. The corresponding +* master protection structure can then be used to protect the slave structure +* configuration and allow only protection context 1 to make modifications. +* Any bus master attempting to change the slave protection structure must then +* have a protection context 1. Otherwise an access fault will occur. +* +* \section group_prot_more_information More Information +* +* Refer to Technical Reference Manual (TRM) and the device datasheet. +* +* \section group_prot_MISRA MISRA-C Compliance] +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA ruleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
11.5RDangerous pointer cast results in loss of volatile qualification.Required to access bus master control register
+* +* \section group_prot_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_prot_macro Macro +* \defgroup group_prot_functions Functions +* \{ +* \defgroup group_prot_functions_busmaster Bus Master and PC Functions +* \defgroup group_prot_functions_mpu MPU Functions +* \defgroup group_prot_functions_smpu SMPU Functions +* \defgroup group_prot_functions_ppu_prog PPU Programmable (PROG) Functions +* \defgroup group_prot_functions_ppu_gr PPU Group (GR) Functions +* \defgroup group_prot_functions_ppu_sl PPU Slave (SL) Functions +* \defgroup group_prot_functions_ppu_rg PPU Region (RG) Functions +* \} +* \defgroup group_prot_data_structures Data structures +* \defgroup group_prot_enums Enumerated types +*/ + +#if !defined(__CY_PROT_H__) +#define __CY_PROT_H__ + +#include +#include "syslib/cy_syslib.h" +#include "cy_device_headers.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** \addtogroup group_prot_macro +* \{ +*/ + +/** Driver major version */ +#define CY_PROT_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_PROT_DRV_VERSION_MINOR 0 + +/** Prot driver ID */ +#define CY_PROT_ID CY_PDL_DRV_ID(0x30u) + +/** \} group_prot_macro */ + +/** +* \addtogroup group_prot_enums +* \{ +*/ + +/** +* Prot Driver error codes +*/ +typedef enum +{ + CY_PROT_SUCCESS = 0x00u, /**< Returned successful */ + CY_PROT_BAD_PARAM = CY_PROT_ID | CY_PDL_STATUS_ERROR | 0x01u, /**< Bad parameter was passed */ + CY_PROT_FAILURE = CY_PROT_ID | CY_PDL_STATUS_ERROR | 0x03u /**< The resource is locked */ +} cy_en_prot_status_t; + +/** +* User/Privileged permission +*/ +typedef enum +{ + CY_PROT_PERM_DISABLED = 0x00u, /**< Read, Write and Execute disabled */ + CY_PROT_PERM_R = 0x01u, /**< Read enabled */ + CY_PROT_PERM_W = 0x02u, /**< Write enabled */ + CY_PROT_PERM_RW = 0x03u, /**< Read and Write enabled */ + CY_PROT_PERM_X = 0x04u, /**< Execute enabled */ + CY_PROT_PERM_RX = 0x05u, /**< Read and Execute enabled */ + CY_PROT_PERM_WX = 0x06u, /**< Write and Execute enabled */ + CY_PROT_PERM_RWX = 0x07u /**< Read, Write and Execute enabled */ +}cy_en_prot_perm_t; + +/** +* Memory region size +*/ +typedef enum +{ + CY_PROT_SIZE_256B = 7u, /**< 256 bytes */ + CY_PROT_SIZE_512B = 8u, /**< 512 bytes */ + CY_PROT_SIZE_1KB = 9u, /**< 1 Kilobyte */ + CY_PROT_SIZE_2KB = 10u, /**< 2 Kilobytes */ + CY_PROT_SIZE_4KB = 11u, /**< 4 Kilobytes */ + CY_PROT_SIZE_8KB = 12u, /**< 8 Kilobytes */ + CY_PROT_SIZE_16KB = 13u, /**< 16 Kilobytes */ + CY_PROT_SIZE_32KB = 14u, /**< 32 Kilobytes */ + CY_PROT_SIZE_64KB = 15u, /**< 64 Kilobytes */ + CY_PROT_SIZE_128KB = 16u, /**< 128 Kilobytes */ + CY_PROT_SIZE_256KB = 17u, /**< 256 Kilobytes */ + CY_PROT_SIZE_512KB = 18u, /**< 512 Kilobytes */ + CY_PROT_SIZE_1MB = 19u, /**< 1 Megabyte */ + CY_PROT_SIZE_2MB = 20u, /**< 2 Megabytes */ + CY_PROT_SIZE_4MB = 21u, /**< 4 Megabytes */ + CY_PROT_SIZE_8MB = 22u, /**< 8 Megabytes */ + CY_PROT_SIZE_16MB = 23u, /**< 16 Megabytes */ + CY_PROT_SIZE_32MB = 24u, /**< 32 Megabytes */ + CY_PROT_SIZE_64MB = 25u, /**< 64 Megabytes */ + CY_PROT_SIZE_128MB = 26u, /**< 128 Megabytes */ + CY_PROT_SIZE_256MB = 27u, /**< 256 Megabytes */ + CY_PROT_SIZE_512MB = 28u, /**< 512 Megabytes */ + CY_PROT_SIZE_1GB = 29u, /**< 1 Gigabyte */ + CY_PROT_SIZE_2GB = 30u, /**< 2 Gigabytes */ + CY_PROT_SIZE_4GB = 31u /**< 4 Gigabytes */ +}cy_en_prot_size_t; + +/** +* Protection Context (PC) +*/ +enum cy_en_prot_pc_t +{ + CY_PROT_PC1 = 1u, /**< PC = 1 */ + CY_PROT_PC2 = 2u, /**< PC = 2 */ + CY_PROT_PC3 = 3u, /**< PC = 3 */ + CY_PROT_PC4 = 4u, /**< PC = 4 */ + CY_PROT_PC5 = 5u, /**< PC = 5 */ + CY_PROT_PC6 = 6u, /**< PC = 6 */ + CY_PROT_PC7 = 7u, /**< PC = 7 */ + CY_PROT_PC8 = 8u, /**< PC = 8 */ + CY_PROT_PC9 = 9u, /**< PC = 9 */ + CY_PROT_PC10 = 10u, /**< PC = 10 */ + CY_PROT_PC11 = 11u, /**< PC = 11 */ + CY_PROT_PC12 = 12u, /**< PC = 12 */ + CY_PROT_PC13 = 13u, /**< PC = 13 */ + CY_PROT_PC14 = 14u, /**< PC = 14 */ + CY_PROT_PC15 = 15u /**< PC = 15 */ +}; + +/** +* Subregion disable (0-7) +*/ +enum cy_en_prot_subreg_t +{ + CY_PROT_SUBREGION_DIS0 = 0x01u, /**< Disable subregion 0 */ + CY_PROT_SUBREGION_DIS1 = 0x02u, /**< Disable subregion 1 */ + CY_PROT_SUBREGION_DIS2 = 0x04u, /**< Disable subregion 2 */ + CY_PROT_SUBREGION_DIS3 = 0x08u, /**< Disable subregion 3 */ + CY_PROT_SUBREGION_DIS4 = 0x10u, /**< Disable subregion 4 */ + CY_PROT_SUBREGION_DIS5 = 0x20u, /**< Disable subregion 5 */ + CY_PROT_SUBREGION_DIS6 = 0x40u, /**< Disable subregion 6 */ + CY_PROT_SUBREGION_DIS7 = 0x80u /**< Disable subregion 7 */ +}; + +/** +* Protection context mask (PC_MASK) +*/ +enum cy_en_prot_pcmask_t +{ + CY_PROT_PCMASK1 = 0x0001u, /**< Mask to allow PC = 1 */ + CY_PROT_PCMASK2 = 0x0002u, /**< Mask to allow PC = 2 */ + CY_PROT_PCMASK3 = 0x0004u, /**< Mask to allow PC = 3 */ + CY_PROT_PCMASK4 = 0x0008u, /**< Mask to allow PC = 4 */ + CY_PROT_PCMASK5 = 0x0010u, /**< Mask to allow PC = 5 */ + CY_PROT_PCMASK6 = 0x0020u, /**< Mask to allow PC = 6 */ + CY_PROT_PCMASK7 = 0x0040u, /**< Mask to allow PC = 7 */ + CY_PROT_PCMASK8 = 0x0080u, /**< Mask to allow PC = 8 */ + CY_PROT_PCMASK9 = 0x0100u, /**< Mask to allow PC = 9 */ + CY_PROT_PCMASK10 = 0x0200u, /**< Mask to allow PC = 10 */ + CY_PROT_PCMASK11 = 0x0400u, /**< Mask to allow PC = 11 */ + CY_PROT_PCMASK12 = 0x0800u, /**< Mask to allow PC = 12 */ + CY_PROT_PCMASK13 = 0x1000u, /**< Mask to allow PC = 13 */ + CY_PROT_PCMASK14 = 0x2000u, /**< Mask to allow PC = 14 */ + CY_PROT_PCMASK15 = 0x4000u /**< Mask to allow PC = 15 */ +}; + +/** \} group_prot_enums */ + + +/*************************************** +* Constants +***************************************/ + +/** \cond INTERNAL */ + +/* General Masks and shifts */ +#define CY_PROT_MSX_CTL_SHIFT (0x02UL) /**< Shift for MSx_CTL register */ +#define CY_PROT_STRUCT_ENABLE (0x01UL) /**< Enable protection unit struct */ +#define CY_PROT_ADDR_SHIFT (8UL) /**< Address shift for MPU, SMPU and PROG PPU structs */ + +/* Permission masks and shifts */ +#define CY_PROT_ATT_PERMISSION_MASK (0x07UL) /**< Protection Unit attribute permission mask */ +#define CY_PROT_ATT_USER_PERMISSION_SHIFT (0x00UL) /**< Protection Unit user attribute permission shift */ +#define CY_PROT_ATT_PRIV_PERMISSION_SHIFT (0x03UL) /**< Protection Unit priliged attribute permission shift */ + +/* Protection Context limit masks */ +#define CY_PROT_MPU_PC_LIMIT_MASK (0xFFFFFFFFUL << CPUSS_PROT_SMPU_MS0_PC_NR_MINUS1) +#define CY_PROT_SMPU_PC_LIMIT_MASK (0xFFFFFFFFUL << CPUSS_SMPU_STRUCT_PC_NR_MINUS1) +#define CY_PROT_PPU_PROG_PC_LIMIT_MASK (0xFFFFFFFFUL << PERI_PPU_PROG_STRUCT_PC_NR_MINUS1) +#define CY_PROT_PPU_FIXED_PC_LIMIT_MASK (0xFFFFFFFFUL << PERI_PPU_FIXED_STRUCT_PC_NR_MINUS1) + +/* Parameter validation masks to check for read-only values */ +#define CY_PROT_SMPU_ATT0_MASK ((uint32_t)~(PROT_SMPU_SMPU_STRUCT_ATT0_PC_MASK_0_Msk)) +#define CY_PROT_SMPU_ATT1_MASK ((uint32_t)~(PROT_SMPU_SMPU_STRUCT_ATT1_UR_Msk \ + | PROT_SMPU_SMPU_STRUCT_ATT1_UX_Msk \ + | PROT_SMPU_SMPU_STRUCT_ATT1_PR_Msk \ + | PROT_SMPU_SMPU_STRUCT_ATT1_PX_Msk \ + | PROT_SMPU_SMPU_STRUCT_ATT1_PC_MASK_0_Msk \ + | PROT_SMPU_SMPU_STRUCT_ATT1_REGION_SIZE_Msk \ + )) +#define CY_PROT_PPU_PROG_ATT0_MASK ((uint32_t)~(PERI_PPU_GR_ATT1_UX_Msk \ + | PERI_PPU_GR_ATT1_PX_Msk \ + |PERI_PPU_PR_ATT0_PC_MASK_0_Msk \ + )) +#define CY_PROT_PPU_PROG_ATT1_MASK ((uint32_t)~(PERI_PPU_PR_ATT1_UR_Msk \ + | PERI_PPU_PR_ATT1_UX_Msk \ + | PERI_PPU_PR_ATT1_PR_Msk \ + | PERI_PPU_PR_ATT1_PX_Msk \ + | PERI_PPU_PR_ATT1_PC_MASK_0_Msk \ + | PERI_PPU_PR_ATT1_REGION_SIZE_Msk \ + )) +#define CY_PROT_PPU_GR_ATT0_MASK ((uint32_t)~(PERI_PPU_GR_ATT0_UX_Msk \ + | PERI_PPU_GR_ATT0_PX_Msk \ + | PERI_PPU_GR_ATT0_PC_MASK_0_Msk \ + | PERI_PPU_GR_ATT0_REGION_SIZE_Msk \ + )) +#define CY_PROT_PPU_GR_ATT1_MASK ((uint32_t)~(PERI_PPU_GR_ATT1_UR_Msk \ + | PERI_PPU_GR_ATT1_UX_Msk \ + | PERI_PPU_GR_ATT1_PR_Msk \ + | PERI_PPU_GR_ATT1_PX_Msk \ + | PERI_PPU_GR_ATT1_PC_MASK_0_Msk \ + | PERI_PPU_GR_ATT1_REGION_SIZE_Msk \ + )) +#define CY_PROT_PPU_SL_ATT0_MASK ((uint32_t)~(PERI_GR_PPU_SL_ATT0_UX_Msk \ + | PERI_GR_PPU_SL_ATT0_PX_Msk \ + | PERI_GR_PPU_SL_ATT0_PC_MASK_0_Msk \ + | PERI_GR_PPU_SL_ATT0_REGION_SIZE_Msk \ + )) +#define CY_PROT_PPU_SL_ATT1_MASK ((uint32_t)~(PERI_GR_PPU_SL_ATT1_UR_Msk \ + | PERI_GR_PPU_SL_ATT1_UX_Msk \ + | PERI_GR_PPU_SL_ATT1_PR_Msk \ + | PERI_GR_PPU_SL_ATT1_PX_Msk \ + | PERI_GR_PPU_SL_ATT1_PC_MASK_0_Msk \ + | PERI_GR_PPU_SL_ATT1_REGION_SIZE_Msk \ + )) +#define CY_PROT_PPU_RG_ATT0_MASK ((uint32_t)~(PERI_GR_PPU_RG_ATT0_UX_Msk \ + | PERI_GR_PPU_RG_ATT0_PX_Msk \ + | PERI_GR_PPU_RG_ATT0_PC_MASK_0_Msk \ + | PERI_GR_PPU_RG_ATT0_REGION_SIZE_Msk \ + )) +#define CY_PROT_PPU_RG_ATT1_MASK ((uint32_t)~(PERI_GR_PPU_RG_ATT1_UR_Msk \ + | PERI_GR_PPU_RG_ATT1_UX_Msk \ + | PERI_GR_PPU_RG_ATT1_PR_Msk \ + | PERI_GR_PPU_RG_ATT1_PX_Msk \ + | PERI_GR_PPU_RG_ATT1_PC_MASK_0_Msk \ + | PERI_GR_PPU_RG_ATT1_REGION_SIZE_Msk \ + )) + +/** \endcond */ + + +/*************************************** +* Configuration Structures +***************************************/ + +/** +* \addtogroup group_prot_data_structures +* \{ +*/ + +/** Configuration structure for MPU Struct initialization */ +typedef struct +{ + uint32_t* address; /**< Base address of the memory region */ + cy_en_prot_size_t regionSize; /**< Size of the memory region */ + uint8_t subregions; /**< Mask of the 8 subregions to disable */ + cy_en_prot_perm_t userPermission; /**< User permissions for the region */ + cy_en_prot_perm_t privPermission; /**< Privileged permissions for the region */ + bool secure; /**< Non Secure = 0, Secure = 1 */ +} cy_stc_mpu_cfg_t; + +/** Configuration structure for SMPU struct initialization */ +typedef struct +{ + uint32_t* address; /**< Base address of the memory region (Only applicable to slave) */ + cy_en_prot_size_t regionSize; /**< Size of the memory region (Only applicable to slave) */ + uint8_t subregions; /**< Mask of the 8 subregions to disable (Only applicable to slave) */ + cy_en_prot_perm_t userPermission; /**< User permissions for the region */ + cy_en_prot_perm_t privPermission; /**< Privileged permissions for the region */ + bool secure; /**< Non Secure = 0, Secure = 1 */ + bool pcMatch; /**< Access evaluation = 0, Matching = 1 */ + uint16_t pcMask; /**< Mask of allowed protection context(s) */ +} cy_stc_smpu_cfg_t; + +/** Configuration structure for Programmable (PROG) PPU (PPU_PR) struct initialization */ +typedef struct +{ + uint32_t* address; /**< Base address of the memory region (Only applicable to slave) */ + cy_en_prot_size_t regionSize; /**< Size of the memory region (Only applicable to slave) */ + uint8_t subregions; /**< Mask of the 8 subregions to disable (Only applicable to slave) */ + cy_en_prot_perm_t userPermission; /**< User permissions for the region */ + cy_en_prot_perm_t privPermission; /**< Privileged permissions for the region */ + bool secure; /**< Non Secure = 0, Secure = 1 */ + bool pcMatch; /**< Access evaluation = 0, Matching = 1 */ + uint16_t pcMask; /**< Mask of allowed protection context(s) */ +} cy_stc_ppu_prog_cfg_t; + +/** Configuration structure for Fixed Group (GR) PPU (PPU_GR) struct initialization */ +typedef struct +{ + cy_en_prot_perm_t userPermission; /**< User permissions for the region */ + cy_en_prot_perm_t privPermission; /**< Privileged permissions for the region */ + bool secure; /**< Non Secure = 0, Secure = 1 */ + bool pcMatch; /**< Access evaluation = 0, Matching = 1 */ + uint16_t pcMask; /**< Mask of allowed protection context(s) */ +} cy_stc_ppu_gr_cfg_t; + +/** Configuration structure for Fixed Slave (SL) PPU (PPU_SL) struct initialization */ +typedef struct +{ + cy_en_prot_perm_t userPermission; /**< User permissions for the region */ + cy_en_prot_perm_t privPermission; /**< Privileged permissions for the region */ + bool secure; /**< Non Secure = 0, Secure = 1 */ + bool pcMatch; /**< Access evaluation = 0, Matching = 1 */ + uint16_t pcMask; /**< Mask of allowed protection context(s) */ +} cy_stc_ppu_sl_cfg_t; + +/** Configuration structure for Fixed Region (RG) PPU (PPU_RG) struct initialization */ +typedef struct +{ + cy_en_prot_perm_t userPermission; /**< User permissions for the region */ + cy_en_prot_perm_t privPermission; /**< Privileged permissions for the region */ + bool secure; /**< Non Secure = 0, Secure = 1 */ + bool pcMatch; /**< Access evaluation = 0, Matching = 1 */ + uint16_t pcMask; /**< Mask of allowed protection context(s) */ +} cy_stc_ppu_rg_cfg_t; + +/** \} group_prot_data_structures */ + + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_prot_functions +* \{ +*/ + +/** +* \addtogroup group_prot_functions_busmaster +* \{ +*/ + +cy_en_prot_status_t Cy_Prot_ConfigBusMaster(en_prot_master_t busMaster, bool privileged, bool secure, uint32_t pcMask); +cy_en_prot_status_t Cy_Prot_SetActivePC(en_prot_master_t busMaster, uint32_t pc); +uint32_t Cy_Prot_GetActivePC(en_prot_master_t busMaster); + +/** \} group_prot_functions_busmaster */ + +/** +* \addtogroup group_prot_functions_mpu +* \{ +*/ + +cy_en_prot_status_t Cy_Prot_ConfigMpuStruct(PROT_MPU_MPU_STRUCT_Type* base, const cy_stc_mpu_cfg_t* config); +cy_en_prot_status_t Cy_Prot_EnableMpuStruct(PROT_MPU_MPU_STRUCT_Type* base); +cy_en_prot_status_t Cy_Prot_DisableMpuStruct(PROT_MPU_MPU_STRUCT_Type* base); + +/** \} group_prot_functions_mpu */ + +/** +* \addtogroup group_prot_functions_smpu +* \{ +*/ + +cy_en_prot_status_t Cy_Prot_ConfigSmpuMasterStruct(PROT_SMPU_SMPU_STRUCT_Type* base, const cy_stc_smpu_cfg_t* config); +cy_en_prot_status_t Cy_Prot_ConfigSmpuSlaveStruct(PROT_SMPU_SMPU_STRUCT_Type* base, const cy_stc_smpu_cfg_t* config); +cy_en_prot_status_t Cy_Prot_EnableSmpuMasterStruct(PROT_SMPU_SMPU_STRUCT_Type* base); +cy_en_prot_status_t Cy_Prot_DisableSmpuMasterStruct(PROT_SMPU_SMPU_STRUCT_Type* base); +cy_en_prot_status_t Cy_Prot_EnableSmpuSlaveStruct(PROT_SMPU_SMPU_STRUCT_Type* base); +cy_en_prot_status_t Cy_Prot_DisableSmpuSlaveStruct(PROT_SMPU_SMPU_STRUCT_Type* base); + +/** \} group_prot_functions_smpu */ + +/** +* \addtogroup group_prot_functions_ppu_prog +* \{ +*/ + +cy_en_prot_status_t Cy_Prot_ConfigPpuProgMasterStruct(PERI_PPU_PR_Type* base, const cy_stc_ppu_prog_cfg_t* config); +cy_en_prot_status_t Cy_Prot_ConfigPpuProgSlaveStruct(PERI_PPU_PR_Type* base, const cy_stc_ppu_prog_cfg_t* config); +cy_en_prot_status_t Cy_Prot_EnablePpuProgMasterStruct(PERI_PPU_PR_Type* base); +cy_en_prot_status_t Cy_Prot_DisablePpuProgMasterStruct(PERI_PPU_PR_Type* base); +cy_en_prot_status_t Cy_Prot_EnablePpuProgSlaveStruct(PERI_PPU_PR_Type* base); +cy_en_prot_status_t Cy_Prot_DisablePpuProgSlaveStruct(PERI_PPU_PR_Type* base); + +/** \} group_prot_functions_ppu_prog */ + +/** +* \addtogroup group_prot_functions_ppu_gr +* \{ +*/ + +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedGrMasterStruct(PERI_PPU_GR_Type* base, const cy_stc_ppu_gr_cfg_t* config); +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedGrSlaveStruct(PERI_PPU_GR_Type* base, const cy_stc_ppu_gr_cfg_t* config); +cy_en_prot_status_t Cy_Prot_EnablePpuFixedGrMasterStruct(PERI_PPU_GR_Type* base); +cy_en_prot_status_t Cy_Prot_DisablePpuFixedGrMasterStruct(PERI_PPU_GR_Type* base); +cy_en_prot_status_t Cy_Prot_EnablePpuFixedGrSlaveStruct(PERI_PPU_GR_Type* base); +cy_en_prot_status_t Cy_Prot_DisablePpuFixedGrSlaveStruct(PERI_PPU_GR_Type* base); + +/** \} group_prot_functions_ppu_gr */ + +/** +* \addtogroup group_prot_functions_ppu_sl +* \{ +*/ + +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedSlMasterStruct(PERI_GR_PPU_SL_Type* base, const cy_stc_ppu_sl_cfg_t* config); +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedSlSlaveStruct(PERI_GR_PPU_SL_Type* base, const cy_stc_ppu_sl_cfg_t* config); +cy_en_prot_status_t Cy_Prot_EnablePpuFixedSlMasterStruct(PERI_GR_PPU_SL_Type* base); +cy_en_prot_status_t Cy_Prot_DisablePpuFixedSlMasterStruct(PERI_GR_PPU_SL_Type* base); +cy_en_prot_status_t Cy_Prot_EnablePpuFixedSlSlaveStruct(PERI_GR_PPU_SL_Type* base); +cy_en_prot_status_t Cy_Prot_DisablePpuFixedSlSlaveStruct(PERI_GR_PPU_SL_Type* base); + +/** \} group_prot_functions_ppu_sl */ + +/** +* \addtogroup group_prot_functions_ppu_rg +* \{ +*/ +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedRgMasterStruct(PERI_GR_PPU_RG_Type* base, const cy_stc_ppu_rg_cfg_t* config); +cy_en_prot_status_t Cy_Prot_ConfigPpuFixedRgSlaveStruct(PERI_GR_PPU_RG_Type* base, const cy_stc_ppu_rg_cfg_t* config); +cy_en_prot_status_t Cy_Prot_EnablePpuFixedRgMasterStruct(PERI_GR_PPU_RG_Type* base); +cy_en_prot_status_t Cy_Prot_DisablePpuFixedRgMasterStruct(PERI_GR_PPU_RG_Type* base); +cy_en_prot_status_t Cy_Prot_EnablePpuFixedRgSlaveStruct(PERI_GR_PPU_RG_Type* base); +cy_en_prot_status_t Cy_Prot_DisablePpuFixedRgSlaveStruct(PERI_GR_PPU_RG_Type* base); + +/** \} group_prot_functions_ppu_rg */ + +/** \} group_prot_functions */ + +/** \} group_prot */ + +#if defined(__cplusplus) +} +#endif + +#endif /* CY_PROT_H */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_common.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_common.c new file mode 100644 index 0000000000..e102bd01ef --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_common.c @@ -0,0 +1,412 @@ +/***************************************************************************//** +* \file cy_scb_common.c +* \version 1.0 +* +* Provides common API implementation of the SCB driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_scb_common.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Function Name: Cy_SCB_ReadArrayNoCheck +****************************************************************************//** +* +* Reads an array of data out of the SCB receive FIFO without checking if the +* receive FIFO has enough data elements. +* Before calling this function, make sure that the receive FIFO has enough data +* elements to be read. +* +* \param base +* The pointer to the SCB instance. +* +* \param rxBuf +* The pointer to location to place data read from the receive FIFO. +* The size of the data element defined by the configured data width. +* +* \param size +* The number of data elements read from the receive FIFO. +* +*******************************************************************************/ +void Cy_SCB_ReadArrayNoCheck(CySCB_Type const *base, void *rxBuf, uint32_t size) +{ + uint32_t idx; + + if (Cy_SCB_IsRxDataWidthByte(base)) + { + uint8_t *buf = (uint8_t *) rxBuf; + + /* Get data available in RX FIFO */ + for (idx = 0UL; idx < size; ++idx) + { + buf[idx] = (uint8_t) Cy_SCB_ReadRxFifo(base); + } + } + else + { + uint16_t *buf = (uint16_t *) rxBuf; + + /* Get data available in RX FIFO */ + for (idx = 0UL; idx < size; ++idx) + { + buf[idx] = (uint16_t) Cy_SCB_ReadRxFifo(base); + } + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_ReadArray +****************************************************************************//** +* +* Reads an array of data out of the SCB receive FIFO. +* This function does not block, it returns how many data elements were +* read from the receive FIFO. +* +* \param base +* The pointer to the SCB instance. +* +* \param rxBuf +* The pointer to location to place data read from receive FIFO. +* The item size is defined by the data type which depends on the configured +* data width. +* +* \param size +* The number of data elements to read from the receive FIFO. +* +* \return +* The number of data elements read from the receive FIFO. +* +*******************************************************************************/ +uint32_t Cy_SCB_ReadArray(CySCB_Type const *base, void *rxBuf, uint32_t size) +{ + /* Get available items in RX FIFO */ + uint32_t numToCopy = Cy_SCB_GetNumInRxFifo(base); + + /* Adjust items which will be read */ + if (numToCopy > size) + { + numToCopy = size; + } + + /* Get data available in RX FIFO */ + Cy_SCB_ReadArrayNoCheck(base, rxBuf, numToCopy); + + return (numToCopy); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_ReadArrayBlocking +****************************************************************************//** +* +* Reads an array of data out of the SCB receive FIFO. +* This function blocks until the number of data elements specified by the +* size has been read from the receive FIFO. +* +* \param base +* The pointer to the SCB instance. +* +* \param rxBuf +* The pointer to location to place data read from receive FIFO. +* The item size is defined by the data type which depends on the configured +* data width. +* +* \param size +* The number of data elements to read from receive FIFO. +* +*******************************************************************************/ +void Cy_SCB_ReadArrayBlocking(CySCB_Type const *base, void *rxBuf, uint32_t size) +{ + uint32_t numCopied; + uint8_t *buf = (uint8_t *) rxBuf; + + /* Get data from RX FIFO. Stop when the requested size is read. */ + while (size > 0UL) + { + numCopied = Cy_SCB_ReadArray(base, (void *) buf, size); + + buf = &buf[(Cy_SCB_IsRxDataWidthByte(base) ? (numCopied) : (2UL * numCopied))]; + size -= numCopied; + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_Write +****************************************************************************//** +* +* Places a single data element in the SCB transmit FIFO. +* This function does not block and returns how many data elements were placed +* in the transmit FIFO. +* +* \param base +* The pointer to the SCB instance. +* +* \param data +* Data to put in the transmit FIFO. +* The item size is defined by the data type which depends on the configured +* data width. +* +* \return +* The number of data elements placed in the transmit FIFO: 0 or 1. +* +*******************************************************************************/ +uint32_t Cy_SCB_Write(CySCB_Type *base, uint32_t data) +{ + uint32_t numCopied = 0UL; + + if (Cy_SCB_GetFifoSize(base) != Cy_SCB_GetNumInTxFifo(base)) + { + Cy_SCB_WriteTxFifo(base, data); + + numCopied = 1UL; + } + + return (numCopied); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_WriteArrayNoCheck +****************************************************************************//** +* +* Places an array of data in the SCB transmit FIFO without checking if the +* transmit FIFO has enough space. +* Before calling this function, make sure that the transmit FIFO has enough +* space to put all requested data elements. +* +* \param base +* The pointer to the SCB instance. +* +* \param txBuf +* The pointer to data to place in the transmit FIFO. +* The item size is defined by the data type which depends on the configured +* TX data width. +* +* \param size +* The number of data elements to transmit. +* +* \return +* The number of data elements placed in the transmit FIFO. +* +*******************************************************************************/ +void Cy_SCB_WriteArrayNoCheck(CySCB_Type *base, void *txBuf, uint32_t size) +{ + uint32_t idx; + + if (Cy_SCB_IsTxDataWidthByte(base)) + { + uint8_t *buf = (uint8_t *) txBuf; + + /* Put data into TX FIFO */ + for (idx = 0UL; idx < size; ++idx) + { + Cy_SCB_WriteTxFifo(base, (uint32_t) buf[idx]); + } + } + else + { + uint16_t *buf = (uint16_t *) txBuf; + + /* Put data into TX FIFO */ + for (idx = 0UL; idx < size; ++idx) + { + Cy_SCB_WriteTxFifo(base, (uint32_t) buf[idx]); + } + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_WriteArray +****************************************************************************//** +* +* Places an array of data in the SCB transmit FIFO. +* This function does not block and it returns how many data elements were +* placed in the transmit FIFO. +* +* \param base +* The pointer to the SCB instance. +* +* \param txBuf +* The pointer to data to place in the transmit FIFO. +* The item size is defined by the data type which depends on the configured +* TX data width. +* +* \param size +* The number of data elements to transmit. +* +* \return +* The number of data elements placed in the transmit FIFO. +* +*******************************************************************************/ +uint32_t Cy_SCB_WriteArray(CySCB_Type *base, void *txBuf, uint32_t size) +{ + /* Get free entries in TX FIFO */ + uint32_t numToCopy = Cy_SCB_GetFifoSize(base) - Cy_SCB_GetNumInTxFifo(base); + + /* Adjust the data elements to write */ + if (numToCopy > size) + { + numToCopy = size; + } + + Cy_SCB_WriteArrayNoCheck(base, txBuf, numToCopy); + + return (numToCopy); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_WriteArrayBlocking +****************************************************************************//** +* +* Places an array of data in the transmit FIFO. +* This function blocks until the number of data elements specified by the size +* is placed in the transmit FIFO. +* +* \param base +* The pointer to the SCB instance. +* +* \param txBuf +* The pointer to data to place in transmit FIFO. +* The item size is defined by the data type which depends on the configured +* data width. +* +* \param size +* The number of data elements to write into the transmit FIFO. +* +*******************************************************************************/ +void Cy_SCB_WriteArrayBlocking(CySCB_Type *base, void *txBuf, uint32_t size) +{ + uint32_t numCopied; + uint8_t *buf = (uint8_t *) txBuf; + + /* Get data from RX FIFO. Stop when the requested size is read. */ + while (size > 0UL) + { + numCopied = Cy_SCB_WriteArray(base, (void *) buf, size); + + buf = &buf[(Cy_SCB_IsTxDataWidthByte(base) ? (numCopied) : (2UL * numCopied))]; + size -= numCopied; + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_WriteString +****************************************************************************//** +* +* Places a NULL terminated string in the transmit FIFO. +* This function blocks until the entire string is placed in the transmit FIFO. +* +* \param base +* The pointer to the SCB instance. +* +* \param string +* The pointer to the null terminated string array. +* +*******************************************************************************/ +void Cy_SCB_WriteString(CySCB_Type *base, char_t const string[]) +{ + uint32_t idx = 0UL; + uint32_t fifoSize = Cy_SCB_GetFifoSize(base); + + /* Put data from TX FIFO. Stop when string is terminated */ + while (((char_t) 0) != string[idx]) + { + /* Wait for free space to be available */ + while (fifoSize == Cy_SCB_GetNumInTxFifo(base)) + { + } + + Cy_SCB_WriteTxFifo(base, (uint32_t) string[idx]); + ++idx; + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_WriteDefaultArrayNoCheck +****************************************************************************//** +* +* Places a number of the same data elements in the SCB transmit FIFO without +* checking if the transmit FIFO has enough space. The data elements is equal +* to txData parameter. +* Before calling this function make sure that transmit FIFO has enough space +* to put all requested data elements. +* +* \param base +* The pointer to the SCB instance. +* +* \param txData +* The data element to transmit repeatedly. +* +* \param size +* The number of data elements to transmit. +* +*******************************************************************************/ +void Cy_SCB_WriteDefaultArrayNoCheck(CySCB_Type *base, uint32_t txData, uint32_t size) +{ + while (size > 0UL) + { + Cy_SCB_WriteTxFifo(base, txData); + --size; + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_WriteDefaultArray +****************************************************************************//** +* +* Places a number of the same data elements in the SCB transmit FIFO. +* The data elements is equal to the txData parameter. +* +* \param base +* The pointer to the SCB instance. +* +* \param txData +* The data element to transmit repeatedly. +* +* \param size +* The number of data elements to transmit. +* +* \return +* The number of data elements placed in the transmit FIFO. +* +*******************************************************************************/ +uint32_t Cy_SCB_WriteDefaultArray(CySCB_Type *base, uint32_t txData, uint32_t size) +{ + /* Get free entries in TX FIFO */ + uint32_t numToCopy = Cy_SCB_GetFifoSize(base) - Cy_SCB_GetNumInTxFifo(base); + + /* Adjust data elements to write */ + if (numToCopy > size) + { + numToCopy = size; + } + + Cy_SCB_WriteDefaultArrayNoCheck(base, txData, numToCopy); + + return (numToCopy); +} + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_common.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_common.h new file mode 100644 index 0000000000..bbb519c46a --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_common.h @@ -0,0 +1,1617 @@ +/***************************************************************************//** +* \file cy_scb_common.h +* \version 1.0 +* +* Provides common API declarations of the SCB driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_scb Serial Communication Block (SCB) +* \{ +* \defgroup group_scb_common Common +* \defgroup group_scb_ezi2c EZI2C (SCB) +* \defgroup group_scb_i2c I2C (SCB) +* \defgroup group_scb_spi SPI (SCB) +* \defgroup group_scb_uart UART (SCB) +* \} */ + +/** +* \addtogroup group_scb_common +* \{ +* +* Common API for the Serial Communication Block. +* +* This is the common API that provides an interface to the SCB hardware. +* The I2C, SPI, and UART drivers use this common API. +* Most users will use individual drivers and do not need to use the common +* API for the SCB. However, you can use the common SCB API to implement +* a custom driver based on the SCB hardware. +* +* \section group_scb_common_configuration Configuration Considerations +* +* This is not a driver and it does not require configuration. +* +* \section group_scb_common_more_information More Information +* +* Refer to the SCB chapter of the technical reference manual (TRM). +* +* \section group_scb_common_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA ruleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
11.4AA cast should not be performed between a pointer to object type and +* a different pointer to object type.The pointer to the buffer memory is void to allow handling of +* different data types: uint8_t (4-8 bits) or uint16_t (9-16 bits). +*
+* +* \section group_scb_common_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_scb_common_macro Macro +* \defgroup group_scb_common_functions Functions +* \defgroup group_scb_common_data_structures Data Structures +* +*/ + +#if !defined(CY_SCB_COMMON_H) +#define CY_SCB_COMMON_H + +#include +#include +#include +#include "cy_device_headers.h" +#include "syslib/cy_syslib.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_scb_common_functions +* \{ +*/ +__STATIC_INLINE uint32_t Cy_SCB_ReadRxFifo (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SetRxFifoLevel(CySCB_Type *base, uint32_t rxLevel); +__STATIC_INLINE uint32_t Cy_SCB_GetNumInRxFifo(CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_GetRxSrValid (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_ClearRxFifo (CySCB_Type *base); + +__STATIC_INLINE void Cy_SCB_WriteTxFifo (CySCB_Type *base, uint32_t data); +__STATIC_INLINE void Cy_SCB_SetTxFifoLevel(CySCB_Type *base, uint32_t txLevel); +__STATIC_INLINE uint32_t Cy_SCB_GetNumInTxFifo(CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_GetTxSrValid (CySCB_Type const *base); +__STATIC_INLINE bool Cy_SCB_IsTxComplete (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_ClearTxFifo (CySCB_Type *base); + +__STATIC_INLINE void Cy_SCB_SetByteMode(CySCB_Type *base, bool byteMode); + +__STATIC_INLINE uint32_t Cy_SCB_GetInterruptCause(CySCB_Type const *base); + +__STATIC_INLINE uint32_t Cy_SCB_GetRxInterruptStatus(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SetRxInterruptMask (CySCB_Type *base, uint32_t interruptMask); +__STATIC_INLINE uint32_t Cy_SCB_GetRxInterruptMask (CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_GetRxInterruptStatusMasked(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_ClearRxInterrupt (CySCB_Type *base, uint32_t interruptMask); +__STATIC_INLINE void Cy_SCB_SetRxInterrupt (CySCB_Type *base, uint32_t interruptMask); + +__STATIC_INLINE uint32_t Cy_SCB_GetTxInterruptStatus(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SetTxInterruptMask (CySCB_Type *base, uint32_t interruptMask); +__STATIC_INLINE uint32_t Cy_SCB_GetTxInterruptMask (CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_GetTxInterruptStatusMasked(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_ClearTxInterrupt (CySCB_Type *base, uint32_t interruptMask); +__STATIC_INLINE void Cy_SCB_SetTxInterrupt (CySCB_Type *base, uint32_t interruptMask); + +__STATIC_INLINE uint32_t Cy_SCB_GetMasterInterruptStatus(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SetMasterInterruptMask (CySCB_Type *base, uint32_t interruptMask); +__STATIC_INLINE uint32_t Cy_SCB_GetMasterInterruptMask (CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_GetMasterInterruptStatusMasked(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_ClearMasterInterrupt (CySCB_Type *base, uint32_t interruptMask); +__STATIC_INLINE void Cy_SCB_SetMasterInterrupt (CySCB_Type *base, uint32_t interruptMask); + +__STATIC_INLINE uint32_t Cy_SCB_GetSlaveInterruptStatus(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SetSlaveInterruptMask (CySCB_Type *base, uint32_t interruptMask); +__STATIC_INLINE uint32_t Cy_SCB_GetSlaveInterruptMask (CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_GetSlaveInterruptStatusMasked(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_ClearSlaveInterrupt (CySCB_Type *base, uint32_t interruptMask); +__STATIC_INLINE void Cy_SCB_SetSlaveInterrupt (CySCB_Type *base, uint32_t interruptMask); + +__STATIC_INLINE uint32_t Cy_SCB_GetI2CInterruptStatus(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SetI2CInterruptMask (CySCB_Type *base, uint32_t interruptMask); +__STATIC_INLINE uint32_t Cy_SCB_GetI2CInterruptMask (CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_GetI2CInterruptStatusMasked(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_ClearI2CInterrupt (CySCB_Type *base, uint32_t interruptMask); + +__STATIC_INLINE uint32_t Cy_SCB_GetSpiInterruptStatus(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SetSpiInterruptMask (CySCB_Type *base, uint32_t interruptMask); +__STATIC_INLINE uint32_t Cy_SCB_GetSpiInterruptMask (CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_GetSpiInterruptStatusMasked(CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_ClearSpiInterrupt (CySCB_Type *base, uint32_t interruptMask); + + +/*************************************** +* Internal Function Prototypes +***************************************/ + +/** \cond INTERNAL */ +void Cy_SCB_ReadArrayNoCheck (CySCB_Type const *base, void *rxBuf, uint32_t size); +uint32_t Cy_SCB_ReadArray (CySCB_Type const *base, void *rxBuf, uint32_t size); +void Cy_SCB_ReadArrayBlocking (CySCB_Type const *base, void *rxBuf, uint32_t size); +uint32_t Cy_SCB_Write (CySCB_Type *base, uint32_t data); +void Cy_SCB_WriteArrayNoCheck (CySCB_Type *base, void *txBuf, uint32_t size); +uint32_t Cy_SCB_WriteArray (CySCB_Type *base, void *txBuf, uint32_t size); +void Cy_SCB_WriteArrayBlocking(CySCB_Type *base, void *txBuf, uint32_t size); +void Cy_SCB_WriteString (CySCB_Type *base, char_t const string[]); +void Cy_SCB_WriteDefaultArrayNoCheck(CySCB_Type *base, uint32_t txData, uint32_t size); +uint32_t Cy_SCB_WriteDefaultArray (CySCB_Type *base, uint32_t txData, uint32_t size); + +__STATIC_INLINE uint32_t Cy_SCB_GetFifoSize (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_FwBlockReset(CySCB_Type *base); +__STATIC_INLINE bool Cy_SCB_IsRxDataWidthByte(CySCB_Type const *base); +__STATIC_INLINE bool Cy_SCB_IsTxDataWidthByte(CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_GetRxFifoLevel (CySCB_Type const *base); +/** \endcond */ + +/** \} group_scb_common_functions */ + +/*************************************** +* API Constants +***************************************/ + +/** +* \addtogroup group_scb_common_macro +* \{ +*/ + +/** Driver major version */ +#define CY_SCB_DRV_VERSION_MAJOR (1) + +/** Driver minor version */ +#define CY_SCB_DRV_VERSION_MINOR (0) + +/** SCB driver identifier */ +#define CY_SCB_ID CY_PDL_DRV_ID(0x2AU) + +/** Position for SCB driver sub mode */ +#define CY_SCB_SUB_MODE_Pos (14UL) + +/** EZI2C mode identifier */ +#define CY_SCB_EZI2C_ID (0x0UL << CY_SCB_SUB_MODE_Pos) + +/** EZI2C mode identifier */ +#define CY_SCB_I2C_ID (0x1UL << CY_SCB_SUB_MODE_Pos) + +/** EZI2C mode identifier */ +#define CY_SCB_SPI_ID (0x2UL << CY_SCB_SUB_MODE_Pos) + +/** EZI2C mode identifier */ +#define CY_SCB_UART_ID (0x3UL << CY_SCB_SUB_MODE_Pos) + +/** +* \defgroup group_scb_common_macro_intr_cause SCB Interrupt Causes +* \{ +*/ +/** Interrupt from Master interrupt sources */ +#define CY_SCB_MASTER_INTR SCB_INTR_CAUSE_M_Msk + +/** Interrupt from Slave interrupt sources */ +#define CY_SCB_SLAVE_INTR SCB_INTR_CAUSE_S_Msk + +/** Interrupt from TX interrupt sources */ +#define CY_SCB_TX_INTR SCB_INTR_CAUSE_TX_Msk + +/** Interrupt from RX interrupt sources */ +#define CY_SCB_RX_INTR SCB_INTR_CAUSE_RX_Msk + +/** Interrupt from I2C externally clocked interrupt sources */ +#define CY_SCB_I2C_INTR SCB_INTR_CAUSE_I2C_EC_Msk + +/** Interrupt from SPI externally clocked interrupt sources */ +#define CY_SCB_SPI_INTR SCB_INTR_CAUSE_SPI_EC_Msk +/** \} group_scb_common_macro_intr_cause */ + +/** +* \defgroup group_scb_common_macro_tx_intr TX Interrupt Statuses +* \{ +*/ +/** +* The number of data elements in the TX FIFO is less than the value +* of the TX FIFO level +*/ +#define CY_SCB_TX_INTR_LEVEL SCB_INTR_TX_TRIGGER_Msk + +/** The TX FIFO is not full */ +#define CY_SCB_TX_INTR_NOT_FULL SCB_INTR_TX_NOT_FULL_Msk + +/** The TX FIFO is empty */ +#define CY_SCB_TX_INTR_EMPTY SCB_INTR_TX_EMPTY_Msk + +/** An attempt to write to a full TX FIFO */ +#define CY_SCB_TX_INTR_OVERFLOW SCB_INTR_TX_OVERFLOW_Msk + +/** An attempt to read from an empty TX FIFO */ +#define CY_SCB_TX_INTR_UNDERFLOW SCB_INTR_TX_UNDERFLOW_Msk + +/** The UART transfer is complete: all data elements from the TX FIFO are sent +*/ +#define CY_SCB_TX_INTR_UART_DONE SCB_INTR_TX_UART_DONE_Msk + +/** SmartCard only: UART received a NACK */ +#define CY_SCB_TX_INTR_UART_NACK SCB_INTR_TX_UART_NACK_Msk + +/** +* SmartCard only: the value on the TX line of the UART does not match the +* value on the RX line +*/ +#define CY_SCB_TX_INTR_UART_ARB_LOST SCB_INTR_TX_UART_ARB_LOST_Msk +/** \} group_scb_common_macro_tx_intr */ + +/** +* \defgroup group_scb_common_macro_rx_intr RX Interrupt Statuses +* \{ +*/ +/** +* The number of data elements in the RX FIFO is greater than the value of the +* RX FIFO level +*/ +#define CY_SCB_RX_INTR_LEVEL SCB_INTR_RX_TRIGGER_Msk + +/** The RX FIFO is not empty */ +#define CY_SCB_RX_INTR_NOT_EMPTY SCB_INTR_RX_NOT_EMPTY_Msk + +/** The RX FIFO is full */ +#define CY_SCB_RX_INTR_FULL SCB_INTR_RX_FULL_Msk + +/** An attempt to write to a full RX FIFO */ +#define CY_SCB_RX_INTR_OVERFLOW SCB_INTR_RX_OVERFLOW_Msk + +/** An attempt to read from an empty RX FIFO */ +#define CY_SCB_RX_INTR_UNDERFLOW SCB_INTR_RX_UNDERFLOW_Msk + +/** A UART framing error detected */ +#define CY_SCB_RX_INTR_UART_FRAME_ERROR SCB_INTR_RX_FRAME_ERROR_Msk + +/** A UART parity error detected */ +#define CY_SCB_RX_INTR_UART_PARITY_ERROR SCB_INTR_RX_PARITY_ERROR_Msk + +/** A UART break detected */ +#define CY_SCB_RX_INTR_UART_BREAK_DETECT SCB_INTR_RX_BREAK_DETECT_Msk +/** \} group_scb_common_macro_rx_intr */ + +/** +* \defgroup group_scb_common_macro_slave_intr Slave Interrupt Statuses +* \{ +*/ +/** +* I2C slave lost arbitration: the value driven on the SDA line is not the same +* as the value observed on the SDA line +*/ +#define CY_SCB_SLAVE_INTR_I2C_ARB_LOST SCB_INTR_S_I2C_ARB_LOST_Msk + +/** The I2C slave received a NAK */ +#define CY_SCB_SLAVE_INTR_I2C_NACK SCB_INTR_S_I2C_NACK_Msk + +/** The I2C slave received an ACK */ +#define CY_SCB_SLAVE_INTR_I2C_ACK SCB_INTR_S_I2C_ACK_Msk + +/** +* A Stop or Repeated Start event for a write transfer intended for this slave +* was detected. +*/ +#define CY_SCB_SLAVE_INTR_I2C_WRITE_STOP SCB_INTR_S_I2C_WRITE_STOP_Msk + +/** A Stop or Repeated Start event intended for this slave was detected */ +#define CY_SCB_SLAVE_INTR_I2C_STOP SCB_INTR_S_I2C_STOP_Msk + +/** The I2C slave received a Start condition */ +#define CY_SCB_SLAVE_INTR_I2C_START SCB_INTR_S_I2C_START_Msk + +/** The I2C slave received the matching address */ +#define CY_SCB_SLAVE_INTR_I2C_ADDR_MATCH SCB_INTR_S_I2C_ADDR_MATCH_Msk + +/** The I2C Slave received the general call address */ +#define CY_SCB_SLAVE_INTR_I2C_GENERAL_ADDR SCB_INTR_S_I2C_GENERAL_Msk + +/** The I2C slave bus error (detection of unexpected Start or Stop condition) */ +#define CY_SCB_SLAVE_INTR_I2C_BUS_ERROR SCB_INTR_S_I2C_BUS_ERROR_Msk + +/** +* The SPI slave select line is deselected at an expected time during an +* SPI transfer. +*/ +#define CY_SCB_SLAVE_INTR_SPI_BUS_ERROR SCB_INTR_S_SPI_BUS_ERROR_Msk +/** \} group_scb_common_macro_slave_intr */ + +/** +* \defgroup group_scb_common_macro_master_intr Master Interrupt Statuses +* \{ +*/ +/** The I2C master's lost arbitration */ +#define CY_SCB_MASTER_INTR_I2C_ARB_LOST SCB_INTR_M_I2C_ARB_LOST_Msk + +/** The I2C master received a NACK */ +#define CY_SCB_MASTER_INTR_I2C_NACK SCB_INTR_M_I2C_NACK_Msk + +/** The I2C master received an ACK */ +#define CY_SCB_MASTER_INTR_I2C_ACK SCB_INTR_M_I2C_ACK_Msk + +/** The I2C master generated a Stop */ +#define CY_SCB_MASTER_INTR_I2C_STOP SCB_INTR_M_I2C_STOP_Msk + +/** The I2C master bus error (detection of unexpected START or STOP condition) +*/ +#define CY_SCB_MASTER_INTR_I2C_BUS_ERROR SCB_INTR_M_I2C_BUS_ERROR_Msk + +/** +* The SPI master transfer is complete: all data elements transferred from the +* TX FIFO and TX shift register. +*/ +#define CY_SCB_MASTER_INTR_SPI_DONE SCB_INTR_M_SPI_DONE_Msk +/** \} group_scb_common_macro_master_intr */ + +/** +* \defgroup group_scb_common_macro_i2c_intr I2C Interrupt Statuses +* \{ +*/ +/** +* Wake up request: the I2C slave received the matching address. +* Note that this interrupt source triggers in active mode. +*/ +#define CY_SCB_I2C_INTR_WAKEUP SCB_INTR_I2C_EC_WAKE_UP_Msk +/** \} group_scb_common_macro_i2c_intr */ + +/** +* \defgroup group_scb_common_macro_SpiIntrStatuses SPI Interrupt Statuses +* \{ +*/ +/** +* Wake up request: the SPI slave detected an active edge of the slave select +* signal. Note that this interrupt source triggers in active mode. +*/ +#define CY_SCB_SPI_INTR_WAKEUP SCB_INTR_SPI_EC_WAKE_UP_Msk +/** \} group_scb_common_macro_SpiIntrStatuses */ + + +/*************************************** +* Internal Constants +***************************************/ + +/** \cond INTERNAL */ + +/* Default registers values */ +#define CY_SCB_CTRL_DEF_VAL (0x0300000FUL) +#define CY_SCB_I2C_CTRL_DEF_VAL (0x00003F88UL) +#define CY_SCB_SPI_CTRL_DEF_VAL (0x03000000UL) +#define CY_SCB_UART_CTRL_DEF_VAL (0x00300000UL) +#define CY_SCB_UART_RX_CTRL_DEF_VAL (0x000A0002UL) +#define CY_SCB_UART_TX_CTRL_DEF_VAL (0x00000002UL) +#define CY_SCB_RX_CTRL_DEF_VAL (0x00000107UL) +#define CY_SCB_TX_CTRL_DEF_VAL (0x00000107UL) + +/* SCB CTRL modes */ +#define CY_SCB_CTRL_MODE_I2C (0UL) +#define CY_SCB_CTRL_MODE_SPI (1UL) +#define CY_SCB_CTRL_MODE_UART (2UL) + +/* SPI slave select polarity */ +#define CY_SCB_SPI_CTRL_SSEL_POLARITY_Pos SCB_SPI_CTRL_SSEL_POLARITY0_Pos +#define CY_SCB_SPI_CTRL_SSEL_POLARITY_Msk (SCB_SPI_CTRL_SSEL_POLARITY0_Msk | \ + SCB_SPI_CTRL_SSEL_POLARITY1_Msk | \ + SCB_SPI_CTRL_SSEL_POLARITY2_Msk | \ + SCB_SPI_CTRL_SSEL_POLARITY3_Msk) + +/* SPI clock modes: CPHA and CPOL */ +#define CY_SCB_SPI_CTRL_CLK_MODE_Pos SCB_SPI_CTRL_CPHA_Pos +#define CY_SCB_SPI_CTRL_CLK_MODE_Msk (SCB_SPI_CTRL_CPHA_Msk | SCB_SPI_CTRL_CPOL_Msk) + +/* UART parity and parity enable combination */ +#define CY_SCB_UART_RX_CTRL_SET_PARITY_Msk (SCB_UART_RX_CTRL_PARITY_ENABLED_Msk | \ + SCB_UART_RX_CTRL_PARITY_Msk) +#define CY_SCB_UART_RX_CTRL_SET_PARITY_Pos (SCB_UART_RX_CTRL_PARITY_Pos) + +#define CY_SCB_UART_TX_CTRL_SET_PARITY_Msk (SCB_UART_TX_CTRL_PARITY_ENABLED_Msk | \ + SCB_UART_TX_CTRL_PARITY_Msk) +#define CY_SCB_UART_TX_CTRL_SET_PARITY_Pos (SCB_UART_TX_CTRL_PARITY_Pos) + +/* Max number of bits for byte mode */ +#define CY_SCB_BYTE_WIDTH (8UL) + +/* Single unit to wait */ +#define CY_SCB_WAIT_1_UNIT (1U) + +/* Clear interrupt sources */ +#define CY_SCB_CLEAR_ALL_INTR_SRC (0UL) + +/* Hardware FIFO size */ +#define CY_SCB_FIFO_SIZE (128UL) +/** \endcond */ + +/** \} group_scb_common_macro */ + + +/*************************************** +* Inline Function Implementation +***************************************/ + +/** +* \addtogroup group_scb_common_functions +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_SCB_ReadRxFifo +****************************************************************************//** +* +* Reads a data element directly out of the RX FIFO. +* This function does not check if the RX FIFO has data before reading it. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* Data from RX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_ReadRxFifo(CySCB_Type const *base) +{ + return (base->RX_FIFO_RD); +} + +/******************************************************************************* +* Function Name: Cy_SCB_SetRxFifoLevel +****************************************************************************//** +* +* Sets the RX FIFO level. When there are more data elements in the RX FIFO than +* this level, the RX FIFO level interrupt is triggered. +* +* \param base +* The pointer to the SCB instance. +* +* \param rxLevel +* When there are more data elements in the FIFO than this level, the RX level +* interrupt is triggered. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetRxFifoLevel(CySCB_Type *base, uint32_t rxLevel) +{ + base->RX_FIFO_CTRL = _CLR_SET_FLD32U(base->RX_FIFO_CTRL, SCB_RX_FIFO_CTRL_TRIGGER_LEVEL, rxLevel); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetNumInRxFifo +****************************************************************************//** +* +* Returns the number of data elements currently in the RX FIFO. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The number or data elements in RX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetNumInRxFifo(CySCB_Type const *base) +{ + return _FLD2VAL(SCB_RX_FIFO_STATUS_USED, base->RX_FIFO_STATUS); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetRxSrValid +****************************************************************************//** +* +* Returns the status of the RX FIFO Shift Register valid bit. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* 1 - RX shift register valid, 0 - RX shift register not valid. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetRxSrValid(CySCB_Type const *base) +{ + return _FLD2VAL(SCB_RX_FIFO_STATUS_SR_VALID, base->RX_FIFO_STATUS); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_ClearRxFifo +****************************************************************************//** +* +* Clears the RX FIFO and shifter. +* +* \param base +* The pointer to the SCB instance. +* +* \note +* If there is partial data in the shifter, it gets cleared and lost. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_ClearRxFifo(CySCB_Type* base) +{ + base->RX_FIFO_CTRL |= (uint32_t) SCB_RX_FIFO_CTRL_CLEAR_Msk; + base->RX_FIFO_CTRL &= (uint32_t) ~SCB_RX_FIFO_CTRL_CLEAR_Msk; + + (void) base->RX_FIFO_CTRL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_WriteTxFifo +****************************************************************************//** +* +* Writes data directly into the TX FIFO. +* This function does not check if the TX FIFO is not full before writing +* into it. +* +* \param base +* The pointer to the SCB instance. +* +* \param data +* Data to write to the TX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_WriteTxFifo(CySCB_Type* base, uint32_t data) +{ + base->TX_FIFO_WR = data; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetTxFifoLevel +****************************************************************************//** +* +* Sets the TX FIFO level, when there are fewer data elements in the TX FIFO than +* this level, the TX FIFO level interrupt is triggered. +* +* \param base +* The pointer to the SCB instance. +* +* \param txLevel +* When there are fewer data elements in the FIFO than this level, the TX level +* interrupt is triggered. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetTxFifoLevel(CySCB_Type *base, uint32_t txLevel) +{ + base->TX_FIFO_CTRL = _CLR_SET_FLD32U(base->TX_FIFO_CTRL, SCB_TX_FIFO_CTRL_TRIGGER_LEVEL, txLevel); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetNumInTxFifo +****************************************************************************//** +* +* Returns the number of data elements currently in the TX FIFO. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The number or data elements in the TX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetNumInTxFifo(CySCB_Type const *base) +{ + return _FLD2VAL(SCB_TX_FIFO_STATUS_USED, base->TX_FIFO_STATUS); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetTxSrValid +****************************************************************************//** +* +* Returns the status of the TX FIFO Shift Register valid bit. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* 1 - TX shift register valid, 0 - TX shift register not valid. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetTxSrValid(CySCB_Type const *base) +{ + return _FLD2VAL(SCB_TX_FIFO_STATUS_SR_VALID, base->TX_FIFO_STATUS); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_IsTxComplete +****************************************************************************//** +* +* Checks if the TX FIFO and Shifter are empty and there is no more data to send. +* +* \param base +* Pointer to SPI the SCB instance. +* +* \return +* If true, transmission complete. If false, transmission is not complete. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SCB_IsTxComplete(CySCB_Type const *base) +{ + return (0UL == (Cy_SCB_GetNumInTxFifo(base) + Cy_SCB_GetTxSrValid(base))); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_ClearTxFifo +****************************************************************************//** +* +* Clears the TX FIFO. +* +* \param base +* The pointer to the SCB instance. +* +* \note +* The TX FIFO clear operation also clears the shift register, thus the shifter +* could be cleared in the middle of a data element transfer; resulting in +* "ones" being sent on the bus for the remainder of the transfer. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_ClearTxFifo(CySCB_Type *base) +{ + base->TX_FIFO_CTRL |= (uint32_t) SCB_TX_FIFO_CTRL_CLEAR_Msk; + base->TX_FIFO_CTRL &= (uint32_t) ~SCB_TX_FIFO_CTRL_CLEAR_Msk; + + (void) base->TX_FIFO_CTRL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetByteMode +****************************************************************************//** +* +* Sets whether the RX and TX FIFOs are in byte mode. +* The FIFOs are either 16-bit wide or 8-bit wide (byte mode). +* When the FIFO is in byte mode it is twice as deep, see device datasheet +* for FIFO depths. +* +* \param base +* The pointer to the SCB instance. +* +* \param byteMode +* If true, TX and RX FIFOs are 8-bit wide. If false, the FIFOs are 16-bit wide. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetByteMode(CySCB_Type *base, bool byteMode) +{ + if (byteMode) + { + base->CTRL |= SCB_CTRL_BYTE_MODE_Msk; + } + else + { + base->CTRL &= ~SCB_CTRL_BYTE_MODE_Msk; + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetInterruptCause +****************************************************************************//** +* +* Returns the mask of bits showing the source of the current triggered +* interrupt. This is useful for modes of operation where an interrupt can +* be generated by conditions in multiple interrupt source registers. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The mask with the OR of the following conditions that have been triggered. +* See \ref group_scb_common_macro_intr_cause for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetInterruptCause(CySCB_Type const *base) +{ + return (base->INTR_CAUSE); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetRxInterruptStatus +****************************************************************************//** +* +* Returns the RX interrupt request register. This register contains the current +* status of the RX interrupt sources. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of the RX interrupt sources. Each constant is a bit field +* value. The value returned may have multiple bits set to indicate the +* current status. +* See \ref group_scb_common_macro_rx_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetRxInterruptStatus(CySCB_Type const *base) +{ + return (base->INTR_RX); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetRxInterruptMask +****************************************************************************//** +* +* Writes the RX interrupt mask register. This register configures which bits +* from the RX interrupt request register can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* Enabled RX interrupt sources. +* See \ref group_scb_common_macro_rx_intr. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetRxInterruptMask(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_RX_MASK = interruptMask; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetRxInterruptMask +****************************************************************************//** +* +* Returns the RX interrupt mask register. This register specifies which bits +* from the RX interrupt request register trigger can an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* Enabled RX interrupt sources. +* See \ref group_scb_common_macro_rx_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetRxInterruptMask(CySCB_Type const *base) +{ + return (base->INTR_RX_MASK); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetRxInterruptStatusMasked +****************************************************************************//** +* +* Returns the RX interrupt masked request register. This register contains +* a logical AND of corresponding bits from the RX interrupt request and +* mask registers. +* This function is intended to be used in the interrupt service routine to +* identify which of the enabled RX interrupt sources caused the interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of enabled RX interrupt sources. +* See \ref group_scb_common_macro_rx_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetRxInterruptStatusMasked(CySCB_Type const *base) +{ + return (base->INTR_RX_MASKED); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_ClearRxInterrupt +****************************************************************************//** +* +* Clears the RX interrupt sources in the interrupt request register. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* The RX interrupt sources to be cleared. +* See \ref group_scb_common_macro_rx_intr for the set of constants. +* +* \note +* - CY_SCB_INTR_RX_FIFO_LEVEL interrupt source is not cleared when +* the RX FIFO has more entries than the level. +* - CY_SCB_INTR_RX_NOT_EMPTY interrupt source is not cleared when the +* RX FIFO is not empty. +* - CY_SCB_INTR_RX_FULL interrupt source is not cleared when the +* RX FIFO is full. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_ClearRxInterrupt(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_RX = interruptMask; + (void) base->INTR_RX; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetRxInterrupt +****************************************************************************//** +* +* Sets the RX interrupt sources in the interrupt request register. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* The RX interrupt sources to set in the RX interrupt request register. +* See \ref group_scb_common_macro_rx_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetRxInterrupt(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_RX_SET = interruptMask; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetTxInterruptStatus +****************************************************************************//** +* +* Returns the TX interrupt request register. This register contains the current +* status of the TX interrupt sources. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of TX interrupt sources. +* Each constant is a bit field value. The value returned may have multiple +* bits set to indicate the current status. +* See \ref group_scb_common_macro_tx_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetTxInterruptStatus(CySCB_Type const *base) +{ + return (base->INTR_TX); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetTxInterruptMask +****************************************************************************//** +* +* Writes the TX interrupt mask register. This register configures which bits +* from the TX interrupt request register can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* Enabled TX interrupt sources. +* See \ref group_scb_common_macro_tx_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetTxInterruptMask(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_TX_MASK = interruptMask; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetTxInterruptMask +****************************************************************************//** +* +* Returns the TX interrupt mask register. This register specifies which +* bits from the TX interrupt request register can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* Enabled TX interrupt sources. +* See \ref group_scb_common_macro_tx_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetTxInterruptMask(CySCB_Type const *base) +{ + return (base->INTR_TX_MASK); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetTxInterruptStatusMasked +****************************************************************************//** +* +* Returns the TX interrupt masked request register. This register contains +* a logical AND of corresponding bits from the TX interrupt request and +* mask registers. +* This function is intended to be used in the interrupt service routine to +* identify which of enabled TX interrupt sources caused the interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of enabled TX interrupt sources. +* See \ref group_scb_common_macro_tx_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetTxInterruptStatusMasked(CySCB_Type const *base) +{ + return (base->INTR_TX_MASKED); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_ClearTxInterrupt +****************************************************************************//** +* +* Clears the TX interrupt sources in the interrupt request register. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* The TX interrupt sources to be cleared. +* See \ref group_scb_common_macro_tx_intr for the set of constants. +* +* \note +* - CY_SCB_INTR_TX_FIFO_LEVEL interrupt source is not cleared when the +* TX FIFO has less entries than the TX level. +* - CY_SCB_INTR_TX_NOT_FULL interrupt source is not cleared when the +* TX FIFO has empty entries in the TX FIFO. +* - CY_SCB_INTR_TX_EMPTY nterrupt source is not cleared when the +* TX FIFO is empty. +* - CY_SCB_INTR_TX_UNDERFLOW interrupt source is not cleared when the +* TX FIFO is empty. Put data into the TX FIFO before clearing it. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_ClearTxInterrupt(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_TX = interruptMask; + (void) base->INTR_TX; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetTxInterrupt +****************************************************************************//** +* +* Sets TX interrupt sources in the interrupt request register. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* The TX interrupt sources to set in the TX interrupt request register. +* See \ref group_scb_common_macro_tx_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetTxInterrupt(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_TX_SET = interruptMask; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetMasterInterruptStatus +****************************************************************************//** +* +* Returns the master interrupt request register. This register contains the current +* status of the master interrupt sources. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of the master interrupt sources. +* Each constant is a bit field value. The value returned may have multiple +* bits set to indicate the current status. +* See \ref group_scb_common_macro_master_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetMasterInterruptStatus (CySCB_Type const *base) +{ + return (base->INTR_M); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetMasterInterruptMask +****************************************************************************//** +* +* Writes the master interrupt mask register. This register specifies which bits +* from the master interrupt request register can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* The master interrupt sources to be enable. +* See \ref group_scb_common_macro_master_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetMasterInterruptMask(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_M_MASK = interruptMask; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetMasterInterruptMask +****************************************************************************//** +* +* Returns the master interrupt mask register. This register specifies which bits +* from the master interrupt request register can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* Enabled master interrupt sources. +* See \ref group_scb_common_macro_master_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetMasterInterruptMask(CySCB_Type const *base) +{ + return (base->INTR_M_MASK); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetMasterInterruptStatusMasked +****************************************************************************//** +* +* Returns the master interrupt masked request register. This register contains a +* logical AND of corresponding bits from the master interrupt request and mask +* registers. +* This function is intended to be used in the interrupt service routine to +* identify which of the enabled master interrupt sources caused the interrupt +* event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of enabled master interrupt sources. +* See \ref group_scb_common_macro_master_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetMasterInterruptStatusMasked(CySCB_Type const *base) +{ + return (base->INTR_M_MASKED); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_ClearMasterInterrupt +****************************************************************************//** +* +* Clears master interrupt sources in the interrupt request register. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* The master interrupt sources to be cleared. +* See \ref group_scb_common_macro_master_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_ClearMasterInterrupt(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_M = interruptMask; + (void) base->INTR_M; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetMasterInterrupt +****************************************************************************//** +* +* Sets master interrupt sources in the interrupt request register. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* The master interrupt sources to set in the master interrupt request register. +* See \ref group_scb_common_macro_master_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetMasterInterrupt(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_M_SET = interruptMask; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetSlaveInterruptStatus +****************************************************************************//** +* +* Returns the slave interrupt request register. This register contains the current +* status of the slave interrupt sources. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of the slave interrupt sources. +* Each constant is a bit field value. The value returned may have multiple +* bits set to indicate the current status. +* See \ref group_scb_common_macro_slave_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetSlaveInterruptStatus(CySCB_Type const *base) +{ + return (base->INTR_S); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetSlaveInterruptMask +****************************************************************************//** +* +* Writes slave interrupt mask register. +* This register specifies which bits from the slave interrupt request register +* can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* Enabled slave interrupt sources. +* See \ref group_scb_common_macro_slave_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetSlaveInterruptMask(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_S_MASK = interruptMask; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetSlaveInterruptMask +****************************************************************************//** +* +* Returns the slave interrupt mask register. +* This register specifies which bits from the slave interrupt request register +* can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* Enabled slave interrupt sources. +* See \ref group_scb_common_macro_slave_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetSlaveInterruptMask(CySCB_Type const *base) +{ + return (base->INTR_S_MASK); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetSlaveInterruptStatusMasked +****************************************************************************//** +* +* Returns the slave interrupt masked request register. This register contains a +* logical AND of corresponding bits from the slave interrupt request and mask +* registers. +* This function is intended to be used in the interrupt service routine to +* identify which of enabled slave interrupt sources caused the interrupt +* event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of enabled slave interrupt sources. +* See \ref group_scb_common_macro_slave_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetSlaveInterruptStatusMasked(CySCB_Type const *base) +{ + return (base->INTR_S_MASKED); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_ClearSlaveInterrupt +****************************************************************************//** +* +* Clears the slave interrupt sources in the interrupt request register. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* Slave interrupt sources to be cleared. +* See \ref group_scb_common_macro_slave_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_ClearSlaveInterrupt(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_S = interruptMask; + (void) base->INTR_S; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetSlaveInterrupt +****************************************************************************//** +* +* Sets slave interrupt sources in the interrupt request register. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* The slave interrupt sources to set in the slave interrupt request register +* See \ref group_scb_common_macro_slave_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetSlaveInterrupt(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_S_SET = interruptMask; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetI2CInterruptStatus +****************************************************************************//** +* +* Returns the I2C interrupt request register. This register contains the +* current status of the I2C interrupt sources. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of the I2C interrupt sources. Each constant is a bit +* field value. +* The value returned may have multiple bits set to indicate the current status. +* See \ref group_scb_common_macro_slave_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetI2CInterruptStatus(CySCB_Type const *base) +{ + return (base->INTR_I2C_EC); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetI2CInterruptMask +****************************************************************************//** +* +* Writes the I2C interrupt mask register. This register specifies which bits +* from the I2C interrupt request register can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* Enabled I2C interrupt sources. +* See \ref group_scb_common_macro_i2c_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetI2CInterruptMask(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_I2C_EC_MASK = interruptMask; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetI2CInterruptMask +****************************************************************************//** +* +* Returns the I2C interrupt mask register. This register specifies which bits +* from the I2C interrupt request register can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* Enabled I2C interrupt sources. +* See \ref group_scb_common_macro_i2c_intr. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetI2CInterruptMask(CySCB_Type const *base) +{ + return (base->INTR_I2C_EC_MASK); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetI2CInterruptStatusMasked +****************************************************************************//** +* +* Returns the I2C interrupt masked request register. This register contains +* a logical AND of corresponding bits from I2C interrupt request and mask +* registers. +* This function is intended to be used in the interrupt service routine to +* identify which of enabled I2C interrupt sources caused the interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of enabled I2C interrupt sources. +* See \ref group_scb_common_macro_i2c_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetI2CInterruptStatusMasked(CySCB_Type const *base) +{ + return (base->INTR_I2C_EC_MASKED); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_ClearI2CInterrupt +****************************************************************************//** +* +* Clears I2C interrupt sources in the interrupt request register. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* The I2C interrupt sources to be cleared. +* See \ref group_scb_common_macro_i2c_intr for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_ClearI2CInterrupt(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_I2C_EC = interruptMask; + (void) base->INTR_I2C_EC; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetSpiInterruptStatus +****************************************************************************//** +* +* Returns the SPI interrupt request register. This register contains the current +* status of the SPI interrupt sources. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of SPI interrupt sources. Each constant is a bit field value. +* The value returned may have multiple bits set to indicate the current status +* See \ref group_scb_common_macro_SpiIntrStatuses for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetSpiInterruptStatus(CySCB_Type const *base) +{ + return (base->INTR_SPI_EC); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SetSpiInterruptMask +****************************************************************************//** +* +* Writes the SPI interrupt mask register. This register specifies which +* bits from the SPI interrupt request register can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* Enabled SPI interrupt sources. +* See \ref group_scb_common_macro_SpiIntrStatuses for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SetSpiInterruptMask(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_SPI_EC_MASK = interruptMask; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetSpiInterruptMask +****************************************************************************//** +* +* Returns the SPI interrupt mask register. This register specifies which bits +* from the SPI interrupt request register can trigger an interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* Enabled SPI interrupt sources. +* See \ref group_scb_common_macro_SpiIntrStatuses for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetSpiInterruptMask(CySCB_Type const *base) +{ + return (base->INTR_SPI_EC_MASK); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetSpiInterruptStatusMasked +****************************************************************************//** +* +* Returns the SPI interrupt masked request register. This register contains +* a logical AND of corresponding bits from the SPI interrupt request and +* mask registers. +* This function is intended to be used in the interrupt service routine to +* identify which of enabled SPI interrupt sources caused the interrupt event. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* The current status of enabled SPI interrupt sources. +* See \ref group_scb_common_macro_SpiIntrStatuses for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetSpiInterruptStatusMasked(CySCB_Type const *base) +{ + return (base->INTR_SPI_EC_MASKED); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_ClearSpiInterrupt +****************************************************************************//** +* +* Clears SPI interrupt sources in the interrupt request register. +* +* \param base +* The pointer to the SCB instance. +* +* \param interruptMask +* The SPI interrupt sources to be cleared. +* See \ref group_scb_common_macro_SpiIntrStatuses for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_ClearSpiInterrupt(CySCB_Type *base, uint32_t interruptMask) +{ + base->INTR_SPI_EC = interruptMask; + (void) base->INTR_SPI_EC; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetFifoSize +****************************************************************************//** +* +* Returns the RX and TX FIFO depth. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* FIFO depth. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetFifoSize(CySCB_Type const *base) +{ + return ((0UL != (SCB_CTRL_BYTE_MODE_Msk & base->CTRL)) ? + (CY_SCB_FIFO_SIZE) : (CY_SCB_FIFO_SIZE / 2UL)); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_IsRxDataWidthByte +****************************************************************************//** +* +* Returns true if the RX data width is a byte (8 bits). +* +* \param base +* The pointer to the SCB instance. +* +* \return +* True if the RX data width is a byte (8 bits). +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SCB_IsRxDataWidthByte(CySCB_Type const *base) +{ + return (_FLD2VAL(SCB_RX_CTRL_DATA_WIDTH, base->RX_CTRL) < CY_SCB_BYTE_WIDTH); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_IsTxDataWidthByte +****************************************************************************//** +* +* Returns true if the TX data width is a byte (8 bits). +* +* \param base +* The pointer to the SCB instance. +* +* \return +* If ture, the TX data width is a byte (8 bits). Othewise, false. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SCB_IsTxDataWidthByte(CySCB_Type const *base) +{ + return (_FLD2VAL(SCB_TX_CTRL_DATA_WIDTH, base->TX_CTRL) < CY_SCB_BYTE_WIDTH); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_FwBlockReset +****************************************************************************//** +* +* Disables and enables the block to return it into the known state (default): +* FIFOs and interrupt statuses are cleared. +* +* \param base +* The pointer to the SCB instance. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_FwBlockReset(CySCB_Type *base) +{ + base->CTRL &= (uint32_t) ~SCB_CTRL_ENABLED_Msk; + + /* Clean-up command registers */ + base->I2C_M_CMD = 0UL; + base->I2C_S_CMD = 0UL; + + base->CTRL |= (uint32_t) SCB_CTRL_ENABLED_Msk; + + (void) base->CTRL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_GetRxFifoLevel +****************************************************************************//** +* +* Returns the RX FIFO level when there are more words in the RX FIFO than the +* level, the RX FIFO level interrupt is triggered. +* +* \param base +* The pointer to the SCB instance. +* +* \return +* RX FIFO level. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_GetRxFifoLevel(CySCB_Type const *base) +{ + return _FLD2VAL(SCB_RX_FIFO_CTRL_TRIGGER_LEVEL, base->RX_FIFO_CTRL); +} +/** \} group_scb_common_functions */ + +#if defined(__cplusplus) +} +#endif + +/** \} group_scb_common */ + +#endif /* (CY_SCB_COMMON_H) */ + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_ezi2c.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_ezi2c.c new file mode 100644 index 0000000000..e61cb2fc53 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_ezi2c.c @@ -0,0 +1,1058 @@ +/***************************************************************************//** +* \file cy_scb_ezi2c.c +* \version 1.0 +* +* Provides EZI2C API implementation of the SCB driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_scb_ezi2c.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/*************************************** +* Function Prototypes +***************************************/ + +static void HandleErrors (CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context); +static void HandleAddress (CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context); +static void UpdateRxFifoLevel (CySCB_Type *base, uint32_t bufSize); +static void HandleDataReceive (CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context); +static void HandleDataTransmit(CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context); +static void HandleStop (CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context); +static void UpdateAddressMask (CySCB_Type *base, cy_stc_scb_ezi2c_context_t const *context); + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_Init +****************************************************************************//** +* +* Initializes the SCB for the EZI2C operation. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param config +* The pointer to the configuration structure \ref cy_stc_scb_ezi2c_config_t. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t +* allocated by the user. The structure is used during the EZI2C operation for +* internal configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_ezi2c_status_t +* +* \note +* Ensure that the SCB block is disabled before calling this function. +* +*******************************************************************************/ +cy_en_scb_ezi2c_status_t Cy_SCB_EZI2C_Init(CySCB_Type *base, cy_stc_scb_ezi2c_config_t const *config, + cy_stc_scb_ezi2c_context_t *context) +{ + cy_en_scb_ezi2c_status_t retStatus = CY_SCB_EZI2C_BAD_PARAM; + + if ((NULL != base) && (NULL != config) && (NULL != context)) + { + /* Configure the EZI2C interface */ + base->CTRL = ((config->numberOfAddresses == CY_SCB_EZI2C_TWO_ADDRESSES) ? SCB_CTRL_ADDR_ACCEPT_Msk : 0UL) | + (config->enableWakeFromSleep ? SCB_CTRL_EC_AM_MODE_Msk : 0UL) | + SCB_CTRL_BYTE_MODE_Msk; + + base->I2C_CTRL = CY_SCB_EZI2C_I2C_CTRL; + + /* Configure the RX direction */ + base->RX_CTRL = CY_SCB_EZI2C_RX_CTRL; + base->RX_FIFO_CTRL = 0UL; + + /* Set the default address and mask */ + if (config->numberOfAddresses == CY_SCB_EZI2C_ONE_ADDRESS) + { + context->address2 = 0U; + Cy_SCB_EZI2C_SetAddress1(base, config->slaveAddress1, context); + } + else + { + Cy_SCB_EZI2C_SetAddress1(base, config->slaveAddress1, context); + Cy_SCB_EZI2C_SetAddress2(base, config->slaveAddress2, context); + } + + /* Configure the TX direction */ + base->TX_CTRL = CY_SCB_EZI2C_TX_CTRL; + base->TX_FIFO_CTRL = CY_SCB_EZI2C_HALF_FIFO_SIZE; + + /* Configure interrupt sources */ + base->INTR_SPI_EC_MASK = 0UL; + base->INTR_I2C_EC_MASK = 0UL; + base->INTR_RX_MASK = 0UL; + base->INTR_TX_MASK = 0UL; + base->INTR_M_MASK = 0UL; + base->INTR_S_MASK = CY_SCB_EZI2C_SLAVE_INTR; + + /* Initialize context */ + context->status = 0UL; + context->state = CY_SCB_EZI2C_STATE_IDLE; + + context->subAddrSize = config->subAddressSize; + + context->buf1Size = 0UL; + context->buf1rwBondary = 0UL; + context->baseAddr1 = 0UL; + + context->buf1Size = 0UL; + context->buf1rwBondary = 0UL; + context->baseAddr2 = 0UL; + + retStatus = CY_SCB_EZI2C_SUCCESS; + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_DeInit +****************************************************************************//** +* +* De-initializes the SCB block, returns register values to default. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \note +* Ensure that the SCB block is disabled before calling this function. +* +*******************************************************************************/ +void Cy_SCB_EZI2C_DeInit(CySCB_Type *base) +{ + /* Returns block registers into the default state */ + base->CTRL = CY_SCB_CTRL_DEF_VAL; + base->I2C_CTRL = CY_SCB_I2C_CTRL_DEF_VAL; + + base->RX_CTRL = CY_SCB_RX_CTRL_DEF_VAL; + base->RX_FIFO_CTRL = 0UL; + base->RX_MATCH = 0UL; + + base->TX_CTRL = CY_SCB_TX_CTRL_DEF_VAL; + base->TX_FIFO_CTRL = 0UL; + + base->INTR_SPI_EC_MASK = 0UL; + base->INTR_I2C_EC_MASK = 0UL; + base->INTR_RX_MASK = 0UL; + base->INTR_TX_MASK = 0UL; + base->INTR_M_MASK = 0UL; + base->INTR_S_MASK = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_Disable +****************************************************************************//** +* +* Disables the SCB block and clears context statuses. +* Note that after the block was disabled, the TX and RX FIFOs and hardware +* statuses are cleared. Also, the hardware stops driving the output and +* ignores the input. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t +* allocated by the user. The structure is used during the EZI2C operation for +* internal configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* Calling this function when EZI2C is busy (slave was address and communicates +* with master) may cause transaction corruption because the hardware stops +* driving the output and ignores the input. It is recommenced to ensure that +* EZI2C slave is not busy before calling this function. +* +*******************************************************************************/ +void Cy_SCB_EZI2C_Disable(CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context) +{ + base->CTRL &= (uint32_t) ~SCB_CTRL_ENABLED_Msk; + + /* Set the state to default and clear statuses */ + context->status = 0UL; + context->state = CY_SCB_EZI2C_STATE_IDLE; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_DeepSleep +****************************************************************************//** +* +* Configures the EZI2C slave to be a wake-up source from Deep Sleep on address +* match: enables wake-up interrupt. +* Note that a wake-up from the Deep Sleep option must be enabled during +* initialization. If this was not done, this function does nothing. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \note +* Not all SCB blocks are capable to be a wake-up source from Deep Sleep. +* Consult the device datasheet to determine which SCB supports this option. +* +*******************************************************************************/ +void Cy_SCB_EZI2C_DeepSleep(CySCB_Type *base) +{ + if (_FLD2BOOL(SCB_CTRL_EC_AM_MODE, base->CTRL)) + { + Cy_SCB_SetI2CInterruptMask(base, CY_SCB_I2C_INTR_WAKEUP); + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_Wakeup +****************************************************************************//** +* +* Disables the wake-up interrupt. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +*******************************************************************************/ +void Cy_SCB_EZI2C_Wakeup(CySCB_Type *base) +{ + if (_FLD2BOOL(SCB_CTRL_EC_AM_MODE, base->CTRL)) + { + Cy_SCB_SetI2CInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_GetActivity +****************************************************************************//** +* +* Returns a non-zero value if an I2C read or write cycle has occurred since the +* last time this function was called. All flags are reset to zero at the end of +* this function call, except the \ref CY_SCB_EZI2C_STATUS_BUSY. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t +* allocated by the user. The structure is used during the EZI2C operation for +* internal configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref group_scb_ezi2c_macro_get_activity. +* +*******************************************************************************/ +uint32_t Cy_SCB_EZI2C_GetActivity(CySCB_Type const *base, cy_stc_scb_ezi2c_context_t *context) +{ + uint32_t intrState; + uint32_t locStatus; + + /* Suppress a compiler warning about unused variables */ + (void) base; + + intrState = Cy_SysLib_EnterCriticalSection(); + + locStatus = context->status; + context->status &= CY_SCB_EZI2C_STATUS_BUSY; + + Cy_SysLib_ExitCriticalSection(intrState); + + return (locStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_SetAddress1 +****************************************************************************//** +* +* Sets the primary EZI2C slave address. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param addr +* The 7-bit right justified slave address. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t +* allocated by the user. The structure is used during the EZI2C operation for +* internal configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +void Cy_SCB_EZI2C_SetAddress1(CySCB_Type *base, uint8_t addr, cy_stc_scb_ezi2c_context_t *context) +{ + context->address1 = addr; + + base->RX_MATCH = _CLR_SET_FLD32U(base->RX_MATCH, SCB_RX_MATCH_ADDR, ((uint32_t)((uint32_t) addr << 1UL))); + + UpdateAddressMask(base, context); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_GetAddress1 +****************************************************************************//** +* +* Returns the primary the EZI2C slave address. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* * \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t +* allocated by the user. The structure is used during the EZI2C operation for +* internal configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* The 7-bit right justified slave address. +* +*******************************************************************************/ +uint32_t Cy_SCB_EZI2C_GetAddress1(CySCB_Type const *base, cy_stc_scb_ezi2c_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return ((uint32_t) context->address1); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_SetBuffer1 +****************************************************************************//** +* +* Sets up the data buffer to be exposed to the I2C master on the primary slave +* address request. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param buf +* The pointer to data buffer. +* +* \param bufSize +* Size of buffer in bytes. +* +* \param rwBoundary +* Number of data bytes starting from the beginning of the buffer with read and +* write access. Data bytes located at rwBoundary or greater are read only. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t +* allocated by the user. The structure is used during the EZI2C operation for +* internal configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* Calling this function in the middle of a transaction intended for the primary +* slave address leads to unexpected behavior. +* +*******************************************************************************/ +void Cy_SCB_EZI2C_SetBuffer1(CySCB_Type const *base, uint8_t *buf, uint32_t bufSize, uint32_t rwBoundary, + cy_stc_scb_ezi2c_context_t *context) +{ + uint32_t intrState; + + /* Suppress a compiler warning about unused variables */ + (void) base; + + CY_ASSERT( !((NULL == buf) && (0UL == bufSize)) ); + + intrState = Cy_SysLib_EnterCriticalSection(); + + context->buf1 = buf; + context->buf1Size = bufSize; + context->buf1rwBondary = rwBoundary; + + Cy_SysLib_ExitCriticalSection(intrState); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_SetAddress2 +****************************************************************************//** +* +* Sets the secondary EZI2C slave address. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param addr +* The 7-bit right justified slave address. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t +* allocated by the user. The structure is used during the EZI2C operation for +* internal configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* Calling this function when EZI2C slave configured for one address operation +* leads to unexpected behavior because it updates address mask. +* +*******************************************************************************/ +void Cy_SCB_EZI2C_SetAddress2(CySCB_Type *base, uint8_t addr, cy_stc_scb_ezi2c_context_t *context) +{ + context->address2 = addr; + + UpdateAddressMask(base, context); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_GetAddress2 +****************************************************************************//** +* +* Returns the secondary the EZI2C slave address. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t +* allocated by the user. The structure is used during the EZI2C operation for +* internal configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* The 7-bit right justified slave address. +* +*******************************************************************************/ +uint32_t Cy_SCB_EZI2C_GetAddress2(CySCB_Type const *base, cy_stc_scb_ezi2c_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return ((uint32_t) context->address2); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_SetBuffer2 +****************************************************************************//** +* +* Sets up the data buffer to be exposed to the I2C master on the secondary +* slave address request. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param buf +* The pointer to data buffer. +* +* \param bufSize +* Size of buffer in bytes. +* +* \param rwBoundary +* Number of data bytes starting from the beginning of the buffer with read and +* write access. Data bytes located at rwBoundary or greater are read only. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t +* allocated by the user. The structure is used during the EZI2C operation for +* internal configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* Calling this function in the middle of a transaction intended for the +* secondary slave address leads to unexpected behavior. +* +*******************************************************************************/ +void Cy_SCB_EZI2C_SetBuffer2(CySCB_Type const *base, uint8_t *buf, uint32_t bufSize, uint32_t rwBoundary, + cy_stc_scb_ezi2c_context_t *context) +{ + uint32_t intrState; + + /* Suppress a compiler warning about unused variables */ + (void) base; + + CY_ASSERT( !((NULL == buf) && (0UL == bufSize)) ); + + intrState = Cy_SysLib_EnterCriticalSection(); + + context->buf2 = buf; + context->buf2Size = bufSize; + context->buf2rwBondary = rwBoundary; + + Cy_SysLib_ExitCriticalSection(intrState); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_Interrupt +****************************************************************************//** +* +* This is the interrupt function for the SCB configured in the EZI2C mode. +* This function must be called inside the user-defined interrupt service +* routine in order for EZI2C slave to work. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t allocated +* by the user. The structure is used during the EZI2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +void Cy_SCB_EZI2C_Interrupt(CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context) +{ + uint32_t slaveIntrStatus; + + /* Handle an I2C wake-up event */ + if (0UL != (CY_SCB_I2C_INTR_WAKEUP & Cy_SCB_GetI2CInterruptStatusMasked(base))) + { + Cy_SCB_ClearI2CInterrupt(base, CY_SCB_I2C_INTR_WAKEUP); + } + + /* Get the slave interrupt sources */ + slaveIntrStatus = Cy_SCB_GetSlaveInterruptStatusMasked(base); + + /* Handle the error conditions */ + if (0UL != (CY_SCB_EZI2C_SLAVE_INTR_ERROR & slaveIntrStatus)) + { + HandleErrors(base, context); + + Cy_SCB_ClearSlaveInterrupt(base, CY_SCB_EZI2C_SLAVE_INTR_ERROR); + + /* Triggers stop processing to complete transaction */ + slaveIntrStatus |= CY_SCB_SLAVE_INTR_I2C_STOP; + } + else + { + if ((CY_SCB_EZI2C_STATE_RX_DATA1 == context->state) && + (0UL != (CY_SCB_SLAVE_INTR_I2C_STOP & slaveIntrStatus))) + { + /* Get data from RX FIFO after Stop is generated */ + Cy_SCB_SetRxInterrupt (base, CY_SCB_RX_INTR_LEVEL); + Cy_SCB_SetRxInterruptMask(base, CY_SCB_RX_INTR_LEVEL); + } + } + + /* Handle the receive direction (master writes data) */ + if (0UL != (CY_SCB_RX_INTR_LEVEL & Cy_SCB_GetRxInterruptStatusMasked(base))) + { + HandleDataReceive(base, context); + + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_LEVEL); + } + + /* Handle the transaction completion */ + if (0UL != (CY_SCB_SLAVE_INTR_I2C_STOP & slaveIntrStatus)) + { + HandleStop(base, context); + + Cy_SCB_ClearSlaveInterrupt(base, CY_SCB_SLAVE_INTR_I2C_STOP); + + /* Update the slave interrupt status */ + slaveIntrStatus = Cy_SCB_GetSlaveInterruptStatusMasked(base); + } + + /* Handle the address byte */ + if (0UL != (CY_SCB_SLAVE_INTR_I2C_ADDR_MATCH & slaveIntrStatus)) + { + HandleAddress(base, context); + + Cy_SCB_ClearI2CInterrupt (base, CY_SCB_I2C_INTR_WAKEUP); + Cy_SCB_ClearSlaveInterrupt(base, CY_SCB_SLAVE_INTR_I2C_ADDR_MATCH); + } + + /* Handle the transmit direction (master reads data) */ + if (0UL != (CY_SCB_TX_INTR_LEVEL & Cy_SCB_GetTxInterruptStatusMasked(base))) + { + HandleDataTransmit(base, context); + + Cy_SCB_ClearTxInterrupt(base, CY_SCB_TX_INTR_LEVEL); + } +} + + + +/******************************************************************************* +* Function Name: HandleErrors +****************************************************************************//** +* +* Handles an error conditions. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t allocated +* by the user. The structure is used during the EZI2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void HandleErrors(CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context) +{ + context->status |= CY_SCB_EZI2C_STATUS_ERR; + + /* Drop any data available in RX FIFO */ + Cy_SCB_ClearRxFifo(base); + + /* Stop TX and RX processing */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + Cy_SCB_SetTxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); +} + + +/******************************************************************************* +* Function Name: HandleAddress +****************************************************************************//** +* +* Prepares the EZI2C slave for the following read or write transfer after the +* matched address was received. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t allocated +* by the user. The structure is used during the EZI2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void HandleAddress(CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context) +{ + /* Default actions: active is address1, ACK address */ + uint32_t cmd = SCB_I2C_S_CMD_S_ACK_Msk; + context->addr1Active = true; + + if (0U != context->address2) + { + /* Get address from RX FIFO and make it 7-bits */ + uint32_t address = (Cy_SCB_ReadRxFifo(base) >> 1UL); + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_LEVEL); + + /* Decide if address matches */ + if ((address == context->address1) || (address == context->address2)) + { + /* ACK address */ + if (address == context->address2) + { + context->addr1Active = false; + } + + /* Clear the stall stop status and enable the stop interrupt source */ + Cy_SCB_ClearSlaveInterrupt (base, CY_SCB_SLAVE_INTR_I2C_STOP); + Cy_SCB_SetSlaveInterruptMask(base, CY_SCB_EZI2C_SLAVE_INTR); + } + else + { + /* NACK address */ + cmd = SCB_I2C_S_CMD_S_NACK_Msk; + + /* Disable the stop interrupt source */ + Cy_SCB_SetI2CInterruptMask(base, CY_SCB_EZI2C_SLAVE_INTR_NO_STOP); + } + } + + /* Clean-up TX FIFO before continue transaction */ + Cy_SCB_ClearTxFifo(base); + + /* Set the command to an ACK or NACK address */ + base->I2C_S_CMD = cmd; + + if (cmd == SCB_I2C_S_CMD_S_ACK_Msk) + { + context->status |= CY_SCB_EZI2C_STATUS_BUSY; + + /* Prepare for a transaction */ + if (_FLD2BOOL(SCB_I2C_STATUS_S_READ,base->I2C_STATUS)) + { + /* Master read data from slave */ + context->state = CY_SCB_EZI2C_STATE_TX_DATA; + + /* Prepare buffer to transmit */ + if (context->addr1Active) + { + context->curBuf = &context->buf1[context->baseAddr1]; + context->bufSize = context->buf1Size - context->baseAddr1; + } + else + { + context->curBuf = &context->buf2[context->baseAddr2]; + context->bufSize = context->buf2Size - context->baseAddr2; + } + + Cy_SCB_SetTxInterruptMask(base, CY_SCB_TX_INTR_LEVEL); + } + else + { + /* Master writes data into slave */ + context->state = CY_SCB_EZI2C_STATE_RX_OFFSET_MSB; + + context->bufSize = ((context->addr1Active) ? context->buf1Size : context->buf2Size); + + Cy_SCB_SetRxFifoLevel (base, 0UL); + Cy_SCB_SetRxInterruptMask(base, CY_SCB_RX_INTR_LEVEL); + } + } +} + + +/******************************************************************************* +* Function Name: HandleDataReceive +****************************************************************************//** +* +* Updates RX FIFO level to trigger next read from it. It also manages +* auto data NACK feature. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param bufSize +* Size of buffer in bytes. +* +*******************************************************************************/ +static void UpdateRxFifoLevel(CySCB_Type *base, uint32_t bufSize) +{ + uint32_t level; + + if (bufSize > CY_SCB_EZI2C_FIFO_SIZE) + { + /* Continue transaction: there is a space in the buffer */ + level = (bufSize - CY_SCB_EZI2C_FIFO_SIZE); + level = ((level > CY_SCB_EZI2C_FIFO_SIZE) ? CY_SCB_EZI2C_HALF_FIFO_SIZE : level) - 1UL; + } + else + { + /* Prepare to end transaction: after FIFO becomes full NACK next byte. + * NACKed byte is dropped by the hardware. + */ + base->I2C_CTRL |= SCB_I2C_CTRL_S_NOT_READY_DATA_NACK_Msk; + + level = ((bufSize == 0UL) ? (0UL) : (bufSize - 1UL)); + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } + + Cy_SCB_SetRxFifoLevel(base, level); +} + + +/******************************************************************************* +* Function Name: HandleDataReceive +****************************************************************************//** +* +* Handles data reading from the RX FIFO. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t allocated +* by the user. The structure is used during the EZI2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void HandleDataReceive(CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context) +{ + switch(context->state) + { + case CY_SCB_EZI2C_STATE_RX_OFFSET_MSB: + case CY_SCB_EZI2C_STATE_RX_OFFSET_LSB: + { + /* Default actions: compare base address and ACK it */ + bool checkBaseAddr = true; + + /* Get base address from RX FIFO */ + uint32_t baseAddr = Cy_SCB_ReadRxFifo(base); + + if (context->subAddrSize == CY_SCB_EZI2C_SUB_ADDR16_BITS) + { + if (context->state == CY_SCB_EZI2C_STATE_RX_OFFSET_MSB) + { + /* ACK base address MSB */ + base->I2C_S_CMD = SCB_I2C_S_CMD_S_ACK_Msk; + + /* Temporary store base address MSB */ + context->idx = (uint32_t) (baseAddr << 8UL); + + /* Do not compare until 16 bits are received */ + checkBaseAddr = false; + context->state = CY_SCB_EZI2C_STATE_RX_OFFSET_LSB; + } + else + { + /* Get base address (MSB | LSB) */ + baseAddr |= context->idx; + } + } + + /* Check if received base address is valid */ + if (checkBaseAddr) + { + uint32_t cmd = SCB_I2C_S_CMD_S_ACK_Msk; + + /* Decide if base address within buffer range */ + if (baseAddr < context->bufSize) + { + /* Accept new base address */ + if (context->addr1Active) + { + context->baseAddr1 = baseAddr; + } + else + { + context->baseAddr2 = baseAddr; + } + + /* Store base address to use it later */ + context->idx = baseAddr; + } + else + { + /* Restore valid base address */ + context->idx = ((context->addr1Active) ? context->baseAddr1 : context->baseAddr2); + + /* Base address is out of range - NACK it */ + cmd = SCB_I2C_S_CMD_S_NACK_Msk; + } + + /* Set the command to an ACK or NACK address */ + base->I2C_S_CMD = cmd; + + if (cmd == SCB_I2C_S_CMD_S_ACK_Msk) + { + /* Prepare buffer for a write */ + if (context->addr1Active) + { + context->curBuf = &context->buf1[context->baseAddr1]; + context->bufSize = ((context->baseAddr1 < context->buf1rwBondary) ? + (context->buf1rwBondary - context->baseAddr1) : (0UL)); + } + else + { + context->curBuf = &context->buf2[context->baseAddr2]; + context->bufSize = ((context->baseAddr2 < context->buf2rwBondary) ? + (context->buf2rwBondary - context->baseAddr2) : (0UL)); + } + + /* Choice receive scheme */ + if ((0U != context->address2) || (context->bufSize < CY_SCB_EZI2C_FIFO_SIZE)) + { + /* Handle each byte separately */ + context->state = CY_SCB_EZI2C_STATE_RX_DATA0; + } + else + { + /* Use RX FIFO and auto ACK/NACK features */ + base->I2C_CTRL |= SCB_I2C_CTRL_S_READY_DATA_ACK_Msk; + UpdateRxFifoLevel(base, context->bufSize); + + context->state = CY_SCB_EZI2C_STATE_RX_DATA1; + } + } + } + } + break; + + case CY_SCB_EZI2C_STATE_RX_DATA0: + { + uint32_t byte = Cy_SCB_ReadRxFifo(base); + + /* Check if there is a space to store byte */ + if (context->bufSize > 0UL) + { + /* Continue the transfer: send ACK */ + base->I2C_S_CMD = SCB_I2C_S_CMD_S_ACK_Msk; + + /* Store byte in the buffer */ + context->curBuf[0UL] = (uint8_t) byte; + --context->bufSize; + ++context->curBuf; + + /* Update base address to notice that buffer is modified */ + ++context->idx; + } + else + { + /* Finish a transfer: send a NACK. Drop received byte */ + base->I2C_S_CMD = SCB_I2C_S_CMD_S_NACK_Msk; + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } + } + break; + + case CY_SCB_EZI2C_STATE_RX_DATA1: + { + /* Get the number of bytes to read from RX FIFO */ + uint32_t numToCopy = Cy_SCB_GetRxFifoLevel(base) + 1UL; + + /* Get data from RX FIFO */ + numToCopy = Cy_SCB_ReadArray(base, context->curBuf, numToCopy); + context->bufSize -= numToCopy; + context->curBuf += numToCopy; + + /* Configure next RX FIFO read event */ + UpdateRxFifoLevel(base, context->bufSize); + + /* Update base address to notice that buffer is modified */ + ++context->idx; + } + break; + + default: + break; + } +} + + +/******************************************************************************* +* Function Name: HandleDataTransmit +****************************************************************************//** +* +* Loads the TX FIFO with data from the buffer. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t allocated +* by the user. The structure is used during the EZI2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void HandleDataTransmit(CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context) +{ + if (context->bufSize > 0UL) + { + /* Write data into TX FIFO from the buffer */ + uint32_t numToCopy = Cy_SCB_WriteArray(base, context->curBuf, context->bufSize); + context->bufSize -= numToCopy; + context->curBuf += numToCopy; + } + + if (0UL == context->bufSize) + { + /* Write default bytes into the TX FIFO */ + (void) Cy_SCB_WriteDefaultArray(base, CY_SCB_EZI2C_DEFAULT_TX, CY_SCB_EZI2C_FIFO_SIZE); + } +} + + +/******************************************************************************* +* Function Name: HandleStop +****************************************************************************//** +* +* Handles transfer completion. +* It is triggered by a stop or restart condition on the bus. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t allocated +* by the user. The structure is used during the EZI2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void HandleStop(CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context) +{ + /* Check for errors */ + if (0UL != (CY_SCB_EZI2C_STATUS_ERR & context->status)) + { + /* Re-enable SCB to get it back into know state: FIFO content and + * interrupt statuses are cleared. + */ + Cy_SCB_FwBlockReset(base); + } + + /* Clean-up hardware to be ready for the next transaction */ + if (CY_SCB_EZI2C_STATE_TX_DATA == context->state) + { + Cy_SCB_SetTxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } + else + { + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + base->I2C_CTRL &= (uint32_t) ~(SCB_I2C_CTRL_S_READY_DATA_ACK_Msk | + SCB_I2C_CTRL_S_NOT_READY_DATA_NACK_Msk); + } + + /* Update statuses */ + context->status &= (uint32_t) ~CY_SCB_EZI2C_STATUS_BUSY; + + if (context->addr1Active) + { + context->status |= ((CY_SCB_EZI2C_STATE_TX_DATA == context->state) ? CY_SCB_EZI2C_STATUS_READ1 : + ((context->baseAddr1 != context->idx) ? CY_SCB_EZI2C_STATUS_WRITE1 : 0UL)); + } + else + { + context->status |= ((CY_SCB_EZI2C_STATE_TX_DATA == context->state) ? CY_SCB_EZI2C_STATUS_READ2 : + ((context->baseAddr2 != context->idx) ? CY_SCB_EZI2C_STATUS_WRITE2 : 0UL)); + } + + /* Back to idle state */ + context->state = CY_SCB_EZI2C_STATE_IDLE; +} + + +/******************************************************************************* +* Function Name: UpdateAddressMask +****************************************************************************//** +* +* Updates the slave address mask to enable the SCB hardware to receive matching +* slave addresses. +* +* \param base +* The pointer to the EZI2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_ezi2c_context_t allocated +* by the user. The structure is used during the EZI2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void UpdateAddressMask(CySCB_Type *base, cy_stc_scb_ezi2c_context_t const *context) +{ + uint32_t addrMask; + + /* Check how many addresses are used: */ + if (0U != context->address2) + { + /* If (addr1 and addr2) bit matches - mask bit equals 1, otherwise 0 */ + addrMask = (uint32_t) ~((uint32_t) context->address1 ^ (uint32_t) context->address2); + } + else + { + /* All bits have to match for singe address */ + addrMask = CY_SCB_EZI2C_ONE_ADDRESS_MASK; + } + + /* Update hardware address match */ + base->RX_MATCH = _CLR_SET_FLD32U(base->RX_MATCH, SCB_RX_MATCH_MASK, ((uint32_t) addrMask << 1UL)); +} + + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_ezi2c.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_ezi2c.h new file mode 100644 index 0000000000..1d51eaf7b9 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_ezi2c.h @@ -0,0 +1,424 @@ +/***************************************************************************//** +* \file cy_scb_ezi2c.h +* \version 1.0 +* +* Provides EZI2C API declarations of the SCB driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \addtogroup group_scb_ezi2c +* \{ +* Driver API for EZI2C slave Peripheral +* +* \warning The EZI2C slave driver state is a prototype and it is not +* recommended for use. +* +* I2C - The Inter-Integrated Circuit (I2C) bus is an industry-standard. +* The two-wire hardware interface was developed by Philips Semiconductors +* (now NXP Semiconductors). +* +* The EZI2C slave peripheral driver provides an API to implement I2C slave +* device based on the SCB hardware block. This slave device emulates common +* I2C EEPROM interface that acts like a dual port memory between the external +* master and your code. I2C devices based on SCB hardware are compatible with +* I2C Standard mode, Fast mode, and Fast mode Plus specifications as defined in +* the I2C bus specification. +* +* Features: +* * An industry-standard I2C bus interface +* * Supports standard data rates of 100/400/1000 kbps +* * Emulates a common I2C EEPROM Interface +* * Acts like a dual port memory between the external master and your code +* * Supports Hardware Address Match +* * Supports two hardware addresses with separate buffers +* * Supports Wake from Deep Sleep on address match +* * Simple to set up and use. Once set up, there is no need to call EZI2C API +* at run time. +* +* \section group_scb_ezi2c_configuration Configuration Considerations +* +* To set up the EZI2C slave driver provide the configuration parameters in the +* \ref cy_stc_scb_ezi2c_config_t structure. For the slave the primary slave +* address slaveAddress1 must be provided. The other parameters are optional +* for operation. +* To initialize the driver, call the \ref Cy_SCB_EZI2C_Init function providing +* a pointer to the filled \ref cy_stc_scb_ezi2c_config_t structure and +* allocated \ref cy_stc_scb_ezi2c_context_t. The \ref Cy_SCB_EZI2C_Interrupt +* function must be called in the interrupt handler for selected the +* SCB instance and this interrupt must be enabled in the NVIC. Set up +* EZI2C slave buffers before calling \ref Cy_SCB_EZI2C_Enable using +* \ref Cy_SCB_EZI2C_SetBuffer1 or/and \ref Cy_SCB_EZI2C_SetBuffer2. Finally, +* enable EZI2C slave operation calling \ref Cy_SCB_EZI2C_Enable. +* +* The following operation might not require any EZI2C slave function calls +* because the I2C master is able to access the slave buffer and the application +* can directly access it as well. Note that this is an application level task +* to ensure buffer content integrity. +* +* The master can access buffer access: +* * The master write operations - A base address is always provided and is one +* or two bytes depending on the sub-address size configuration. This base +* address is retained and will be used for later read operations. Following +* the base address is a sequence of bytes that are written into the buffer +* starting from the base address location. The buffer index is incremented +* for each written byte, but this does not affect the base address, which is +* retained. The length of a write operation is limited by the maximum buffer +* read/write region size.\n +* When a master attempts to write outside the read/write region or past the +* end of the buffer, the last byte is NACKed. +* * A read operation always starts from the base address set by the most +* recent write operation. The buffer index is incremented for each read byte. +* Two sequential read operations start from the same base address no matter +* how many bytes were read. The length of a read operation is not limited by +* the maximum size of the data buffer. The EZI2C slave returns 0xFF bytes +* if the read operation passes the end of the buffer.\n +* Typically, a read operation requires the base address to be updated before +* starting the read. In this case, the write and read operations must be +* combined together. The I2C master may use ReStart or Stop/Start conditions +* to combine the operations. The write operation only sets only the base +* address and the following read operation will start from the new base +* address. In cases where the base address remains the same, there is no need +* for a write operation to be performed. +* +* \section group_scb_ezi2c_more_information More Information +* +* For more information on the SCB peripheral, refer to the technical reference +* manual (TRM). +* +* \section group_scb_ezi2c_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required / Advisory)Rule DescriptionDescription of Deviation(s)
14.2RAll non-null statements shall either: a) have at least one side-effect +* however executed, or b) cause control flow to change.The unused function parameters are cast to void. This statement +* has no side-effect and is used to suppress a compiler warning.
+* +* \section group_scb_ezi2c_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_scb_ezi2c_macro Macro +* \defgroup group_scb_ezi2c_functions Functions +* \defgroup group_scb_ezi2c_data_structures Data Structures +* \defgroup group_scb_ezi2c_enums Enumerated Types +*/ + +#if !defined(CY_SCB_EZI2C_H) +#define CY_SCB_EZI2C_H + +#include "cy_scb_common.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/*************************************** +* Enumerated Types +***************************************/ + +/** +* \addtogroup group_scb_ezi2c_enums +* \{ +*/ + +/** EZI2C status codes */ +typedef enum +{ + /** Operation completed successfully */ + CY_SCB_EZI2C_SUCCESS = 0x00U, + + /** One or more of input parameters are invalid */ + CY_SCB_EZI2C_BAD_PARAM = CY_SCB_ID | CY_PDL_STATUS_ERROR | CY_SCB_EZI2C_ID | 1UL, +} cy_en_scb_ezi2c_status_t; + +/** \cond INTERNAL */ +/** EZI2C slave FSM states */ +typedef enum +{ + CY_SCB_EZI2C_STATE_IDLE, + CY_SCB_EZI2C_STATE_RX_OFFSET_MSB, + CY_SCB_EZI2C_STATE_RX_OFFSET_LSB, + CY_SCB_EZI2C_STATE_RX_DATA0, + CY_SCB_EZI2C_STATE_RX_DATA1, + CY_SCB_EZI2C_STATE_TX_DATA +} cy_en_scb_ezi2c_state_t; +/** \endcond */ +/** \} group_scb_ezi2c_enums */ + + +/*************************************** +* Type Definitions +***************************************/ + +/** +* \addtogroup group_scb_ezi2c_data_structures +* \{ +*/ + +/** EZI2C Configuration Structure */ +typedef struct cy_stc_scb_ezi2c_config +{ + /** + * Number of supported addresses either (See + * \ref group_scb_ezi2c_macro_num_of_addr for the set of constants) + */ + uint32_t numberOfAddresses; + + /** The 7-bit right justified primary slave address */ + uint8_t slaveAddress1; + + /** The 7-bit right justified secondary slave address */ + uint8_t slaveAddress2; + + /** Size of sub-address, can either be 8 or 16 bits (See + * \ref group_scb_ezi2c_macro_sub_addr_size for the set of constants) + */ + uint32_t subAddressSize; + + /** + * When set, the slave will wake the device from deep sleep on an address + * match (The device datasheet must be consulted to determine which SCBs + * support this mode) + */ + bool enableWakeFromSleep; + + /** Nominal Bus data rate */ + uint32_t dataRateHz; +} cy_stc_scb_ezi2c_config_t; + +/** EZI2C Internal structure, holds data used by EZI2C functions */ +typedef struct cy_stc_scb_ezi2c_context +{ + cy_en_scb_ezi2c_state_t state; /**< Driver state */ + uint32_t status; /**< Communication status */ + + uint8_t address1; /**< Primary slave address (7-bits right justified) */ + uint8_t address2; /**< Secondary slave address (7-bits right justified) */ + uint32_t subAddrSize; /**< Sub-address size */ + + uint32_t idx; /**< Index within buffer during operation */ + uint32_t baseAddr1; /**< Valid base address for primary slave address */ + uint32_t baseAddr2; /**< Valid base address for secondary slave address */ + + bool addr1Active; /**< Defines whether request is intended to primary slave address */ + uint8_t *curBuf; /**< Pointer to the current location in buffer (while it is accessed) */ + uint32_t bufSize; /**< Specifies how many bytes in current buffer left in the buffer */ + + uint8_t *buf1; /**< Pointer to the buffer that exposed on request intended to primary slave address */ + uint32_t buf1Size; /**< Buffer size assigned to the primary slave address */ + uint32_t buf1rwBondary; /**< Read/Write boundary within the buffer assigned to the primary slave address */ + + uint8_t *buf2; /**< Pointer to the buffer that exposed on request intended to secondary slave address */ + uint32_t buf2Size; /**< Buffer size assigned to the secondary slave address */ + uint32_t buf2rwBondary; /**< Read/Write boundary within the buffer assigned to the secondary slave address */ + +} cy_stc_scb_ezi2c_context_t; +/** \} group_scb_ezi2c_data_structures */ + + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_scb_ezi2c_functions +* \{ +*/ +/* Basic functions */ +cy_en_scb_ezi2c_status_t Cy_SCB_EZI2C_Init(CySCB_Type *base, cy_stc_scb_ezi2c_config_t const *config, + cy_stc_scb_ezi2c_context_t *context); +void Cy_SCB_EZI2C_DeInit(CySCB_Type *base); +__STATIC_INLINE void Cy_SCB_EZI2C_Enable(CySCB_Type *base); +void Cy_SCB_EZI2C_Disable(CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context); + +/* Low power functions */ +void Cy_SCB_EZI2C_DeepSleep(CySCB_Type *base); +void Cy_SCB_EZI2C_Wakeup (CySCB_Type *base); + +uint32_t Cy_SCB_EZI2C_GetActivity(CySCB_Type const *base, cy_stc_scb_ezi2c_context_t *context); + +/* Configuration functions for address 1 */ +void Cy_SCB_EZI2C_SetAddress1(CySCB_Type *base, uint8_t addr, cy_stc_scb_ezi2c_context_t *context); +uint32_t Cy_SCB_EZI2C_GetAddress1(CySCB_Type const *base, cy_stc_scb_ezi2c_context_t const *context); +void Cy_SCB_EZI2C_SetBuffer1 (CySCB_Type const *base, uint8_t *buf, uint32_t bufSize, uint32_t rwBoundary, + cy_stc_scb_ezi2c_context_t *context); + +/* Configuration functions for address 2 */ +void Cy_SCB_EZI2C_SetAddress2(CySCB_Type *base, uint8_t addr, cy_stc_scb_ezi2c_context_t *context); +uint32_t Cy_SCB_EZI2C_GetAddress2(CySCB_Type const *base, cy_stc_scb_ezi2c_context_t const *context); +void Cy_SCB_EZI2C_SetBuffer2 (CySCB_Type const *base, uint8_t *buf, uint32_t bufSize, uint32_t rwBoundary, + cy_stc_scb_ezi2c_context_t *context); + +/* Interrupt handler */ +void Cy_SCB_EZI2C_Interrupt(CySCB_Type *base, cy_stc_scb_ezi2c_context_t *context); +/** \} group_scb_ezi2c_functions */ + + +/*************************************** +* API Constants +***************************************/ + +/** +* \addtogroup group_scb_ezi2c_macro +* \{ +*/ + +/** +* \defgroup group_scb_ezi2c_macro_num_of_addr Number of Addresses +* \{ +*/ +#define CY_SCB_EZI2C_ONE_ADDRESS (0UL) /**< Only one address */ +#define CY_SCB_EZI2C_TWO_ADDRESSES (1UL) /**< Two addresses */ +/** \} group_scb_ezi2c_macro_num_of_addr */ + +/** +* \defgroup group_scb_ezi2c_macro_sub_addr_size Size of Sub-Address +* \{ +*/ +#define CY_SCB_EZI2C_SUB_ADDR8_BITS (0UL) /**< Sub-address is 8 bits */ +#define CY_SCB_EZI2C_SUB_ADDR16_BITS (1UL) /**< Sub-address is 16 bits */ +/** \} group_scb_ezi2c_macro_sub_addr_size */ + +/** +* \defgroup group_scb_ezi2c_macro_get_activity EZI2C Activity Status +* Each EZI2C slave status is encoded in a separate bit, therefore multiple bits +* may be set to indicate the current status. +* \{ +*/ + +/** Read transfer complete. The transfer intended for the primary slave address. +* The error condition status bit must be checked to ensure that read +* transfer was completed successfully. +*/ +#define CY_SCB_EZI2C_STATUS_READ1 (0x01UL) + +/** +* Write transfer complete. The buffer content was modified. The transfer +* intended for the primary slave address. +* The error condition status bit must be checked to ensure that write transfer +* was completed successfully. +*/ +#define CY_SCB_EZI2C_STATUS_WRITE1 (0x02UL) + +/** Read transfer complete. The transfer intended for the secondary slave +* address. +* The error condition status bit must be checked to ensure that read +* transfer was completed successfully. +*/ +#define CY_SCB_EZI2C_STATUS_READ2 (0x04UL) + +/** Write transfer complete. The buffer content was modified. The transfer +* intended for the primary slave address. +* The error condition status bit must be checked to ensure that write transfer +* was completed successfully. +*/ +#define CY_SCB_EZI2C_STATUS_WRITE2 (0x08UL) + +/** A transfer intended for the primary address or secondary address is in +* progress. The status bit is set after an address match and cleared +* on a Stop or ReStart condition. +*/ +#define CY_SCB_EZI2C_STATUS_BUSY (0x10UL) + +/** An error occurred during a transfer intended for the primary or secondary +* slave address. The sources of error are: misplaced Start or Stop condition or +* lost arbitration while slave drives SDA. When CY_SCB_EZI2C_STATUS_ERR is +* set the slave buffer may contain invalid byte. It is recommended to +* discard buffer content in this case. +*/ +#define CY_SCB_EZI2C_STATUS_ERR (0x20UL) +/** \} group_scb_ezi2c_macro_get_activity */ + +/** This value is returned by the slave when the buffer is not configured or +* the master requests more byte than available in the buffer. +*/ +#define CY_SCB_EZI2C_DEFAULT_TX (0xFFUL) + + +/*************************************** +* Internal Constants +***************************************/ + +/** \cond INTERNAL */ +/* Default registers values */ +#define CY_SCB_EZI2C_I2C_CTRL (SCB_I2C_CTRL_S_GENERAL_IGNORE_Msk | SCB_I2C_CTRL_SLAVE_MODE_Msk) +#define CY_SCB_EZI2C_DATA_WIDTH (7UL) +#define CY_SCB_EZI2C_RX_CTRL (_VAL2FLD(SCB_RX_CTRL_DATA_WIDTH, CY_SCB_EZI2C_DATA_WIDTH) | \ + SCB_RX_CTRL_MSB_FIRST_Msk) +#define CY_SCB_EZI2C_TX_CTRL (CY_SCB_EZI2C_RX_CTRL) + +#define CY_SCB_EZI2C_SLAVE_INTR (CY_SCB_SLAVE_INTR_I2C_ADDR_MATCH | CY_SCB_SLAVE_INTR_I2C_STOP | \ + CY_SCB_SLAVE_INTR_I2C_BUS_ERROR | CY_SCB_SLAVE_INTR_I2C_ARB_LOST) +/* Error interrupt sources */ +#define CY_SCB_EZI2C_SLAVE_INTR_ERROR (CY_SCB_SLAVE_INTR_I2C_BUS_ERROR | CY_SCB_SLAVE_INTR_I2C_ARB_LOST) + +/* Disables Stop interrupt source */ +#define CY_SCB_EZI2C_SLAVE_INTR_NO_STOP (CY_SCB_EZI2C_SLAVE_INTR & ((uint32_t) ~CY_SCB_SLAVE_INTR_I2C_STOP)) + +/* FIFO size */ +#define CY_SCB_EZI2C_FIFO_SIZE (128UL) +#define CY_SCB_EZI2C_HALF_FIFO_SIZE (CY_SCB_EZI2C_FIFO_SIZE / 2UL) + +#define CY_SCB_EZI2C_ONE_ADDRESS_MASK (0xFFUL) +/** \endcond */ +/** \} group_scb_ezi2c_macro */ + + +/*************************************** +* Inline Function Implementation +***************************************/ + +/** +* \addtogroup group_scb_ezi2c_functions +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_SCB_EZI2C_Enable +****************************************************************************//** +* +* Enables the SCB block for the EZI2C operation +* +* \param base +* The pointer to the EZI2C SCB instance. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_EZI2C_Enable(CySCB_Type *base) +{ + base->CTRL |= SCB_CTRL_ENABLED_Msk; +} +/** \} group_scb_ezi2c_functions */ + +#if defined(__cplusplus) +} +#endif + +/** \} group_scb_ezi2c */ + +#endif /* (CY_SCB_EZI2C_H) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_i2c.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_i2c.c new file mode 100644 index 0000000000..350d7446c3 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_i2c.c @@ -0,0 +1,2791 @@ +/***************************************************************************//** +* \file cy_scb_i2c.c +* \version 1.0 +* +* Provides I2C API implementation of the SCB driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_scb_i2c.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/*************************************** +* Function Prototypes +***************************************/ + +static void SlaveInterrupt (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +static void SlaveHandleAddress (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +static void SlaveHandleDataReceive (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +static void SlaveHandleDataTransmit(CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +static void SlaveHandleStop (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); + +static void MasterInterrupt (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +static void MasterHandleDataTransmit(CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +static void MasterHandleDataReceive (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +static void MasterHandleStop (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +static void MasterHandleComplete (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); + +static cy_en_scb_i2c_status_t HandleStatus(CySCB_Type *base, uint32_t status, + cy_stc_scb_i2c_context_t *context); +static uint32_t WaitOneUnit(uint32_t *timeout); + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_Init +****************************************************************************//** +* +* Initializes the SCB for the I2C operation. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param config +* The pointer to the configuration structure \ref cy_stc_scb_i2c_config_t. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_i2c_status_t +* +* \note +* Ensure that the SCB block is disabled before calling this function. +* +*******************************************************************************/ +cy_en_scb_i2c_status_t Cy_SCB_I2C_Init(CySCB_Type *base, cy_stc_scb_i2c_config_t const *config, cy_stc_scb_i2c_context_t *context) +{ + cy_en_scb_i2c_status_t retStatus = CY_SCB_I2C_BAD_PARAM; + + if ((NULL != base) && (NULL != config) && (NULL != context)) + { + /* Configure the I2C interface */ + base->CTRL = (config->acceptAddrInFifo ? SCB_CTRL_ADDR_ACCEPT_Msk : 0UL) | + (config->enableWakeFromSleep ? SCB_CTRL_EC_AM_MODE_Msk : 0UL) | + SCB_CTRL_BYTE_MODE_Msk; + + base->I2C_CTRL = (config->ackGeneralAddr ? 0UL : SCB_I2C_CTRL_S_GENERAL_IGNORE_Msk) | + _VAL2FLD(CY_SCB_I2C_CTRL_MODE, config->i2cMode); + + /* Configure the RX direction */ + base->RX_CTRL = CY_SCB_I2C_RX_CTRL; + base->RX_FIFO_CTRL = (config->useRxFifo ? (CY_SCB_I2C_FIFO_SIZE - 1UL) : 0UL); + + /* Set the default address and mask */ + base->RX_MATCH = _VAL2FLD(SCB_RX_MATCH_ADDR, ((uint32_t) config->slaveAddress << 1UL)) | + _VAL2FLD(SCB_RX_MATCH_MASK, (uint32_t) config->slaveAddressMask); + + /* Configure the TX direction */ + base->TX_CTRL = CY_SCB_I2C_TX_CTRL; + base->TX_FIFO_CTRL = (config->useTxFifo ? CY_SCB_I2C_HALF_FIFO_SIZE : 1UL); + + /* Configure interrupt sources */ + base->INTR_SPI_EC_MASK = 0UL; + base->INTR_I2C_EC_MASK = 0UL; + base->INTR_RX_MASK = 0UL; + base->INTR_TX_MASK = 0UL; + base->INTR_M_MASK = 0UL; + + base->INTR_S_MASK = (0UL != (CY_SCB_I2C_SLAVE & config->i2cMode)) ? CY_SCB_I2C_SLAVE_INTR : 0UL; + + /* Initialize the context */ + context->useRxFifo = config->useRxFifo; + context->useTxFifo = config->useTxFifo; + + context->state = CY_SCB_I2C_IDLE; + + /* Master-specific */ + context->masterStatus = 0UL; + context->masterBufferIdx = 0UL; + + /* Slave-specific */ + context->slaveStatus = 0UL; + + context->slaveRxBufferIdx = 0UL; + context->slaveRxBufferSize = 0UL; + + context->slaveTxBufferIdx = 0UL; + context->slaveTxBufferSize = 0UL; + + /* Unregister callbacks */ + context->cbEvents = NULL; + context->cbAddr = NULL; + + retStatus = CY_SCB_I2C_SUCCESS; + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_DeInit +****************************************************************************//** +* +* De-initializes the SCB block, returns register values to default. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \note +* Ensure that the SCB block is disabled before calling this function. +* +*******************************************************************************/ +void Cy_SCB_I2C_DeInit(CySCB_Type *base) +{ + /* Returns block registers into the default state */ + base->CTRL = CY_SCB_CTRL_DEF_VAL; + base->I2C_CTRL = CY_SCB_I2C_CTRL_DEF_VAL; + + base->RX_CTRL = CY_SCB_RX_CTRL_DEF_VAL; + base->RX_FIFO_CTRL = 0UL; + base->RX_MATCH = 0UL; + + base->TX_CTRL = CY_SCB_TX_CTRL_DEF_VAL; + base->TX_FIFO_CTRL = 0UL; + + base->INTR_SPI_EC_MASK = 0UL; + base->INTR_I2C_EC_MASK = 0UL; + base->INTR_RX_MASK = 0UL; + base->INTR_TX_MASK = 0UL; + base->INTR_M_MASK = 0UL; + base->INTR_S_MASK = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_Disable +****************************************************************************//** +* +* Disables the SCB block and clears context statuses. +* Note that after the block is disabled, the TX and RX FIFOs and hardware +* statuses are cleared. Also, the hardware stops driving the output and +* ignores the input. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* Calling this function when I2C is busy (master preforms transaction or slave +* was address and communicates with master) may cause transaction corruption +* because the hardware stops driving the output and ignores the input. +* It is recommenced to ensure that I2C is not busy before calling this function. +* +*******************************************************************************/ +void Cy_SCB_I2C_Disable(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + base->CTRL &= (uint32_t) ~SCB_CTRL_ENABLED_Msk; + + /* Set the state to default and clear statuses */ + context->state = CY_SCB_I2C_IDLE; + context->masterStatus = 0UL; + context->slaveStatus = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_DeepSleep +****************************************************************************//** +* +* Configures the I2C slave to be a wake-up source from Deep Sleep on address +* match: configures the wake-up behavior and enables wake-up interrupt. +* Note that a wake-up from the Deep Sleep option must be enabled during +* initialization. If this was not done, this function does nothing. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param wakeupAction +* Determines the slaves behavior after a wake-up: NAKs address (master has to +* retry) or stretches the clock and continues the transaction when the device +* is awaken. +* See \ref group_scb_i2c_macro_wake_up for the set of constants. +* +* \note +* Not all SCB blocks are capable to be a wake-up source from Deep Sleep. +* Consult the device datasheet to determine which SCB supports this option. +* +*******************************************************************************/ +void Cy_SCB_I2C_DeepSleep(CySCB_Type *base, uint32_t wakeupAction) +{ + if (_FLD2BOOL(SCB_CTRL_EC_AM_MODE, base->CTRL)) + { + if (CY_SCB_I2C_WAKEUP_NACK == wakeupAction) + { + base->I2C_CTRL |= (uint32_t) SCB_I2C_CTRL_S_NOT_READY_ADDR_NACK_Msk; + } + else + { + base->I2C_CTRL &= (uint32_t) ~SCB_I2C_CTRL_S_NOT_READY_ADDR_NACK_Msk; + } + + Cy_SCB_SetI2CInterruptMask(base, CY_SCB_I2C_INTR_WAKEUP); + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_Wakeup +****************************************************************************//** +* +* Disables the wake-up interrupt. +* +* \param base +* The pointer to the I2C SCB instance. +* +*******************************************************************************/ +void Cy_SCB_I2C_Wakeup(CySCB_Type *base) +{ + if (_FLD2BOOL(SCB_CTRL_EC_AM_MODE, base->CTRL)) + { + Cy_SCB_SetI2CInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SetDataRate +****************************************************************************//** +* +* Configures the SCB to work at the desired data rate. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param dataRateHz +* The desired data Rate in Hz. +* +* \param scbClockkHz +* The frequency of the clock connected to the SCB in kHz. +* +* \return +* The achieved data rate in Hz. +* +* \note +* This function does not change the values of the clock divider connected +* to the SCB, it only changes the SCB clock oversample registers. If this +* function is not able to achieve the desired data rate, then the clock +* divider has to be adjusted. Call this function only while the SCB is +* disabled. For the slave, this function only checks that the attached clock is +* fast enough to meet the desired data rate, it does not change any registers. +* +*******************************************************************************/ +uint32_t Cy_SCB_I2C_SetDataRate(CySCB_Type *base, uint32_t dataRateHz, uint32_t scbClockkHz) +{ + uint32_t actDataRate = 1UL; + + if (CY_SCB_I2C_SLAVE == _FLD2VAL(CY_SCB_I2C_CTRL_MODE, base->I2C_CTRL)) + { + actDataRate = Cy_SCB_I2C_GetDataRate(base, scbClockkHz); + + /* Use an analog filter */ + base->RX_CTRL &= (uint32_t) SCB_RX_CTRL_MEDIAN_Msk; + base->I2C_CFG = CY_SCB_I2C_ENABLE_ANALOG_FITLER; + } + else + { + uint32_t idx = 0UL; + uint32_t dutyCycleLow; + uint32_t dutyCycleHigh; + + uint32_t fstpClockMin = (CY_SCB_I2C_MASTER == _FLD2VAL(CY_SCB_I2C_CTRL_MODE, base->I2C_CTRL)) ? + CY_SCB_I2C_MASTER_FSTP_MIN : CY_SCB_I2C_SLAVE_FSTP_CLK_MIN; + + /* Check the clock to be in the range and set the minimum duty cycle */ + if ((scbClockkHz >= CY_SCB_I2C_MASTER_STD_CLK_MIN) && (scbClockkHz <= CY_SCB_I2C_MASTER_STD_CLK_MAX)) + { + dutyCycleLow = CY_SCB_I2C_MASTER_STD_LOW_MIN; + dutyCycleHigh = CY_SCB_I2C_MASTER_STD_HIGH_MIN; + } + else if ((scbClockkHz >= CY_SCB_I2C_MASTER_FST_MIN) && (scbClockkHz <= CY_SCB_I2C_MASTER_FST_MIN)) + { + dutyCycleLow = CY_SCB_I2C_MASTER_FST_LOW_MIN; + dutyCycleHigh = CY_SCB_I2C_MASTER_FST_HIGH_MIN; + } + else if ((scbClockkHz >= fstpClockMin) && (scbClockkHz <= CY_SCB_I2C_MASTER_FSTP_MAX)) + { + dutyCycleLow = CY_SCB_I2C_MASTER_FSTP_LOW_MIN; + dutyCycleHigh = CY_SCB_I2C_MASTER_FSTP_HIGH_MIN; + } + else + { + /* The clock frequency is too low or it gets to the gap between + * the Fast and Fast Plus data rates + */ + actDataRate = 0UL; + } + + if (actDataRate > 0UL) + { + /* Adjust the duty cycle low and high to reach the requested data rate */ + do + { + /* Calculate the actual data rate */ + actDataRate = (1000U * scbClockkHz) / (dutyCycleLow + dutyCycleHigh); + + if (actDataRate > dataRateHz) + { + /* Increment the duty cycle low or high */ + if (0UL == (idx & 0x1U)) + { + if (dutyCycleLow < CY_SCB_I2C_PHASE_DUTY_CYCLE_MAX) + { + ++dutyCycleLow; + } + } + else + { + if (dutyCycleHigh < CY_SCB_I2C_PHASE_DUTY_CYCLE_MAX) + { + ++dutyCycleHigh; + } + + if (dutyCycleLow == CY_SCB_I2C_PHASE_DUTY_CYCLE_MAX) + { + ++idx; + } + } + + ++idx; + } + else + { + break; + } + } + while ((dutyCycleLow + dutyCycleHigh) < CY_SCB_I2C_DUTY_CYCLE_MAX); + + /* Configure the duty cycle low and high */ + Cy_SCB_I2C_MasterSetLowPhaseDutyCycle (base, dutyCycleLow); + Cy_SCB_I2C_MasterSetHighPhaseDutyCycle(base, dutyCycleHigh); + + /* Update the actual data rate for the case when the low and high duty cycle are max values */ + actDataRate = (1000U * scbClockkHz) / (dutyCycleLow + dutyCycleHigh); + + /* Update the filter settings */ + if (actDataRate > CY_SCB_I2C_SLAVE_FST_DATA_RATE) + { + /* Use a digital filter */ + base->RX_CTRL |= (uint32_t) SCB_RX_CTRL_MEDIAN_Msk; + base->I2C_CFG = CY_SCB_I2C_DISABLE_ANALOG_FITLER; + } + else + { + /* Use an analog filter */ + base->RX_CTRL &= (uint32_t) SCB_RX_CTRL_MEDIAN_Msk; + base->I2C_CFG = CY_SCB_I2C_ENABLE_ANALOG_FITLER; + } + } + } + + return (actDataRate); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_GetDataRate +****************************************************************************//** +* +* Returns the data rate for the selected SCB block. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param scbClockkHz +* The frequency of the clock connected to the SCB in kHz. +* +* \return +* The data rate in Hz. +* +*******************************************************************************/ +uint32_t Cy_SCB_I2C_GetDataRate(CySCB_Type const *base, uint32_t scbClockkHz) +{ + uint32_t actDataRate; + + if (_FLD2VAL(CY_SCB_I2C_CTRL_MODE, base->I2C_CTRL) == CY_SCB_I2C_SLAVE) + { + /* Check the clock frequency range to get maximum supported data rate */ + if ((scbClockkHz >= CY_SCB_I2C_SLAVE_FST_CLK_MIN) && (scbClockkHz <= CY_SCB_I2C_SLAVE_FST_CLK_MAX)) + { + actDataRate = CY_SCB_I2C_SLAVE_FST_DATA_RATE; + } + else if ((scbClockkHz >= CY_SCB_I2C_SLAVE_STD_CLK_MIN) && (scbClockkHz <= CY_SCB_I2C_SLAVE_STD_CLK_MAX)) + { + actDataRate = CY_SCB_I2C_SLAVE_STD_DATA_RATE; + } + else if ((scbClockkHz >= CY_SCB_I2C_SLAVE_FSTP_CLK_MIN) && (scbClockkHz <= CY_SCB_I2C_SLAVE_FSTP_CLK_MAX)) + { + actDataRate = CY_SCB_I2C_SLAVE_FST_DATA_RATE; + } + else + { + /* The clock frequency is too low or it gets to the gap between + * Fast and Fast Plus data rates. + */ + actDataRate = 0UL; + } + } + else + { + uint32_t dutyCycle; + + dutyCycle = (_FLD2VAL(SCB_I2C_CTRL_LOW_PHASE_OVS, base->I2C_CTRL) + 1U); + dutyCycle += (_FLD2VAL(SCB_I2C_CTRL_HIGH_PHASE_OVS, base->I2C_CTRL) + 1U); + + /* Calculate the actual data rate */ + actDataRate = (1000UL * scbClockkHz) / dutyCycle; + } + + return (actDataRate); +} + + +/******************************************************************************* +* I2C Slave API +*******************************************************************************/ + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveGetStatus +****************************************************************************//** +* +* Returns the current I2C slave status. +* This status is a bit mask and the value returned may have multiple bits set. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref group_scb_i2c_macro_slave_status. +* +*******************************************************************************/ +uint32_t Cy_SCB_I2C_SlaveGetStatus(CySCB_Type const *base, cy_stc_scb_i2c_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->slaveStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveConfigReadBuf +****************************************************************************//** +* +* Configures the buffer pointer and the read buffer size. This is the buffer +* that the master reads data from. After this function is called, data +* transfer from the read buffer to the master is handled by +* \ref Cy_SCB_I2C_Interrupt. +* +* When Read transaction is completed (master generated Stop, ReStart or +* error occurred), the \ref CY_SCB_I2C_SLAVE_RD_BUSY status is cleared and +* the \ref CY_SCB_I2C_SLAVE_RD_CMPLT is set, also +* the \ref CY_SCB_I2C_SLAVE_RD_CMPLT_EVENT event is generated. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param rdBuf +* The pointer to the buffer with data to be read by the master. +* +* \param size +* An amount of data the master can read from rdBuf. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* * The Read buffer must not be modified and stay allocated until it has been +* read by the master. +* * If this function has not been called, and the master tries to read data +* from the slave a \ref CY_SCB_I2C_DEFAULT_TX is returned to the master. +* * If the master tries to read more bytes than available in the Read buffer, +* a \ref CY_SCB_I2C_SLAVE_RD_BUF_EMPTY_EVENT event occurs. The +* \ref CY_SCB_I2C_DEFAULT_TX is returned to the master if the buffer remains +* empty after an event notification. +* +*******************************************************************************/ +void Cy_SCB_I2C_SlaveConfigReadBuf(CySCB_Type const *base, uint8_t *rdBuf, uint32_t size, + cy_stc_scb_i2c_context_t *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + if (NULL != rdBuf) + { + context->slaveTxBuffer = rdBuf; + context->slaveTxBufferSize = size; + context->slaveTxBufferIdx = 0UL; + context->slaveTxBufferCnt = 0UL; + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveAbortRead +****************************************************************************//** +* +* Aborts the configured slave read buffer to be read by the master. +* If the master reads and "abort operation" is requested, the +* \ref CY_SCB_I2C_SLAVE_RD_BUF_EMPTY_EVENT event occurs. The +* \ref CY_SCB_I2C_DEFAULT_TX is returned to the master if the buffer remains +* empty after the event notification. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \sideeffect +* If the TX FIFO is used, this function clears it. +* The TX FIFO clear operation also clears the shift register, thus +* the shifter can be cleared in the middle of a data element transfer, +* corrupting it. The data element corruption means that all bits which has +* not been transmitted are transmitted as "ones" on the bus. +* +*******************************************************************************/ +void Cy_SCB_I2C_SlaveAbortRead(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t intrState; + + /* Suppress a compiler warning about unused variables */ + (void) base; + + intrState = Cy_SysLib_EnterCriticalSection(); + + /* Reset index to make write buffer empty */ + context->slaveTxBufferSize = 0UL; + + if ((context->useTxFifo) && + (0UL != (CY_SCB_I2C_SLAVE_RD_BUSY & context->slaveStatus))) + { + /* Clear TX FIFO from available data */ + Cy_SCB_ClearTxFifo(base); + } + + Cy_SysLib_ExitCriticalSection(intrState); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveGetReadTransferCount +****************************************************************************//** +* +* Returns the number of bytes read by the master since the last time +* \ref Cy_SCB_I2C_SlaveConfigReadBuf is called. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* The number of bytes read by the master. +* +* \note +* * This function returns an invalid value if read transaction was +* aborted or any of listed events occurred during the transaction: +* \ref CY_SCB_I2C_SLAVE_ARB_LOST, \ref CY_SCB_I2C_SLAVE_BUS_ERR. +* * This number is updated only when a transaction completes, either through +* an error or successfully. +* +*******************************************************************************/ +uint32_t Cy_SCB_I2C_SlaveGetReadTransferCount(CySCB_Type const *base, cy_stc_scb_i2c_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->slaveTxBufferCnt); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveClearReadStatus +****************************************************************************//** +* +* Clears the read status and error conditions flags and returns their values. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref group_scb_i2c_macro_slave_status. +* +* \note +* The \ref CY_SCB_I2C_SLAVE_RD_BUSY flag is not cleared. +* +*******************************************************************************/ +uint32_t Cy_SCB_I2C_SlaveClearReadStatus(CySCB_Type const *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t retStatus; + + /* Suppress a compiler warning about unused variables */ + (void) base; + + retStatus = (context->slaveStatus & CY_SCB_I2C_SLAVE_RD_CLEAR); + context->slaveStatus &= (uint32_t) ~CY_SCB_I2C_SLAVE_RD_CLEAR; + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveConfigWriteBuf +****************************************************************************//** +* +* Configures the buffer pointer and size of the write buffer. This is the buffer +* that the master writes data to. After this function is called data transfer +* from the master into the write buffer is handled by \ref Cy_SCB_I2C_Interrupt. +* +* When write transaction is completed (master generated Stop, ReStart or +* error occurred) the \ref CY_SCB_I2C_SLAVE_WR_BUSY status is cleared and +* the \ref CY_SCB_I2C_SLAVE_WR_CMPLT is set, also +* the \ref CY_SCB_I2C_SLAVE_WR_CMPLT_EVENT event is generated. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param wrBuf +* The pointer to buffer to store data written by the master. +* +* \param size +* Size of wrBuf. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* * The write buffer must not be modified and stay allocated until it has been +* written by the master. +* * If this function has not been called and the master tries to write data +* the 1st byte is NAKed and discarded. +* * If the master writes more bytes than slave can stores in the write buffer +* the \ref CY_SCB_I2C_SLAVE_WR_OVRFL status is set and slave will NACK last +* byte, unless the RX FIFO is used. Then the slave will NAK only after +* RX FIFO becomes full. +* * If the RX FIFO is used the minimum write buffer size is automatically +* the size of the RX FIFO. If write buffer is less than RX FIFO size extra +* bytes are ACKed and stored into RX FIFO but ignored by firmware. +* +*******************************************************************************/ +void Cy_SCB_I2C_SlaveConfigWriteBuf(CySCB_Type const *base, uint8_t *wrBuf, uint32_t size, + cy_stc_scb_i2c_context_t *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + if (NULL != wrBuf) + { + context->slaveRxBuffer = wrBuf; + context->slaveRxBufferSize = size; + context->slaveRxBufferIdx = 0UL; + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveAbortWrite +****************************************************************************//** +* +* Aborts the configured slave write buffer to be written by the master. +* If master writes and "abort operation" is requested the next incoming byte will +* be NAKed. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* If the RX FIFO is used the NAK will not be sent until RX FIFO +* becomes full however bytes accepted after abort request are ignored. +* +*******************************************************************************/ +void Cy_SCB_I2C_SlaveAbortWrite(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t intrState; + + /* Suppress a compiler warning about unused variables */ + (void) base; + + intrState = Cy_SysLib_EnterCriticalSection(); + + /* Reset index to make read buffer empty */ + context->slaveRxBufferSize = 0UL; + + if ((context->useRxFifo) && + (0UL != (CY_SCB_I2C_SLAVE_WR_BUSY & context->slaveStatus))) + { + /* Configure to NACK when RX FIFO is full and disable RX level + * interrupt sources to stop getting data from RX FIFO. + */ + base->I2C_CTRL |= SCB_I2C_CTRL_S_NOT_READY_DATA_NACK_Msk; + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } + + Cy_SysLib_ExitCriticalSection(intrState); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveGetWriteTransferCount +****************************************************************************//** +* +* Returns the number of bytes written by the master since the last time +* \ref Cy_SCB_I2C_SlaveConfigWriteBuf is called. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* Number of bytes written by the master. +* +* \note +* * This function returns an invalid value if write transaction was +* aborted or any of listed events occurred during the transaction: +* \ref CY_SCB_I2C_SLAVE_ARB_LOST, \ref CY_SCB_I2C_SLAVE_BUS_ERR. +* * This number is only updated when the transaction completes, either through +* an error or successfully. +* +*******************************************************************************/ +uint32_t Cy_SCB_I2C_SlaveGetWriteTransferCount(CySCB_Type const *base, cy_stc_scb_i2c_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->slaveRxBufferIdx); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveClearWriteStatus +****************************************************************************//** +* +* Clears the write status flags and error conditions flags returns and their +* values. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref group_scb_i2c_macro_slave_status. +* +* \note +* The \ref CY_SCB_I2C_SLAVE_WR_BUSY flag is not cleared. +* +*******************************************************************************/ +uint32_t Cy_SCB_I2C_SlaveClearWriteStatus(CySCB_Type const *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t retStatus; + + /* Suppress a compiler warning about unused variables */ + (void) base; + + retStatus = (context->slaveStatus & CY_SCB_I2C_SLAVE_WR_CLEAR); + context->slaveStatus &= (uint32_t) ~CY_SCB_I2C_SLAVE_WR_CLEAR; + + return (retStatus); +} + + +/******************************************************************************* +* I2C Master API: High level +*******************************************************************************/ + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterGetStatus +****************************************************************************//** +* +* Returns the current I2C master status. +* This status is a bit mask and the value returned may have multiple bits set. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref group_scb_i2c_macro_master_status. +* Note that not all I2C master statuses are returned by this function. Refer to +* more details of each status. +* +* \note +* Status is cleared by calling \ref Cy_SCB_I2C_MasterRead or +* \ref Cy_SCB_I2C_MasterWrite. +* +*******************************************************************************/ +uint32_t Cy_SCB_I2C_MasterGetStatus(CySCB_Type const *base, cy_stc_scb_i2c_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->masterStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterRead +****************************************************************************//** +* +* This function configures the master to automatically read an entire buffer +* of data from the slave device. After the transaction is initiated by this +* function it returns and \ref Cy_SCB_I2C_Interrupt manages further data +* transfer. +* +* When a read transaction is completed (requested number of bytes are read or +* error occurred) the \ref CY_SCB_I2C_MASTER_BUSY status is cleared and +* the \ref CY_SCB_I2C_MASTER_RD_CMPLT_EVENT event is generated. +* +* Note that the master must read at least one byte. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param masterXferConfig +* Master transfer configuration structure +* \ref cy_stc_scb_i2c_master_xfer_config_t. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_i2c_status_t +* +* \note +* The buffer must not be modified and stay allocated until read operation +* completion. +* +*******************************************************************************/ +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterRead(CySCB_Type *base, + cy_stc_scb_i2c_master_xfer_config_t *masterXferConfig, + cy_stc_scb_i2c_context_t *context) +{ + cy_en_scb_i2c_status_t retStatus = CY_SCB_I2C_MASTER_NOT_READY; + + /* Disable I2C slave interrupt sources to protect state */ + Cy_SCB_SetSlaveInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + if (0UL != (CY_SCB_I2C_IDLE_MASK & context->state)) + { + uint32_t intrState; + + /* Setup context */ + context->masterStatus = CY_SCB_I2C_MASTER_BUSY; + + context->masterBuffer = masterXferConfig->buffer; + context->masterBufferSize = masterXferConfig->bufferSize; + context->masterBufferIdx = 0UL; + context->masterNumBytes = 0UL; + context->masterPause = masterXferConfig->xferPending; + context->masterRdDir = true; + + /* Clean-up hardware before transfer. Note RX FIFO is empty at here */ + Cy_SCB_ClearMasterInterrupt(base, CY_SCB_I2C_MASTER_INTR_ALL); + Cy_SCB_ClearTxFifo(base); + + if (CY_SCB_I2C_IDLE == context->state) + { + /* Generate Start condition */ + base->I2C_M_CMD = SCB_I2C_M_CMD_M_START_ON_IDLE_Msk; + } + else + { + /* Generate ReStart condition. Note if previous transfer was read, + * NACK is generated before ReStart to complete it. + */ + base->I2C_M_CMD = (SCB_I2C_M_CMD_M_START_Msk | (_FLD2BOOL(SCB_I2C_STATUS_M_READ, base->I2C_STATUS) ? + SCB_I2C_M_CMD_M_NACK_Msk : 0UL)); + } + + /* Put address in TX FIFO */ + Cy_SCB_WriteTxFifo(base, (CY_SCB_I2C_READ_XFER | _VAL2FLD(CY_SCB_I2C_ADDRESS, masterXferConfig->slaveAddress))); + + /* Configure interrupt for data reception */ + if ((context->useRxFifo) && (!context->masterPause) && (context->masterBufferSize >= 2UL)) + { + /* Enable Auto data ACK */ + base->I2C_CTRL |= SCB_I2C_CTRL_M_READY_DATA_ACK_Msk; + + /* Adjust level in RX FIFO */ + Cy_SCB_SetRxFifoLevel(base, (context->masterBufferSize <= CY_SCB_I2C_FIFO_SIZE) ? + (context->masterBufferSize - 2UL) : (CY_SCB_I2C_HALF_FIFO_SIZE - 1UL)); + + context->state = CY_SCB_I2C_MASTER_RX1; + } + else + { + /* Adjust level in RX FIFO */ + Cy_SCB_SetRxFifoLevel(base, 0UL); + + context->state = CY_SCB_I2C_MASTER_RX0; + } + + /* Enable interrupt sources to continue transfer. + * Requires critical section to not cause race condition between RX and Master + * interrupt sources. + */ + intrState = Cy_SysLib_EnterCriticalSection(); + Cy_SCB_SetRxInterruptMask (base, CY_SCB_RX_INTR_LEVEL); + Cy_SCB_SetMasterInterruptMask(base, CY_SCB_I2C_MASTER_INTR); + Cy_SysLib_ExitCriticalSection(intrState); + + retStatus = CY_SCB_I2C_SUCCESS; + } + + /* Enable I2C slave interrupt sources */ + Cy_SCB_SetSlaveInterruptMask(base, CY_SCB_I2C_SLAVE_INTR); + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterAbortRead +****************************************************************************//** +* +* This function requests master to abort read operation by NAKing the next byte +* and generating a Stop condition. The function does not wait until these +* actions are completed therefore next read operation can be initiated only +* after the \ref CY_SCB_I2C_MASTER_BUSY is cleared. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +******************************************************************************/ +void Cy_SCB_I2C_MasterAbortRead(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t intrState; + + intrState = Cy_SysLib_EnterCriticalSection(); + + if (0UL != (CY_SCB_I2C_MASTER_BUSY & context->masterStatus)) + { + if ((CY_SCB_I2C_MASTER_RX0 == context->state) || (CY_SCB_I2C_MASTER_RX1 == context->state)) + { + if (context->useRxFifo) + { + /* Disable RX processing */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + /* Change state and request Stop generation */ + context->state = CY_SCB_I2C_MASTER_STOP; + + /* Enable ACK interrupt source to generate Stop after Start was generated */ + Cy_SCB_SetMasterInterruptMask(base, CY_SCB_I2C_MASTER_INTR_ALL); + } + else + { + /* Reduce buffer to minimum value and request Stop generation */ + context->masterPause = false; + context->masterBufferSize = 1UL; + } + } + } + else + { + /* Master waits for ReStart */ + if (CY_SCB_I2C_MASTER_WAIT == context->state) + { + /* Generate NAK + Stop */ + base->I2C_M_CMD = (SCB_I2C_M_CMD_M_STOP_Msk | SCB_I2C_M_CMD_M_NACK_Msk); + } + } + + Cy_SysLib_ExitCriticalSection(intrState); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterWrite +****************************************************************************//** +* +* This function configures the master to automatically write an entire buffer +* of data to a slave device. After the transaction is initiated by this +* function it returns and \ref Cy_SCB_I2C_Interrupt manages further data +* transfer. +* +* When a write transaction is completed (requested number of bytes are written +* or error occurred) the \ref CY_SCB_I2C_MASTER_BUSY status is cleared and +* the \ref CY_SCB_I2C_MASTER_WR_CMPLT_EVENT event is generated. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param masterXferConfig +* Master transfer configuration structure +* \ref cy_stc_scb_i2c_master_xfer_config_t. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_i2c_status_t +* +* \note +* The buffer must not be modified and stay allocated until data has been +* copied into TX FIFO. +* +*******************************************************************************/ +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterWrite(CySCB_Type *base, + cy_stc_scb_i2c_master_xfer_config_t *masterXferConfig, + cy_stc_scb_i2c_context_t *context) +{ + cy_en_scb_i2c_status_t retStatus = CY_SCB_I2C_MASTER_NOT_READY; + + /* Disable I2C slave interrupt sources to protect state */ + Cy_SCB_SetSlaveInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + if (0UL != (CY_SCB_I2C_IDLE_MASK & context->state)) + { + uint32_t intrState; + + /* Setup context */ + context->masterStatus = CY_SCB_I2C_MASTER_BUSY; + + context->masterBuffer = masterXferConfig->buffer; + context->masterBufferSize = masterXferConfig->bufferSize; + context->masterBufferIdx = 0UL; + context->masterNumBytes = 0UL; + context->masterPause = masterXferConfig->xferPending; + context->masterRdDir = false; + + /* Clean-up hardware before transfer. Note RX FIFO is empty at here */ + Cy_SCB_ClearMasterInterrupt(base, CY_SCB_I2C_MASTER_INTR_ALL); + Cy_SCB_ClearTxFifo(base); + + if (CY_SCB_I2C_IDLE == context->state) + { + /* Generate Start condition */ + base->I2C_M_CMD = SCB_I2C_M_CMD_M_START_ON_IDLE_Msk; + } + else + { + /* Generate ReStart condition. Note if previous transfer was read, + * NACK is generated before ReStart to complete it. + */ + base->I2C_M_CMD = (SCB_I2C_M_CMD_M_START_Msk | (_FLD2BOOL(SCB_I2C_STATUS_M_READ, base->I2C_STATUS) ? + SCB_I2C_M_CMD_M_NACK_Msk : 0UL)); + } + + /* Put address in TX FIFO */ + Cy_SCB_WriteTxFifo(base, _VAL2FLD(CY_SCB_I2C_ADDRESS, masterXferConfig->slaveAddress)); + + context->state = CY_SCB_I2C_MASTER_TX; + + /* TX FIFO is empty. Set level to start transfer */ + Cy_SCB_SetTxFifoLevel(base, (context->useTxFifo) ? CY_SCB_I2C_HALF_FIFO_SIZE : (1UL)); + + /* Enable interrupt sources to continue transfer. + * Requires critical section to not cause race condition between TX and Master + * interrupt sources. + */ + intrState = Cy_SysLib_EnterCriticalSection(); + Cy_SCB_SetTxInterruptMask (base, CY_SCB_TX_INTR_LEVEL); + Cy_SCB_SetMasterInterruptMask(base, CY_SCB_I2C_MASTER_INTR); + Cy_SysLib_ExitCriticalSection(intrState); + + retStatus = CY_SCB_I2C_SUCCESS; + } + + /* Enable I2C slave interrupt sources */ + Cy_SCB_SetSlaveInterruptMask(base, CY_SCB_I2C_SLAVE_INTR); + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterAbortWrite +****************************************************************************//** +* +* This function requests master to abort write operation by generating Stop +* condition. The function does not wait until this action is completed, +* therefore next write operation can be initiated only after the +* \ref CY_SCB_I2C_MASTER_BUSY is cleared. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \sideeffect +* If the TX FIFO is used it is cleared before Stop generation. +* The TX FIFO clear operation also clears shift register thus shifter +* could be cleared in the middle of a data element transfer, corrupting it. +* The remaining bits to transfer within corrupted data element are +* complemented with ones. +* +*******************************************************************************/ +void Cy_SCB_I2C_MasterAbortWrite(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t intrState; + + intrState = Cy_SysLib_EnterCriticalSection(); + + if (0UL != (CY_SCB_I2C_MASTER_BUSY & context->masterStatus)) + { + /* Disable TX processing */ + Cy_SCB_SetTxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + if (context->useTxFifo) + { + /* Clear TX FIFO to allow Stop generation */ + Cy_SCB_ClearTxFifo(base); + } + + if ((CY_SCB_I2C_MASTER_TX == context->state) || (CY_SCB_I2C_MASTER_TX_DONE == context->state)) + { + /* Request Stop generation */ + context->state = CY_SCB_I2C_MASTER_STOP; + + /* Enable ACK interrupt source to trigger Stop generation */ + Cy_SCB_SetMasterInterruptMask(base, CY_SCB_I2C_MASTER_INTR_ALL); + } + } + else + { + /* Master waits for ReStart */ + if (CY_SCB_I2C_MASTER_WAIT == context->state) + { + /* Generate Stop */ + base->I2C_M_CMD = (SCB_I2C_M_CMD_M_STOP_Msk | SCB_I2C_M_CMD_M_NACK_Msk); + } + } + + Cy_SysLib_ExitCriticalSection(intrState); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterGetTransferCount +****************************************************************************//** +* +* Returns the number of bytes transferred since the last call of +* \ref Cy_SCB_I2C_MasterWrite or \ref Cy_SCB_I2C_MasterRead function. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* Number of bytes read or written by the master. +* +* \note +* * This function returns an invalid value if read or write transaction was +* aborted or any of listed events occurred during the transaction: +* \ref CY_SCB_I2C_MASTER_ARB_LOST, \ref CY_SCB_I2C_MASTER_BUS_ERR or +* \ref CY_SCB_I2C_MASTER_ABORT_START. +* +* * This number is only updated when the transaction completes, either through +* an error or successfully. +* +*******************************************************************************/ +uint32_t Cy_SCB_I2C_MasterGetTransferCount(CySCB_Type const *base, cy_stc_scb_i2c_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->masterNumBytes); +} + + +/******************************************************************************* +* I2C Master API: Low level +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterSendStart +****************************************************************************//** +* +* Generates a Start condition and sends a slave address with the Read/Write bit. +* This function is blocking and it does not return until the Start condition +* and address byte are sent and a ACK/NAK is received, an error or timeout +* occurred. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param address +* 7 bit right justified slave address. +* +* \param bitRnW +* This sets the value of the Read/Write bit in the address, thus defining +* the direction of the following transfer. +* See \ref group_scb_i2c_macro_direction for the set of constants. +* +* \param timeoutMs +* Defines in milliseconds the time that this function can block for. +* If that time expires, the function returns. If a zero is passed, +* the function waits forever for the action to complete. If a timeout occurs, +* the SCB block is reset. Note The maximum value is sizeof(uint32_t)/1000. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_i2c_status_t +* +* \note +* After a Read transaction is initiated and the slave ACKs the address, at +* least one byte must be read before completing the transaction or changing +* its direction. +* +*******************************************************************************/ +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterSendStart(CySCB_Type *base, uint32_t address, + uint32_t bitRnW, uint32_t timeoutMs, + cy_stc_scb_i2c_context_t *context) +{ + cy_en_scb_i2c_status_t retStatus = CY_SCB_I2C_MASTER_NOT_READY; + + /* Disable the I2C slave interrupt sources to protect the state */ + Cy_SCB_SetSlaveInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + if (CY_SCB_I2C_IDLE == context->state) + { + uint32_t locStatus; + + /* Convert the timeout to microseconds */ + uint32_t timeout = (timeoutMs * 1000UL); + + /* Set the read or write direction */ + context->state = CY_SCB_I2C_MASTER_ADDR; + context->masterRdDir = (CY_SCB_I2C_READ_XFER == bitRnW); + + /* Clean up the hardware before a transfer. Note RX FIFO is empty at here */ + Cy_SCB_ClearMasterInterrupt(base, CY_SCB_I2C_MASTER_INTR_ALL); + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_NOT_EMPTY); + Cy_SCB_ClearTxFifo(base); + + /* Generate a Start and send address byte */ + Cy_SCB_WriteTxFifo(base, (_VAL2FLD(CY_SCB_I2C_ADDRESS, address) | bitRnW)); + base->I2C_M_CMD = SCB_I2C_M_CMD_M_START_ON_IDLE_Msk; + + /* Wait for a completion event from the master or slave */ + do + { + locStatus = ((CY_SCB_I2C_MASTER_TX_BYTE_DONE & Cy_SCB_GetMasterInterruptStatus(base)) | + (CY_SCB_I2C_SLAVE_ADDR_DONE & Cy_SCB_GetSlaveInterruptStatus(base))); + + locStatus |= WaitOneUnit(&timeout); + + } while (0UL == locStatus); + + retStatus = HandleStatus(base, locStatus, context); + } + + /* Enable I2C slave interrupt sources */ + Cy_SCB_SetSlaveInterruptMask(base, CY_SCB_I2C_SLAVE_INTR); + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterSendReStart +****************************************************************************//** +* +* Generates a ReStart condition and sends a slave address with the Read/Write +* bit. +* This function is blocking and it does not return until the ReStart condition +* and address byte are sent and an ACK/NAK is received, an error or timeout +* occurred. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param address +* A 7-bit right-justified slave address. +* +* \param bitRnW +* This sets the value of the Read/Write bit in the address, thus defining +* the direction of the following transfer. +* See \ref group_scb_i2c_macro_direction for the set of constants. +* +* \param timeoutMs +* Defines in milliseconds the time that this function can block for. +* If that time expires, the function returns. If a zero is passed, +* the function waits forever for the action to complete. If a timeout occurs, +* the SCB block is reset. Note The maximum value is sizeof(uint32_t)/1000. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_i2c_status_t +* +* \note +* * A successful transaction must be initiated by \ref Cy_SCB_I2C_MasterSendStart +* before calling this function. If this condition is not met, this function +* does nothing and returns \ref CY_SCB_I2C_MASTER_NOT_READY. +* * After a Read transaction is initiated and the slave ACKs the address, +* at least one byte must be read before completing the transaction or +* changing its direction. +* +*******************************************************************************/ +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterSendReStart(CySCB_Type *base, uint32_t address, + uint32_t bitRnW, uint32_t timeoutMs, + cy_stc_scb_i2c_context_t *context) +{ + cy_en_scb_i2c_status_t retStatus = CY_SCB_I2C_MASTER_NOT_READY; + + if (0UL != (CY_SCB_I2C_MASTER_ACTIVE & context->state)) + { + uint32_t locStatus; + + /* Convert the timeout to microseconds */ + uint32_t timeout = (timeoutMs * 1000UL); + + /* Set the read or write direction */ + context->state = CY_SCB_I2C_MASTER_ADDR; + context->masterRdDir = (CY_SCB_I2C_READ_XFER == bitRnW); + + /* Generate a restart (for write direction) and NACK plus restart for the Read direction */ + base->I2C_M_CMD = SCB_I2C_M_CMD_M_START_Msk | + (_FLD2BOOL(SCB_I2C_STATUS_M_READ, base->I2C_STATUS) ? + SCB_I2C_M_CMD_M_NACK_Msk : 0UL); + + /* Send the address byte */ + Cy_SCB_WriteTxFifo(base, (_VAL2FLD(CY_SCB_I2C_ADDRESS, address) | bitRnW)); + + /* Wait for a completion event from the or slave */ + do + { + locStatus = ((CY_SCB_I2C_MASTER_TX_BYTE_DONE & Cy_SCB_GetMasterInterruptStatus(base)) | + (CY_SCB_I2C_SLAVE_ADDR_DONE & Cy_SCB_GetSlaveInterruptStatus(base))); + + locStatus |= WaitOneUnit(&timeout); + + } while (0UL == locStatus); + + /* Convert the status from register plus timeout to the API status */ + retStatus = HandleStatus(base, locStatus, context); + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterSendStop +****************************************************************************//** +* +* Generates a Stop condition to complete the current transaction. +* This function is blocking and it does not return until the Stop condition +* is generated, an error occurred or timeout occurred. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param timeoutMs +* Defines in milliseconds the time that this function can block for. +* If that time expires, the function returns. If a zero is passed, +* the function waits forever for the action to complete. If a timeout occurs, +* the SCB block is reset. Note The maximum value is sizeof(uint32_t)/1000. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_i2c_status_t +* +* \note +* * A successful transaction must be initiated by +* \ref Cy_SCB_I2C_MasterSendStart or \ref Cy_SCB_I2C_MasterSendReStart +* before calling this function. If this condition is not met, this function +* does nothing and returns. +* \ref CY_SCB_I2C_MASTER_NOT_READY. +* * Even after the slave NAKs the address, this function has to be called +* to complete the transaction. +* +*******************************************************************************/ +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterSendStop(CySCB_Type *base,uint32_t timeoutMs, + cy_stc_scb_i2c_context_t *context) +{ + cy_en_scb_i2c_status_t retStatus = CY_SCB_I2C_MASTER_NOT_READY; + + if (0UL != (CY_SCB_I2C_MASTER_ACTIVE & context->state)) + { + uint32_t locStatus; + + /* Convert the timeout to microseconds */ + uint32_t timeout = (timeoutMs * 1000UL); + + /* Generate a stop (for Write direction) and NACK plus stop for the Read direction */ + base->I2C_M_CMD = (SCB_I2C_M_CMD_M_STOP_Msk | SCB_I2C_M_CMD_M_NACK_Msk); + + /* Wait for a completion event from the master or slave */ + do + { + locStatus = (CY_SCB_I2C_MASTER_STOP_DONE & Cy_SCB_GetMasterInterruptStatus(base)); + + locStatus |= WaitOneUnit(&timeout); + + } while (0UL == locStatus); + + /* Convert the status from register plus timeout to the API status */ + retStatus = HandleStatus(base, locStatus, context); + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterReadByte +****************************************************************************//** +* +* Reads one byte from a slave and generates an ACK or prepares to generate +* a NAK. The NAK will be generated before a Stop or ReStart condition by +* \ref Cy_SCB_I2C_MasterSendStop or \ref Cy_SCB_I2C_MasterSendReStart function +* appropriately. +* This function is blocking and it does not return until a byte is +* received, an error occurred or timeout occurred. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param ackNack +* A response to a received byte. +* See \ref group_scb_i2c_macro_ack_nack for the set of constants. +* +* \param byte +* The pointer to the location to store the Read byte. +* +* \param timeoutMs +* Defines in milliseconds the time that this function can block for. +* If that time expires, the function returns. If a zero is passed, +* the function waits forever for the action to complete. If a timeout occurs, +* the SCB block is reset. Note The maximum value is sizeof(uint32_t)/1000. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_i2c_status_t +* +* \note +* A successful transaction must be initiated by \ref Cy_SCB_I2C_MasterSendStart +* or \ref Cy_SCB_I2C_MasterSendReStart before calling this function. If this +* condition is not met, this function does nothing and returns +* \ref CY_SCB_I2C_MASTER_NOT_READY. +* +*******************************************************************************/ +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterReadByte(CySCB_Type *base, uint32_t ackNack, + uint8_t *byte, uint32_t timeoutMs, + cy_stc_scb_i2c_context_t *context) +{ + cy_en_scb_i2c_status_t retStatus = CY_SCB_I2C_MASTER_NOT_READY; + + if (CY_SCB_I2C_MASTER_RX0 == context->state) + { + bool rxEmpty; + + uint32_t locStatus; + + /* Convert the timeout to microseconds */ + uint32_t timeout = (timeoutMs * 1000UL); + + /* Wait for ACK/NAK transmission and data byte reception */ + do + { + locStatus = (CY_SCB_I2C_MASTER_RX_BYTE_DONE & Cy_SCB_GetMasterInterruptStatus(base)); + rxEmpty = (0UL == (CY_SCB_RX_INTR_NOT_EMPTY & Cy_SCB_GetRxInterruptStatus(base))); + + locStatus |= WaitOneUnit(&timeout); + + } while ((rxEmpty) && (0UL == locStatus)); + + /* The Read byte if available */ + if (!rxEmpty) + { + /* Get the received data byte */ + *byte = (uint8_t) Cy_SCB_ReadRxFifo(base); + + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_NOT_EMPTY | CY_SCB_RX_INTR_LEVEL); + } + + /* Convert the status from register plus timeout to the API status */ + retStatus = HandleStatus(base, locStatus, context); + + if (CY_SCB_I2C_SUCCESS == retStatus) + { + /* Generate ACK or wait for NAK generation */ + if (CY_SCB_I2C_ACK == ackNack) + { + base->I2C_M_CMD = SCB_I2C_M_CMD_M_ACK_Msk; + } + } + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterWriteByte +****************************************************************************//** +* +* Sends one byte to a slave. +* This function is blocking and it does not return until a byte is +* transmitted, an error occurred or timeout occurred. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param theByte +* The byte to write to a slave. +* +* \param timeoutMs +* Defines in milliseconds the time that this function can block for. +* If that time expires, the function returns. If a zero is passed, +* the function waits forever for the action to complete. If a timeout occurs, +* the SCB block is reset. Note The maximum value is sizeof(uint32_t)/1000. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_i2c_status_t +* +* \note +* A successful transaction must be initiated by \ref Cy_SCB_I2C_MasterSendStart +* or \ref Cy_SCB_I2C_MasterSendReStart before calling this function. If this +* condition is not met, this function does nothing and returns +* \ref CY_SCB_I2C_MASTER_NOT_READY. +* +*******************************************************************************/ +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterWriteByte(CySCB_Type *base, uint32_t theByte, + uint32_t timeoutMs, + cy_stc_scb_i2c_context_t *context) +{ + cy_en_scb_i2c_status_t retStatus = CY_SCB_I2C_MASTER_NOT_READY; + + if (CY_SCB_I2C_MASTER_TX == context->state) + { + uint32_t locStatus; + + /* Convert the timeout to microseconds */ + uint32_t timeout = (timeoutMs * 1000UL); + + /* Send the data byte */ + Cy_SCB_WriteTxFifo(base, theByte); + + /* Wait for a completion event from the master or slave */ + do + { + locStatus = (CY_SCB_I2C_MASTER_TX_BYTE_DONE & Cy_SCB_GetMasterInterruptStatus(base)); + locStatus |= WaitOneUnit(&timeout); + + } while (0UL == locStatus); + + /* Convert the status from register plus timeout to the API status */ + retStatus = HandleStatus(base, locStatus, context); + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_Interrupt +****************************************************************************//** +* +* This is the interrupt function for the SCB configured in the I2C mode. +* This function must be called inside the user-defined interrupt service +* routine in order for higher-level functions to work: +* * Slave: Any of the slave functions. +* * Master: \ref Cy_SCB_I2C_MasterRead and \ref Cy_SCB_I2C_MasterWrite. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +void Cy_SCB_I2C_Interrupt(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + if (0UL != (CY_SCB_I2C_MASTER_ACTIVE & context->state)) + { + /* Execute a transfer as the master */ + MasterInterrupt(base, context); + } + else + { + /* Execute a transfer as the slave */ + SlaveInterrupt(base, context); + } +} + + +/******************************************************************************* +* Function Name: SlaveInterrupt +****************************************************************************//** +* +* This is the interrupt function to execute a slave transfer. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void SlaveInterrupt(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t slaveIntrStatus; + + /* Handle an I2C wake-up event */ + if (0UL != (CY_SCB_I2C_INTR_WAKEUP & Cy_SCB_GetI2CInterruptStatusMasked(base))) + { + Cy_SCB_ClearI2CInterrupt(base, CY_SCB_I2C_INTR_WAKEUP); + } + + /* Handle the slave interrupt sources */ + slaveIntrStatus = Cy_SCB_GetSlaveInterruptStatusMasked(base); + + /* Handle the error conditions */ + if (0UL != (CY_SCB_I2C_SLAVE_INTR_ERROR & slaveIntrStatus)) + { + /* Update the status */ + context->slaveStatus |= (0UL != (CY_SCB_SLAVE_INTR_I2C_BUS_ERROR & slaveIntrStatus)) ? + CY_SCB_I2C_SLAVE_BUS_ERR : CY_SCB_I2C_SLAVE_ARB_LOST; + + /* Disable the RX interrupt source to drop data into RX FIFO if any */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + /* Add the stop status to back into the default state and set completion statuses */ + slaveIntrStatus |= CY_SCB_SLAVE_INTR_I2C_STOP; + } + else + { + if (0UL != (CY_SCB_SLAVE_INTR_I2C_STOP & slaveIntrStatus)) + { + /* Get data from the RX FIFO after a stop is generated if there is + * space to store it. + */ + if ((Cy_SCB_GetNumInRxFifo(base) > 0UL) && (context->slaveRxBufferSize > 0UL)) + { + Cy_SCB_SetRxInterrupt (base, CY_SCB_RX_INTR_LEVEL); + Cy_SCB_SetRxInterruptMask(base, CY_SCB_RX_INTR_LEVEL); + } + } + } + + /* Handle the receive direction (master writes data) */ + if (0UL != (CY_SCB_RX_INTR_LEVEL & Cy_SCB_GetRxInterruptStatusMasked(base))) + { + SlaveHandleDataReceive(base, context); + + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_LEVEL); + } + + /* Handle the transfer completion */ + if (0UL != (CY_SCB_SLAVE_INTR_I2C_STOP & slaveIntrStatus)) + { + SlaveHandleStop(base, context); + + Cy_SCB_ClearSlaveInterrupt(base, CY_SCB_SLAVE_INTR_I2C_STOP); + + /* Update the slave interrupt status */ + slaveIntrStatus = Cy_SCB_GetSlaveInterruptStatusMasked(base); + } + + /* Handle the address reception */ + if (0UL != (CY_SCB_I2C_SLAVE_INTR_ADDR & slaveIntrStatus)) + { + SlaveHandleAddress(base, context); + + Cy_SCB_ClearI2CInterrupt(base, CY_SCB_I2C_INTR_WAKEUP); + Cy_SCB_ClearSlaveInterrupt(base, CY_SCB_I2C_SLAVE_INTR_ADDR); + } + + /* Handle the transmit direction (master reads data) */ + if (0UL != (CY_SCB_I2C_SLAVE_INTR_TX & Cy_SCB_GetTxInterruptStatusMasked(base))) + { + SlaveHandleDataTransmit(base, context); + + Cy_SCB_ClearTxInterrupt(base, CY_SCB_TX_INTR_LEVEL); + } +} + + +/******************************************************************************* +* Function Name: SlaveHandleAddress +****************************************************************************//** +* +* Prepares the slave for the following Read or Write transfer after the +* matched address was received. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void SlaveHandleAddress(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + /* The default command is the ACK address. It can be overridden in an address callback */ + uint32_t cmd = CY_SCB_I2C_ACK; + + /* The callback for the address in RX FIFO or a general call */ + if (NULL != context->cbAddr) + { + uint32_t events = 0UL; + + /* Set an address in the FIFO event if the address accept is enabled */ + if (_FLD2BOOL(SCB_CTRL_ADDR_ACCEPT, base->CTRL)) + { + events = (0UL != (CY_SCB_SLAVE_INTR_I2C_ADDR_MATCH & Cy_SCB_GetSlaveInterruptStatusMasked(base))) ? + CY_SCB_I2C_ADDR_IN_FIFO_EVENT : 0UL; + } + + /* Set a general call event if "ignore general call" is disabled */ + if (!_FLD2BOOL(SCB_I2C_CTRL_S_GENERAL_IGNORE, base->I2C_CTRL)) + { + events |= (0UL != (CY_SCB_SLAVE_INTR_I2C_GENERAL_ADDR & Cy_SCB_GetSlaveInterruptStatusMasked(base))) ? + CY_SCB_I2C_GENERAL_CALL_EVENT : 0UL; + } + + /* Check presence of events before involve callback */ + if (0UL != events) + { + /* Involve a callback for the address phase and get the ACK/NACK command */ + cmd = context->cbAddr(events); + + /* Clear RX level interrupt after address reception */ + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_LEVEL); + + if (cmd == CY_SCB_I2C_ACK) + { + /* Clear the stall stop status and enable the stop interrupt source */ + Cy_SCB_ClearSlaveInterrupt(base, CY_SCB_SLAVE_INTR_I2C_STOP); + Cy_SCB_SetSlaveInterruptMask(base, CY_SCB_I2C_SLAVE_INTR); + } + else + { + /* Disable the stop interrupt source */ + Cy_SCB_SetI2CInterruptMask(base, CY_SCB_I2C_SLAVE_INTR_NO_STOP); + } + } + } + + /* Set the command to an ACK or NACK address */ + base->I2C_S_CMD = cmd; + + if (cmd == CY_SCB_I2C_ACK) + { + bool readDirection = _FLD2BOOL(SCB_I2C_STATUS_S_READ,base->I2C_STATUS); + + /* Notify the user about start of transfer */ + if (NULL != context->cbEvents) + { + context->cbEvents(readDirection ? CY_SCB_I2C_SLAVE_READ_EVENT : CY_SCB_I2C_SLAVE_WRITE_EVENT); + } + + /* Prepare for a transfer */ + if (readDirection) + { + context->state = CY_SCB_I2C_SLAVE_TX; + context->slaveStatus |= CY_SCB_I2C_SLAVE_RD_BUSY; + + /* Prepare to transmit data */ + context->slaveTxBufferIdx = context->slaveTxBufferCnt; + context->slaveRdBufEmpty = false; + Cy_SCB_ClearTxFifo(base); + Cy_SCB_SetTxInterruptMask(base, CY_SCB_TX_INTR_LEVEL); + } + else + { + uint32_t level = 0UL; + + context->state = CY_SCB_I2C_SLAVE_RX; + context->slaveStatus |= CY_SCB_I2C_SLAVE_WR_BUSY; + + /* Prepare to receive data */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_RX_INTR_LEVEL); + + if (context->useRxFifo) + { + if (context->slaveRxBufferSize > 0UL) + { + /* ACK data automatically until RX FIFO is full */ + base->I2C_CTRL |= SCB_I2C_CTRL_S_READY_DATA_ACK_Msk; + + if (context->slaveRxBufferSize > CY_SCB_I2C_FIFO_SIZE) + { + /* Set a level in RX FIFO to trigger the receive interrupt source */ + level = (context->slaveRxBufferSize - CY_SCB_I2C_FIFO_SIZE); + level = (level > CY_SCB_I2C_FIFO_SIZE) ? ((CY_SCB_I2C_FIFO_SIZE / 2UL) - 1UL) : (level - 1UL); + } + else + { + /* Set a level in RX FIFO to read the number of bytes */ + level = (context->slaveRxBufferSize - 1UL); + + /* NACK when RX FIFO becomes full */ + base->I2C_CTRL |= SCB_I2C_CTRL_S_NOT_READY_DATA_NACK_Msk; + + /* Disable the RX level interrupt and wait until RX FIFO is full or stops */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } + } + } + + Cy_SCB_SetRxFifoLevel(base, level); + } + } +} + + +/******************************************************************************* +* Function Name: SlaveHandleDataReceive +****************************************************************************//** +* +* Reads data from RX FIFO into the buffer provided by +* \ref Cy_SCB_I2C_SlaveConfigWriteBuf. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void SlaveHandleDataReceive(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + /* Check if there is space to put data */ + if (context->slaveRxBufferSize > 0UL) + { + if (context->useRxFifo) + { + uint32_t level; + + /* Get the number of bytes to read from RX FIFO */ + uint32_t numToCopy = Cy_SCB_GetRxFifoLevel(base) + 1UL; + + /* Get data from RX FIFO */ + numToCopy = Cy_SCB_ReadArray(base, context->slaveRxBuffer, numToCopy); + context->slaveRxBufferIdx += numToCopy; + context->slaveRxBufferSize -= numToCopy; + context->slaveRxBuffer = &context->slaveRxBuffer[numToCopy]; + + /* Prepare to read a next chunk of data */ + if (context->slaveRxBufferSize > CY_SCB_I2C_FIFO_SIZE) + { + level = context->slaveRxBufferSize - CY_SCB_I2C_FIFO_SIZE; + level = ((level > CY_SCB_I2C_FIFO_SIZE) ? (CY_SCB_I2C_FIFO_SIZE / 2UL) : level) - 1UL; + } + else + { + base->I2C_CTRL |= SCB_I2C_CTRL_S_NOT_READY_DATA_NACK_Msk; + + level = (context->slaveRxBufferSize == 0UL) ? (0UL) : (context->slaveRxBufferSize - 1UL); + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } + + /* Set the RX level to trigger an interrupt */ + Cy_SCB_SetRxFifoLevel(base, level); + } + else + { + /* Continue the transfer: send an ACK */ + base->I2C_S_CMD = SCB_I2C_S_CMD_S_ACK_Msk; + + /* Put data into the RX buffer */ + context->slaveRxBuffer[context->slaveRxBufferIdx] = (uint8_t) Cy_SCB_ReadRxFifo(base); + ++context->slaveRxBufferIdx; + --context->slaveRxBufferSize; + } + } + else + { + /* Finish a transfer: send a NACK and discard the received byte */ + base->I2C_S_CMD = SCB_I2C_S_CMD_S_NACK_Msk; + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } +} + + +/******************************************************************************* +* Function Name: SlaveHandleDataTransmit +****************************************************************************//** +* +* Loads TX FIFO with data provided by \ref Cy_SCB_I2C_SlaveConfigReadBuf. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void SlaveHandleDataTransmit(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t numToCopy; + + /* Notify the user that there is no data to send to the master. + * This event triggers once in scope of a transfer. + */ + if ((!context->slaveRdBufEmpty) && (0UL == context->slaveTxBufferSize)) + { + /* Involve a callback if registered: no data to send */ + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_I2C_SLAVE_RD_BUF_EMPTY_EVENT); + } + + /* Update the Read buffer empty status after a callback is involved */ + context->slaveRdBufEmpty = (0UL == context->slaveTxBufferSize); + + /* Enable the TX level interrupt source to continue sending data */ + Cy_SCB_SetTxInterruptMask(base, CY_SCB_TX_INTR_LEVEL); + } + + /* Check if the Read buffer was updated in the callback */ + if (context->slaveRdBufEmpty) + { + /* The Read buffer is empty: copy CY_SCB_I2C_DEFAULT_TX into TX FIFO */ + numToCopy = (context->useTxFifo) ? Cy_SCB_GetFifoSize(base) : 1UL; + + numToCopy = Cy_SCB_WriteDefaultArray(base, CY_SCB_I2C_DEFAULT_TX, numToCopy); + context->slaveTxBufferIdx += numToCopy; + + context->slaveStatus |= CY_SCB_I2C_SLAVE_RD_UNDRFL; + } + else + { + if (context->slaveTxBufferSize > 1UL) + { + /* Get the number of bytes to copy into TX FIFO */ + numToCopy = (context->useTxFifo) ? (context->slaveTxBufferSize - 1UL) : (1UL); + + /* Write data into TX FIFO */ + numToCopy = Cy_SCB_WriteArray(base, context->slaveTxBuffer, numToCopy); + context->slaveTxBufferIdx += numToCopy; + context->slaveTxBufferSize -= numToCopy; + context->slaveTxBuffer = &context->slaveTxBuffer[numToCopy]; + } + + /* Put the last byte */ + if ((CY_SCB_I2C_FIFO_SIZE != Cy_SCB_GetNumInTxFifo(base)) && (1UL == context->slaveTxBufferSize)) + { + uint32_t intrStatus; + + /* Put the last data element and make sure that "TX done" will happen for it */ + intrStatus = Cy_SysLib_EnterCriticalSection(); + + Cy_SCB_WriteTxFifo(base, (uint32_t) context->slaveTxBuffer[0UL]); + Cy_SCB_ClearTxInterrupt(base, CY_SCB_TX_INTR_UNDERFLOW); + + Cy_SysLib_ExitCriticalSection(intrStatus); + + /* Move the pointers */ + ++context->slaveTxBufferIdx; + context->slaveTxBufferSize = 0UL; + context->slaveTxBuffer = &context->slaveTxBuffer[1UL]; + + /* Enable the TX underflow interrupt to catch when there is no data to send */ + Cy_SCB_SetTxInterruptMask(base, CY_SCB_TX_INTR_UNDERFLOW); + + if (context->useTxFifo) + { + /* Data is copied into TX FIFO */ + context->slaveStatus |= CY_SCB_I2C_SLAVE_RD_IN_FIFO; + + /* Involve a callback if registered: data copied into TX FIFO */ + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_I2C_SLAVE_RD_IN_FIFO_EVENT); + } + } + } + } +} + + +/******************************************************************************* +* Function Name: SlaveHandleStop +****************************************************************************//** +* +* Handles transfer completion. It is triggered by a stop or restart +* condition on the bus. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void SlaveHandleStop(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t locEvents; + + if (CY_SCB_I2C_SLAVE_RX == context->state) + { + /* If any data is left in RX FIFO, this is an overflow */ + if (Cy_SCB_GetNumInRxFifo(base) > 0UL) + { + context->slaveStatus |= CY_SCB_I2C_SLAVE_WR_OVRFL; + + if (context->useRxFifo) + { + Cy_SCB_ClearRxFifo(base); + } + else + { + (void) Cy_SCB_ReadRxFifo(base); + } + } + + locEvents = (uint32_t) CY_SCB_I2C_SLAVE_WR_CMPLT_EVENT; + context->slaveStatus |= (uint32_t) CY_SCB_I2C_SLAVE_WR_CMPLT; + context->slaveStatus &= (uint32_t) ~CY_SCB_I2C_SLAVE_WR_BUSY; + + /* Clean up the RX direction */ + base->I2C_CTRL &= (uint32_t) ~(SCB_I2C_CTRL_S_READY_DATA_ACK_Msk | + SCB_I2C_CTRL_S_NOT_READY_DATA_NACK_Msk); + + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_LEVEL); + } + else + { + /* The number of bytes left in TX FIFO */ + uint32_t size = Cy_SCB_GetNumInTxFifo(base) + Cy_SCB_GetTxSrValid(base); + + /* Get the number of bytes transferred from the read buffer */ + context->slaveTxBufferCnt = (context->slaveTxBufferIdx - size); + + /* Update buffer pointer and its size if there is no overflow */ + if (0UL == (CY_SCB_I2C_SLAVE_RD_UNDRFL & context->slaveStatus)) + { + context->slaveTxBufferSize += size; + context->slaveTxBuffer -= size; + } + + locEvents = (uint32_t) CY_SCB_I2C_SLAVE_RD_CMPLT_EVENT; + context->slaveStatus |= (uint32_t) CY_SCB_I2C_SLAVE_RD_CMPLT; + context->slaveStatus &= (uint32_t) ~CY_SCB_I2C_SLAVE_RD_BUSY; + + /* Clean up the TX direction */ + Cy_SCB_SetTxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } + + /* Return scb into the known state after an error */ + if (0UL != (CY_SCB_I2C_SLAVE_INTR_ERROR & Cy_SCB_GetSlaveInterruptStatusMasked(base))) + { + /* After scb IP is reset, the interrupt statuses are cleared */ + Cy_SCB_FwBlockReset(base); + + locEvents |= CY_SCB_I2C_SLAVE_ERR_EVENT; + } + + /* After a stop or error, set the state to idle */ + context->state = CY_SCB_I2C_IDLE; + + /* Call a completion callback if registered */ + if (NULL != context->cbEvents) + { + context->cbEvents(locEvents); + } +} + + +/******************************************************************************* +* Function Name: MasterInterrupt +****************************************************************************//** +* +* This is the interrupt function for the SCB configured in the I2C master. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void MasterInterrupt(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t masterIntrStatus = Cy_SCB_GetMasterInterruptStatusMasked(base); + uint32_t intrCause = Cy_SCB_GetInterruptCause(base); + + /* Check if the slave is active. It can be addressed during the master set-up transfer */ + if (0UL != (CY_SCB_SLAVE_INTR & intrCause)) + { + /* Abort the transfer due to slave operation */ + if (0UL != base->I2C_M_CMD) + { + base->I2C_M_CMD = 0UL; + + context->masterStatus |= CY_SCB_I2C_MASTER_ABORT_START; + } + + context->state = CY_SCB_I2C_MASTER_CMPLT; + } + + /* Check for master error conditions */ + if (0UL != (CY_SCB_MASTER_INTR & intrCause)) + { + /* Master interrupt source is other than ACK */ + if (0UL == (CY_SCB_MASTER_INTR_I2C_ACK & masterIntrStatus)) + { + /* Skip TX processing */ + intrCause &= (uint32_t) ~CY_SCB_TX_INTR; + + /* The master has not received the acknowledgment for slave */ + if (0UL != (CY_SCB_MASTER_INTR_I2C_NACK & masterIntrStatus)) + { + /* Clear NAK interrupt source */ + Cy_SCB_ClearMasterInterrupt(base, CY_SCB_MASTER_INTR_I2C_NACK); + + /* Update status to indicate address or data NAK */ + context->masterStatus |= (0UL == (CY_SCB_MASTER_INTR_I2C_ACK & Cy_SCB_GetMasterInterruptStatus(base))) ? + CY_SCB_I2C_MASTER_ADDR_NAK : CY_SCB_I2C_MASTER_DATA_NAK; + + /* Check if end transaction was not requested before */ + if (!((CY_SCB_I2C_MASTER_WAIT_STOP == context->state) || (CY_SCB_I2C_MASTER_STOP == context->state))) + { + context->state = (context->masterPause) ? CY_SCB_I2C_MASTER_CMPLT : CY_SCB_I2C_MASTER_STOP; + } + else + { + /* Wait for Stop generation because it was requested after all + * bytes were copied into the TX FIFO. + */ + } + } + + /* Complete the transfer: stop, bus error or arbitration lost */ + if (0UL != (CY_SCB_I2C_MASTER_INTR_CMPLT & masterIntrStatus)) + { + /* The master detected a bus error condition */ + if (0UL != (CY_SCB_MASTER_INTR_I2C_BUS_ERROR & masterIntrStatus)) + { + context->masterStatus |= CY_SCB_I2C_MASTER_BUS_ERR; + } + + /* The master detected an arbitration lost condition */ + if (0UL != (CY_SCB_MASTER_INTR_I2C_ARB_LOST & masterIntrStatus)) + { + context->masterStatus |= CY_SCB_I2C_MASTER_ARB_LOST; + } + + context->state = CY_SCB_I2C_MASTER_CMPLT; + } + } + } + + if (0UL != (CY_SCB_RX_INTR & intrCause)) + { + MasterHandleDataReceive(base, context); + + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_LEVEL); + } + + if (0UL != (CY_SCB_TX_INTR & intrCause)) + { + MasterHandleDataTransmit(base, context); + + Cy_SCB_ClearTxInterrupt(base, CY_SCB_TX_INTR_LEVEL); + } + + /* Complete the transfer */ + if (CY_SCB_I2C_MASTER_CMPLT == context->state) + { + MasterHandleComplete(base, context); + } + + /* Generate stop to complete transfer */ + if (CY_SCB_I2C_MASTER_STOP == context->state) + { + MasterHandleStop(base, context); + } +} + + +/******************************************************************************* +* Function Name: MasterHandleDataReceive +****************************************************************************//** +* +* Reads data from RX FIFO into the buffer provided by \ref Cy_SCB_I2C_MasterRead. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void MasterHandleDataReceive(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + switch (context->state) + { + case CY_SCB_I2C_MASTER_RX0: + { + /* Put data into the component buffer */ + context->masterBuffer[0UL] = (uint8_t) Cy_SCB_ReadRxFifo(base); + + ++context->masterBufferIdx; + --context->masterBufferSize; + + if (context->masterBufferSize > 0UL) + { + /* Continue the transaction: move pointer send an ACK */ + context->masterBuffer = &context->masterBuffer[1UL]; + base->I2C_M_CMD = SCB_I2C_M_CMD_M_ACK_Msk; + } + else + { + /* Complete the transaction */ + context->state = (context->masterPause) ? CY_SCB_I2C_MASTER_CMPLT : CY_SCB_I2C_MASTER_STOP; + } + } + break; + + case CY_SCB_I2C_MASTER_RX1: + { + uint32_t numToCopied; + + /* Get data from RX FIFO */ + numToCopied = Cy_SCB_ReadArray(base, context->masterBuffer, context->masterBufferSize); + context->masterBufferIdx += numToCopied; + context->masterBufferSize -= numToCopied; + context->masterBuffer = &context->masterBuffer[numToCopied]; + + if (context->masterBufferSize < 2UL) + { + /* Stop ACKing data */ + base->I2C_CTRL &= (uint32_t) ~SCB_I2C_CTRL_M_READY_DATA_ACK_Msk; + + if (1UL == context->masterBufferSize) + { + /* Catch the last byte */ + Cy_SCB_SetRxFifoLevel(base, 0UL); + + context->state = CY_SCB_I2C_MASTER_RX0; + } + else + { + /* Stop RX processing */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + context->state = CY_SCB_I2C_MASTER_STOP; + } + } + else + { + /* Continue the transfer: Adjust the level in RX FIFO */ + Cy_SCB_SetRxFifoLevel(base, (context->masterBufferSize <= CY_SCB_I2C_HALF_FIFO_SIZE) ? + (context->masterBufferSize - 2UL) : (CY_SCB_I2C_HALF_FIFO_SIZE - 1UL)); + } + } + break; + + default: + /* Do nothing: drop data into RX FIFO */ + break; + } +} + + +/******************************************************************************* +* Function Name: MasterHandleDataTransmit +****************************************************************************//** +* +* Loads TX FIFO with data provided by \ref Cy_SCB_I2C_MasterWrite. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void MasterHandleDataTransmit(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + if (CY_SCB_I2C_MASTER_TX_DONE == context->state) + { + context->state = CY_SCB_I2C_MASTER_CMPLT; + } + else if (CY_SCB_I2C_MASTER_TX == context->state) + { + if (context->masterBufferSize > 1UL) + { + /* Get the number of bytes to copy into TX FIFO */ + uint32_t NumToCopy = (context->useTxFifo) ? (context->masterBufferSize - 1UL) : (1UL); + + /* Write data into TX FIFO */ + NumToCopy = Cy_SCB_WriteArray(base, context->masterBuffer, NumToCopy); + context->masterBufferIdx += NumToCopy; + context->masterBufferSize -= NumToCopy; + context->masterBuffer = &context->masterBuffer[NumToCopy]; + } + + /* Put the last byte */ + if ((CY_SCB_I2C_FIFO_SIZE != Cy_SCB_GetNumInTxFifo(base)) && (1UL == context->masterBufferSize)) + { + uint32_t intrStatus; + + /* Put the last data byte into TX FIFO and make sure that TX + * underflow will happen after all data is transfered onto the bus. + */ + intrStatus = Cy_SysLib_EnterCriticalSection(); + + Cy_SCB_WriteTxFifo(base, (uint32_t) context->masterBuffer[0UL]); + Cy_SCB_ClearTxInterrupt(base, CY_SCB_TX_INTR_UNDERFLOW); + + Cy_SysLib_ExitCriticalSection(intrStatus); + + ++context->masterBufferIdx; + context->masterBufferSize = 0UL; + } + + /* Complete the transfer */ + if (0UL == context->masterBufferSize) + { + if (context->masterPause) + { + /* Wait until data is transfered onto the bus */ + Cy_SCB_SetTxInterruptMask(base, CY_SCB_TX_INTR_UNDERFLOW); + + context->state = CY_SCB_I2C_MASTER_TX_DONE; + } + else + { + /* Disable TX processing */ + Cy_SCB_SetTxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + /* Request Stop generation */ + context->state = CY_SCB_I2C_MASTER_STOP; + } + + if (context->useTxFifo) + { + /* Notify the user that data is in TX FIFO */ + context->masterStatus |= CY_SCB_I2C_MASTER_WR_IN_FIFO; + + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_I2C_MASTER_WR_IN_FIFO_EVENT); + } + } + } + } + else + { + /* Do nothing */ + } +} + + +/******************************************************************************* +* Function Name: MasterHandleComplete +****************************************************************************//** +* +* Handles the transfer completion on a stop or restart - the normal case or +* completion due to an error on the bus or lost arbitration. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void MasterHandleComplete(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + uint32_t masterIntrStatus = Cy_SCB_GetMasterInterruptStatusMasked(base); + + /* Clean-up hardware: disable interrupt sources */ + base->I2C_CTRL &= (uint32_t) ~SCB_I2C_CTRL_M_READY_DATA_ACK_Msk; + + /* Disable the interrupt source for master operation */ + Cy_SCB_SetRxInterruptMask (base, CY_SCB_CLEAR_ALL_INTR_SRC); + Cy_SCB_SetTxInterruptMask (base, CY_SCB_CLEAR_ALL_INTR_SRC); + Cy_SCB_SetMasterInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + Cy_SCB_ClearMasterInterrupt(base, CY_SCB_I2C_MASTER_INTR_ALL); + + /* Operation complete - master is not busy anymore */ + context->masterStatus &= (uint32_t) ~CY_SCB_I2C_MASTER_BUSY; + + /* Get number of byte transferred on the bus */ + if (context->masterRdDir) + { + context->masterNumBytes = context->masterBufferIdx; + } + else + { + context->masterNumBytes = context->masterBufferIdx - + (Cy_SCB_GetNumInTxFifo(base) + Cy_SCB_GetTxSrValid(base)); + } + + /* Clean up after a not completed transfer */ + if (0UL != (CY_SCB_I2C_MASTER_INTR_ERR & masterIntrStatus)) + { + /* Reset the scb IP block when: + * 1. Master mode: Reset IP when arbitration is lost or a bus error occurs. + * 2. Master-Slave mode: Reset IP if it is not the address phase (ACK is 0). + * Otherwise, reset only on a bus error. If "lost arbitration" happened, the slave + * can be addressed, so let the slave accept the address. + */ + + bool resetIp = true; + + /* Check the Master-Slave address an ACK/NACK */ + if (CY_SCB_I2C_MASTER_SLAVE == _FLD2VAL(CY_SCB_I2C_CTRL_MODE, base->I2C_CTRL)) + { + resetIp = ((0UL != (CY_SCB_MASTER_INTR_I2C_ACK & masterIntrStatus)) ? true : + ((0UL != (CY_SCB_MASTER_INTR_I2C_BUS_ERROR & masterIntrStatus)) ? true : false)); + } + + if (resetIp) + { + /* Reset to get it back in an known state */ + Cy_SCB_FwBlockReset(base); + } + + /* Back to the idle state. The master is not active anymore */ + context->state = CY_SCB_I2C_IDLE; + } + else + { + if (context->useRxFifo) + { + /* Clear RX FIFO from remaining data and level interrupt source */ + Cy_SCB_ClearRxFifo(base); + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_LEVEL); + } + + context->state = (context->masterPause) ? CY_SCB_I2C_MASTER_WAIT : CY_SCB_I2C_IDLE; + } + + /* An operation completion callback */ + if (NULL != context->cbEvents) + { + /* Get completion events based on the hardware status */ + uint32_t locEvents = context->masterRdDir ? CY_SCB_I2C_MASTER_RD_CMPLT_EVENT : CY_SCB_I2C_MASTER_WR_CMPLT_EVENT; + + /* Add errors if any */ + locEvents |= (0UL != (CY_SCB_I2C_MASTER_ERR & context->masterStatus)) ? CY_SCB_I2C_MASTER_ERR_EVENT : 0UL; + + context->cbEvents(locEvents); + } +} + + +/******************************************************************************* +* Function Name: MasterHandleComplete +****************************************************************************//** +* +* Handles the stop condition generation +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_i2c_context_t allocated +* by the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void MasterHandleStop(CySCB_Type *base, cy_stc_scb_i2c_context_t *context) +{ + /* Stop RX and TX processing */ + Cy_SCB_SetRxInterruptMask (base, CY_SCB_CLEAR_ALL_INTR_SRC); + Cy_SCB_SetTxInterruptMask (base, CY_SCB_CLEAR_ALL_INTR_SRC); + + if (0UL != base->I2C_M_CMD) + { + /* Enable ACK interrupt source: it triggers after Start or ReStart generation */ + Cy_SCB_SetMasterInterruptMask(base, CY_SCB_I2C_MASTER_INTR_ALL); + } + else + { + /* Disable ACK interrupt source */ + Cy_SCB_SetMasterInterruptMask(base, CY_SCB_I2C_MASTER_INTR); + + /* Complete transaction generating Stop */ + base->I2C_M_CMD = (SCB_I2C_M_CMD_M_STOP_Msk | SCB_I2C_M_CMD_M_NACK_Msk); + context->state = CY_SCB_I2C_MASTER_WAIT_STOP; + } +} + + +/****************************************************************************** +* Function Name: WaitOneUnit +****************************************************************************//** +* +* Waits for one unit before unblock code execution. +* Note If a timeout value is 0, this function does nothing and returns 0. +* +* \param timeout +* The pointer to a timeout value. +* +* \return +* Returns 0 if a timeout does not expire or the timeout mask. +* +*******************************************************************************/ +static uint32_t WaitOneUnit(uint32_t *timeout) +{ + uint32_t status = 0UL; + + /* If the timeout equal to 0. Ignore the timeout */ + if (*timeout > 0UL) + { + Cy_SysLib_DelayUs(CY_SCB_WAIT_1_UNIT); + --(*timeout); + + if (0UL == *timeout) + { + status = CY_SCB_I2C_MASTER_TIMEOUT_DONE; + } + } + + return (status); +} + + +/****************************************************************************** +* Function Name: HandleStatus +****************************************************************************//** +* +* Convers passed status into the cy_en_scb_i2c_status_t. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param status +* The status to covert. +* +* \return +* \ref cy_en_scb_i2c_status_t +* +*******************************************************************************/ +static cy_en_scb_i2c_status_t HandleStatus(CySCB_Type *base, uint32_t status, cy_stc_scb_i2c_context_t *context) +{ + bool resetBlock = false; + cy_en_scb_i2c_status_t retStatus = CY_SCB_I2C_MASTER_MANUAL_TIMEOUT; + + /* Convert the master status to the API status */ + if (0UL != (CY_SCB_I2C_MASTER_TIMEOUT_DONE & status)) + { + resetBlock = true; + } + else if (0UL != (CY_SCB_I2C_SLAVE_ADDR_DONE & status)) + { + if (0UL != base->I2C_M_CMD) + { + /* Abort the master operation, the slave was addressed first */ + retStatus = CY_SCB_I2C_MASTER_MANUAL_ABORT_START; + + base->I2C_M_CMD = 0UL; + context->state = CY_SCB_I2C_IDLE; + } + } + else if (0UL != (CY_SCB_MASTER_INTR_I2C_BUS_ERROR & status)) + { + retStatus = CY_SCB_I2C_MASTER_MANUAL_BUS_ERR; + resetBlock = true; + } + else if (0UL != (CY_SCB_MASTER_INTR_I2C_ARB_LOST & status)) + { + retStatus = CY_SCB_I2C_MASTER_MANUAL_ARB_LOST; + + if (CY_SCB_I2C_MASTER_ADDR == context->state) + { + /* This is the address phase: + * 1. Master mode: Reset IP when "arbitration lost" occurred. + * 2. Master-Slave mode: If "lost arbitration" occurred, the slave + * can be addressed to let the slave accept the address; do not + * reset IP. + */ + resetBlock = !_FLD2BOOL(SCB_I2C_CTRL_SLAVE_MODE, base->I2C_CTRL); + + context->state = CY_SCB_I2C_IDLE; + } + else + { + resetBlock = true; + } + } + else if (0UL != (CY_SCB_MASTER_INTR_I2C_NACK & status)) + { + /* An address or data was NAKed */ + retStatus = (CY_SCB_I2C_MASTER_ADDR == context->state) ? + CY_SCB_I2C_MASTER_MANUAL_ADDR_NAK : CY_SCB_I2C_MASTER_MANUAL_NAK; + } + else if (0UL != (CY_SCB_MASTER_INTR_I2C_STOP & status)) + { + /* No errors - end of transaction detected */ + retStatus = CY_SCB_I2C_SUCCESS; + + context->state = CY_SCB_I2C_IDLE; + } + else /* No errors - continue trasaction */ + { + retStatus = CY_SCB_I2C_SUCCESS; + + /* The change state */ + if (CY_SCB_I2C_MASTER_ADDR == context->state) + { + context->state = (context->masterRdDir) ? + CY_SCB_I2C_MASTER_RX0 : CY_SCB_I2C_MASTER_TX; + } + } + + if (resetBlock) + { + /* A block reset clears all interrupt sources */ + Cy_SCB_FwBlockReset(base); + + context->state = CY_SCB_I2C_IDLE; + } + else + { + Cy_SCB_ClearMasterInterrupt(base, CY_SCB_I2C_MASTER_INTR_ALL); + } + + return (retStatus); +} + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_i2c.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_i2c.h new file mode 100644 index 0000000000..4dc1484fd0 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_i2c.h @@ -0,0 +1,1112 @@ +/***************************************************************************//** +* \file cy_scb_i2c.h +* \version 1.0 +* +* Provides I2C API declarations of the SCB driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \addtogroup group_scb_i2c +* \{ +* Driver API for I2C Bus Peripheral +* +* I2C - The Inter-Integrated Circuit (I2C) bus is an industry-standard. +* The two-wire hardware interface was developed by Philips Semiconductors +* (now NXP Semiconductors). +* +* The I2C peripheral driver provides an API to implement I2C slave, master, +* or master-slave devices based on the SCB hardware block. +* I2C devices based on SCB hardware are compatible with I2C +* Standard-mode, Fast-mode, and Fast-mode Plus specifications as defined in +* the I2C-bus specification. +* +* Features: +* * An industry-standard I2C bus interface +* * Supports slave, master, and master-slave operation +* * Supports standard data rates of 100/400/1000 kbps +* * Hardware Address Match, multiple addresses +* * Wake From DeepSleep on Address Match +* +* \section group_scb_i2c_configuration Configuration Considerations +* +* To set up the I2C driver, provide the configuration parameters in the +* \ref cy_stc_scb_i2c_config_t structure. For master configuration, +* provide i2cMode, useRxFifo, and useTxFifo. For slave mode also provide the +* slaveAddress and slaveAddressMask. The other parameters are optional for +* operation. +* To initialize the driver, call the \ref Cy_SCB_I2C_Init function providing the +* filled \ref cy_stc_scb_i2c_config_t structure and allocated +* \ref cy_stc_scb_i2c_context_t. Before calling \ref Cy_SCB_I2C_Enable to start +* the I2C operation, the \ref Cy_SCB_I2C_SetDataRate must be called to set +* the data rate. +* +* Master mode operation: \n +* There are two methods for initiating I2C master transactions. +* These two methods are described below. Only one method should be used +* at a time. They should not be mixed. +* +* * Call \ref Cy_SCB_I2C_MasterRead or \ref Cy_SCB_I2C_MasterWrite to +* communicate with the slave. These functions do not block and only +* start a transaction. After a transfer is started, the +* \ref Cy_SCB_I2C_Interrupt handles the further data transfer until its +* completion. Therefore, \ref Cy_SCB_I2C_Interrupt must be called inside the +* user interrupt handler to make the API above work. To monitor the transfer, +* use \ref Cy_SCB_I2C_MasterGetStatus or \ref Cy_SCB_I2C_RegisterEventCallback +* to register callback function to be notified about +* \ref group_scb_i2c_macro_callback_events. +* +* * Call \ref Cy_SCB_I2C_MasterSendStart to generate a start, send an address +* with the Read/Write direction bit, and receive acknowledgment. After the +* address is ACKed by the slave, the transaction can be continued by calling +* \ref Cy_SCB_I2C_MasterReadByte or \ref Cy_SCB_I2C_MasterWriteByte depending +* on its direction. These functions handle one byte per call, therefore +* they should be called for each byte in the transaction. Note that for the +* Read transaction the last byte must be NAKed. To complete the current +* transaction, call \ref Cy_SCB_I2C_MasterSendStop or call +* \ref Cy_SCB_I2C_MasterSendReStart to complete the current transaction and +* start a new one. Typically, do a restart to change the transaction +* direction without releasing the bus from the master control. +* Note that these functions are blocking and do not require calling +* \ref Cy_SCB_I2C_Interrupt inside the user interrupt handler. Using these +* functions requires extensive knowledge of the I2C protocol to execute +* transactions correctly. +* +* Slave mode operation: +* +* The slave operation is based on the \ref Cy_SCB_I2C_Interrupt that must be +* called inside the user interrupt handler. The Read and Write buffer must +* be provided for the slave to enable communication with the master. Use +* \ref Cy_SCB_I2C_SlaveConfigReadBuf and \ref Cy_SCB_I2C_SlaveConfigWriteBuf +* for this purpose. Note that after transaction completion the buffer must be +* configured again. Otherwise, the same buffer is used starting from the point +* where the master stopped a previous transaction. +* For example: The Read buffer is configured to be 10 bytes and the master Read +* is 8 bytes. If the Read buffer is not configured again, the next master Read +* will start from the 9th byte. +* To monitor the transfer status, use \ref Cy_SCB_I2C_SlaveGetStatus or +* use \ref Cy_SCB_I2C_RegisterEventCallback to register a callback function +* to be notified about \ref group_scb_i2c_macro_callback_events. +* +* \note All slave API (except \ref Cy_SCB_I2C_SlaveAbortRead and +* \ref Cy_SCB_I2C_SlaveAbortWrite) are not interrupt-protected and to +* prevent a race condition, they should be protected from the I2C interruption +* in the place where they are called. +* +* \section group_scb_i2c_more_information More Information +* +* For more information on the SCB peripheral, refer to the technical reference +* manual (TRM). +* +* \section group_scb_i2c_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
13.7RBoolean operations whose results are invariant shall not be +* permitted.The same condition check is executed before and after callback is +* called because after the callback returns, the condition might be not +* true any more.
14.2RAll non-null statements shall either: a) have at least one side-effect +* however executed, or b) cause control flow to change.The unused function parameters are cast to void. This statement +* has no side-effect and is used to suppress a compiler warning.
+* +* \section group_scb_i2c_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_scb_i2c_macro Macro +* \defgroup group_scb_i2c_functions Functions +* \defgroup group_scb_i2c_data_structures Data Structures +* \defgroup group_scb_i2c_enums Enumerated Types +*/ + +#if !defined(CY_SCB_I2C_H) +#define CY_SCB_I2C_H + +#include "cy_scb_common.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/*************************************** +* Enumerated Types +***************************************/ + +/** +* \addtogroup group_scb_i2c_enums +* \{ +*/ + +/** I2C status codes */ +typedef enum +{ + /** Operation completed successfully */ + CY_SCB_I2C_SUCCESS = 0x00U, + + /** One or more of input parameters are invalid */ + CY_SCB_I2C_BAD_PARAM = CY_SCB_ID | CY_PDL_STATUS_ERROR | CY_SCB_I2C_ID | 1UL, + + /** + * The master is not ready to start a new transaction. + * Either the master is still processing a previous transaction or in the + * master-slave mode the slave operation is in progress. Call this function + * again once that operation is completed or aborted. + */ + CY_SCB_I2C_MASTER_NOT_READY, + + /** + * The master operation timed out before completing. Applicable only for + * the master functions which allows byte processing. + */ + CY_SCB_I2C_MASTER_MANUAL_TIMEOUT, + + /** The slave NACKed the address. Applicable only for the master functions + * which allows byte processing. + */ + CY_SCB_I2C_MASTER_MANUAL_ADDR_NAK, + + /** The slave NACKed the data byte. Applicable only for the master + * functions which allows byte processing. */ + CY_SCB_I2C_MASTER_MANUAL_NAK, + + /** + * The master lost arbitration, the transaction was aborted. Applicable only + * for the master functions which allows byte processing. + */ + CY_SCB_I2C_MASTER_MANUAL_ARB_LOST, + + /** + * The master detected an erroneous start or stop, the transaction was + * aborted. Applicable only for the master functions which allows byte + * processing. + */ + CY_SCB_I2C_MASTER_MANUAL_BUS_ERR, + + /** + * The master transaction was aborted and the slave transaction is on-going + * because the slave was addressed before the master generated a start. + * Applicable only for the master functions which allows byte processing. + */ + CY_SCB_I2C_MASTER_MANUAL_ABORT_START +} cy_en_scb_i2c_status_t; +/** \} group_scb_i2c_enums */ + + +/*************************************** +* Type Definitions +***************************************/ + +/** +* \addtogroup group_scb_i2c_data_structures +* \{ +*/ + +/** +* Provides the typedef for the callback function called in the +* \ref Cy_SCB_I2C_Interrupt to notify the user about occurrences of +* \ref group_scb_i2c_macro_callback_events. +*/ +typedef void (* scb_i2c_handle_events_t)(uint32_t event); + +/** +* Provides the typedef for the callback function called in the +* \ref Cy_SCB_I2C_Interrupt to notify the user about occurrences of +* \ref group_scb_i2c_macro_addr_callback_events. +* This callback must return a decision to ACK (continue transaction) or +* NAK (end transaction) the received address. +* See \ref group_scb_i2c_macro_ack_nack for the set of constants. +* Note if the slave configured to accept an address in RX FIFO, it must read +* from it using the \ref Cy_SCB_ReadRxFifo function. +*/ +typedef uint32_t (* scb_i2c_handle_addr_t)(uint32_t event); + +/** I2C Configuration Structure */ +typedef struct cy_stc_scb_i2c_config +{ + /** + * Specifies the mode of operation (See \ref group_scb_i2c_macro_modes + * for the set of constants) + */ + uint32_t i2cMode; + + /** + * If the RX FIFO is used, the possibility of clock stretching is greatly + * reduced, and the interrupt overhead during an I2C transaction is also + * reduced. The reason: the hardware is configured to automatically ACK + * incoming data, and the interrupt is configured to take data out of the + * RX FIFO. + * * For the master mode, the drawback is that the master may receive more + * data than desired due to the interrupt latency. An interrupt fires + * when the second-to-last byte has been received, this interrupt tells + * the hardware to stop receiving data. If the latency of this interrupt + * is longer than 1 transfer of the byte on the I2C bus, then the + * hardware automatically ACKs the following bytes until the interrupt + * is serviced or the RX FIFO becomes full. + * * For the slave mode, the drawback is that the slave will only NACKs + * the master when the RX FIFO becomes full, NOT when the slave write + * firmware buffer becomes full. + * Note that all received extra bytes will be dropped in any mode. + * To avoid these drawbacks, do not enable this option. Then, hardware is + * configured to trigger an interrupt when a byte is available in the + * RX FIFO. After the byte is read, an ACK or NACK decision is made. + * Therefore, each received bytes requires the interrupt service to + * continue the transfer and that leads to increasing the interrupt + * overhead and the possibility of clock stretching. + * This parameter is not available if f acceptAddrInFifo is true. + */ + bool useRxFifo; + + /** + * If the TX FIFO is used, the possibility of clock stretching is greatly + * reduced, and the interrupt overhead during an I2C transaction is + * also reduced. The reason: the TX FIFO is fully loaded with data and + * the interrupt is configured to keep the TX FIFO loaded. + * The drawback of using this option is that the abort operation clears + * the TX FIFO. The TX FIFO clear operation also clears the shift + * register so that the shifter can be cleared in the middle of a byte + * transfer, corrupting it. The remaining bits to transfer within the + * corrupted byte are complemented with 1s. If this is an issue, + * then do not enable this option. + * If the TX FIFO is not used, then data is written to the TX FIFO byte + * by byte. This leads to more interrupts and also increases the + * possibility of clock stretching. + * Use the TX FIFO if the abort function is not used. + */ + bool useTxFifo; + + /** + * The 7-bit right justified slave address, used only for the slave mode + */ + uint8_t slaveAddress; + + /** + * The slave address mask, bit 0, must always be 0. It's used only for the + * slave mode + */ + uint8_t slaveAddressMask; + + /** + * True - the slave address is accepted in RX FIFO, false - the slave + * addresses are not accepted in FIFO + */ + bool acceptAddrInFifo; + + /** + * True - accept the general call address; false - ignore the general + * call address. + */ + bool ackGeneralAddr; + + /** + * When set, the slave will wake the device from deep sleep on an address + * match (the device datasheet must be consulted to determine which SCBs + * support this mode) + */ + bool enableWakeFromSleep; +} cy_stc_scb_i2c_config_t; + +/** I2C Internal structure, holds data used by I2C functions */ +typedef struct cy_stc_scb_i2c_context +{ + bool useRxFifo; /**< Holds RX FIFO configuration */ + bool useTxFifo; /**< Holds TX FIFO configuration */ + + uint32_t state; /**< Holds state of driver */ + + uint32_t masterStatus; /**< Holds master status */ + bool masterPause; /**< Stores how master ends transfer */ + bool masterRdDir; /**< Stores direction of master transfer */ + + uint8_t *masterBuffer; /**< Pointer to master buffer transmit or receive buffer */ + uint32_t masterBufferIdx; /**< Current Read/Write location in master buffer */ + uint32_t masterBufferSize; /**< End of master buffer */ + uint32_t masterNumBytes; /**< Number of bytes sent or received */ + + uint32_t slaveStatus; /**< Holds slave status */ + bool slaveRdBufEmpty; /**< Tracks slave Read buffer empty event */ + + uint8_t *slaveTxBuffer; /**< Pointer to slave TX buffer */ + uint32_t slaveTxBufferIdx; /**< Current Read location in the slave TX buffer */ + uint32_t slaveTxBufferSize; /**< End of slave TX buffer */ + uint32_t slaveTxBufferCnt; /**< Number of transferred bytes */ + + uint8_t *slaveRxBuffer; /**< Pointer to slave RX buffer */ + uint32_t slaveRxBufferIdx; /**< Current Write location in the slave buffer */ + uint32_t slaveRxBufferSize; /**< End of slave buffer */ + + /** + * The pointer to an event callback that is called when an I2C event occurs + */ + scb_i2c_handle_events_t cbEvents; + + /** + * The pointer to an address callback, used only for the slave + */ + scb_i2c_handle_addr_t cbAddr; +} cy_stc_scb_i2c_context_t; + +/** The I2C Master transfer structure */ +typedef struct cy_stc_scb_i2c_master_xfer_config +{ + uint8_t slaveAddress; /**< Address of slave to start transfer with */ + uint8_t *buffer; /**< Pointer to buffer for data to read from slave + or with data to write into slave */ + uint32_t bufferSize; /**< Size of buffer */ + bool xferPending; /**< Transfer operation is pending - + Stop condition will not be generated */ +} cy_stc_scb_i2c_master_xfer_config_t; +/** \} group_scb_i2c_data_structures */ + + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_scb_i2c_functions +* \{ +*/ +/* Basic functions */ +cy_en_scb_i2c_status_t Cy_SCB_I2C_Init(CySCB_Type *base, cy_stc_scb_i2c_config_t const *config, + cy_stc_scb_i2c_context_t *context); +void Cy_SCB_I2C_DeInit (CySCB_Type *base); +__STATIC_INLINE void Cy_SCB_I2C_Enable(CySCB_Type *base); +void Cy_SCB_I2C_Disable(CySCB_Type *base, cy_stc_scb_i2c_context_t *context); + +/* Data rate configuration functions */ +uint32_t Cy_SCB_I2C_SetDataRate(CySCB_Type *base, uint32_t dataRateHz, uint32_t scbClockkHz); +uint32_t Cy_SCB_I2C_GetDataRate(CySCB_Type const *base, uint32_t scbClockkHz); + +/* Configure slave address */ +__STATIC_INLINE void Cy_SCB_I2C_SlaveSetAddress (CySCB_Type *base, uint8_t addr); +__STATIC_INLINE uint32_t Cy_SCB_I2C_SlaveGetAddress (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_I2C_SlaveSetAddressMask(CySCB_Type *base, uint8_t addrMask); +__STATIC_INLINE uint32_t Cy_SCB_I2C_SlaveGetAddressMask(CySCB_Type const *base); + +/* Configure master oversampling */ +__STATIC_INLINE void Cy_SCB_I2C_MasterSetLowPhaseDutyCycle (CySCB_Type *base, uint32_t clockCycles); +__STATIC_INLINE void Cy_SCB_I2C_MasterSetHighPhaseDutyCycle(CySCB_Type *base, uint32_t clockCycles); + +/* Low power functions */ +void Cy_SCB_I2C_DeepSleep(CySCB_Type *base, uint32_t wakeupAction); +void Cy_SCB_I2C_Wakeup (CySCB_Type *base); + +__STATIC_INLINE bool Cy_SCB_I2C_IsBusBusy (CySCB_Type const *base); + +/* Register callbacks */ +__STATIC_INLINE void Cy_SCB_I2C_RegisterEventCallback(CySCB_Type const *base, scb_i2c_handle_events_t callback, + cy_stc_scb_i2c_context_t *context); +__STATIC_INLINE void Cy_SCB_I2C_RegisterAddrCallback (CySCB_Type const *base, scb_i2c_handle_addr_t callback, + cy_stc_scb_i2c_context_t *context); + +/* Slave functions */ +uint32_t Cy_SCB_I2C_SlaveGetStatus(CySCB_Type const *base, cy_stc_scb_i2c_context_t const *context); + +void Cy_SCB_I2C_SlaveConfigReadBuf (CySCB_Type const *base, uint8_t *rdBuf, uint32_t size, + cy_stc_scb_i2c_context_t *context); +void Cy_SCB_I2C_SlaveAbortRead (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +uint32_t Cy_SCB_I2C_SlaveGetReadTransferCount(CySCB_Type const *base, cy_stc_scb_i2c_context_t const *context); +uint32_t Cy_SCB_I2C_SlaveClearReadStatus (CySCB_Type const *base, cy_stc_scb_i2c_context_t *context); + +void Cy_SCB_I2C_SlaveConfigWriteBuf (CySCB_Type const *base, uint8_t *wrBuf, uint32_t size, + cy_stc_scb_i2c_context_t *context); +void Cy_SCB_I2C_SlaveAbortWrite (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +uint32_t Cy_SCB_I2C_SlaveGetWriteTransferCount(CySCB_Type const *base, cy_stc_scb_i2c_context_t const *context); +uint32_t Cy_SCB_I2C_SlaveClearWriteStatus (CySCB_Type const *base, cy_stc_scb_i2c_context_t *context); + +/* Master interrupt processing functions */ +uint32_t Cy_SCB_I2C_MasterGetStatus(CySCB_Type const *base, cy_stc_scb_i2c_context_t const *context); + +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterRead(CySCB_Type *base, cy_stc_scb_i2c_master_xfer_config_t* masterXferConfig, + cy_stc_scb_i2c_context_t *context); +void Cy_SCB_I2C_MasterAbortRead (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterWrite(CySCB_Type *base, cy_stc_scb_i2c_master_xfer_config_t *masterXferConfig, + cy_stc_scb_i2c_context_t *context); +void Cy_SCB_I2C_MasterAbortWrite (CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +uint32_t Cy_SCB_I2C_MasterGetTransferCount(CySCB_Type const *base, cy_stc_scb_i2c_context_t const *context); + +/* Master manual processing functions */ +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterSendStart (CySCB_Type *base, uint32_t address, uint32_t bitRnW, uint32_t timeoutMs, + cy_stc_scb_i2c_context_t *context); +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterSendReStart(CySCB_Type *base, uint32_t address, uint32_t bitRnW, uint32_t timeoutMs, + cy_stc_scb_i2c_context_t *context); +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterSendStop (CySCB_Type *base,uint32_t timeoutMs, cy_stc_scb_i2c_context_t *context); +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterReadByte (CySCB_Type *base, uint32_t ackNack, uint8_t *byte, uint32_t timeoutMs, + cy_stc_scb_i2c_context_t *context); +cy_en_scb_i2c_status_t Cy_SCB_I2C_MasterWriteByte (CySCB_Type *base, uint32_t theByte, uint32_t timeoutMs, + cy_stc_scb_i2c_context_t *context); +/* Interrupt handler */ +void Cy_SCB_I2C_Interrupt(CySCB_Type *base, cy_stc_scb_i2c_context_t *context); +/** \} group_scb_i2c_functions */ + + +/*************************************** +* API Constants +***************************************/ + +/** +* \addtogroup group_scb_i2c_macro +* \{ +*/ + +/** +* \defgroup group_scb_i2c_macro_modes I2C Modes +* \{ +*/ +#define CY_SCB_I2C_SLAVE (1U) /**< Configures SCB for I2C Slave operation */ +#define CY_SCB_I2C_MASTER (2U) /**< Configures SCB for I2C Master operation */ +#define CY_SCB_I2C_MASTER_SLAVE (3U) /**< Configures SCB for I2C Master-Slave operation */ +/** \} group_scb_i2c_macro_modes */ + +/** +* \defgroup group_scb_i2c_macro_slave_status I2C Slave Status +* Each I2C slave status is encoded in a separate bit, therefore multiple bits +* may be set to indicate the current status. +* \{ +*/ +/** There is a Read transaction in progress */ +#define CY_SCB_I2C_SLAVE_RD_BUSY (0x00000001UL) + +/** +* All read data has been loaded to TX FIFO, applicable only if TX FIFO is +* enabled +*/ +#define CY_SCB_I2C_SLAVE_RD_IN_FIFO (0x00000002UL) + +/** +* The master has finished reading data from the slave +*/ +#define CY_SCB_I2C_SLAVE_RD_CMPLT (0x00000004UL) + +/** +* Set when the master tried to read more bytes than available in the configured +* read buffer. The slave is not able to finish the transaction and sends +* \ref CY_SCB_I2C_DEFAULT_TX. +*/ +#define CY_SCB_I2C_SLAVE_RD_UNDRFL (0x00000008UL) + +/** There is a Write transaction in progress */ +#define CY_SCB_I2C_SLAVE_WR_BUSY (0x00000010UL) + +/** +* The master has finished writing data into the slave +*/ +#define CY_SCB_I2C_SLAVE_WR_CMPLT (0x00000020UL) + +/** +* The master attempted to write more bytes than space available in the +* configured Write buffer. Note that all subsequent bytes are dropped. +*/ +#define CY_SCB_I2C_SLAVE_WR_OVRFL (0x00000040UL) + +/** The slave lost arbitration, the transaction was aborted */ +#define CY_SCB_I2C_SLAVE_ARB_LOST (0x00000080UL) + +/** +* The slave captured an error on the bus during a master transaction (sources +* of error is misplaced Start or Stop). +*/ +#define CY_SCB_I2C_SLAVE_BUS_ERR (0x00000100UL) +/** \} group_scb_i2c_macro_slave_status */ + +/** +* \defgroup group_scb_i2c_macro_master_status I2C Master Status +* Each I2C master status is encoded in a separate bit, therefore multiple +* bits may be set to indicate the current status. +* \{ +*/ + +/** +* The master is busy executing operation initiated by \ref Cy_SCB_I2C_MasterRead +* or \ref Cy_SCB_I2C_MasterWrite +*/ +#define CY_SCB_I2C_MASTER_BUSY (0x00010000UL) + +/** +* All Write data has been loaded to the TX FIFO +*/ +#define CY_SCB_I2C_MASTER_WR_IN_FIFO (0x00020000UL) + +/** The slave NACKed the address. */ +#define CY_SCB_I2C_MASTER_ADDR_NAK (0x00100000UL) + +/** Write completed before all bytes were sent (last byte was NAKed) +*/ +#define CY_SCB_I2C_MASTER_DATA_NAK (0x00200000UL) + +/** The master lost arbitration, the transaction was aborted */ +#define CY_SCB_I2C_MASTER_ARB_LOST (0x00400000UL) + +/** +* The master detected an erroneous start or stop, the transaction was aborted +*/ +#define CY_SCB_I2C_MASTER_BUS_ERR (0x00800000UL) + +/** +* The master transaction was aborted and the slave transaction is on-going +* because the slave was addressed before the master generated a start +*/ +#define CY_SCB_I2C_MASTER_ABORT_START (0x01000000UL) +/** \} group_scb_i2c_macro_master_status */ + +/** +* \defgroup group_scb_i2c_macro_direction I2C Direction +* \{ +*/ +#define CY_SCB_I2C_WRITE_XFER (0UL) /**< Current transaction is Write */ +#define CY_SCB_I2C_READ_XFER (1UL) /**< Current transaction is Read */ +/** \} group_scb_i2c_macro_direction */ + +/** +* \defgroup group_scb_i2c_macro_ack_nack I2C ACK NAK +* \{ +*/ +#define CY_SCB_I2C_ACK (SCB_I2C_S_CMD_S_ACK_Msk) /**< Send ACK to current byte */ +#define CY_SCB_I2C_NAK (SCB_I2C_S_CMD_S_NACK_Msk) /**< Send NAK to current byte */ +/** \} group_scb_i2c_macro_ack_nack */ + +/** +* \defgroup group_scb_i2c_macro_wake_up I2C Wakeup Actions +* \{ +*/ +#define CY_SCB_I2C_WAKEUP_STRETCH (0UL) /**< Slave will stretch clock on wakeup */ +#define CY_SCB_I2C_WAKEUP_NACK (1UL) /**< Slave will NAK address on wakeup */ +/** \} group_scb_i2c_macro_wake_up */ + +/** +* \defgroup group_scb_i2c_macro_callback_events I2C Callback Events +* \{ +* Each event is encoded in a separate bit, and therefore it is possible to +* notify about multiple events. +*/ +/** +* Indicates that the slave was addressed and the master wants to read data. +* This event can be used to configure the slave Read buffer. +*/ +#define CY_SCB_I2C_SLAVE_READ_EVENT (0x00000001UL) + +/** +* Indicates that the slave was addressed and the master wants to write data. +* This event can be used to configure the slave Write buffer. +*/ +#define CY_SCB_I2C_SLAVE_WRITE_EVENT (0x00000002UL) + +/** +* All slave data from the configured Read buffer has been loaded to TX FIFO. +* The content of the Read buffer can be modified. Applicable only if TX FIFO is +* enabled. +*/ +#define CY_SCB_I2C_SLAVE_RD_IN_FIFO_EVENT (0x00000004UL) + +/** +* The master has read all data out of the configured Read buffer. +* This event can be used to configure the next Read buffer. If the buffer remains +* empty, the \ref CY_SCB_I2C_DEFAULT_TX bytes are returned to the master. +*/ +#define CY_SCB_I2C_SLAVE_RD_BUF_EMPTY_EVENT (0x00000008UL) + +/** +* Indicates the master completed reading from the slave (set by master NAK +* or Stop) +*/ +#define CY_SCB_I2C_SLAVE_RD_CMPLT_EVENT (0x00000010UL) + +/** +* Indicates master completed writing to the slave (set by master Stop +* or Restart) +*/ +#define CY_SCB_I2C_SLAVE_WR_CMPLT_EVENT (0x00000020UL) + +/** +* Indicates the I2C hardware detected an error. +* Check \ref Cy_SCB_I2C_SlaveGetStatus to determine the source of the error. +*/ +#define CY_SCB_I2C_SLAVE_ERR_EVENT (0x00000040UL) + +/** +* All master write data has been loaded to TX FIFO. +* The content of the Write buffer can be modified. Applicable only if +* TX FIFO is enabled. +*/ +#define CY_SCB_I2C_MASTER_WR_IN_FIFO_EVENT (0x00010000UL) + +/** +* Indicates the master completed writing data to the slave +*/ +#define CY_SCB_I2C_MASTER_WR_CMPLT_EVENT (0x00020000UL) + +/** +* Indicates the master completed reading data from the slave +*/ +#define CY_SCB_I2C_MASTER_RD_CMPLT_EVENT (0x00040000UL) + +/** +* Indicates the I2C hardware detected an error. It occurs together with +* \ref CY_SCB_I2C_MASTER_RD_CMPLT_EVENT or \ref CY_SCB_I2C_MASTER_WR_CMPLT_EVENT +* depends on the direction of the transfer. +* Check \ref Cy_SCB_I2C_MasterGetStatus to determine the source of the error. +*/ +#define CY_SCB_I2C_MASTER_ERR_EVENT (0x00080000UL) +/** \} group_scb_i2c_macro_callback_events */ + +/** +* \defgroup group_scb_i2c_macro_addr_callback_events I2C Address Callback Events +* Each event is encoded in a separate bit and therefore it is possible to +* notify about multiple events. +* \{ +*/ +/** +* Indicates the slave was addressed by the general call address +*/ +#define CY_SCB_I2C_GENERAL_CALL_EVENT (0x01UL) + +/** +* The slave address is in the RX FIFO. +* Note that the address must be read from the RX FIFO using the +* \ref Cy_SCB_ReadRxFifo function. +*/ +#define CY_SCB_I2C_ADDR_IN_FIFO_EVENT (0x02UL) +/** \} group_scb_i2c_macro_addr_callback_events */ + +/** +* This value is returned by the slave when there is no data in the +* Read buffer +*/ +#define CY_SCB_I2C_DEFAULT_TX (0xFFUL) + + +/*************************************** +* Internal Constants +***************************************/ + +/** \cond INTERNAL */ + +/* Slave statuses */ +#define CY_SCB_I2C_SLAVE_RD_CLEAR (CY_SCB_I2C_SLAVE_RD_CMPLT | CY_SCB_I2C_SLAVE_RD_IN_FIFO | \ + CY_SCB_I2C_SLAVE_RD_UNDRFL | CY_SCB_I2C_SLAVE_ARB_LOST | \ + CY_SCB_I2C_SLAVE_BUS_ERR) + +#define CY_SCB_I2C_SLAVE_WR_CLEAR (CY_SCB_I2C_SLAVE_WR_CMPLT | CY_SCB_I2C_SLAVE_WR_OVRFL | \ + CY_SCB_I2C_SLAVE_ARB_LOST | CY_SCB_I2C_SLAVE_BUS_ERR) + +/* The position and mask to set the I2C mode */ +#define CY_SCB_I2C_CTRL_MODE_Pos SCB_I2C_CTRL_SLAVE_MODE_Pos +#define CY_SCB_I2C_CTRL_MODE_Msk (SCB_I2C_CTRL_SLAVE_MODE_Msk | SCB_I2C_CTRL_MASTER_MODE_Msk) + +/* RX and TX control register values */ +#define CY_SCB_I2C_DATA_WIDTH (7UL) +#define CY_SCB_I2C_RX_CTRL (_VAL2FLD(SCB_RX_CTRL_DATA_WIDTH, CY_SCB_I2C_DATA_WIDTH) | \ + SCB_RX_CTRL_MSB_FIRST_Msk) +#define CY_SCB_I2C_TX_CTRL (CY_SCB_I2C_RX_CTRL) + +/* The position and mask to make an address byte */ +#define CY_SCB_I2C_ADDRESS_Pos (1UL) +#define CY_SCB_I2C_ADDRESS_Msk (0xFEUL) + +/* Master error statuses */ +#define CY_SCB_I2C_MASTER_ERR (CY_SCB_I2C_MASTER_ABORT_START | CY_SCB_I2C_MASTER_ADDR_NAK | \ + CY_SCB_I2C_MASTER_DATA_NAK | CY_SCB_I2C_MASTER_BUS_ERR | \ + CY_SCB_I2C_MASTER_ARB_LOST) + +/* Master interrupt masks */ +#define CY_SCB_I2C_MASTER_INTR (CY_SCB_MASTER_INTR_I2C_ARB_LOST | CY_SCB_MASTER_INTR_I2C_BUS_ERROR | \ + CY_SCB_MASTER_INTR_I2C_NACK | CY_SCB_MASTER_INTR_I2C_STOP) + +#define CY_SCB_I2C_MASTER_INTR_ALL (CY_SCB_I2C_MASTER_INTR | CY_SCB_MASTER_INTR_I2C_ACK) + +#define CY_SCB_I2C_MASTER_INTR_ERR (CY_SCB_MASTER_INTR_I2C_BUS_ERROR | CY_SCB_MASTER_INTR_I2C_ARB_LOST) + +#define CY_SCB_I2C_MASTER_INTR_CMPLT (CY_SCB_I2C_MASTER_INTR_ERR | CY_SCB_MASTER_INTR_I2C_STOP) + +/* Master statuses. */ +#define CY_SCB_I2C_MASTER_TX_BYTE_DONE (CY_SCB_MASTER_INTR_I2C_ACK | CY_SCB_MASTER_INTR_I2C_NACK | \ + CY_SCB_MASTER_INTR_I2C_BUS_ERROR | CY_SCB_MASTER_INTR_I2C_ARB_LOST) + +#define CY_SCB_I2C_MASTER_RX_BYTE_DONE (CY_SCB_MASTER_INTR_I2C_BUS_ERROR | CY_SCB_MASTER_INTR_I2C_ARB_LOST) + +#define CY_SCB_I2C_MASTER_STOP_DONE (CY_SCB_MASTER_INTR_I2C_STOP | \ + CY_SCB_MASTER_INTR_I2C_BUS_ERROR | CY_SCB_MASTER_INTR_I2C_ARB_LOST) + +#define CY_SCB_I2C_MASTER_TIMEOUT_DONE (0x80000000UL) + +/* The slave interrupt mask */ +#define CY_SCB_I2C_SLAVE_INTR (CY_SCB_SLAVE_INTR_I2C_ADDR_MATCH | CY_SCB_SLAVE_INTR_I2C_GENERAL_ADDR | \ + CY_SCB_SLAVE_INTR_I2C_STOP | CY_SCB_SLAVE_INTR_I2C_BUS_ERROR | \ + CY_SCB_SLAVE_INTR_I2C_ARB_LOST) + +#define CY_SCB_I2C_SLAVE_INTR_NO_STOP (CY_SCB_I2C_SLAVE_INTR & (uint32_t) ~CY_SCB_SLAVE_INTR_I2C_STOP) + +#define CY_SCB_I2C_SLAVE_INTR_ADDR (CY_SCB_SLAVE_INTR_I2C_ADDR_MATCH | CY_SCB_SLAVE_INTR_I2C_GENERAL_ADDR) + +#define CY_SCB_I2C_SLAVE_ADDR_DONE (CY_SCB_I2C_SLAVE_INTR_ADDR) + +#define CY_SCB_I2C_SLAVE_INTR_TX (CY_SCB_TX_INTR_LEVEL | CY_SCB_TX_INTR_UNDERFLOW) + +#define CY_SCB_I2C_SLAVE_INTR_ERROR (CY_SCB_SLAVE_INTR_I2C_BUS_ERROR | CY_SCB_SLAVE_INTR_I2C_ARB_LOST) + +/* I2C states */ +#define CY_SCB_I2C_IDLE (0x10000000UL) +#define CY_SCB_I2C_IDLE_MASK (0x10000000UL) + +/* Master states */ +#define CY_SCB_I2C_MASTER_ACTIVE (0x00100000UL) +#define CY_SCB_I2C_MASTER_WAIT (0x10100000UL) +#define CY_SCB_I2C_MASTER_RX0 (0x00110000UL) +#define CY_SCB_I2C_MASTER_RX1 (0x00120000UL) +#define CY_SCB_I2C_MASTER_ADDR (0x10130000UL) +#define CY_SCB_I2C_MASTER_TX (0x00140000UL) +#define CY_SCB_I2C_MASTER_TX_DONE (0x00150000UL) +#define CY_SCB_I2C_MASTER_STOP (0x00160000UL) +#define CY_SCB_I2C_MASTER_WAIT_STOP (0x00170000UL) +#define CY_SCB_I2C_MASTER_CMPLT (0x00180000UL) + +/* Slave states */ +#define CY_SCB_I2C_SLAVE_ACTIVE (0x00001000UL) +#define CY_SCB_I2C_SLAVE_RX_MASK (0x00001001UL) +#define CY_SCB_I2C_SLAVE_RX (0x00001001UL) +#define CY_SCB_I2C_SLAVE_TX (0x00001002UL) + +/* FIFO size */ +#define CY_SCB_I2C_FIFO_SIZE (128UL) +#define CY_SCB_I2C_HALF_FIFO_SIZE (CY_SCB_I2C_FIFO_SIZE / 2UL) + +#define CY_SCB_I2C_DEFAULT_RETURN (0xFFUL) + +/* Slave clock limits */ +#define CY_SCB_I2C_SLAVE_STD_CLK_MIN (1550U) +#define CY_SCB_I2C_SLAVE_STD_CLK_MAX (12800U) +#define CY_SCB_I2C_SLAVE_FST_CLK_MIN (7820U) +#define CY_SCB_I2C_SLAVE_FST_CLK_MAX (15380U) +#define CY_SCB_I2C_SLAVE_FSTP_CLK_MIN (15840U) +#define CY_SCB_I2C_SLAVE_FSTP_CLK_MAX (48000U) + +/* I2C data rates max: standard, fast and fast plus modes */ +#define CY_SCB_I2C_SLAVE_STD_DATA_RATE (100000U) +#define CY_SCB_I2C_SLAVE_FST_DATA_RATE (400000U) +#define CY_SCB_I2C_SLAVE_FSTP_DATA_RATE (1000000U) + +/* Master clock and duty cycle limits for standard mode */ +#define CY_SCB_I2C_MASTER_STD_CLK_MIN (1550U) +#define CY_SCB_I2C_MASTER_STD_CLK_MAX (3200U) +#define CY_SCB_I2C_MASTER_STD_LOW_MIN (8U) +#define CY_SCB_I2C_MASTER_STD_HIGH_MIN (8U) + +/* Master clock and duty cycle limits for fast mode */ +#define CY_SCB_I2C_MASTER_FST_MIN (7820U) +#define CY_SCB_I2C_MASTER_FST_MAX (10000U) +#define CY_SCB_I2C_MASTER_FST_LOW_MIN (13U) +#define CY_SCB_I2C_MASTER_FST_HIGH_MIN (8U) + +/* Master clock and duty cycle limits for fast plus mode */ +#define CY_SCB_I2C_MASTER_FSTP_MIN (14320U) +#define CY_SCB_I2C_MASTER_FSTP_MAX (25800U) +#define CY_SCB_I2C_MASTER_FSTP_LOW_MIN (9U) +#define CY_SCB_I2C_MASTER_FSTP_HIGH_MIN (6U) + +/* Master duty cycle limits */ +#define CY_SCB_I2C_PHASE_DUTY_CYCLE_MAX (16U) +#define CY_SCB_I2C_DUTY_CYCLE_MAX (32U) + +/* Analog filter settings. */ +#define CY_SCB_I2C_ENABLE_ANALOG_FITLER (0x002A1013UL) +#define CY_SCB_I2C_DISABLE_ANALOG_FITLER (0x002A0003UL) +/** \endcond */ + +/** \} group_scb_i2c_macro */ + + +/*************************************** +* In-line Function Implementation +***************************************/ + +/** +* \addtogroup group_scb_i2c_functions +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_Enable +****************************************************************************//** +* +* Enables the SCB block for the I2C operation +* +* \param base +* The pointer to the I2C SCB instance. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_I2C_Enable(CySCB_Type *base) +{ + base->CTRL |= SCB_CTRL_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_IsBusBusy +****************************************************************************//** +* +* Checks if the I2C bus is busy. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \return +* A bus status: busy or not busy. +* +* \note +* After the SCB block is enabled or reset, the valid bus busy-status returns +* after half of the SCL period. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SCB_I2C_IsBusBusy(CySCB_Type const *base) +{ + return _FLD2BOOL(SCB_I2C_STATUS_BUS_BUSY, base->I2C_STATUS); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveSetAddress +****************************************************************************//** +* +* Sets the slave address for the I2C slave. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param addr +* The 7-bit right justified slave address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_I2C_SlaveSetAddress(CySCB_Type *base, uint8_t addr) +{ + base->RX_MATCH = _CLR_SET_FLD32U(base->RX_MATCH, SCB_RX_MATCH_ADDR, ((uint32_t)((uint32_t) addr << 1UL))); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveGetAddress +****************************************************************************//** +* +* Returns the slave address of the I2C slave. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \return +* The 7-bit right justified slave address. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_I2C_SlaveGetAddress(CySCB_Type const *base) +{ + return (_FLD2VAL(SCB_RX_MATCH_ADDR, base->RX_MATCH) >> 1UL); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveSetAddressMask +****************************************************************************//** +* +* Sets the slave address mask for the I2C slave. The LSBit must always be 0. +* In all other bit positions a 1 indicates that the incoming address must match +* the corresponding bit in the slave address. A 0 in the mask means that the +* incoming address does not need to match. +* Example Slave Address = 0x0c. Slave Address Mask = 0x08. This means that the +* hardware will accept both 0x08 and 0x0c as valid addresses. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param addrMask +* The 8-bit address mask, the upper 7 bits correspond to the slave address. +* LSBit must always be 0. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_I2C_SlaveSetAddressMask(CySCB_Type *base, uint8_t addrMask) +{ + base->RX_MATCH = _CLR_SET_FLD32U(base->RX_MATCH, SCB_RX_MATCH_MASK, ((uint32_t) addrMask)); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_SlaveGetAddressMask +****************************************************************************//** +* +* Returns the slave address mask. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \return +* The 8-bit address mask, the upper 7 bits correspond to the slave address. +* LSBit must always be 0. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_I2C_SlaveGetAddressMask(CySCB_Type const *base) +{ + return _FLD2VAL(SCB_RX_MATCH_MASK, base->RX_MATCH); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterSetLowPhaseDutyCycle +****************************************************************************//** +* +* This function sets the number of SCB clock cycles in the low phase of SCL. +* If \ref Cy_SCB_I2C_SetDataRate is called after this function, the values +* specified in this function are overwritten. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param clockCycles +* The number of SCB clock cycles in the low phase of SCL. +* The valid range is 7 to 16. +* +* \note +* This function should be used at your own risk. Changing the number of clock +* cycles in a phase of SCL may violate the I2C specification. Make this +* change only while the block is disabled. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_I2C_MasterSetLowPhaseDutyCycle(CySCB_Type *base, uint32_t clockCycles) +{ + base->I2C_CTRL = _CLR_SET_FLD32U(base->I2C_CTRL, SCB_I2C_CTRL_LOW_PHASE_OVS, (clockCycles - 1UL)); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_MasterSetHighPhaseDutyCycle +****************************************************************************//** +* +* This function sets the number of SCB clock cycles in the high phase of SCL, +* If \ref Cy_SCB_I2C_SetDataRate is called after this function, the values +* specified in this function get overwritten. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param clockCycles +* The number of SCB clock cycles in the high phase of SCL. +* The valid range is 5 to 16. +* +* \note +* This function should be used at your own risk. Changing the number of clock +* cycles in a phase of SCL may violate the I2C specification. Make this +* change only while the block is disabled. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_I2C_MasterSetHighPhaseDutyCycle(CySCB_Type *base, uint32_t clockCycles) +{ + base->I2C_CTRL = _CLR_SET_FLD32U(base->I2C_CTRL, SCB_I2C_CTRL_HIGH_PHASE_OVS, (clockCycles - 1UL)); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_RegisterEventCallback +****************************************************************************//** +* +* Registers a callback function that notifies that +* \ref group_scb_i2c_macro_callback_events occurred in the +* \ref Cy_SCB_I2C_Interrupt. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param callback +* The pointer to a callback function. +* See \ref scb_i2c_handle_events_t for the function prototype. +* +* \param context +* The pointer to context structure \ref cy_stc_scb_i2c_context_t allocated by +* the user. The structure is used while the I2C operation for internal +* configuration and data keeping. The user should not modify anything in +* this structure. +* +* \note +* To remove the callback, pass NULL as the pointer to the callback function. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_I2C_RegisterEventCallback(CySCB_Type const *base, + scb_i2c_handle_events_t callback, cy_stc_scb_i2c_context_t *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + context->cbEvents = callback; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_I2C_RegisterAddrCallback +****************************************************************************//** +* +* Registers a callback function that notifies that +* \ref group_scb_i2c_macro_addr_callback_events occurred in the +* \ref Cy_SCB_I2C_Interrupt. +* +* \param base +* The pointer to the I2C SCB instance. +* +* \param callback +* The pointer to a callback function. +* See \ref scb_i2c_handle_addr_t for the function prototype. +* +* \param context +* The pointer to context structure \ref cy_stc_scb_i2c_context_t allocated by +* the user. The structure is used during the I2C operation for internal +* configuration and data keeping. The user should not modify anything in +* this structure. +* +* \note +* To remove the callback, pass NULL as the pointer to a callback function. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_I2C_RegisterAddrCallback(CySCB_Type const *base, + scb_i2c_handle_addr_t callback, cy_stc_scb_i2c_context_t *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + context->cbAddr = callback; +} + +/** \} group_scb_i2c_functions */ + +#if defined(__cplusplus) +} +#endif + +/** \} group_scb_i2c */ + +#endif /* (CY_SCB_I2C_H) */ + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_spi.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_spi.c new file mode 100644 index 0000000000..e7727b185a --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_spi.c @@ -0,0 +1,766 @@ +/***************************************************************************//** +* \file cy_scb_spi.c +* \version 1.0 +* +* Provides SPI API implementation of the SCB driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_scb_spi.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/* Static functions */ +static void HandleTransmit(CySCB_Type *base, cy_stc_scb_spi_context_t *context); +static void HandleReceive (CySCB_Type *base, cy_stc_scb_spi_context_t *context); +static void DiscardArrayNoCheck(CySCB_Type const *base, uint32_t size); + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_Init +****************************************************************************//** +* +* Initializes the SCB for SPI operation. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param config +* The pointer to the configuration structure \ref cy_stc_scb_spi_config_t. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_spi_context_t allocated +* by the user. The structure is used during the SPI operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* If only SPI functions which do not require context will be used pass NULL +* as pointer to context. +* +* \return +* \ref cy_en_scb_spi_status_t +* +* \note +* Ensure that the SCB block is disabled before calling this function. +* +*******************************************************************************/ +cy_en_scb_spi_status_t Cy_SCB_SPI_Init(CySCB_Type *base, cy_stc_scb_spi_config_t const *config, cy_stc_scb_spi_context_t *context) +{ + cy_en_scb_spi_status_t retStatus = CY_SCB_SPI_BAD_PARAM; + + if ((NULL != base) && (NULL != config)) + { + /* Set SCLK mode for TI - CY_SCB_SPI_CPHA1_CPOL0, NS - CY_SCB_SPI_CPHA0_CPOL0, Motorola - take from config */ + uint32_t locSclkMode = (CY_SCB_SPI_MOTOROLA == config->subMode) ? config->sclkMode : + ((CY_SCB_SPI_NATIONAL == config->subMode) ? CY_SCB_SPI_CPHA0_CPOL0 : CY_SCB_SPI_CPHA1_CPOL0); + + /* Configure an SPI interface */ + base->CTRL = (((config->rxDataWidth <= CY_SCB_BYTE_WIDTH) && (config->txDataWidth <= CY_SCB_BYTE_WIDTH)) ? + SCB_CTRL_BYTE_MODE_Msk : 0UL) | + (config->enableWakeFromSleep ? SCB_CTRL_EC_AM_MODE_Msk : 0UL) | + _VAL2FLD(SCB_CTRL_OVS, (config->oversample - 1UL)) | + _VAL2FLD(SCB_CTRL_MODE, CY_SCB_CTRL_MODE_SPI); + + base->SPI_CTRL = (config->enableTransferSeperation ? 0UL : SCB_SPI_CTRL_SSEL_CONTINUOUS_Msk) | + ((0UL != (CY_SCB_SPI_TI_PRECEDE & config->subMode)) ? SCB_SPI_CTRL_SELECT_PRECEDE_Msk : 0UL) | + (config->enableMisoLateSample ? SCB_SPI_CTRL_LATE_MISO_SAMPLE_Msk : 0UL) | + (config->enableFreeRunSclk ? SCB_SPI_CTRL_SCLK_CONTINUOUS_Msk : 0UL) | + ((CY_SCB_SPI_MASTER == config->spiMode) ? SCB_SPI_CTRL_MASTER_MODE_Msk : 0UL) | + _VAL2FLD(CY_SCB_SPI_CTRL_CLK_MODE, locSclkMode) | + _VAL2FLD(CY_SCB_SPI_CTRL_SSEL_POLARITY, config->ssPolarity) | + _VAL2FLD(SCB_SPI_CTRL_MODE, config->subMode); + + /* Configure the RX direction */ + base->RX_CTRL = (config->enableMsbFirst ? SCB_RX_CTRL_MSB_FIRST_Msk : 0UL) | + (config->enableInputFilter ? SCB_RX_CTRL_MEDIAN_Msk : 0UL) | + _VAL2FLD(SCB_RX_CTRL_DATA_WIDTH, (config->rxDataWidth - 1UL)); + + base->RX_FIFO_CTRL = _VAL2FLD(SCB_RX_FIFO_CTRL_TRIGGER_LEVEL, config->rxFifoTriggerLevel); + + /* Configure the TX direction */ + base->TX_CTRL = (config->enableMsbFirst ? SCB_RX_CTRL_MSB_FIRST_Msk : 0UL) | + _VAL2FLD(SCB_TX_CTRL_DATA_WIDTH, (config->txDataWidth - 1UL)); + + base->TX_FIFO_CTRL = _VAL2FLD(SCB_TX_FIFO_CTRL_TRIGGER_LEVEL, config->txFifoTriggerLevel); + + /* Set up interrupt sources */ + base->INTR_TX_MASK = config->txFifoIntEnableMask; + base->INTR_RX_MASK = config->rxFifoIntEnableMask; + base->INTR_M = (config->masterSlaveIntEnableMask & SCB_INTR_M_MASK_SPI_DONE_Msk); + base->INTR_S = (config->masterSlaveIntEnableMask & SCB_INTR_S_MASK_SPI_BUS_ERROR_Msk); + base->INTR_SPI_EC_MASK = 0UL; + + /* Initialize the context */ + if (NULL != context) + { + context->status = 0UL; + + context->txBufIdx = 0UL; + context->rxBufIdx = 0UL; + + context->cbEvents = NULL; + + #if !defined(NDEBUG) + /* Put an initialization key into the initKey variable to verify + * context initialization in the transfer API. + */ + context->initKey = CY_SCB_SPI_INIT_KEY; + #endif /* !(NDEBUG) */ + } + + retStatus = CY_SCB_SPI_SUCCESS; + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_DeInit +****************************************************************************//** +* +* De-initializes the SCB block, returns the register values to default. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \note +* Ensure that the SCB block is disabled before calling this function. +* +*******************************************************************************/ +void Cy_SCB_SPI_DeInit(CySCB_Type *base) +{ + /* SPI interface */ + base->CTRL = CY_SCB_CTRL_DEF_VAL; + base->SPI_CTRL = CY_SCB_SPI_CTRL_DEF_VAL; + + /* RX direction */ + base->RX_CTRL = CY_SCB_RX_CTRL_DEF_VAL; + base->RX_FIFO_CTRL = 0UL; + + /* TX direction */ + base->TX_CTRL = CY_SCB_TX_CTRL_DEF_VAL; + base->TX_FIFO_CTRL = 0UL; + + /* Disable all interrupt sources */ + base->INTR_SPI_EC_MASK = 0UL; + base->INTR_I2C_EC_MASK = 0UL; + base->INTR_RX_MASK = 0UL; + base->INTR_TX_MASK = 0UL; + base->INTR_M_MASK = 0UL; + base->INTR_S_MASK = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_Disable +****************************************************************************//** +* +* Disables the SCB block, clears context statuses and disables +* TX and RX interrupt sources. +* Note that after the block is disabled the TX and RX FIFOs and +* hardware statuses are cleared. Also, the hardware stops driving the output +* and ignores the input. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_spi_context_t allocated +* by the user. The structure is used during the SPI operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* If only SPI functions which do not require context will be used pass NULL +* as pointer to context. +* +* \note +* Calling this function when the SPI is busy (master preforms data transfer or +* slave communicates with the master) may cause transfer corruption because the +* hardware stops driving the output and ignores the input. +* It is recommenced to ensure that the SPI is not busy before calling this +* function. +* +*******************************************************************************/ +void Cy_SCB_SPI_Disable(CySCB_Type *base, cy_stc_scb_spi_context_t *context) +{ + base->CTRL &= (uint32_t) ~SCB_CTRL_ENABLED_Msk; + + if (NULL != context) + { + context->status = 0UL; + + context->rxBufIdx = 0UL; + context->txBufIdx = 0UL; + } + + /* Disable RX and TX interrupt sources for the slave because + * RX overflow and TX underflow are kept enabled after the 1st call of + * Cy_SCB_SPI_Transfer(). + */ + if (!_FLD2BOOL(SCB_SPI_CTRL_MASTER_MODE, base->SPI_CTRL)) + { + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + Cy_SCB_SetTxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_DeepSleep +****************************************************************************//** +* +* Prepares the SPI for deep sleep operation: clears the SPI wake up interrupt +* history and enables it. The wake-up event is the activation of the +* slave select line. +* This function does nothing if the deep sleep option has not been enabled. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \note +* Not all SCBs support the deep sleep operation, consult the device +* datasheet to determine which SCBs support deep sleep operation. +* +*******************************************************************************/ +void Cy_SCB_SPI_DeepSleep(CySCB_Type *base) +{ + if (_FLD2BOOL(SCB_CTRL_EC_AM_MODE, base->CTRL)) + { + /* Clear and enable the SPI wakeup source */ + Cy_SCB_ClearSpiInterrupt (base, CY_SCB_SPI_INTR_WAKEUP); + Cy_SCB_SetSpiInterruptMask(base, CY_SCB_SPI_INTR_WAKEUP); + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_Wakeup +****************************************************************************//** +* +* Disables the wakeup interrupt. +* This function does nothing if the deep sleep option has not been enabled. +* +* \param base +* The pointer to the SPI SCB instance. +* +*******************************************************************************/ +void Cy_SCB_SPI_Wakeup(CySCB_Type *base) +{ + if (_FLD2BOOL(SCB_CTRL_EC_AM_MODE, base->CTRL)) + { + /* Disable the SPI wakeup source */ + Cy_SCB_SetSpiInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } +} + + +/************************* High-Level Functions ******************************** +* The following functions are considered high-level. They provide the layer of +* intelligence to the SCB. These functions require interrupts. +* Low-level and high-level functions should not be mixed because low-level API +* can adversely affect the operation of high-level functions. +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_Transfer +****************************************************************************//** +* +* This function starts an SPI transfer operation. +* It configures transmit and receive buffers for an SPI transfer. +* If the data that will be received is not important, pass NULL as rxBuf. +* If the data that will be transmitted is not important, pass NULL as txBuf +* and then the \ref CY_SCB_SPI_DEFAULT_TX is sent out as each data element. +* +* After the function configures TX and RX interrupt sources, it returns and +* \ref Cy_SCB_SPI_Interrupt manages further data transfer. +* +* * In the master mode, the transfer operation is started after calling this +* function +* * In the slave mode, the transfer is registered and will be started when +* the master request arrives. +* +* When the transfer operation is completed (requested number of data elements +* sent and received), the \ref CY_SCB_SPI_TRANSFER_ACTIVE status is cleared +* and the \ref CY_SCB_SPI_TRANSFER_CMPLT_EVENT event is generated. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param txBuf +* The pointer of the buffer with data to transmit. +* The item size is defined by the data type which depends on the configured +* TX data width. +* +* \param rxBuf +* The pointer to the buffer to store received data. +* The item size is defined by the data type which depends on the configured +* RX data width. +* +* \param size +* The number of data elements to transmit and receive. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_spi_context_t allocated +* by the user. The structure is used during the SPI operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_spi_status_t +* +* \note +* * The buffers must not be modified and stay allocated until the end of the +* transfer. +* * This function overrides all RX and TX FIFO interrupt sources and changes +* the RX and TX FIFO level. +* +*******************************************************************************/ +cy_en_scb_spi_status_t Cy_SCB_SPI_Transfer(CySCB_Type *base, void *txBuf, void *rxBuf, uint32_t size, cy_stc_scb_spi_context_t *context) +{ + cy_en_scb_spi_status_t retStatus = CY_SCB_SPI_TRANSFER_BUSY; + +#if !defined(NDEBUG) + /* Check that the initialization key was set before using the context */ + CY_ASSERT(NULL != context); + CY_ASSERT(CY_SCB_SPI_INIT_KEY == context->initKey); +#endif /* !(NDEBUG) */ + + /* Check if there are no active transfer requests */ + if (0UL == (CY_SCB_SPI_TRANSFER_ACTIVE & context->status)) + { + uint32_t fifoSize = Cy_SCB_GetFifoSize(base); + + /* Set up the context */ + context->status = CY_SCB_SPI_TRANSFER_ACTIVE; + + context->txBuf = txBuf; + context->txBufSize = size; + context->txBufIdx = 0UL; + + context->rxBuf = rxBuf; + context->rxBufSize = size; + context->rxBufIdx = 0UL; + + /* Set the TX interrupt when half of FIFO was transmitted */ + Cy_SCB_SetTxFifoLevel(base, fifoSize / 2UL); + + if (_FLD2BOOL(SCB_SPI_CTRL_MASTER_MODE, base->SPI_CTRL)) + { + /* Trigger an RX interrupt: + * - If the transfer size is equal to or less than FIFO, trigger at the end of the transfer. + * - If the transfer size is greater than FIFO, trigger 1 byte earlier than the TX interrupt. + */ + Cy_SCB_SetRxFifoLevel(base, (size > fifoSize) ? ((fifoSize / 2UL) - 2UL) : (size - 1UL)); + + Cy_SCB_SetMasterInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + /* Enable interrupt sources to perform a transfer */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_RX_INTR_LEVEL); + Cy_SCB_SetTxInterruptMask(base, CY_SCB_TX_INTR_LEVEL); + } + else + { + /* Trigger an RX interrupt: + * - If the transfer size is equal to or less than half of FIFO, trigger ??at the end of the transfer. + * - If the transfer size is greater than half of FIFO, trigger 1 byte earlier than a TX interrupt. + */ + Cy_SCB_SetRxFifoLevel(base, (size > (fifoSize / 2UL)) ? ((fifoSize / 2UL) - 2UL) : (size - 1UL)); + + Cy_SCB_SetSlaveInterruptMask(base, CY_SCB_SLAVE_INTR_SPI_BUS_ERROR); + + /* Enable interrupt sources to perform a transfer */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_RX_INTR_LEVEL | CY_SCB_RX_INTR_OVERFLOW); + Cy_SCB_SetTxInterruptMask(base, CY_SCB_TX_INTR_LEVEL | CY_SCB_TX_INTR_UNDERFLOW); + } + + retStatus = CY_SCB_SPI_SUCCESS; + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_AbortTransfer +****************************************************************************//** +* +* Aborts the current SPI transfer. +* It disables the transmit and RX interrupt sources, clears the TX +* and RX FIFOs and the status. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_spi_context_t allocated +* by the user. The structure is used during the SPI operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* In the slave mode and after abort of transfer operation master continue +* sending data it gets into RX FIFO and TX FIFO is underflow as there is +* nothing to send. To drop this data, RX FIFO has to be cleared when +* the transfer is completed. Otherwise, received data will be kept and +* copied to the buffer when \ref Cy_SCB_SPI_Transfer is called. +* +* \sideeffect +* The transmit FIFO clear operation also clears the shift register, so that +* the shifter could be cleared in the middle of a data element transfer, +* corrupting it. The data element corruption means that all bits which has +* not been transmitted are transmitted as "ones" on the bus. +* +*******************************************************************************/ +void Cy_SCB_SPI_AbortTransfer(CySCB_Type *base, cy_stc_scb_spi_context_t *context) +{ + /* Disable interrupt sources */ + Cy_SCB_SetSlaveInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + if (_FLD2BOOL(SCB_SPI_CTRL_MASTER_MODE, base->SPI_CTRL)) + { + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + Cy_SCB_SetTxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } + else + { + Cy_SCB_SetRxInterruptMask(base, CY_SCB_RX_INTR_OVERFLOW); + Cy_SCB_SetTxInterruptMask(base, CY_SCB_TX_INTR_UNDERFLOW); + } + + /* Clear FIFOs */ + Cy_SCB_SPI_ClearTxFifo(base); + Cy_SCB_SPI_ClearRxFifo(base); + + /* Clear the status to allow a new transfer */ + context->status = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_GetNumTransfered +****************************************************************************//** +* +* Returns the number of data elements transferred since the last call to \ref +* Cy_SCB_SPI_Transfer. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_spi_context_t allocated +* by the user. The structure is used during the SPI operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* The number of data elements transferred. +* +*******************************************************************************/ +uint32_t Cy_SCB_SPI_GetNumTransfered(CySCB_Type const *base, cy_stc_scb_spi_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->rxBufIdx); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_GetTransferStatus +****************************************************************************//** +* +* Returns the status of the transfer operation started by +* \ref Cy_SCB_SPI_Transfer. +* This status is a bit mask and the value returned may have a multiple-bit set. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_spi_context_t allocated +* by the user. The structure is used during the SPI operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref group_scb_spi_macro_xfer_status. +* +* \note +* The status is cleared by calling \ref Cy_SCB_SPI_Transfer or +* \ref Cy_SCB_SPI_AbortTransfer. +* +*******************************************************************************/ +uint32_t Cy_SCB_SPI_GetTransferStatus(CySCB_Type const *base, cy_stc_scb_spi_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->status); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_Interrupt +****************************************************************************//** +* +* This is the interrupt function for the SCB configured in the SPI mode. +* This function must be called inside the user-defined interrupt service +* routine in order for \ref Cy_SCB_SPI_Transfer to work. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_spi_context_t allocated +* by the user. The structure is used during the SPI operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +void Cy_SCB_SPI_Interrupt(CySCB_Type *base, cy_stc_scb_spi_context_t *context) +{ + uint32 locXferErr = 0UL; + + /* Wake up on the slave select condition */ + if (0UL != (CY_SCB_SPI_INTR_WAKEUP & Cy_SCB_GetSpiInterruptStatusMasked(base))) + { + Cy_SCB_ClearSpiInterrupt(base, CY_SCB_SPI_INTR_WAKEUP); + } + + /* The slave error condition */ + if (0UL != (CY_SCB_SLAVE_INTR_SPI_BUS_ERROR & Cy_SCB_GetSlaveInterruptStatusMasked(base))) + { + locXferErr = CY_SCB_SPI_TRANSFER_ERR; + context->status |= CY_SCB_SPI_SLAVE_TRANSFER_ERR; + + Cy_SCB_ClearSlaveInterrupt(base, CY_SCB_SLAVE_INTR_SPI_BUS_ERROR); + } + + /* The RX overflow error condition */ + if (0UL != (CY_SCB_RX_INTR_OVERFLOW & Cy_SCB_GetRxInterruptStatusMasked(base))) + { + locXferErr = CY_SCB_SPI_TRANSFER_ERR; + context->status |= CY_SCB_SPI_TRANSFER_OVERFLOW; + + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_OVERFLOW); + } + + /* The TX underflow error condition or slave complete data transfer */ + if (0UL != (CY_SCB_TX_INTR_UNDERFLOW & Cy_SCB_GetTxInterruptStatusMasked(base))) + { + locXferErr = CY_SCB_SPI_TRANSFER_ERR; + context->status |= CY_SCB_SPI_TRANSFER_UNDERFLOW; + + Cy_SCB_ClearTxInterrupt(base, CY_SCB_TX_INTR_UNDERFLOW); + } + + /* Report an error, use a callback */ + if (0UL != locXferErr) + { + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_SPI_TRANSFER_ERR); + } + } + + /* RX direction */ + if (0UL != (CY_SCB_RX_INTR_LEVEL & Cy_SCB_GetRxInterruptStatusMasked(base))) + { + HandleReceive(base, context); + + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_LEVEL); + } + + /* TX direction */ + if (0UL != (CY_SCB_TX_INTR_LEVEL & Cy_SCB_GetTxInterruptStatusMasked(base))) + { + HandleTransmit(base, context); + + Cy_SCB_ClearTxInterrupt(base, CY_SCB_TX_INTR_LEVEL); + } + + /* The transfer is complete: all data is loaded in the TX FIFO + * and all data is read from the RX FIFO + */ + if ((0UL != (context->status & CY_SCB_SPI_TRANSFER_ACTIVE)) && + (0UL == context->rxBufSize) && (0UL == context->txBufSize)) + { + /* The transfer is complete */ + context->status &= (uint32_t) ~CY_SCB_SPI_TRANSFER_ACTIVE; + + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_SPI_TRANSFER_CMPLT_EVENT); + } + } +} + + +/******************************************************************************* +* Function Name: HandleReceive +****************************************************************************//** +* +* Reads data from RX FIFO into the buffer provided by \ref Cy_SCB_SPI_Transfer. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_spi_context_t allocated +* by the user. The structure is used during the SPI operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void HandleReceive(CySCB_Type *base, cy_stc_scb_spi_context_t *context) +{ + /* Get data in RX FIFO */ + uint32_t numToCopy = Cy_SCB_GetNumInRxFifo(base); + + /* Adjust the number to read */ + if (numToCopy > context->rxBufSize) + { + numToCopy = context->rxBufSize; + } + + /* Move the buffer */ + context->rxBufIdx += numToCopy; + context->rxBufSize -= numToCopy; + + /* Read data from RX FIFO */ + if (NULL != context->rxBuf) + { + uint8_t *buf = (uint8_t *) context->rxBuf; + + Cy_SCB_ReadArrayNoCheck(base, context->rxBuf, numToCopy); + + buf = &buf[(Cy_SCB_IsRxDataWidthByte(base) ? (numToCopy) : (2UL * numToCopy))]; + context->rxBuf = (void *) buf; + } + else + { + /* Discard read data. */ + DiscardArrayNoCheck(base, numToCopy); + } + + if (0UL == context->rxBufSize) + { + /* Disable the RX level interrupt */ + Cy_SCB_SetRxInterruptMask(base, (Cy_SCB_GetRxInterruptMask(base) & (uint32_t) ~CY_SCB_RX_INTR_LEVEL)); + } + else + { + uint32_t level = (_FLD2BOOL(SCB_SPI_CTRL_MASTER_MODE, base->SPI_CTRL)) ? + Cy_SCB_GetFifoSize(base) : (Cy_SCB_GetFifoSize(base) / 2UL); + + if (context->rxBufSize < level) + { + Cy_SCB_SetRxFifoLevel(base, (context->rxBufSize - 1UL)); + } + } +} + + +/******************************************************************************* +* Function Name: HandleTransmit +****************************************************************************//** +* +* Loads TX FIFO with data provided by \ref Cy_SCB_SPI_Transfer. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_spi_context_t allocated +* by the user. The structure is used during the SPI operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void HandleTransmit(CySCB_Type *base, cy_stc_scb_spi_context_t *context) +{ + uint32_t numToCopy; + uint32_t fifoSize = Cy_SCB_GetFifoSize(base); + + numToCopy = fifoSize - Cy_SCB_GetNumInTxFifo(base); + + /* Adjust the number to load */ + if (numToCopy > context->txBufSize) + { + numToCopy = context->txBufSize; + } + + /* Move the buffer */ + context->txBufIdx += numToCopy; + context->txBufSize -= numToCopy; + + /* Load TX FIFO with data */ + if (NULL != context->txBuf) + { + uint8_t *buf = (uint8_t *) context->txBuf; + + Cy_SCB_WriteArrayNoCheck(base, context->txBuf, numToCopy); + + buf = &buf[(Cy_SCB_IsTxDataWidthByte(base) ? (numToCopy) : (2UL * numToCopy))]; + context->txBuf = (void *) buf; + } + else + { + Cy_SCB_WriteDefaultArrayNoCheck(base, CY_SCB_SPI_DEFAULT_TX, numToCopy); + } + + if (0UL == context->txBufSize) + { + /* Data is transferred into TX FIFO */ + context->status |= CY_SCB_SPI_TRANSFER_IN_FIFO; + + /* Disable the TX level interrupt */ + Cy_SCB_SetTxInterruptMask(base, (Cy_SCB_GetTxInterruptMask(base) & (uint32_t) ~CY_SCB_TX_INTR_LEVEL)); + + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_SPI_TRANSFER_IN_FIFO_EVENT); + } + } +} + + +/******************************************************************************* +* Function Name: DiscardArrayNoCheck +****************************************************************************//** +* +* Reads the number of data elements from the SPI RX FIFO. The read data is +* discarded. Before calling this function, make sure that RX FIFO has +* enough data elements to read. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param size +* The number of data elements to read. +* +*******************************************************************************/ +static void DiscardArrayNoCheck(CySCB_Type const *base, uint32_t size) +{ + while (size > 0UL) + { + (void) Cy_SCB_SPI_Read(base); + --size; + } +} + + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_spi.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_spi.h new file mode 100644 index 0000000000..e3878e9ff9 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_spi.h @@ -0,0 +1,1233 @@ +/***************************************************************************//** +* \file cy_scb_spi.h +* \version 1.0 +* +* Provides SPI API declarations of the SCB driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \addtogroup group_scb_spi +* \{ +* Driver API for SPI Bus Peripheral. +* +* Three different SPI protocols or modes are supported: +* * The original SPI protocol as defined by Motorola. +* * TI: Uses a short pulse on "spi_select" to indicate a start of transaction. +* * National Semiconductor (Microwire): Transmissions and Receptions occur +* separately. +* In addition to the standard 8-bit word length, the component supports a +* configurable 4- to 16-bit data width for communicating at non-standard SPI +* data widths. +* +* \section group_scb_spi_configuration Configuration Considerations +* +* To set up an SPI, provide configuration parameters in the +* \ref cy_stc_scb_spi_config_t structure. For example: provide spiMode, +* subMode, sclkMode, oversample, rxDataWidth, and txDataWidth. The other +* parameters are optional for operation. +* To initialize driver call \ref Cy_SCB_SPI_Init function providing the pointer +* to populated configuration structure +* \ref cy_stc_scb_spi_config_t and the pointer to allocated context structure +* \ref cy_stc_scb_spi_context_t. +* The clock source connected to the SCB SPI must be configured to provide +* the sufficient frequency and set the appropriate oversampling (only matters +* for the master mode) to reach the desired data rate. Call +* \ref Cy_SCB_SPI_Enable to start the SPI operation after configuration is +* completed. +* +* The SPI API are the same for the master and slave mode operation and +* are divided into two categories: low-level and high-level. Do not +* mix high-level and low-level API because a low-level API can adversely +* affect the operation of a higher level API. +* +* The Low-level API's functions allow interacting directly with the hardware +* and do not use interrupts. These functions do not require context for +* operation, thus NULL can be passed in \ref Cy_SCB_SPI_Init and +* \ref Cy_SCB_SPI_Disable instead of a pointer to the context structure. +* +* * To write data into the TX FIFO, use one of the provided functions: +* \ref Cy_SCB_SPI_Write, \ref Cy_SCB_SPI_WriteArray or +* \ref Cy_SCB_SPI_WriteArrayBlocking. +* Note that in the master mode, putting data into the TX FIFO starts a +* transfer. Due to the SPI nature, the received data is put into the RX FIFO. +* +* * To read data from the RX FIFO, use one of the provided functions: +* \ref Cy_SCB_SPI_Read or \ref Cy_SCB_SPI_ReadArray. +* +* * The statuses can be polled using: \ref Cy_SCB_SPI_GetRxFifoStatus, +* \ref Cy_SCB_SPI_GetTxFifoStatus and \ref Cy_SCB_SPI_GetSlaveMasterStatus. +* The statuses are W1C (Write 1 to Clear) and after a status is set, +* it must be cleared. Note that there are statuses evaluated as level. These +* statuses remain set when an event is true. Therefore, after the clear +* operation, the status is cleared but then it is restored (if event is still +* true). +* For example: the TX FIFO empty interrupt source can be cleared when the +* TX FIFO is not empty. Put at least two data elements (one goes to the +* shifter and next to FIFO) before clearing this status. +* +* The High-level API uses interrupts to execute a transfer. Call +* \ref Cy_SCB_SPI_Transfer to start communication: for the master mode a +* transfer to the slave is started while for the slave mode the Read and Write +* buffers are prepared for the following communication with the master. +* After a transfer is started, the \ref Cy_SCB_SPI_Interrupt handles the +* transfer until its completion. Therefore it must be called inside the +* user interrupt handler to make the high-level API work. To monitor the status +* of the transfer operation, use \ref Cy_SCB_SPI_GetTransferStatus. +* Alternately, use \ref Cy_SCB_SPI_RegisterCallback to register a callback +* function to be notified about \ref group_scb_spi_macro_callback_events. +* +* \section group_scb_spi_more_information More Information +* +* For more information on the SCB peripheral, refer to the technical reference +* manual (TRM). +* +* \section group_scb_spi_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
11.4AA cast should not be performed between a pointer to object type and +* a different pointer to object type.The pointer to the buffer memory is void to allow handling different +* different data types: uint8_t (4-8 bits) or uint16_t (9-16 bits). +*
14.2RAll non-null statements shall either: a) have at least one side-effect +* however executed, or b) cause control flow to change.The unused function parameters are cast to void. This statement +* has no side-effect and is used to suppress a compiler warning.
20.3RThe validity of values passed to library functions shall be checked. +* The CY_ASSERT() macro is used for verification of pointer to context +* parameter against NULL. This macro halts code execution if +* verification fails what ensures that NULL pointer is not dereference. +*
+* +* \section group_scb_spi_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_scb_spi_macro Macro +* \defgroup group_scb_spi_functions Functions +* \defgroup group_scb_spi_data_structures Data Structures +* \defgroup group_scb_spi_enums Enumerated Types +*/ + +#if !defined(CY_SCB_SPI_H) +#define CY_SCB_SPI_H + +#include "cy_scb_common.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/*************************************** +* Enumerated Types +***************************************/ + +/** +* \addtogroup group_scb_spi_enums +* \{ +*/ + +/** SPI status codes */ +typedef enum +{ + /** Operation completed successfully */ + CY_SCB_SPI_SUCCESS = 0x00U, + + /** One or more of input parameters are invalid */ + CY_SCB_SPI_BAD_PARAM = CY_SCB_ID | CY_PDL_STATUS_ERROR | CY_SCB_SPI_ID | 1UL, + + /** + * The SPI is busy processing a transfer. Call this function again + * once that transfer is completed or aborted. + */ + CY_SCB_SPI_TRANSFER_BUSY +} cy_en_scb_spi_status_t; +/** \} group_scb_spi_enums */ + + +/*************************************** +* Type Definitions +***************************************/ + +/** +* \addtogroup group_scb_spi_data_structures +* \{ +*/ + +/** +* Provides the typedef for the callback function called in the +* \ref Cy_SCB_SPI_Interrupt to notify the user about occurrences of +* \ref group_scb_spi_macro_callback_events. +*/ +typedef void (* scb_spi_handle_events_t)(uint32_t event); + + +/** SPI Configuration Structure */ +typedef struct cy_stc_scb_spi_config +{ + /** + * Specifies the mode of operation + * (See \ref group_scb_spi_macro_modes for the set of constants) + */ + uint32_t spiMode; + + /** + * Specifies the submode of SPI operation + * (See \ref group_scb_spi_macro_sub_modes for the set of constants) + */ + uint32_t subMode; + + /** + * Configures the SCLK operation for Motorola sub-mode, ignored for all + * other submodes (See \ref group_scb_spi_macro_sclk_modes for the set + * of constants) + */ + uint32_t sclkMode; + + /** + * Oversample factor for SPI. + * * For the master mode, the data rate is the SCB clock / oversample + * (valid range is 4-16). + * * For the slave mode, the oversample value is ignored. The data rate is + * determined by the SCB clock frequency. See the device datasheet for + * more details. + */ + uint32_t oversample; + + /** + * The width of RX data (valid range 4-16). It must be the same as + * \ref txDataWidth except in National sub-mode. + */ + uint32_t rxDataWidth; + + /** + * The width of TX data (valid range 4-16). It must be the same as + * \ref rxDataWidth except in National sub-mode. + */ + uint32_t txDataWidth; + + /** + * Enables the hardware to shift out the data element MSB first, otherwise, + * LSB first + */ + bool enableMsbFirst; + + /** + * Enables the master to generate a continuous SCLK regardless of whether + * there is data to send + */ + bool enableFreeRunSclk; + + /** + * Enables a digital 3-tap median filter to be applied to the input + * of the RX FIFO to filter glitches on the line. + */ + bool enableInputFilter; + + /** + * Enables the master to sample MISO line one half clock later to allow + * better timings. + */ + bool enableMisoLateSample; + + /** + * Enables the master to transmit each data element separated by a + * de-assertion of the slave select line (only applicable for the master + * mode) + */ + bool enableTransferSeperation; + + /** + * Sets active polarity of each SS line. + * This is a bit mask: bit 0 corresponds to SS0 and so on to SS3. + * 1 means active high, a 0 means active low. + */ + uint32_t ssPolarity; + + /** + * When set, the slave will wake the device when the slave select line + * becomes active. + * Note that not all SCBs support this mode. Consult the device + * datasheet to determine which SCBs support wake from deep sleep. + */ + bool enableWakeFromSleep; + + /** + * When there are more entries in the RX FIFO, then at this level + * the RX trigger output goes high. This output can be connected + * to a DMA channel through a trigger mux. + * Also, it controls the \ref CY_SCB_SPI_RX_TRIGGER interrupt source. + */ + uint32_t rxFifoTriggerLevel; + + /** + * Bits set in this mask will allow events to cause an interrupt + * (See \ref group_scb_spi_macro_rx_fifo_status for the set of constant) + */ + uint32_t rxFifoIntEnableMask; + + /** + * When there are fewer entries in the TX FIFO, then at this level + * the TX trigger output goes high. This output can be connected + * to a DMA channel through a trigger mux. + * Also, it controls the \ref CY_SCB_SPI_TX_TRIGGER interrupt source. + */ + uint32_t txFifoTriggerLevel; + + /** + * Bits set in this mask allow events to cause an interrupt + * (See \ref group_scb_spi_macro_tx_fifo_status for the set of constants) + */ + uint32_t txFifoIntEnableMask; + + /** + * Bits set in this mask allow events to cause an interrupt + * (See \ref group_scb_spi_macro_master_slave_status for the set of + * constants) + */ + uint32_t masterSlaveIntEnableMask; + +}cy_stc_scb_spi_config_t; + +/** SPI internal context structure */ +typedef struct cy_stc_scb_spi_context +{ + uint32_t volatile status; /**< Receive status */ + + void *rxBuf; /**< Pointer to receive buffer */ + uint32_t volatile rxBufSize; /**< Receive buffer size */ + uint32_t volatile rxBufIdx; /**< Pointer to receive buffer */ + + void *txBuf; /**< Pointer to transmit buffer */ + uint32_t volatile txBufSize; /**< Transmit buffer size */ + uint32_t volatile txBufIdx; /**< Index within transmit buffer */ + + /** + * The pointer to an event callback called when an SPI event occurs + */ + scb_spi_handle_events_t cbEvents; + +#if !defined(NDEBUG) + uint32_t initKey; /**< Tracks context initialization */ +#endif /* !(NDEBUG) */ +} cy_stc_scb_spi_context_t; + +/** \} group_scb_spi_data_structures */ + + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_scb_spi_functions +* \{ +*/ + +/* Basic functions */ +cy_en_scb_spi_status_t Cy_SCB_SPI_Init(CySCB_Type *base, cy_stc_scb_spi_config_t const *config, + cy_stc_scb_spi_context_t *context); +void Cy_SCB_SPI_DeInit (CySCB_Type *base); +__STATIC_INLINE void Cy_SCB_SPI_Enable(CySCB_Type *base); +void Cy_SCB_SPI_Disable(CySCB_Type *base, cy_stc_scb_spi_context_t *context); + +/* Low-power functions */ +void Cy_SCB_SPI_DeepSleep(CySCB_Type *base); +void Cy_SCB_SPI_Wakeup (CySCB_Type *base); + +/* Configuration functions */ +__STATIC_INLINE void Cy_SCB_SPI_SetActiveSlaveSelect(CySCB_Type *base, uint32_t slaveSelect); +__STATIC_INLINE void Cy_SCB_SPI_SetActiveSlaveSelectPolarity(CySCB_Type *base, uint32_t slaveSelect, uint32_t polarity); + +/* Bus status */ +__STATIC_INLINE bool Cy_SCB_SPI_IsBusBusy(CySCB_Type const *base); + +/* Low-level: Receive direction */ +__STATIC_INLINE uint32_t Cy_SCB_SPI_Read (CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_SPI_ReadArray(CySCB_Type const *base, void *rxBuf, uint32_t size); + +__STATIC_INLINE uint32_t Cy_SCB_SPI_GetRxFifoStatus (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SPI_ClearRxFifoStatus(CySCB_Type *base, uint32_t clearMask); +__STATIC_INLINE uint32_t Cy_SCB_SPI_GetNumInRxFifo (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SPI_ClearRxFifo (CySCB_Type *base); + +/* Low-level: Transmit direction */ +__STATIC_INLINE uint32_t Cy_SCB_SPI_Write (CySCB_Type *base, uint32_t data); +__STATIC_INLINE uint32_t Cy_SCB_SPI_WriteArray(CySCB_Type *base, void *txBuf, uint32_t size); +__STATIC_INLINE void Cy_SCB_SPI_WriteArrayBlocking(CySCB_Type *base, void *txBuf, uint32_t size); + +__STATIC_INLINE uint32_t Cy_SCB_SPI_GetTxFifoStatus (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SPI_ClearTxFifoStatus(CySCB_Type *base, uint32_t clearMask); +__STATIC_INLINE uint32_t Cy_SCB_SPI_GetNumInTxFifo (CySCB_Type const *base); +__STATIC_INLINE bool Cy_SCB_SPI_IsTxComplete (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SPI_ClearTxFifo (CySCB_Type *base); + +/* Low-level: Master or slave status */ +__STATIC_INLINE uint32_t Cy_SCB_SPI_GetSlaveMasterStatus (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_SPI_ClearSlaveMasterStatus(CySCB_Type *base, uint32_t clearMask); + +/* High-level: callback */ +__STATIC_INLINE void Cy_SCB_SPI_RegisterCallback(CySCB_Type const *base, scb_spi_handle_events_t callback, + cy_stc_scb_spi_context_t *context); + +/* High-level: Transfer functions */ +cy_en_scb_spi_status_t Cy_SCB_SPI_Transfer(CySCB_Type *base, void *txBuf, void *rxBuf, uint32_t size, + cy_stc_scb_spi_context_t *context); +void Cy_SCB_SPI_AbortTransfer (CySCB_Type *base, cy_stc_scb_spi_context_t *context); +uint32_t Cy_SCB_SPI_GetNumTransfered (CySCB_Type const *base, cy_stc_scb_spi_context_t const *context); +uint32_t Cy_SCB_SPI_GetTransferStatus(CySCB_Type const *base,cy_stc_scb_spi_context_t const *context); + +/* High-level: Interrupt handler */ +void Cy_SCB_SPI_Interrupt(CySCB_Type *base, cy_stc_scb_spi_context_t *context); +/** \} group_scb_spi_functions */ + + +/*************************************** +* API Constants +***************************************/ + +/** +* \addtogroup group_scb_spi_macro +* \{ +*/ + +/** +* \defgroup group_scb_spi_macro_modes SPI Modes +* \{ +*/ +#define CY_SCB_SPI_SLAVE (0UL) /**< Configures SCB for SPI Slave operation */ +#define CY_SCB_SPI_MASTER (1UL) /**< Configures SCB for SPI Master operation */ +/** \} group_scb_spi_macro_modes */ + +/** +* \defgroup group_scb_spi_macro_sub_modes SPI Submodes +* \{ +*/ +/** Configures an SPI for a standard Motorola SPI operation */ +#define CY_SCB_SPI_MOTOROLA (0UL) + +/** +* Configures the SPI for the TI SPI operation. In the TI mode, the slave select +* is a pulse. In this case, the pulse coincides with the first bit. +*/ +#define CY_SCB_SPI_TI_COINCIDES (1UL) + +/** +* Configures an SPI for the TI SPI operation, in the TI mode. The slave select +* is a pulse. In this case the pulse precedes the first bit. +*/ +#define CY_SCB_SPI_TI_PRECEDES (1UL | CY_SCB_SPI_TI_PRECEDE) + +/** +* Configures an SPI for the National SPI operation. This is a half-duplex +* mode of operation. +*/ +#define CY_SCB_SPI_NATIONAL (2UL) +/** \} group_scb_spi_macro_sub_modes */ + +/** +* \defgroup group_scb_spi_macro_sclk_modes SPI SCLK Modes +* \{ +*/ +#define CY_SCB_SPI_CPHA0_CPOL0 (0UL) /**< Clock is active low, data is changed on first edge */ +#define CY_SCB_SPI_CPHA0_CPOL1 (1UL) /**< Clock is active high, data is changed on first edge */ +#define CY_SCB_SPI_CPHA1_CPOL0 (2UL) /**< Clock is active low, data is changed on second edge */ +#define CY_SCB_SPI_CPHA1_CPOL1 (3UL) /**< Clock is active high, data is changed on second edge */ +/** \} group_scb_spi_macro_sclk_modes */ + +/** +* \defgroup group_scb_spi_macro_slave_select SPI Slave Selects +* \{ +*/ +#define CY_SCB_SPI_SLAVE_SELECT0 (0UL) /**< Master will use Slave Select 0 */ +#define CY_SCB_SPI_SLAVE_SELECT1 (1UL) /**< Master will use Slave Select 1 */ +#define CY_SCB_SPI_SLAVE_SELECT2 (2UL) /**< Master will use Slave Select 2 */ +#define CY_SCB_SPI_SLAVE_SELECT3 (3UL) /**< Master will use Slave Select 3 */ +/** \} group_scb_spi_macro_slave_select */ + +/** +* \defgroup group_scb_spi_macro_tx_fifo_status SPI TX FIFO Statuses +* Each SPI TX FIFO status is encoded in a separate bit. Therefore multiple bits +* may be set to indicate the current status. +* \{ +*/ +/** The number of entries in the TX FIFO is less than the TX FIFO trigger level +* value +*/ +#define CY_SCB_SPI_TX_TRIGGER (SCB_INTR_TX_TRIGGER_Msk) + +/** The TX FIFO is not full, there is a space for more data */ +#define CY_SCB_SPI_TX_NOT_FULL (SCB_INTR_TX_NOT_FULL_Msk) + +/** +* The TX FIFO is empty, note that there may still be data in the shift register. +*/ +#define CY_SCB_SPI_TX_EMPTY (SCB_INTR_TX_EMPTY_Msk) + +/** An attempt to write to the full TX FIFO */ +#define CY_SCB_SPI_TX_OVERFLOW (SCB_INTR_TX_OVERFLOW_Msk) + +/** +* Applicable only for the slave mode. The master tried to read more +* data elements than available. +*/ +#define CY_SCB_SPI_TX_UNDERFLOW (SCB_INTR_TX_UNDERFLOW_Msk) +/** \} group_scb_spi_macro_tx_fifo_status */ + +/** +* \defgroup group_scb_spi_macro_rx_fifo_status SPI RX FIFO Statuses +* \{ +* Each SPI RX FIFO status is encoded in a separate bit. Therefore, multiple +* bits may be set to indicate the current status. +*/ +/** The number of entries in the RX FIFO is more than the RX FIFO trigger +* level value. +*/ +#define CY_SCB_SPI_RX_TRIGGER (SCB_INTR_RX_TRIGGER_Msk) + +/** The RX FIFO is not empty, there is data to read */ +#define CY_SCB_SPI_RX_NOT_EMPTY (SCB_INTR_RX_NOT_EMPTY_Msk) + +/** +* The RX FIFO is full. There is no more space for additional data. +* Any additional data will be dropped. +*/ +#define CY_SCB_SPI_RX_FULL (SCB_INTR_RX_FULL_Msk) + +/** +* The RX FIFO was full and there was an attempt to write to it. +* This additional data was dropped. +*/ +#define CY_SCB_SPI_RX_OVERFLOW (SCB_INTR_RX_OVERFLOW_Msk) + +/** An attempt to read from an empty RX FIFO */ +#define CY_SCB_SPI_RX_UNDERFLOW (SCB_INTR_RX_UNDERFLOW_Msk) +/** \} group_scb_spi_macro_rx_fifo_status */ + +/** +* \defgroup group_scb_spi_macro_master_slave_status SPI Master and Slave Statuses +* \{ +*/ +/** The slave was deselected at the wrong time */ +#define CY_SCB_SPI_SLAVE_ERR (SCB_INTR_S_SPI_BUS_ERROR_Msk) + +/** The master has transmitted all data elements from FIFO and shifter */ +#define CY_SCB_SPI_MASTER_DONE (SCB_INTR_M_SPI_DONE_Msk) +/** \} group_scb_spi_macro_master_slave_status */ + +/** +* \defgroup group_scb_spi_macro_xfer_status SPI Transfer Status +* \{ +* Each SPI transfer status is encoded in a separate bit, therefore multiple bits +* may be set to indicate the current status. +*/ +/** +* Transfer started by \ref Cy_SCB_SPI_Transfer is in progress. +*/ +#define CY_SCB_SPI_TRANSFER_ACTIVE (0x01UL) + +/** +* All TX data from \ref Cy_SCB_SPI_Transfer is in the TX FIFO. +*/ +#define CY_SCB_SPI_TRANSFER_IN_FIFO (0x02UL) + +/** The slave was deselected at the wrong time. */ +#define CY_SCB_SPI_SLAVE_TRANSFER_ERR (SCB_INTR_S_SPI_BUS_ERROR_Msk) + +/** +* RX FIFO was full and there was an attempt to write to it. +* This additional data was dropped. +*/ +#define CY_SCB_SPI_TRANSFER_OVERFLOW (SCB_INTR_RX_OVERFLOW_Msk) + +/** +* Applicable only for the slave mode. The master tried to read more +* data elements than available in the TX FIFO. +*/ +#define CY_SCB_SPI_TRANSFER_UNDERFLOW (SCB_INTR_TX_UNDERFLOW_Msk) +/** \} group_scb_spi_macro_xfer_status */ + +/** +* \defgroup group_scb_spi_macro_callback_events SPI Callback Events +* \{ +* Only single event is notified by the callback. +*/ +/** All TX data from \ref Cy_SCB_SPI_Transfer is in the TX FIFO.*/ +#define CY_SCB_SPI_TRANSFER_IN_FIFO_EVENT (0x01U) + +/** The transfer started by \ref Cy_SCB_SPI_Transfer is complete.*/ +#define CY_SCB_SPI_TRANSFER_CMPLT_EVENT (0x02U) + +/** +* An error occurred during the transfer. This includes overflow, underflow +* and a transfer error. Check \ref Cy_SCB_SPI_GetTransferStatus. +*/ +#define CY_SCB_SPI_TRANSFER_ERR_EVENT (0x04U) +/** \} group_scb_spi_macro_callback_events */ + +/** +* \defgroup group_scb_spi_macro_polarity SPI Polarity +* \{ +*/ +#define CY_SCB_SPI_ACTIVE_LOW (0UL) /**< Signal in question is active low */ +#define CY_SCB_SPI_ACTIVE_HIGH (1UL) /**< Signal in question is active high */ +/** \} group_scb_spi_macro_polarity */ + +/** Default TX value when no TX buffer is defined */ +#define CY_SCB_SPI_DEFAULT_TX (0x0000FFFFUL) + +/** Data returned by the hardware when an empty RX FIFO is read */ +#define CY_SCB_SPI_RX_NO_DATA (0xFFFFFFFFUL) + + +/*************************************** +* Internal Constants +***************************************/ + +/** \cond INTERNAL */ +#define CY_SCB_SPI_TI_PRECEDE (0x10UL) + +#define CY_SCB_SPI_RX_INTR (CY_SCB_SPI_RX_TRIGGER | CY_SCB_SPI_RX_NOT_EMPTY | CY_SCB_SPI_RX_FULL | \ + CY_SCB_SPI_RX_OVERFLOW | CY_SCB_SPI_RX_UNDERFLOW) + +#define CY_SCB_SPI_TX_INTR (CY_SCB_SPI_TX_TRIGGER | CY_SCB_SPI_TX_NOT_FULL | CY_SCB_SPI_TX_EMPTY | \ + CY_SCB_SPI_TX_OVERFLOW | CY_SCB_SPI_TX_UNDERFLOW) + +#define CY_SCB_SPI_TRANSFER_ERR (CY_SCB_SPI_SLAVE_TRANSFER_ERR | CY_SCB_SPI_TRANSFER_OVERFLOW | \ + CY_SCB_SPI_TRANSFER_UNDERFLOW) + +#define CY_SCB_SPI_INIT_KEY (0x00ABCDEFUL) +/** \endcond */ + +/** \} group_scb_spi_macro */ + + +/*************************************** +* In-line Function Implementation +***************************************/ + +/** +* \addtogroup group_scb_spi_functions +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_Enable +****************************************************************************//** +* +* Enables the SCB block for the SPI operation. +* +* \param base +* The pointer to the SPI SCB instance. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SPI_Enable(CySCB_Type *base) +{ + base->CTRL |= SCB_CTRL_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_IsBusBusy +****************************************************************************//** +* +* Returns whether the SPI bus is busy or not. The bus busy is determined using +* the slave select signal. +* * Motorola and National Semiconductor sub-modes: the bus is busy after the +* slave select line is activated and lasts until the slave select line is +* deactivated. +* * Texas Instrument sub-modes: The bus is busy at the moment of the initial +* pulse on the slave select line and lasts until the transfer is complete. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \return +* True - the bus is busy, false - the bus is idle. +* +* \note +* * The SPI master does not assign the slave select line immediately after +* the 1st data element is written into the TX FIFO. It takes up to 2 SCLK +* clocks to assign the slave select line. Before this happens, the bus +* is considered idle. +* * If the SPI master is configured to separate a data elements transfer, +* the bus is busy during each element transfer and is free between them. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SCB_SPI_IsBusBusy(CySCB_Type const *base) +{ + return _FLD2BOOL(SCB_SPI_STATUS_BUS_BUSY, base->SPI_STATUS); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_SetActiveSlaveSelect +****************************************************************************//** +* +* Selects an active slave select line from one of four available. +* This function is applicable for the master and slave. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param slaveSelect +* The slave select line number. +* See \ref group_scb_spi_macro_slave_select for the set of constants. +* +* \note +* The SCB be idle or disabled before calling this function. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SPI_SetActiveSlaveSelect(CySCB_Type *base, uint32_t slaveSelect) +{ + base->SPI_CTRL = _CLR_SET_FLD32U(base->SPI_CTRL, SCB_SPI_CTRL_SSEL, slaveSelect); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_SetActiveSlaveSelectPolarity +****************************************************************************//** +* +* Sets the active polarity for the slave select line. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param slaveSelect +* The slave select line number. +* See \ref group_scb_spi_macro_slave_select for the set of constants. +* +* \param polarity +* The polarity of the slave select line. +* See \ref group_scb_spi_macro_polarity for the set of constants. +* +* \note +* The SCB be idle or disabled before calling this function. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SPI_SetActiveSlaveSelectPolarity(CySCB_Type *base, uint32_t slaveSelect, uint32_t polarity) +{ + uint32_t mask = _VAL2FLD(CY_SCB_SPI_CTRL_SSEL_POLARITY, (1UL << slaveSelect)); + + if (0UL != polarity) + { + base->SPI_CTRL |= (uint32_t) mask; + } + else + { + base->SPI_CTRL &= (uint32_t) ~mask; + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_GetRxFifoStatus +****************************************************************************//** +* +* Returns the current status of the RX FIFO. +* Clear the active statuses to let the SCB hardware update them. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \return +* \ref group_scb_spi_macro_rx_fifo_status +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_SPI_GetRxFifoStatus(CySCB_Type const *base) +{ + return (Cy_SCB_GetRxInterruptStatus(base) & CY_SCB_SPI_RX_INTR); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_ClearRxFifoStatus +****************************************************************************//** +* +* Clears the selected statuses of the RX FIFO. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param clearMask +* The mask of which statuses to clear. +* See \ref group_scb_spi_macro_rx_fifo_status for the set of constants. +* +* \note +* * This status is also used for interrupt generation, so clearing it also +* clears the interrupt sources. +* * Level sensitive statuses such as \ref CY_SCB_SPI_RX_TRIGGER, +* \ref CY_SCB_SPI_RX_NOT_EMPTY and \ref CY_SCB_SPI_RX_FULL set high again after +* being cleared if the condition remains true. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SPI_ClearRxFifoStatus(CySCB_Type *base, uint32_t clearMask) +{ + Cy_SCB_ClearRxInterrupt(base, clearMask); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_GetNumInRxFifo +****************************************************************************//** +* +* Returns the number of data elements in the SPI RX FIFO. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \return +* The number of data elements in the RX FIFO. +* The size of a data element defined by the configured RX data width. +* +* \note +* This number does not include any data currently in the RX shifter. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_SPI_GetNumInRxFifo(CySCB_Type const *base) +{ + return Cy_SCB_GetNumInRxFifo(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_ClearRxFifo +****************************************************************************//** +* +* Clears all data out of the SPI RX FIFO. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \sideeffect +* Any data currently in the shifter is cleared and lost. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SPI_ClearRxFifo(CySCB_Type *base) +{ + Cy_SCB_ClearRxFifo(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_GetTxFifoStatus +****************************************************************************//** +* +* Returns the current status of the TX FIFO. +* Clear the active statuses to let the SCB hardware update them. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \return +* \ref group_scb_spi_macro_tx_fifo_status +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_SPI_GetTxFifoStatus(CySCB_Type const *base) +{ + return (Cy_SCB_GetTxInterruptStatus(base) & CY_SCB_SPI_TX_INTR); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_ClearTxFifoStatus +****************************************************************************//** +* +* Clears the selected statuses of the TX FIFO. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param clearMask +* The mask of which statuses to clear. +* See \ref group_scb_spi_macro_tx_fifo_status for the set of constants. +* +* \note +* * The status is also used for interrupt generation, so clearing it also +* clears the interrupt sources. +* * Level sensitive statuses such as \ref CY_SCB_SPI_TX_TRIGGER, +* \ref CY_SCB_SPI_TX_EMPTY and \ref CY_SCB_SPI_TX_NOT_FULL set high again after +* being cleared if the condition remains true. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SPI_ClearTxFifoStatus(CySCB_Type *base, uint32_t clearMask) +{ + Cy_SCB_ClearTxInterrupt(base, clearMask); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_GetNumInTxFifo +****************************************************************************//** +* +* Returns the number of data elements in the SPI TX FIFO. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \return +* The number of data elements in the TX FIFO. +* The size of a data element defined by the configured TX data width. +* +* \note +* This number does not include any data currently in the TX shifter. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_SPI_GetNumInTxFifo(CySCB_Type const *base) +{ + return Cy_SCB_GetNumInTxFifo(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_IsTxComplete +****************************************************************************//** +* +* Checks if the TX FIFO and Shifter are empty and there is no more data to send +* +* \param base +* Pointer to the SPI SCB instance. +* +* \return +* If true, transmission complete. If false, transmission is not complete. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SCB_SPI_IsTxComplete(CySCB_Type const *base) +{ + return Cy_SCB_IsTxComplete(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_ClearTxFifo +****************************************************************************//** +* +* Clears all data out of the SPI TX FIFO. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \sideeffect +* The TX FIFO clear operation also clears the shift register, so that +* the shifter could be cleared in the middle of a data element transfer, +* corrupting it. The data element corruption means that all bits which has +* not been transmitted are transmitted as 1s on the bus. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SPI_ClearTxFifo(CySCB_Type *base) +{ + Cy_SCB_ClearTxFifo(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_GetSlaveMasterStatus +****************************************************************************//** +* +* Returns the current status of either the slave or the master, depending +* on the configured SPI mode. +* Clear the active statuses to let the SCB hardware update them. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \return +* \ref group_scb_spi_macro_master_slave_status +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_SPI_GetSlaveMasterStatus(CySCB_Type const *base) +{ + uint32_t retStatus; + + if (_FLD2BOOL(SCB_SPI_CTRL_MASTER_MODE, base->SPI_CTRL)) + { + retStatus = (Cy_SCB_GetMasterInterruptStatus(base) & CY_SCB_MASTER_INTR_SPI_DONE); + } + else + { + retStatus = (Cy_SCB_GetSlaveInterruptStatus(base) & CY_SCB_SLAVE_INTR_SPI_BUS_ERROR); + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_ClearSlaveMasterStatus +****************************************************************************//** +* +* Clears the selected statuses of either the slave or the master. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param clearMask +* The mask of which statuses to clear. +* See \ref group_scb_spi_macro_master_slave_status for the set of constants. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SPI_ClearSlaveMasterStatus(CySCB_Type *base, uint32_t clearMask) +{ + if (_FLD2BOOL(SCB_SPI_CTRL_MASTER_MODE, base->SPI_CTRL)) + { + Cy_SCB_ClearMasterInterrupt(base, clearMask); + } + else + { + Cy_SCB_ClearSlaveInterrupt(base, clearMask); + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_Read +****************************************************************************//** +* +* Reads a single data element from the SPI RX FIFO. +* This function does not check if the RX FIFO has data before reading it. +* If the RX FIFO is empty, the function returns \ref CY_SCB_SPI_RX_NO_DATA. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \return +* Data from the RX FIFO. +* The data element size is defined by the configured RX data width. +* +* \note +* * This function only reads data available in the RX FIFO. It does not +* initiate an SPI transfer. +* * When in the master mode, writes data into the TX FIFO and waits until +* the transfer is completed before getting data from the RX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_SPI_Read(CySCB_Type const *base) +{ + return Cy_SCB_ReadRxFifo(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_ReadArray +****************************************************************************//** +* +* Reads an array of data out of the SPI RX FIFO. +* This function does not block. It returns how many data elements were read +* from the RX FIFO. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param rxBuf +* The pointer to the location to place data read from the RX FIFO. +* The item size is defined by the data type which depends on the configured +* RX data width. +* +* \param size +* The number of data elements to read from the RX FIFO. +* +* \return +* The number of data elements read from the RX FIFO. +* +* \note +* * This function only reads data available in the RX FIFO. It does not +* initiate an SPI transfer. +* * When in the master mode, writes data into the TX FIFO and waits until +* the transfer is completed before getting data from the RX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_SPI_ReadArray(CySCB_Type const *base, void *rxBuf, uint32_t size) +{ + return Cy_SCB_ReadArray(base, rxBuf, size); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_Write +****************************************************************************//** +* +* Places a single data element in the SPI TX FIFO. +* This function does not block. It returns how many data elements were placed +* in the TX FIFO. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param data +* Data to put in the TX FIFO. +* The item size is defined by the data type, which depends on the configured +* TX data width. +* +* \return +* The number of data elements placed in the TX FIFO: 0 or 1. +* +* \note +* * When in the master mode, writing data into the TX FIFO starts an SPI +* transfer. +* * When in the slave mode, writing data into the TX FIFO does not start +* an SPI transfer. The data is loaded in the TX FIFO and will be sent +* to the master on its request. +* * The SPI interface is full-duplex, therefore reads and writtes occur +* at the same time. Thus for every data element transferred out of the +* TX FIFO, one is transferred into the RX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_SPI_Write(CySCB_Type *base, uint32_t data) +{ + return Cy_SCB_Write(base, data); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_WriteArray +****************************************************************************//** +* +* Places an array of data in the SPI TX FIFO. This function does not +* block. It returns how many data elements were placed in the TX FIFO. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param txBuf +* The pointer to the data to place in the TX FIFO. +* The item size is defined by the data type, which depends on the configured +* TX data width. +* +* \param size +* The number of data elements to transmit. +* +* \return +* The number of data elements placed in the TX FIFO. +* +* \note +* * When in the master mode, writing data into the TX FIFO starts an SPI +* transfer. +* * When in the slave mode, writing data into the TX FIFO does not start +* an SPI transfer. The data is loaded in the TX FIFO and will be sent to +* the master on its request. +* * The SPI interface is full-duplex, therefore reads and writtes occur +* at the same time. Thus for every data element transferred out of the +* TX FIFO, one is transferred into the RX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_SPI_WriteArray(CySCB_Type *base, void *txBuf, uint32_t size) +{ + return Cy_SCB_WriteArray(base, txBuf, size); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_WriteArrayBlocking +****************************************************************************//** +* +* Places an array of data in the SPI TX FIFO. This function blocks +* until the number of data elements specified by size is placed in the SPI +* TX FIFO. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param txBuf +* The pointer to data to place in the TX FIFO. +* The item size is defined by the data type, which depends on the configured +* TX data width. +* +* \param size +* The number of data elements to write into the TX FIFO. +* +* \note +* * When in the master mode, writing data into the TX FIFO starts an SPI +* transfer. +* * When in the slave mode, writing data into the TX FIFO does not start +* an SPI transfer. The data is loaded in the TX FIFO and will be sent to +* the master on its request. +* * The SPI interface is full-duplex, therefore reads and writtes occur +* at the same time. Thus for every data element transferred out of the +* TX FIFO, one is transferred into the RX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SPI_WriteArrayBlocking(CySCB_Type *base, void *txBuf, uint32_t size) +{ + Cy_SCB_WriteArrayBlocking(base, txBuf, size); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_SPI_RegisterCallback +****************************************************************************//** +* +* Registers a callback function, which notifies that +* \ref group_scb_spi_macro_callback_events occurred in the +* \ref Cy_SCB_SPI_Interrupt. +* +* \param base +* The pointer to the SPI SCB instance. +* +* \param callback +* The pointer to the callback function. +* See \ref scb_spi_handle_events_t for the function prototype. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_spi_context_t allocated +* by the user. The structure is used during the SPI operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* To remove the callback, pass NULL as the pointer to the callback function. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_SPI_RegisterCallback(CySCB_Type const *base, + scb_spi_handle_events_t callback, cy_stc_scb_spi_context_t *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + context->cbEvents = callback; +} + +/** \} group_scb_spi_functions */ + +#if defined(__cplusplus) +} +#endif + +/** \} group_scb_spi */ + +#endif /* (CY_SCB_SPI_H) */ + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_uart.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_uart.c new file mode 100644 index 0000000000..c5a57ebe3b --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_uart.c @@ -0,0 +1,1181 @@ +/***************************************************************************//** +* \file cy_scb_uart.c +* \version 1.0 +* +* Provides UART API implementation of the SCB driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_scb_uart.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/* Static functions */ +static void HandleDataReceive (CySCB_Type *base, cy_stc_scb_uart_context_t *context); +static void HandleRingBuffer (CySCB_Type *base, cy_stc_scb_uart_context_t *context); +static void HandleDataTransmit(CySCB_Type *base, cy_stc_scb_uart_context_t *context); + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_Init +****************************************************************************//** +* +* Initializes the SCB for UART operation. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param config +* The pointer to configuration structure \ref cy_stc_scb_uart_config_t. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* If only UART functions which do not require context will be used pass NULL +* as pointer to context. +* +* \return +* \ref cy_en_scb_uart_status_t +* +* \note +* Ensure that the SCB block is disabled before calling this function. +* +*******************************************************************************/ +cy_en_scb_uart_status_t Cy_SCB_UART_Init(CySCB_Type *base, cy_stc_scb_uart_config_t const *config, cy_stc_scb_uart_context_t *context) +{ + cy_en_scb_uart_status_t retStatus = CY_SCB_UART_BAD_PARAM; + + if ((NULL != base) && (NULL != config)) + { + uint32_t ovs; + + if ((CY_SCB_UART_IRDA == config->uartMode) && (!config->irdaEnableLowPowerReceiver)) + { + /* For Normal IrDA mode oversampling is always zero */ + ovs = 0UL; + } + else + { + ovs = (config->oversample - 1UL); + } + + /* Configure the UART interface */ + base->CTRL = (config->enableMutliProcessorMode ? SCB_CTRL_ADDR_ACCEPT_Msk : 0UL) | + ((config->dataWidth <= CY_SCB_BYTE_WIDTH) ? SCB_CTRL_BYTE_MODE_Msk : 0UL) | + _VAL2FLD(SCB_CTRL_OVS, ovs) | + _VAL2FLD(SCB_CTRL_MODE, CY_SCB_CTRL_MODE_UART); + + base->UART_CTRL = _VAL2FLD(SCB_UART_CTRL_MODE, config->uartMode); + + /* Configure the RX direction */ + base->UART_RX_CTRL = (config->irdaInvertRx ? SCB_UART_RX_CTRL_POLARITY_Msk : 0UL) | + (config->enableMutliProcessorMode ? SCB_UART_RX_CTRL_MP_MODE_Msk : 0UL) | + (config->dropOnParityError ? SCB_UART_RX_CTRL_DROP_ON_PARITY_ERROR_Msk : 0UL) | + (config->dropOnFrameError ? SCB_UART_RX_CTRL_DROP_ON_FRAME_ERROR_Msk : 0UL) | + _VAL2FLD(SCB_UART_RX_CTRL_BREAK_WIDTH, (config->breakWidth - 1UL)) | + _VAL2FLD(SCB_UART_RX_CTRL_STOP_BITS, (config->stopBits - 1UL)) | + _VAL2FLD(CY_SCB_UART_RX_CTRL_SET_PARITY, config->parity); + + base->RX_CTRL = (config->enableMsbFirst ? SCB_RX_CTRL_MSB_FIRST_Msk : 0UL) | + (config->enableInputFilter ? SCB_RX_CTRL_MEDIAN_Msk : 0UL) | + _VAL2FLD(SCB_RX_CTRL_DATA_WIDTH, (config->dataWidth - 1UL)); + + base->RX_MATCH = _VAL2FLD(SCB_RX_MATCH_ADDR, config->receiverAddress) | + _VAL2FLD(SCB_RX_MATCH_MASK, config->receiverAddressMask); + + /* Configure the TX direction */ + base->UART_TX_CTRL = (config->smartCardRetryOnNack ? SCB_UART_TX_CTRL_RETRY_ON_NACK_Msk : 0UL) | + _VAL2FLD(SCB_UART_TX_CTRL_STOP_BITS, (config->stopBits - 1UL)) | + _VAL2FLD(CY_SCB_UART_RX_CTRL_SET_PARITY, config->parity); + + base->TX_CTRL = (config->enableMsbFirst ? SCB_RX_CTRL_MSB_FIRST_Msk : 0UL) | + _VAL2FLD(SCB_TX_CTRL_DATA_WIDTH, (config->dataWidth - 1UL)); + + base->RX_FIFO_CTRL = _VAL2FLD(SCB_RX_FIFO_CTRL_TRIGGER_LEVEL, config->rxFifoTriggerLevel); + + /* Configure the flow control */ + base->UART_FLOW_CTRL = (config->enableCts ? SCB_UART_FLOW_CTRL_CTS_ENABLED_Msk : 0UL) | + ((CY_SCB_UART_ACTIVE_HIGH == config->ctsPolarity) ? SCB_UART_FLOW_CTRL_CTS_POLARITY_Msk : 0UL) | + ((CY_SCB_UART_ACTIVE_HIGH == config->rtsPolarity) ? SCB_UART_FLOW_CTRL_RTS_POLARITY_Msk : 0UL) | + _VAL2FLD(SCB_UART_FLOW_CTRL_TRIGGER_LEVEL, config->rtsRxFifoLevel); + + + base->TX_FIFO_CTRL = _VAL2FLD(SCB_TX_FIFO_CTRL_TRIGGER_LEVEL, config->txFifoTriggerLevel); + + /* Set up interrupt sources */ + base->INTR_TX_MASK = config->txFifoIntEnableMask; + base->INTR_RX_MASK = config->rxFifoIntEnableMask; + + /* Initialize context */ + if (NULL != context) + { + context->rxStatus = 0UL; + context->txStatus = 0UL; + + context->rxRingBuf = NULL; + context->rxRingBufSize = 0UL; + + context->rxBufIdx = 0UL; + context->txLeftToTransmit = 0UL; + + context->cbEvents = NULL; + + #if !defined(NDEBUG) + /* Put an initialization key into the initKey variable to verify + * context initialization in the transfer API. + */ + context->initKey = CY_SCB_UART_INIT_KEY; + #endif /* !(NDEBUG) */ + } + + retStatus = CY_SCB_UART_SUCCESS; + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_DeInit +****************************************************************************//** +* +* De-initializes the SCB block, returns the register values to default. +* +* \param base +* The pointer to the UART SCB instance. +* +* \note +* Ensure that the SCB block is disabled before calling this function. +* +*******************************************************************************/ +void Cy_SCB_UART_DeInit(CySCB_Type *base) +{ + /* De-initialize the UART interface */ + base->CTRL = CY_SCB_CTRL_DEF_VAL; + base->UART_CTRL = CY_SCB_UART_CTRL_DEF_VAL; + + /* De-initialize the RX direction */ + base->UART_RX_CTRL = 0UL; + base->RX_CTRL = CY_SCB_RX_CTRL_DEF_VAL; + base->RX_FIFO_CTRL = 0UL; + base->RX_MATCH = 0UL; + + /* De-initialize the TX direction */ + base->UART_TX_CTRL = 0UL; + base->TX_CTRL = CY_SCB_TX_CTRL_DEF_VAL; + base->TX_FIFO_CTRL = 0UL; + + /* De-initialize the flow control */ + base->UART_FLOW_CTRL = 0UL; + + /* De-initialize the interrupt sources */ + base->INTR_SPI_EC_MASK = 0UL; + base->INTR_I2C_EC_MASK = 0UL; + base->INTR_RX_MASK = 0UL; + base->INTR_TX_MASK = 0UL; + base->INTR_M_MASK = 0UL; + base->INTR_S_MASK = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_Disable +****************************************************************************//** +* +* Disables the SCB block and clears context statuses. +* Note that after the block is disabled, the TX and RX FIFOs and +* hardware statuses are cleared. Also, the hardware stops driving the +* output and ignores the input. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* If only UART functions which do not require context will be used pass NULL +* as pointer to context. +* +* \note +* Calling this function when the UART is busy (transmitter preforms data +* transfer or receiver is in the middle of data reception) may result transfer +* corruption because the hardware stops driving the output and ignores +* the input. +* Ensure that the UART is not busy before calling this function. +* +*******************************************************************************/ +void Cy_SCB_UART_Disable(CySCB_Type *base, cy_stc_scb_uart_context_t *context) +{ + base->CTRL &= (uint32_t) ~SCB_CTRL_ENABLED_Msk; + + if (NULL != context) + { + context->rxStatus = 0UL; + context->txStatus = 0UL; + + context->rxBufIdx = 0UL; + context->txLeftToTransmit = 0UL; + } +} + + +/************************* High-Level Functions ******************************** +* The following functions are considered high-level. They provide the layer of +* intelligence to the SCB. These functions require interrupts. +* Low-level and high-level functions should not be mixed because low-level API +* can adversely affect the operation of high-level functions. +*******************************************************************************/ + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_StartRingBuffer +****************************************************************************//** +* +* Starts the receive ring buffer operation. +* The RX interrupt source is configured to get data from the RX +* FIFO and put into the ring buffer. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param ringBuffer +* Pointer to the user defined ring buffer. +* The item size is defined by the data type which depends on the configured +* data width. +* +* \param size +* The size of the receive ring buffer. +* Note that one data element is used for internal use, so if the size is 32, +* then only 31 data elements are used for data storage. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* * The buffer must not be modified and stay allocated while the ring buffer +* operates. +* * This function overrides the RX interrupt sources and changes the +* RX FIFO level. +* +*******************************************************************************/ +void Cy_SCB_UART_StartRingBuffer(CySCB_Type *base, void *ringBuffer, uint32_t size, cy_stc_scb_uart_context_t *context) +{ +#if !defined(NDEBUG) + /* Check that the initialization key was set before using the context */ + CY_ASSERT(NULL != context); + CY_ASSERT(CY_SCB_UART_INIT_KEY == context->initKey); +#endif /* !(NDEBUG) */ + + if ((NULL != ringBuffer) && (size > 0UL)) + { + uint32_t halfFifoSize = (Cy_SCB_GetFifoSize(base) / 2UL); + + context->rxRingBuf = ringBuffer; + context->rxRingBufSize = size; + context->rxRingBufHead = 0UL; + context->rxRingBufTail = 0UL; + + /* Set up an RX interrupt to handle the ring buffer */ + Cy_SCB_SetRxFifoLevel(base, (size >= halfFifoSize) ? (halfFifoSize - 1UL) : (size - 1UL)); + + Cy_SCB_SetRxInterruptMask(base, CY_SCB_RX_INTR_LEVEL); + } +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_StopRingBuffer +****************************************************************************//** +* +* Stops receiving data into the ring buffer, and clears the ring buffer. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +void Cy_SCB_UART_StopRingBuffer(CySCB_Type *base, cy_stc_scb_uart_context_t *context) +{ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + Cy_SCB_UART_ClearRingBuffer(base, context); + + context->rxRingBuf = NULL; + context->rxRingBufSize = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetNumInRingBuffer +****************************************************************************//** +* +* Returns the number of data elements in the ring buffer. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* The number of data elements in the receive ring buffer. +* +* \note +* One data element is used for internal use, so when the buffer is full, +* this function returns (Ring Buffer size - 1). +* +*******************************************************************************/ +uint32_t Cy_SCB_UART_GetNumInRingBuffer(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context) +{ + uint32_t size; + uint32_t locHead = context->rxRingBufHead; + + /* Suppress a compiler warning about unused variables */ + (void) base; + + if (locHead >= context->rxRingBufTail) + { + size = (locHead - context->rxRingBufTail); + } + else + { + size = (locHead + (context->rxBufSize - context->rxRingBufTail)); + } + + return (size); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_ClearRingBuffer +****************************************************************************//** +* +* Clears the ring buffer. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +void Cy_SCB_UART_ClearRingBuffer(CySCB_Type const *base, cy_stc_scb_uart_context_t *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + context->rxRingBufHead = context->rxRingBufTail; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_Receive +****************************************************************************//** +* +* This function starts a UART receive operation. +* It configures the receive interrupt sources to get data available in the +* receive FIFO and returns. The \ref Cy_SCB_UART_Interrupt manages the further +* data transfer. +* +* If the ring buffer is enabled, this function first reads data from the ring +* buffer. If there is more data to receive, it configures the receive interrupt +* sources to copy the remaining bytes from the RX FIFO when they arrive. +* +* When the receive operation is completed (requested number of data elements +* received) the \ref CY_SCB_UART_RECEIVE_ACTIVE status is cleared and +* the \ref CY_SCB_UART_RECEIVE_DONE_EVENT event is generated. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param rxBuf +* Pointer to buffer to store received data. +* The item size is defined by the data type which depends on the configured +* data width. +* +* \param size +* The number of data elements to receive. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_uart_status_t +* +* \note +* * The buffer must not be modified and stay allocated until end of the +* receive operation. +* * This function overrides the RX interrupt sources and changes the +* RX FIFO level. +* +*******************************************************************************/ +cy_en_scb_uart_status_t Cy_SCB_UART_Receive(CySCB_Type *base, void *rxBuf, uint32_t size, cy_stc_scb_uart_context_t *context) +{ + cy_en_scb_uart_status_t retStatus = CY_SCB_UART_RECEIVE_BUSY; + +#if !defined(NDEBUG) + /* Check that the initialization key was set before using the context */ + CY_ASSERT(NULL != context); + CY_ASSERT(CY_SCB_UART_INIT_KEY == context->initKey); +#endif /* !(NDEBUG) */ + + /* Check if there are no active transfer requests */ + if (0UL == (context->rxStatus & CY_SCB_UART_RECEIVE_ACTIVE)) + { + uint8_t *tmpBuf = (uint8_t *) rxBuf; + uint32_t numToCopy = 0UL; + + /* Disable the RX interrupt source to stop the ring buffer update */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + if (NULL != context->rxRingBuf) + { + /* Get the items available in the ring buffer */ + numToCopy = Cy_SCB_UART_GetNumInRingBuffer(base, context); + + if (numToCopy > 0UL) + { + uint32_t idx; + uint32_t locTail = context->rxRingBufTail; + bool byteMode = Cy_SCB_IsRxDataWidthByte(base); + + /* Adjust the number of items to be read */ + if (numToCopy > size) + { + numToCopy = size; + } + + /* Copy the data elements from the ring buffer */ + for (idx = 0UL; idx < numToCopy; ++idx) + { + ++locTail; + + if (locTail == context->rxRingBufSize) + { + locTail = 0UL; + } + + if (byteMode) + { + uint8_t *buf = (uint8_t *) rxBuf; + buf[idx] = ((uint8_t *) context->rxRingBuf)[locTail]; + } + else + { + uint16_t *buf = (uint16_t *) rxBuf; + buf[idx] = ((uint16_t *) context->rxRingBuf)[locTail]; + } + } + + /* Update the ring buffer tail after data has been copied */ + context->rxRingBufTail = locTail; + + /* Update with the copied bytes */ + size -= numToCopy; + context->rxBufIdx = numToCopy; + + /* Check if all requested data has been read from the ring buffer */ + if (0UL == size) + { + /* Enable the RX-error interrupt sources to update the error status */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_UART_RECEIVE_ERR); + + /* Call a completion callback if there was no abort receive called + * in the interrupt. The abort clears the number of the received bytes. + */ + if (context->rxBufIdx > 0UL) + { + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_UART_RECEIVE_DONE_EVENT); + } + } + + /* Continue receiving data in the ring buffer */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_RX_INTR_LEVEL); + } + else + { + tmpBuf = &tmpBuf[(byteMode) ? (numToCopy) : (2UL * numToCopy)]; + } + } + } + + /* Set up a direct RX FIFO receive */ + if (size > 0UL) + { + uint32_t halfFifoSize = Cy_SCB_GetFifoSize(base) / 2UL; + + /* Set up context */ + context->rxStatus = CY_SCB_UART_RECEIVE_ACTIVE; + + context->rxBuf = (void *) tmpBuf; + context->rxBufSize = size; + context->rxBufIdx = numToCopy; + + /* Set the RX FIFO level to the trigger interrupt */ + Cy_SCB_SetRxFifoLevel(base, (size > halfFifoSize) ? (halfFifoSize - 1UL) : (size - 1UL)); + + /* Enable the RX interrupt sources to continue data reading */ + Cy_SCB_SetRxInterruptMask(base, CY_SCB_UART_RX_INTR); + } + + retStatus = CY_SCB_UART_SUCCESS; + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_AbortReceive +****************************************************************************//** +* +* Abort the current receive operation by clearing the receive status. +* * If the ring buffer is disabled, the receive interrupt sources are disabled. +* * If the ring buffer is enabled, the receive interrupt source is configured +* to get data from the receive FIFO and put it into the ring buffer. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* * The RX FIFO and ring buffer are not cleared after abort of receive +* operation. +* * If after the abort of the receive operation the transmitter continues +* sending data, it gets into the RX FIFO. To drop this data, the RX FIFO +* and ring buffer (if enabled) have to be cleared when the transmitter +* stops sending data. Otherwise, received data will be kept and copied +* to the buffer when \ref Cy_SCB_UART_Receive is called. +* +*******************************************************************************/ +void Cy_SCB_UART_AbortReceive(CySCB_Type *base, cy_stc_scb_uart_context_t *context) +{ + if (NULL == context->rxRingBuf) + { + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } + + context->rxBufSize = 0UL; + context->rxBufIdx = 0UL; + + context->rxStatus = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetNumReceived +****************************************************************************//** +* +* Returns the number of data elements received since the last call to \ref +* Cy_SCB_UART_Receive. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* The number of data elements received. +* +*******************************************************************************/ +uint32_t Cy_SCB_UART_GetNumReceived(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->rxBufIdx); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetReceiveStatus +****************************************************************************//** +* +* Returns the status of the receive operation. +* This status is a bit mask and the value returned may have multiple bits set. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref group_scb_uart_macro_receive_status. +* +* \note +* The status is only cleared by calling \ref Cy_SCB_UART_Receive again. +* +*******************************************************************************/ +uint32_t Cy_SCB_UART_GetReceiveStatus(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->rxStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_Transmit +****************************************************************************//** +* +* This function starts a UART transmit operation. +* It configures the transmit interrupt sources and returns. +* The \ref Cy_SCB_UART_Interrupt manages the further data transfer. +* +* When the transmit operation is completed (requested number of data elements +* sent on the bus), the \ref CY_SCB_UART_TRANSMIT_ACTIVE status is cleared and +* the \ref CY_SCB_UART_TRANSMIT_DONE_EVENT event is generated. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param txBuf +* Pointer to user data to place in transmit buffer. +* The item size is defined by the data type which depends on the configured +* data width. +* +* \param size +* The number of data elements to transmit. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref cy_en_scb_uart_status_t +* +* \note +* * The buffer must not be modified and stay allocated until its content is +* copied into the TX FIFO. +* * This function overrides the TX FIFO interrupt sources and changes the +* TX FIFO level. +* +*******************************************************************************/ +cy_en_scb_uart_status_t Cy_SCB_UART_Transmit(CySCB_Type *base, void *txBuf, uint32_t size, cy_stc_scb_uart_context_t *context) +{ + cy_en_scb_uart_status_t retStatus = CY_SCB_UART_TRANSMIT_BUSY; + +#if !defined(NDEBUG) + /* Check that the initialization key was set before using the context */ + CY_ASSERT(NULL != context); + CY_ASSERT(CY_SCB_UART_INIT_KEY == context->initKey); +#endif /* !(NDEBUG) */ + + /* Check if there are no active transfer requests */ + if (0UL == (CY_SCB_UART_TRANSMIT_ACTIVE & context->txStatus)) + { + /* Set up context */ + context->txStatus = CY_SCB_UART_TRANSMIT_ACTIVE; + + context->txBuf = txBuf; + context->txBufSize = size; + + /* Set the level in TX FIFO to start a transfer */ + Cy_SCB_SetTxFifoLevel(base, (Cy_SCB_GetFifoSize(base) / 2UL)); + + /* Enable the interrupt sources */ + if (CY_SCB_UART_SMARTCARD == _FLD2VAL(SCB_UART_CTRL_MODE, base->UART_CTRL)) + { + /* Transfer data into TX FIFO and track SmartCard-specific errors */ + Cy_SCB_SetTxInterruptMask(base, CY_SCB_UART_TX_INTR); + } + else + { + /* Transfer data into TX FIFO */ + Cy_SCB_SetTxInterruptMask(base, CY_SCB_TX_INTR_LEVEL); + } + + retStatus = CY_SCB_UART_SUCCESS; + } + + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_AbortTransmit +****************************************************************************//** +* +* Aborts the current transmit operation. +* It disables the transmit interrupt sources and clears the transmit FIFO +* and status. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \sideeffect +* The transmit FIFO clear operation also clears the shift register, so that +* the shifter could be cleared in the middle of a data element transfer, +* corrupting it. The data element corruption means that all bits which has +* not been transmitted are transmitted as "ones" on the bus. +* +*******************************************************************************/ +void Cy_SCB_UART_AbortTransmit(CySCB_Type *base, cy_stc_scb_uart_context_t *context) +{ + Cy_SCB_SetTxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + Cy_SCB_UART_ClearTxFifo(base); + + context->txBufSize = 0UL; + context->txLeftToTransmit = 0UL; + + context->txStatus = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetNumLeftToTransmit +****************************************************************************//** +* +* Returns the number of data elements left to transmit since the last call to +* \ref Cy_SCB_UART_Transmit. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* The number of data elements left to transmit. +* +*******************************************************************************/ +uint32_t Cy_SCB_UART_GetNumLeftToTransmit(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->txLeftToTransmit); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetTransmitStatus +****************************************************************************//** +* +* Returns the status of the transmit operation. +* This status is a bit mask and the value returned may have multiple bits set. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \return +* \ref group_scb_uart_macro_transmit_status. +* +* \note +* The status is only cleared by calling \ref Cy_SCB_UART_Transmit or +* \ref Cy_SCB_UART_AbortTransmit. +* +*******************************************************************************/ +uint32_t Cy_SCB_UART_GetTransmitStatus(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + return (context->txStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_Interrupt +****************************************************************************//** +* +* This is the interrupt function for the SCB configured in the UART mode. +* This function must be called inside a user-defined interrupt service +* routine to make \ref Cy_SCB_UART_Transmit and \ref Cy_SCB_UART_Receive +* work. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +void Cy_SCB_UART_Interrupt(CySCB_Type *base, cy_stc_scb_uart_context_t *context) +{ + if (0UL != (CY_SCB_RX_INTR & Cy_SCB_GetInterruptCause(base))) + { + /* Get RX error events: a frame error, parity error, and overflow */ + uint32_t locRxErr = (CY_SCB_UART_RECEIVE_ERR & Cy_SCB_GetRxInterruptStatusMasked(base)); + + /* Handle the error conditions */ + if (0UL != locRxErr) + { + context->rxStatus |= locRxErr; + + Cy_SCB_ClearRxInterrupt(base, locRxErr); + + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_UART_RECEIVE_ERR_EVENT); + } + } + + /* Break the detect */ + if (0UL != (CY_SCB_RX_INTR_UART_BREAK_DETECT & Cy_SCB_GetRxInterruptStatusMasked(base))) + { + context->rxStatus |= CY_SCB_UART_RECEIVE_BREAK_DETECT; + + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_UART_BREAK_DETECT); + } + + /* Copy the received data */ + if (0UL != (CY_SCB_RX_INTR_LEVEL & Cy_SCB_GetRxInterruptStatusMasked(base))) + { + if (context->rxBufSize > 0UL) + { + HandleDataReceive(base, context); + } + else + { + if (NULL != context->rxRingBuf) + { + HandleRingBuffer(base, context); + } + } + + Cy_SCB_ClearRxInterrupt(base, CY_SCB_RX_INTR_LEVEL); + } + } + + if (0UL != (CY_SCB_TX_INTR & Cy_SCB_GetInterruptCause(base))) + { + uint32_t locTxErr = (CY_SCB_UART_TRANSMIT_ERR & Cy_SCB_GetTxInterruptStatusMasked(base)); + + /* Handle the TX error conditions */ + if (0UL != locTxErr) + { + context->txStatus |= locTxErr; + Cy_SCB_ClearTxInterrupt(base, locTxErr); + + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_UART_TRANSMIT_ERR_EVENT); + } + } + + /* Load data to transmit */ + if (0UL != (CY_SCB_TX_INTR_LEVEL & Cy_SCB_GetTxInterruptStatusMasked(base))) + { + HandleDataTransmit(base, context); + + Cy_SCB_ClearTxInterrupt(base, CY_SCB_TX_INTR_LEVEL); + } + + /* Handle the TX complete */ + if (0UL != (CY_SCB_TX_INTR_UART_DONE & Cy_SCB_GetTxInterruptStatusMasked(base))) + { + /* Disable all TX interrupt sources */ + Cy_SCB_SetTxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + context->txStatus &= (uint32_t) ~CY_SCB_UART_TRANSMIT_ACTIVE; + context->txLeftToTransmit = 0UL; + + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_UART_TRANSMIT_DONE_EVENT); + } + } + } +} + + + +/******************************************************************************* +* Function Name: HandleDataReceive +****************************************************************************//** +* +* Reads data from the receive FIFO into the buffer provided by +* \ref Cy_SCB_UART_Receive. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void HandleDataReceive(CySCB_Type *base, cy_stc_scb_uart_context_t *context) +{ + uint32_t numCopied; + uint32_t halfFifoSize = Cy_SCB_GetFifoSize(base) / 2UL; + + /* Get data from RX FIFO */ + numCopied = Cy_SCB_UART_GetArray(base, context->rxBuf, context->rxBufSize); + + /* Move the buffer */ + context->rxBufIdx += numCopied; + context->rxBufSize -= numCopied; + + if (0UL == context->rxBufSize) + { + if (NULL != context->rxRingBuf) + { + /* Adjust the level to proceed with the ring buffer */ + Cy_SCB_SetRxFifoLevel(base, (context->rxRingBufSize >= halfFifoSize) ? + (halfFifoSize - 1UL) : (context->rxRingBufSize - 1UL)); + + Cy_SCB_SetRxInterruptMask(base, CY_SCB_RX_INTR_LEVEL); + } + else + { + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + } + + /* Update the status */ + context->rxStatus &= (uint32_t) ~CY_SCB_UART_RECEIVE_ACTIVE; + + /* Notify that receive is done in a callback */ + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_UART_RECEIVE_DONE_EVENT); + } + } + else + { + uint8_t *buf = (uint8_t *) context->rxBuf; + + buf = &buf[(Cy_SCB_IsRxDataWidthByte(base) ? (numCopied) : (2UL * numCopied))]; + context->rxBuf = (void *) buf; + + if (context->rxBufSize < halfFifoSize) + { + /* Set the RX FIFO level to trigger an interrupt */ + Cy_SCB_SetRxFifoLevel(base, (context->rxBufSize - 1UL)); + } + } +} + + +/******************************************************************************* +* Function Name: HandleRingBuffer +****************************************************************************//** +* +* Reads data from the receive FIFO into the receive ring buffer. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void HandleRingBuffer(CySCB_Type *base, cy_stc_scb_uart_context_t *context) +{ + uint32_t halfFifoSize = Cy_SCB_GetFifoSize(base) / 2UL; + uint32_t numToCopy = Cy_SCB_GetNumInRxFifo(base); + uint32_t locHead = context->rxRingBufHead; + uint32_t rxData; + + /* Get data into the ring buffer */ + while (numToCopy > 0UL) + { + ++locHead; + + if (locHead == context->rxRingBufSize) + { + locHead = 0UL; + } + + if (locHead == context->rxRingBufTail) + { + /* The ring buffer is full, trigger a callback */ + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_UART_RB_FULL_EVENT); + } + + /* The ring buffer is still full. Disable the RX interrupt not to put data into the ring buffer. + * The data is stored in the RX FIFO until it overflows. Revert the head index. + */ + if (locHead == context->rxRingBufTail) + { + Cy_SCB_SetRxInterruptMask(base, CY_SCB_CLEAR_ALL_INTR_SRC); + + locHead = (locHead > 0UL) ? (locHead - 1UL) : (context->rxRingBufSize - 1UL); + break; + } + } + + /* Get data from RX FIFO. */ + rxData = Cy_SCB_ReadRxFifo(base); + + /* Put a data item in the ring buffer */ + if (Cy_SCB_IsRxDataWidthByte(base)) + { + ((uint8_t *) context->rxRingBuf)[locHead] = (uint8_t) rxData; + } + else + { + ((uint16_t *) context->rxRingBuf)[locHead] = (uint16_t) rxData; + } + + --numToCopy; + } + + /* Update the head index */ + context->rxRingBufHead = locHead; + + /* Get free entries in the ring buffer */ + numToCopy = context->rxRingBufSize - Cy_SCB_UART_GetNumInRingBuffer(base, context); + + if (numToCopy < halfFifoSize) + { + /* Adjust the level to copy to the ring buffer */ + uint32_t level = (numToCopy > 0UL) ? (numToCopy - 1UL) : 0UL; + Cy_SCB_SetRxFifoLevel(base, level); + } +} + + +/******************************************************************************* +* Function Name: HandleDataTransmit +****************************************************************************//** +* +* Loads the transmit FIFO with data provided by \ref Cy_SCB_UART_Transmit. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +*******************************************************************************/ +static void HandleDataTransmit(CySCB_Type *base, cy_stc_scb_uart_context_t *context) +{ + uint32_t numToCopy; + uint32_t fifoSize = Cy_SCB_GetFifoSize(base); + bool byteMode = Cy_SCB_IsTxDataWidthByte(base); + + if (context->txBufSize > 1UL) + { + uint8_t *buf = (uint8_t *) context->txBuf; + + /* Get the number of items left for transmission */ + context->txLeftToTransmit = context->txBufSize; + + /* Put data into TX FIFO */ + numToCopy = Cy_SCB_UART_PutArray(base, context->txBuf, (context->txBufSize - 1UL)); + + /* Move the buffer */ + context->txBufSize -= numToCopy; + + buf = &buf[(byteMode) ? (numToCopy) : (2UL * numToCopy)]; + context->txBuf = (void *) buf; + } + + /* Put the last data item into TX FIFO */ + if ((fifoSize != Cy_SCB_GetNumInTxFifo(base)) && (1UL == context->txBufSize)) + { + uint32_t txData; + uint32_t intrStatus; + + context->txBufSize = 0UL; + + /* Get the last item from the buffer */ + txData = (uint32_t) ((byteMode) ? ((uint8_t *) context->txBuf)[0UL] : + ((uint16_t *) context->txBuf)[0UL]); + + /* Put the last data element and make sure that "TX done" will happen for it */ + intrStatus = Cy_SysLib_EnterCriticalSection(); + + Cy_SCB_WriteTxFifo(base, txData); + Cy_SCB_ClearTxInterrupt(base, CY_SCB_TX_INTR_UART_DONE); + + Cy_SysLib_ExitCriticalSection(intrStatus); + + /* Disable the level interrupt source and enable "transfer done" */ + Cy_SCB_SetTxInterruptMask(base, (CY_SCB_TX_INTR_UART_DONE | + (Cy_SCB_GetTxInterruptMask(base) & (uint32_t) ~CY_SCB_TX_INTR_LEVEL))); + + /* Data is copied into TX FIFO */ + context->txStatus |= CY_SCB_UART_TRANSMIT_IN_FIFO; + + if (NULL != context->cbEvents) + { + context->cbEvents(CY_SCB_UART_TRANSMIT_IN_FIFO_EVENT); + } + } +} + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_uart.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_uart.h new file mode 100644 index 0000000000..783b2570b0 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_uart.h @@ -0,0 +1,1282 @@ +/***************************************************************************//** +* \file cy_scb_uart.h +* \version 1.0 +* +* Provides UART API declarations of the SCB driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \addtogroup group_scb_uart +* \{ +* Driver API for UART +* +* UART - Universal Synchronous/Asynchronous Receiver/Transmitter, +* commonly referred to as RS-232. +* +* Three different UART-like serial interface protocols are supported: +* * UART - the standard mode with an optional UART Hardware flow control. +* * SmartCard - the transfer is similar to the UART transfer, +* but a NACK (negative acknowledgment) may be sent from the +* receiver to the transmitter. Both transmitter and receiver drive the same +* line, although never at the same time. +* * IrDA - the Infra-red Data Association protocol adds a modulation +* scheme to the UART signaling. At the transmitter, bits are modulated. +* At the receiver, bits are demodulated. The modulation scheme uses the +* Return-to-Zero-Inverted (RZI) format. Bit value "0" is signaled by a +* short "1" pulse on the line and bit value "1" is signaled by holding +* the line to "0". +* +* \section group_scb_uart_configuration Configuration Considerations +* +* To set up a UART, provide configuration parameters in the +* \ref cy_stc_scb_uart_config_t structure. For example: provide uartMode, +* overSample, dataWidth, enableMsbFirst, parity, and stopBits. The other +* parameters are optional for operation. +* To initialize the driver, call the \ref Cy_SCB_UART_Init function providing +* filled \ref cy_stc_scb_uart_config_t structure and allocated +* \ref cy_stc_scb_uart_context_t. +* The clock source connected to SCB UART must be configured to provide +* the sufficient frequency and set the appropriate oversampling to reach the +* desired data. +* Call \ref Cy_SCB_UART_Enable to start the UART operation after configuration +* is completed. +* +* The UART API is divided into two categories: low-level and high-level. +* Do not mix high-level and low-level API because low-level APIs can adversely +* affect the operation of higher level API. +* +* The low-level API's functions allow interacting directly with the hardware +* and do not use interrupts. These functions do not require context for +* operation, thus NULL can be passed in \ref Cy_SCB_UART_Init and +* \ref Cy_SCB_UART_Disable instead of a pointer to the context structure. +* +* * To write data into the TX FIFO, use one of the provided functions: +* \ref Cy_SCB_UART_Put, \ref Cy_SCB_UART_PutArray, +* \ref Cy_SCB_UART_PutArrayBlocking or \ref Cy_SCB_UART_PutString. +* Note that putting data into the TX FIFO starts data transfer. +* +* * To read data from the RX FIFO, use one of the provided functions: +* \ref Cy_SCB_UART_Get, \ref Cy_SCB_UART_GetArray or +* \ref Cy_SCB_UART_GetArrayBlocking. +* +* * The statuses can be polled by using: \ref Cy_SCB_UART_GetRxFifoStatus and +* \ref Cy_SCB_UART_GetTxFifoStatus. +* The statuses are W1C (Write 1 to Clear) and after status is set it must +* be cleared. Note that there are statuses that are evaluated as level. These +* statuses remain set when an event is true. Therefore after clear operation +* the status is cleared but then restored (if event is true). +* For example: the TX FIFO empty can be cleared when the TX FIFO is +* NOT empty. You have to put at least (two data elements, one goes to shifter +* and next in FIFO) before clearing this status. +* +* The High Level API uses an interrupt to execute transfer. Call +* \ref Cy_SCB_UART_Transmit to start transmission. Call \ref Cy_SCB_UART_Receive +* to start receive operation. After the operation is started the +* \ref Cy_SCB_UART_Interrupt handles the data transfer until its +* completion. Therefore \ref Cy_SCB_UART_Interrupt must be called inside the +* user interrupt handler to make the high level API work. To monitor status +* of transmit operation, use \ref Cy_SCB_UART_GetTransmitStatus and +* \ref Cy_SCB_UART_GetReceiveStatus to monitor receive status appropriately. +* Alternatively use \ref Cy_SCB_UART_RegisterCallback to register callback +* function to be notified about \ref group_scb_uart_macro_callback_events. +* +* There is also capability to insert a receive ring buffer that operates between +* the RX FIFO and the user buffer. The received data is copied into the ring +* buffer from the RX FIFO. This process runs in the background after the ring +* buffer operation is started by \ref Cy_SCB_UART_StartRingBuffer. +* When \ref Cy_SCB_UART_Receive is called, it first reads data from the ring +* buffer and then sets up an interrupt to receive more data if the required +* amount has not been read yet. +* +* \section group_scb_uart_more_information More Information +* +* For more information on the SCB peripheral, refer to the technical reference +* manual (TRM). +* +* \section group_scb_uart_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
11.4AA cast should not be performed between a pointer to object type and +* a different pointer to object type.The pointer to the buffer memory is void to allow handling different +* different data types: uint8_t (4-8 bits) or uint16_t (9-16 bits). +*
14.2RAll non-null statements shall either: a) have at least one side-effect +* however executed, or b) cause control flow to change.The unused function parameters are cast to void. This statement +* has no side-effect and is used to suppress a compiler warning.
20.3RThe validity of values passed to library functions shall be checked. +* The CY_ASSERT() macro is used for verification of pointer to context +* parameter against NULL. This macro halts code execution if +* verification fails what ensures that NULL pointer is not dereference. +*
+* +* \section group_scb_uart_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_scb_uart_macro Macro +* \defgroup group_scb_uart_functions Functions +* \defgroup group_scb_uart_data_structures Data Structures +* \defgroup group_scb_uart_enums Enumerated Types +*/ + +#if !defined(CY_SCB_UART_H) +#define CY_SCB_UART_H + +#include "cy_scb_common.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/*************************************** +* Enumerated Types +***************************************/ + +/** +* \addtogroup group_scb_uart_enums +* \{ +*/ + +/** UART status codes */ +typedef enum +{ + /** Operation completed successfully */ + CY_SCB_UART_SUCCESS = 0x00U, + + /** One or more of input parameters are invalid */ + CY_SCB_UART_BAD_PARAM = CY_SCB_ID | CY_PDL_STATUS_ERROR | CY_SCB_UART_ID | 1UL, + + /** + * The UART is busy processing a transmit operation. Call this function + * again once that operation is completed or aborted. + */ + CY_SCB_UART_RECEIVE_BUSY, + + /** + * The UART is busy processing a receive operation. Call this function + * again once that operation is completed or aborted. + */ + CY_SCB_UART_TRANSMIT_BUSY +} cy_en_scb_uart_status_t; +/** \} group_scb_uart_enums */ + + +/*************************************** +* Type Definitions +***************************************/ + +/** +* \addtogroup group_scb_uart_data_structures +* \{ +*/ + +/** +* Provides the typedef for the callback function called in the +* \ref Cy_SCB_UART_Interrupt to notify the user about occurrences of +* \ref group_scb_uart_macro_callback_events. +*/ +typedef void (* scb_uart_handle_events_t)(uint32_t event); + +/** UART configuration structure */ +typedef struct stc_scb_uart_config +{ + /** Specifies the UART's mode of operation + * (See \ref group_scb_uart_macro_modes for the set of constants) + */ + uint32_t uartMode; + + /** + * Oversample factor for UART. + * * The UART baud rate is the SCB Clock frequency / oversample + * (valid range is 8-16). + * * For IrDA, the oversample is always 16, unless + * \ref irdaEnableLowPowerReceiver is enabled. Then the oversample is + * reduced to the \ref group_scb_uart_macro_irda_lp_ovs set. + */ + uint32_t oversample; + + /** The width of UART data (valid range is 5 to 9) */ + uint32_t dataWidth; + + /** + * Enables the hardware to shift out data element MSB first, otherwise, + * LSB first + */ + bool enableMsbFirst; + + /** + * Specifies the number of stop bits in the UART transaction, in half-bit + * increments (See \ref group_scb_uart_macro_stop_bits for the set of + * constants.) + */ + uint32_t stopBits; + + /** Configures the UART parity + * (See \ref group_scb_uart_macro_parity for the set of constants.) + */ + uint32_t parity; + + /** + * Enables a digital 3-tap median filter to be applied to the input + * of the RX FIFO to filter glitches on the line + */ + bool enableInputFilter; + + /** + * Enables the hardware to drop data in the RX FIFO when a parity error is + * detected + */ + bool dropOnParityError; + + /** + * Enables the hardware to drop data in the RX FIFO when a frame error is + * detected + */ + bool dropOnFrameError; + + /** + * Enables the UART operation in Multi-Processor mode which requires + * dataWidth to be 9 bits (the 9th bit is used to indicate address byte) + */ + bool enableMutliProcessorMode; + + /** + * If Multi Processor mode is enabled, this is the address of the RX + * FIFO. If the address matches, data is accepted into the FIFO. If + * it does not match, the data is ignored. + */ + uint32_t receiverAddress; + + /** This is the address mask for the Multi Processor address. 1 indicates + * that the incoming address must match the corresponding bit in the slave + * address. A 0 in the mask indicates that the incoming address does + * not need to match. + */ + uint32_t receiverAddressMask; + + /** + * Enables the hardware to accept the matching address in the RX FIFO. + * This is useful when the device supports more than one address. + */ + bool acceptAddrInFifo; + + /** Inverts the IrDA RX input */ + bool irdaInvertRx; + + /** + * Enables the low-power receive for IrDA mode. + * Note that the transmission must be disabled if this mode is enabled. + */ + bool irdaEnableLowPowerReceiver; + + /** + * Enables retransmission of the frame placed in the TX FIFO when + * NACK is received in SmartCard mode + */ + bool smartCardRetryOnNack; + + /** + * Enables the usage of the CTS input signal for the transmitter. The + * transmitter waits for CTS to be active before sending data + */ + bool enableCts; + + /** Sets the CTS Polarity + * (See \ref group_scb_uart_macro_polarity for the set of constants.) + */ + uint32_t ctsPolarity; + + /** + * When the RX FIFO has fewer entries than rtsRxFifoLevel, the + * RTS signal is active (note to disable RTS, set this field to zero) + */ + uint32_t rtsRxFifoLevel; + + /** Sets the RTS Polarity + * (See \ref group_scb_uart_macro_polarity for the set of constants.) + */ + uint32_t rtsPolarity; + + /** Specifies the number of bits to detect a break condition */ + uint32_t breakWidth; + + /** + * When there are more entries in the RX FIFO than this level + * the RX trigger output goes high. This output can be connected + * to a DMA channel through a trigger mux. + * Also, it controls the \ref CY_SCB_UART_RX_TRIGGER interrupt source. + */ + uint32_t rxFifoTriggerLevel; + + /** + * The bits set in this mask allow the event to cause an interrupt + * (See \ref group_scb_uart_macro_rx_fifo_status for the set of constants.) + */ + uint32_t rxFifoIntEnableMask; + + /** + * When there are fewer entries in the TX FIFO then this level + * the TX trigger output goes high. This output can be connected + * to a DMA channel through a trigger mux. + * Also it controls \ref CY_SCB_UART_TX_TRIGGER interrupt source. + */ + uint32_t txFifoTriggerLevel; + + /** + * Bits set in this mask allows the event to cause an interrupt + * (See \ref group_scb_uart_macro_tx_fifo_status for the set of constants) + */ + uint32_t txFifoIntEnableMask; + + +} cy_stc_scb_uart_config_t; + +/** UART internal context structure */ +typedef struct cy_stc_scb_uart_context +{ + uint32_t volatile txStatus; /**< Transmit status */ + uint32_t volatile rxStatus; /**< Receive status */ + + void *rxRingBuf; /**< Pointer to ring buffer */ + uint32_t volatile rxRingBufSize; /**< Ring buffer size */ + uint32_t volatile rxRingBufHead; /**< Ring buffer head index */ + uint32_t volatile rxRingBufTail; /**< Ring buffer tail index */ + + void *rxBuf; /**< Pointer to receive buffer */ + uint32_t volatile rxBufSize; /**< Receive buffer size */ + uint32_t volatile rxBufIdx; /**< Index within receive buffer */ + + void *txBuf; /**< Pointer to transmit buffer */ + uint32_t volatile txBufSize; /**< Transmit buffer size */ + uint32_t volatile txLeftToTransmit; /**< Number of data elements left to be transmitted */ + + /** + * The pointer to an event callback which is called when a UART event occurs + */ + scb_uart_handle_events_t cbEvents; + +#if !defined(NDEBUG) + uint32_t initKey; /**< Tracks context initialization */ +#endif /* !(NDEBUG) */ +} cy_stc_scb_uart_context_t; +/** \} group_scb_uart_data_structures */ + + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_scb_uart_functions +* \{ +*/ + +/* Basic functions */ +cy_en_scb_uart_status_t Cy_SCB_UART_Init(CySCB_Type *base, cy_stc_scb_uart_config_t const *config, + cy_stc_scb_uart_context_t *context); +void Cy_SCB_UART_DeInit (CySCB_Type *base); +__STATIC_INLINE void Cy_SCB_UART_Enable(CySCB_Type *base); +void Cy_SCB_UART_Disable(CySCB_Type *base, cy_stc_scb_uart_context_t *context); + +/* Configuration functions */ +__STATIC_INLINE void Cy_SCB_UART_EnableCts (CySCB_Type *base); +__STATIC_INLINE void Cy_SCB_UART_DisableCts (CySCB_Type *base); +__STATIC_INLINE void Cy_SCB_UART_SetRtsFifoLevel(CySCB_Type *base, uint32_t rxFifoLevel); +__STATIC_INLINE uint32_t Cy_SCB_UART_GetRtsFifoLevel(CySCB_Type const *base); + +__STATIC_INLINE void Cy_SCB_UART_EnableSkipStart (CySCB_Type *base); +__STATIC_INLINE void Cy_SCB_UART_DisableSkipStart(CySCB_Type *base); + +/* Low-level: RX direction functions */ +__STATIC_INLINE uint32_t Cy_SCB_UART_Get (CySCB_Type const *base); +__STATIC_INLINE uint32_t Cy_SCB_UART_GetArray (CySCB_Type const *base, void *rxBuf, uint32_t size); +__STATIC_INLINE void Cy_SCB_UART_GetArrayBlocking(CySCB_Type const *base, void *rxBuf, uint32_t size); + +__STATIC_INLINE uint32_t Cy_SCB_UART_GetRxFifoStatus (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_UART_ClearRxFifoStatus(CySCB_Type *base, uint32_t clearMask); +__STATIC_INLINE uint32_t Cy_SCB_UART_GetNumInRxFifo (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_UART_ClearRxFifo (CySCB_Type *base); + +/* Low-level: TX direction functions */ +__STATIC_INLINE uint32_t Cy_SCB_UART_Put (CySCB_Type *base, uint32_t data); +__STATIC_INLINE uint32_t Cy_SCB_UART_PutArray (CySCB_Type *base, void *txBuf, uint32_t size); +__STATIC_INLINE void Cy_SCB_UART_PutArrayBlocking(CySCB_Type *base, void *txBuf, uint32_t size); +__STATIC_INLINE void Cy_SCB_UART_PutString (CySCB_Type *base, char_t const string[]); + +__STATIC_INLINE uint32_t Cy_SCB_UART_GetTxFifoStatus (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_UART_ClearTxFifoStatus(CySCB_Type *base, uint32_t clearMask); +__STATIC_INLINE uint32_t Cy_SCB_UART_GetNumInTxFifo (CySCB_Type const *base); +__STATIC_INLINE bool Cy_SCB_UART_IsTxComplete (CySCB_Type const *base); +__STATIC_INLINE void Cy_SCB_UART_ClearTxFifo (CySCB_Type *base); + +/* High-level: Callback */ +__STATIC_INLINE void Cy_SCB_UART_RegisterCallback(CySCB_Type const *base, scb_uart_handle_events_t callback, + cy_stc_scb_uart_context_t *context); + +/* High-level: Ring buffer functions */ +void Cy_SCB_UART_StartRingBuffer (CySCB_Type *base, void* ringBuffer, uint32_t size, + cy_stc_scb_uart_context_t *context); +void Cy_SCB_UART_StopRingBuffer (CySCB_Type *base, cy_stc_scb_uart_context_t *context); +uint32_t Cy_SCB_UART_GetNumInRingBuffer(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context); +void Cy_SCB_UART_ClearRingBuffer (CySCB_Type const *base, cy_stc_scb_uart_context_t *context); + +/* High-level: RX direction functions */ +cy_en_scb_uart_status_t Cy_SCB_UART_Receive(CySCB_Type *base, void *rxBuf, uint32_t size, cy_stc_scb_uart_context_t *context); +void Cy_SCB_UART_AbortReceive (CySCB_Type *base, cy_stc_scb_uart_context_t *context); +uint32_t Cy_SCB_UART_GetNumReceived (CySCB_Type const *base, cy_stc_scb_uart_context_t const *context); +uint32_t Cy_SCB_UART_GetReceiveStatus(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context); + +/* High-level: TX direction functions */ +cy_en_scb_uart_status_t Cy_SCB_UART_Transmit(CySCB_Type *base, void *txBuf, uint32_t size, cy_stc_scb_uart_context_t *context); +void Cy_SCB_UART_AbortTransmit (CySCB_Type *base, cy_stc_scb_uart_context_t *context); +uint32_t Cy_SCB_UART_GetNumLeftToTransmit(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context); +uint32_t Cy_SCB_UART_GetTransmitStatus (CySCB_Type const *base, cy_stc_scb_uart_context_t const *context); + +/* High-level: Interrupt handler */ +void Cy_SCB_UART_Interrupt(CySCB_Type *base, cy_stc_scb_uart_context_t *context); +/** \} group_scb_uart_functions */ + + +/*************************************** +* API Constants +***************************************/ + +/** +* \addtogroup group_scb_uart_macro +* \{ +*/ + +/** +* \defgroup group_scb_uart_macro_modes UART Mode Defines +* \{ +*/ +/** Configures the SCB for Standard UART operation */ +#define CY_SCB_UART_STANDARD (0UL) + +/** Configures the SCB for SmartCard operation */ +#define CY_SCB_UART_SMARTCARD (1UL) + +/** Configures the SCB for IrDA operation */ +#define CY_SCB_UART_IRDA (2UL) +/** \} group_scb_uart_macro_modes */ + +/** +* \defgroup group_scb_uart_macro_stop_bits UART Stop Bit Defines +* \{ +*/ +#define CY_SCB_UART_STOP_BITS_1 (2UL) /**< UART looks for 1 Stop Bit */ +#define CY_SCB_UART_STOP_BITS_1_5 (3UL) /**< UART looks for 1.5 Stop Bits */ +#define CY_SCB_UART_STOP_BITS_2 (4UL) /**< UART looks for 2 Stop Bits */ +#define CY_SCB_UART_STOP_BITS_2_5 (5UL) /**< UART looks for 2.5 Stop Bits */ +#define CY_SCB_UART_STOP_BITS_3 (6UL) /**< UART looks for 3 Stop Bits */ +#define CY_SCB_UART_STOP_BITS_3_5 (7UL) /**< UART looks for 3.5 Stop Bits */ +#define CY_SCB_UART_STOP_BITS_4 (8UL) /**< UART looks for 4 Stop Bits */ +/** \} group_scb_uart_macro_stop_bits */ + +/** +* \defgroup group_scb_uart_macro_parity UART Parity Defines +* \{ +*/ +#define CY_SCB_UART_PARITY_NONE (0UL) /**< UART has no parity check */ +#define CY_SCB_UART_PARITY_EVEN (2UL) /**< UART has even parity check */ +#define CY_SCB_UART_PARITY_ODD (3UL) /**< UART has odd parity check */ +/** \} group_scb_uart_macro_parity */ + +/** +* \defgroup group_scb_uart_macro_irda_lp_ovs UART IRDA Low Power Oversample factors +* \{ +*/ +#define CY_SCB_UART_IRDA_LP_OVS16 (1UL) /**< IrDA in low-power mode oversampled by 16 */ +#define CY_SCB_UART_IRDA_LP_OVS32 (2UL) /**< IrDA in low-power mode oversampled by 32 */ +#define CY_SCB_UART_IRDA_LP_OVS48 (3UL) /**< IrDA in low-power mode oversampled by 48 */ +#define CY_SCB_UART_IRDA_LP_OVS96 (4UL) /**< IrDA in low-power mode oversampled by 96 */ +#define CY_SCB_UART_IRDA_LP_OVS192 (5UL) /**< IrDA in low-power mode oversampled by 192 */ +#define CY_SCB_UART_IRDA_LP_OVS768 (6UL) /**< IrDA in low-power mode oversampled by 768 */ +#define CY_SCB_UART_IRDA_LP_OVS1536 (7UL) /**< IrDA in low-power mode oversampled by 1536 */ +/** \} group_scb_uart_macro_irda_lp_ovs */ + +/** +* \defgroup group_scb_uart_macro_polarity UART Polarity Defines +* \{ +*/ +#define CY_SCB_UART_ACTIVE_LOW (0UL) /**< Signal is active low */ +#define CY_SCB_UART_ACTIVE_HIGH (1UL) /**< Signal is active high */ +/** \} group_scb_uart_macro_polarity */ + +/** +* \defgroup group_scb_uart_macro_rx_fifo_status UART Receive FIFO status. +* \{ +*/ +/** The number of entries in the RX FIFO is more than the RX FIFO trigger level +* value +*/ +#define CY_SCB_UART_RX_TRIGGER (SCB_INTR_RX_TRIGGER_Msk) + +/** The RX FIFO is not empty, there is data to read */ +#define CY_SCB_UART_RX_NOT_EMPTY (SCB_INTR_RX_NOT_EMPTY_Msk) + +/** +* The RX FIFO is full, there is no more space for additional data, +* any additional data will be dropped +*/ +#define CY_SCB_UART_RX_FULL (SCB_INTR_RX_FULL_Msk) + +/** +* The RX FIFO was full and there was an attempt to write to it. +* That additional data was dropped. +*/ +#define CY_SCB_UART_RX_OVERFLOW (SCB_INTR_RX_OVERFLOW_Msk) + +/** An attempt to read from an empty RX FIFO */ +#define CY_SCB_UART_RX_UNDERFLOW (SCB_INTR_RX_UNDERFLOW_Msk) + +/** The RX FIFO detected a frame error, either a stop or stop-bit error */ +#define CY_SCB_UART_RX_ERR_FRAME (SCB_INTR_RX_FRAME_ERROR_Msk) + +/** The RX FIFO detected a parity error */ +#define CY_SCB_UART_RX_ERR_PARITY (SCB_INTR_RX_PARITY_ERROR_Msk) + +/** The RX FIFO detected a break transmission from the transmitter */ +#define CY_SCB_UART_RX_BREAK_DETECT (SCB_INTR_RX_BREAK_DETECT_Msk) +/** \} group_scb_uart_macro_rx_fifo_status */ + +/** +* \defgroup group_scb_uart_macro_tx_fifo_status UART TX FIFO Statuses +* \{ +*/ +/** The number of entries in the TX FIFO is less than the TX FIFO trigger level +* value +*/ +#define CY_SCB_UART_TX_TRIGGER (SCB_INTR_TX_TRIGGER_Msk) + +/** The TX FIFO is not full, there is a space for more data */ +#define CY_SCB_UART_TX_NOT_FULL (SCB_INTR_TX_NOT_FULL_Msk) + +/** The TX FIFO is empty, note there may still be data in the shift register.*/ +#define CY_SCB_UART_TX_EMPTY (SCB_INTR_TX_EMPTY_Msk) + +/** An attempt to write to the full TX FIFO */ +#define CY_SCB_UART_TX_OVERFLOW (SCB_INTR_TX_OVERFLOW_Msk) + +/** An attempt to read from an empty transmitter FIFO (hardware reads). */ +#define CY_SCB_UART_TX_UNDERFLOW (SCB_INTR_TX_UNDERFLOW_Msk) + +/** All data has been transmitted out of the FIFO, including shifter */ +#define CY_SCB_UART_TX_DONE (SCB_INTR_TX_UART_DONE_Msk) + +/** SmartCard only: the transmitter received a NACK */ +#define CY_SCB_UART_TX_NACK (SCB_INTR_TX_UART_NACK_Msk) + +/** SmartCard only: the transmitter lost arbitration */ +#define CY_SCB_UART_TX_ARB_LOST (SCB_INTR_TX_UART_ARB_LOST_Msk) +/** \} group_scb_uart_macro_tx_fifo_status */ + +/** +* \defgroup group_scb_uart_macro_receive_status UART Receive Statuses +* \{ +*/ +/** The receive operation triggered by \ref Cy_SCB_UART_Receive is in progress */ +#define CY_SCB_UART_RECEIVE_ACTIVE (0x01UL) + +/** +* The hardware RX FIFO was full and there was an attempt to write to it. +* That additional data was dropped. +*/ +#define CY_SCB_UART_RECEIVE_OVERFLOW (SCB_INTR_RX_OVERFLOW_Msk) + +/** The receive hardware detected a frame error, either a start or +* stop bit error +*/ +#define CY_SCB_UART_RECEIVE_ERR_FRAME (SCB_INTR_RX_FRAME_ERROR_Msk) + +/** The receive hardware detected a parity error */ +#define CY_SCB_UART_RECEIVE_ERR_PARITY (SCB_INTR_RX_PARITY_ERROR_Msk) + +/** The receive hardware detected a break transmission from transmitter */ +#define CY_SCB_UART_RECEIVE_BREAK_DETECT (SCB_INTR_RX_BREAK_DETECT_Msk) +/** \} group_scb_uart_macro_receive_status */ + +/** +* \defgroup group_scb_uart_macro_transmit_status UART Transmit Status +* \{ +*/ +/** The transmit operation triggered by \ref Cy_SCB_UART_Transmit is in progress */ +#define CY_SCB_UART_TRANSMIT_ACTIVE (0x01UL) + +/** All data elements specified by \ref Cy_SCB_UART_Transmit are in the TX FIFO */ +#define CY_SCB_UART_TRANSMIT_IN_FIFO (0x02UL) + +/** SmartCard only: the transmitter received a NACK */ +#define CY_SCB_UART_TRANSMIT_NACK (SCB_INTR_TX_UART_NACK_Msk) + +/** SmartCard only: the transmitter lost arbitration */ +#define CY_SCB_UART_TRANSMIT_ARB_LOST (SCB_INTR_TX_UART_ARB_LOST_Msk) +/** \} group_scb_uart_macro_transmit_status */ + +/** +* \defgroup group_scb_uart_macro_callback_events UART Callback Events +* \{ +* Only single event is notified by the callback. +*/ +/** All data elements specified by \ref Cy_SCB_UART_Transmit are in the TX FIFO */ +#define CY_SCB_UART_TRANSMIT_IN_FIFO_EVENT (0x01UL) + +/** +* All data elements specified by \ref Cy_SCB_UART_Transmit have been transmitted. +*/ +#define CY_SCB_UART_TRANSMIT_DONE_EVENT (0x02UL) + +/** All data elements specified by \ref Cy_SCB_UART_Receive have been received */ +#define CY_SCB_UART_RECEIVE_DONE_EVENT (0x04UL) + +/** +* The ring buffer is full, there is no more space for additional data. +* Additional data is stored in the RX FIFO until it becomes full, at which point +* data is dropped. +*/ +#define CY_SCB_UART_RB_FULL_EVENT (0x08UL) + +/** +* An error was detected during the receive operation. This includes overflow, +* frame error, or parity error. Check \ref Cy_SCB_UART_GetReceiveStatus to +* determine the source of the error. +*/ +#define CY_SCB_UART_RECEIVE_ERR_EVENT (0x10UL) + +/** +* An error was detected during the transmit operation. This includes a NACK +* or lost arbitration. Check \ref Cy_SCB_UART_GetTransmitStatus to determine +* the source of the error +*/ +#define CY_SCB_UART_TRANSMIT_ERR_EVENT (0x20UL) +/** \} group_scb_uart_macro_callback_events */ + +/** Data returned by the hardware when an empty RX FIFO is read */ +#define CY_SCB_UART_RX_NO_DATA (0xFFFFFFFFUL) + + +/*************************************** +* Internal Constants +***************************************/ + +/** \cond INTERNAL */ +#define CY_SCB_UART_TX_FIFO_STATUS (CY_SCB_UART_TX_TRIGGER | CY_SCB_UART_TX_NOT_FULL | CY_SCB_UART_TX_EMPTY | \ + CY_SCB_UART_TX_OVERFLOW | CY_SCB_UART_TX_UNDERFLOW | CY_SCB_UART_TX_DONE | \ + CY_SCB_UART_TX_NACK | CY_SCB_UART_TX_ARB_LOST) + +#define CY_SCB_UART_RX_FIFO_STATUS (CY_SCB_UART_RX_TRIGGER | CY_SCB_UART_RX_NOT_EMPTY | CY_SCB_UART_RX_FULL | \ + CY_SCB_UART_RX_OVERFLOW | CY_SCB_UART_RX_UNDERFLOW | CY_SCB_UART_RX_ERR_FRAME | \ + CY_SCB_UART_RX_ERR_PARITY | CY_SCB_UART_RX_BREAK_DETECT) + +#define CY_SCB_UART_TX_INTR (CY_SCB_TX_INTR_LEVEL | CY_SCB_TX_INTR_UART_NACK | CY_SCB_TX_INTR_UART_ARB_LOST) + +#define CY_SCB_UART_RX_INTR (CY_SCB_RX_INTR_LEVEL | CY_SCB_RX_INTR_OVERFLOW | CY_SCB_RX_INTR_UART_FRAME_ERROR | \ + CY_SCB_RX_INTR_UART_PARITY_ERROR | CY_SCB_RX_INTR_UART_BREAK_DETECT) + +#define CY_SCB_UART_RECEIVE_ERR (CY_SCB_RX_INTR_OVERFLOW | CY_SCB_RX_INTR_UART_FRAME_ERROR | \ + CY_SCB_RX_INTR_UART_PARITY_ERROR | CY_SCB_RX_INTR_UART_BREAK_DETECT) + +#define CY_SCB_UART_TRANSMIT_ERR (CY_SCB_TX_INTR_UART_NACK | CY_SCB_TX_INTR_UART_ARB_LOST) + +#define CY_SCB_UART_INIT_KEY (0x00ABCDEFUL) +/** \endcond */ + +/** \} group_scb_uart_macro */ + + +/*************************************** +* In-line Function Implementation +***************************************/ + +/** +* \addtogroup group_scb_uart_functions +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_SCB_UART_Enable +****************************************************************************//** +* +* Enables the SCB block for the UART operation. +* +* \param base +* The pointer to the UART SCB instance. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_Enable(CySCB_Type *base) +{ + base->CTRL |= SCB_CTRL_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_EnableCts +****************************************************************************//** +* +* Enables the Clear to Send (CTS) input for the UART. The UART will not transmit +* data while this signal is inactive. +* +* \param base +* The pointer to the UART SCB instance. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_EnableCts(CySCB_Type *base) +{ + base->UART_FLOW_CTRL |= SCB_UART_FLOW_CTRL_CTS_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_DisableCts +****************************************************************************//** +* +* Disables the Clear to Send (CTS) input for the UART. +* See \ref Cy_SCB_UART_EnableCts for the details. +* +* \param base +* The pointer to the UART SCB instance. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_DisableCts(CySCB_Type *base) +{ + base->UART_FLOW_CTRL &= (uint32_t) ~SCB_UART_FLOW_CTRL_CTS_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_SetRtsFifoLevel +****************************************************************************//** +* +* Sets a level for the Ready To Send (RTS) signal activation. +* When the number of data elements in the receive FIFO is below this level, +* then the RTS output is active. Otherwise, the RTS signal is inactive. +* To disable the RTS signal generation, set this level to zero. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param rxFifoLevel +* The level in the RX FIFO for RTS signal activation. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_SetRtsFifoLevel(CySCB_Type *base, uint32_t rxFifoLevel) +{ + base->UART_FLOW_CTRL = _CLR_SET_FLD32U(base->UART_FLOW_CTRL, SCB_UART_FLOW_CTRL_TRIGGER_LEVEL, rxFifoLevel); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetRtsFifoLevel +****************************************************************************//** +* +* Returns the level in the RX FIFO for the RTS signal activation. +* +* \param base +* The pointer to the UART SCB instance. +* +* \return +* The level in the RX FIFO for RTS signal activation. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_UART_GetRtsFifoLevel(CySCB_Type const *base) +{ + return _FLD2VAL(SCB_UART_FLOW_CTRL_TRIGGER_LEVEL, base->UART_FLOW_CTRL); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_EnableSkipStart +****************************************************************************//** +* +* Enables the skip start-bit functionality. +* The UART hardware does not synchronize to a start but synchronizes to +* the first rising edge. To create a rising edge, the first data bit must +* be a 1. This feature is useful when the Start edge is used to wake the +* device through a GPIO interrupt. +* +* \param base +* The pointer to the UART SCB instance. +* +* \note +* The skip start-bit feature is applied whenever the UART is disabled due +* to entrance into DeepSleep or after calling \ref Cy_SCB_UART_Disable. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_EnableSkipStart(CySCB_Type *base) +{ + base->UART_RX_CTRL |= SCB_UART_RX_CTRL_SKIP_START_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_DisableSkipStart +****************************************************************************//** +* +* Disable the skip start-bit functionality. +* See \ref Cy_SCB_UART_EnableSkipStart for the details. +* +* \param base +* The pointer to the UART SCB instance. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_DisableSkipStart(CySCB_Type *base) +{ + base->UART_RX_CTRL &= (uint32_t) ~SCB_UART_RX_CTRL_SKIP_START_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_Get +****************************************************************************//** +* +* Reads a single data element from the UART RX FIFO. +* This function does not check whether the RX FIFO has data before reading it. +* If the RX FIFO is empty, the function returns \ref CY_SCB_UART_RX_NO_DATA. +* +* \param base +* The pointer to the UART SCB instance. +* +* \return +* Data from the RX FIFO. +* The data element size is defined by the configured data width. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_UART_Get(CySCB_Type const *base) +{ + return Cy_SCB_ReadRxFifo(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetArray +****************************************************************************//** +* +* Reads an array of data out of the UART RX FIFO. +* This function does not block. It returns how many data elements were read +* from the RX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param rxBuf +* The pointer to the location to place the data read from the RX FIFO. +* The item size is defined by the data type, which depends on the configured +* data width. +* +* \param size +* The number of data elements to read from the RX FIFO. +* +* \return +* The number of data elements read from the RX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_UART_GetArray(CySCB_Type const *base, void *rxBuf, uint32_t size) +{ + return Cy_SCB_ReadArray(base, rxBuf, size); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetArrayBlocking +****************************************************************************//** +* +* Reads an array of data out of the UART RX FIFO. +* This function blocks until the number of data elements specified by the +* size has been read from the RX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param rxBuf +* The pointer to the location to place the data read from the RX FIFO. +* The item size is defined by the data type which depends on the configured +* data width. +* +* \param size +* The number of data elements to read from the RX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_GetArrayBlocking(CySCB_Type const *base, void *rxBuf, uint32_t size) +{ + Cy_SCB_ReadArrayBlocking(base, rxBuf, size); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetRxFifoStatus +****************************************************************************//** +* +* Returns the current status of the RX FIFO. +* Clear the active statuses to let the SCB hardware update them. +* +* \param base +* The pointer to the UART SCB instance. +* +* \return +* \ref group_scb_uart_macro_rx_fifo_status +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_UART_GetRxFifoStatus(CySCB_Type const *base) +{ + return (Cy_SCB_GetRxInterruptStatus(base) & CY_SCB_UART_RX_FIFO_STATUS); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_ClearRxFifoStatus +****************************************************************************//** +* +* Clears the selected statuses of the RX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param clearMask +* The mask whose statuses to clear. +* See \ref group_scb_uart_macro_rx_fifo_status for the set of constants. +* +* \note +* * This status is also used for interrupt generation, so clearing it also +* clears the interrupt sources. +* * Level-sensitive statuses such as \ref CY_SCB_UART_RX_TRIGGER, +* \ref CY_SCB_UART_RX_NOT_EMPTY and \ref CY_SCB_UART_RX_FULL set high again after +* being cleared if the condition remains true. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_ClearRxFifoStatus(CySCB_Type *base, uint32_t clearMask) +{ + Cy_SCB_ClearRxInterrupt(base, clearMask); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetNumInRxFifo +****************************************************************************//** +* +* Returns the number of data elements in the UART RX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \return +* The number of data elements in the RX FIFO. +* The size of date element defined by the configured data width. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_UART_GetNumInRxFifo(CySCB_Type const *base) +{ + return Cy_SCB_GetNumInRxFifo(base); +} + +/******************************************************************************* +* Function Name: Cy_SCB_UART_ClearRxFifo +****************************************************************************//** +* +* Clears all data out of the UART RX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \sideeffect +* Any data currently in the shifter is cleared and lost. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_ClearRxFifo(CySCB_Type *base) +{ + Cy_SCB_ClearRxFifo(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_Put +****************************************************************************//** +* +* Places a single data element in the UART TX FIFO. +* This function does not block and returns how many data elements were placed +* in the TX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param data +* Data to put in the TX FIFO. +* The item size is defined by the data type which depends on the configured +* data width. +* +* \return +* The number of data elements placed in the TX FIFO: 0 or 1. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_UART_Put(CySCB_Type *base, uint32_t data) +{ + return Cy_SCB_Write(base, data); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_PutArray +****************************************************************************//** +* +* Places an array of data in the UART TX FIFO. +* This function does not block and it returns how many data elements were +* placed in the TX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param txBuf +* The pointer to data to place in the TX FIFO. +* The item size is defined by the data type which depends on the configured +* TX data width. +* +* \param size +* The number of data elements to TX. +* +* \return +* The number of data elements placed in the TX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_UART_PutArray(CySCB_Type *base, void *txBuf, uint32_t size) +{ + return Cy_SCB_WriteArray(base, txBuf, size); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_PutArrayBlocking +****************************************************************************//** +* +* Places an array of data in the UART TX FIFO. +* This function blocks until the number of data elements specified by the size +* is placed in the TX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param txBuf +* The pointer to data to place in the TX FIFO. +* The item size is defined by the data type which depends on the configured +* data width. +* +* \param size +* The number of data elements to write into the TX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_PutArrayBlocking(CySCB_Type *base, void *txBuf, uint32_t size) +{ + Cy_SCB_WriteArrayBlocking(base, txBuf, size); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_PutString +****************************************************************************//** +* +* Places a NULL terminated string in the UART TX FIFO. +* This function blocks until the entire string is placed in the TX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param string +* The pointer to the null terminated string array. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_PutString(CySCB_Type *base, char_t const string[]) +{ + Cy_SCB_WriteString(base, string); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetTxFifoStatus +****************************************************************************//** +* +* Returns the current status of the TX FIFO. +* Clear the active statuses to let the SCB hardware update them. +* +* \param base +* The pointer to the UART SCB instance. +* +* \return +* \ref group_scb_uart_macro_tx_fifo_status +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_UART_GetTxFifoStatus(CySCB_Type const *base) +{ + return (Cy_SCB_GetTxInterruptStatus(base) & CY_SCB_UART_TX_FIFO_STATUS); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_ClearTxFifoStatus +****************************************************************************//** +* +* Clears the selected statuses of the TX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param clearMask +* The mask whose statuses to clear. +* See \ref group_scb_uart_macro_tx_fifo_status for the set of constants. +* +* \note +* * The status is also used for interrupt generation, so clearing it also +* clears the interrupt sources. +* * Level-sensitive statuses such as \ref CY_SCB_UART_TX_TRIGGER, +* \ref CY_SCB_UART_TX_EMPTY and \ref CY_SCB_UART_TX_NOT_FULL set high again after +* being cleared if the condition remains true. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_ClearTxFifoStatus(CySCB_Type *base, uint32_t clearMask) +{ + Cy_SCB_ClearTxInterrupt(base, clearMask); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_GetNumInTxFifo +****************************************************************************//** +* +* Returns the number of data elements in the UART TX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \return +* The number of data elements in the TX FIFO. +* The size of date element defined by the configured data width. +* +* \note +* This number does not include any data currently in the TX shifter. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SCB_UART_GetNumInTxFifo(CySCB_Type const *base) +{ + return Cy_SCB_GetNumInTxFifo(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_IsTxComplete +****************************************************************************//** +* +* Checks if the TX FIFO and Shifter are empty and there is no more data to send +* +* \param base +* Pointer to the UART SCB instance. +* +* \return +* If true, transmission complete. If false, transmission is not complete. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SCB_UART_IsTxComplete(CySCB_Type const *base) +{ + return Cy_SCB_IsTxComplete(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_ClearTxFifo +****************************************************************************//** +* +* Clears all data out of the UART TX FIFO. +* +* \param base +* The pointer to the UART SCB instance. +* +* \sideeffect +* The TX FIFO clear operation also clears the shift register, so that +* the shifter could be cleared in the middle of a data element transfer, +* corrupting it. The data element corruption means that all bits that have +* not been transmitted are transmitted as 1s on the bus. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_ClearTxFifo(CySCB_Type *base) +{ + Cy_SCB_ClearTxFifo(base); +} + + +/******************************************************************************* +* Function Name: Cy_SCB_UART_RegisterCallback +****************************************************************************//** +* +* Registers a callback function that notifies that +* \ref group_scb_uart_macro_callback_events occurred in the +* \ref Cy_SCB_UART_Interrupt. +* +* \param base +* The pointer to the UART SCB instance. +* +* \param callback +* The pointer to the callback function. +* See \ref scb_uart_handle_events_t for the function prototype. +* +* \param context +* The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated +* by the user. The structure is used during the UART operation for internal +* configuration and data keeping. The user should not modify anything +* in this structure. +* +* \note +* To remove the callback, pass NULL as the pointer to the callback function. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SCB_UART_RegisterCallback(CySCB_Type const *base, + scb_uart_handle_events_t callback, cy_stc_scb_uart_context_t *context) +{ + /* Suppress a compiler warning about unused variables */ + (void) base; + + context->cbEvents = callback; +} + +/** \} group_scb_uart_functions */ + +#if defined(__cplusplus) +} +#endif + +/** \} group_scb_uart */ + +#endif /* (CY_SCB_UART_H) */ + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysclk/cy_sysclk.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysclk/cy_sysclk.c new file mode 100644 index 0000000000..a3d89ea34a --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysclk/cy_sysclk.c @@ -0,0 +1,1285 @@ +/***************************************************************************//** +* \file cy_sysclk.c +* \version 1.0 +* +* Provides an API implementation of the sysclk driver. +* +******************************************************************************** +* \copyright +* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_sysclk.h" +#include "syslib/cy_syslib.h" +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/* # of elements in an array */ +#define CY_SYSCLK_N_ELMTS(a) (sizeof(a) / sizeof((a)[0])) + +/* ========================================================================== */ +/* =========================== ECO SECTION ============================ */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_EcoConfigure +****************************************************************************//** +* +* This function configures the external crystal oscillator (ECO) trim bits based +* on crystal characteristics. This function should only be called when the ECO is +* disabled. +* +* \param freq Operating frequency of the crystal in Hz. +* +* \param cLoad Crystal load capacitance in pF. +* +* \param esr Effective series resistance of the crystal in ohms. +* +* \param driveLevel Crystal drive level in uW. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - ECO configuration completed successfully
+* CY_SYSCLK_BAD_PARAM - One or more invalid parameters
+* CY_SYSCLK_INVALID_STATE - ECO already enabled +* +* \note +* The following calculations are implemented, generally in floating point: +* freqMHz = freq / 1,000,000 +* max amplitude Vpp = 1,000 * sqrt(drivelevel / 2 / esr) / 3.14 / freqMHz / cLoad +* gm_min mA/V = 5 * 4 * 3.14 * 3.14 * freqMhz^2 * cLoad^2 * 4 * esr / 1,000,000,000 +* # amplifier sections = INT(gm_min / 4.5) +* atrim = if max amplitude < 0.5 then error +* else 2 * the following: +* max amplitude < 0.6: 0 +* max amplitude < 0.7: 1 +* max amplitude < 0.8: 2 +* max amplitude < 0.9: 3 +* max amplitude < 1.15: 5 +* max amplitude < 1.275: 6 +* max amplitude >= 1.275: 7 +* wdtrim = if max amplitude < 0.5 then error +* else 2 * the following: +* max amplitude < 1.2: INT(5 * max amplitude) - 2 +* max amplitude >= 1.2: 3 +* gtrim = if # amplifier sections > 3 then error +* else the following: +* # amplifier sections > 1: # amplifier sections +* # amplifier sections = 1: 0 +* # amplifier sections < 1: 1 +* rtrim = if gtrim = error then error +* else the following: +* freqMHz > 26.8: 0 +* freqMHz > 23.33: 1 +* freqMHz > 16.5: 2 +* freqMHz <= 16.5: 3 +* ftrim = if atrim = error then error +* else INT(atrim / 2) +* +* \note +* This function returns immediately if the ECO is enabled. +*******************************************************************************/ +uint32_t Cy_SysClk_EcoConfigure(uint32_t freq, uint32_t cLoad, uint32_t esr, uint32_t driveLevel) +{ + /* error if ECO is not disabled - any of the 3 enable bits are set */ + uint32_t rtnval = CY_SYSCLK_INVALID_STATE; + if ((SRSS->CLK_ECO_CONFIG & 0xE0000000ul) == 0ul) + { + /* calculate intemediate values */ + float32_t freqMHz = (float32_t)freq / 1000000.0f; + float32_t maxAmplitude = + (1000.0f * ((float32_t)sqrt((float64_t)((float32_t)driveLevel / (2.0f * (float32_t)esr))))) / + (3.14f * freqMHz * (float32_t)cLoad); + float32_t gm_min = + (788.8f /*5 * 4 * 3.14 * 3.14 * 4*/ * freqMHz * freqMHz * (float32_t)cLoad * (float32_t)cLoad) / + 1000000000.0f; + uint32_t nAmpSections = (uint32_t)(gm_min / 4.5f); + + /* error if input parameters cause erroneous intermediate values */ + rtnval = CY_SYSCLK_BAD_PARAM; + if ((maxAmplitude >= 0.5f) && (nAmpSections <= 3ul)) + { + uint32_t atrim, wdtrim, gtrim, rtrim, ftrim, reg; + + atrim = 2ul * (maxAmplitude < 0.6f ? 0ul : + (maxAmplitude < 0.7f ? 1ul : + (maxAmplitude < 0.8f ? 2ul : + (maxAmplitude < 0.9f ? 3ul : + (maxAmplitude < 1.15f ? 5ul : + (maxAmplitude < 1.275f ? 6ul : 7ul)))))); + + wdtrim = 2ul * (maxAmplitude < 1.2f ? (uint32_t)(5.0f * maxAmplitude) - 2ul : 3ul); + + gtrim = (nAmpSections > 1ul ? nAmpSections : + (nAmpSections == 1ul ? 0ul : 1ul)); + + rtrim = (freqMHz > 26.8f ? 0ul : + (freqMHz > 23.33f ? 1ul : + (freqMHz > 16.5f ? 2ul : 3ul))); + + ftrim = atrim / 2ul; + + /* update all fields of trim control register with one write, without + changing the ITRIM field in bits [21:16]: + gtrim: bits [13:12] + rtrim: bits [11:10] + ftrim: bits [9:8] + atrim: bits [7:4] + wdtrim: bits [2:0] + */ + reg = (SRSS->CLK_TRIM_ECO_CTL & ~0x3FFFul); + reg |= (gtrim & 3ul) << 12; + reg |= (rtrim & 3ul) << 10; + reg |= (ftrim & 3ul) << 8; + reg |= (atrim & 0x0Ful) << 4; + reg |= (wdtrim & 7ul); + SRSS->CLK_TRIM_ECO_CTL = reg; + + rtnval = CY_SYSCLK_SUCCESS; + } /* if valid parameters */ + } /* if ECO not enabled */ + + return (rtnval); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_EcoEnable +****************************************************************************//** +* +* Enables the external crystal oscillator (ECO). This function should be called +* after \ref Cy_SysClk_EcoConfigure. +* +* \param timeoutus Amount of time in microseconds to wait for the ECO to lock. +* If a lock does not occur, the ECO is stopped. To avoid waiting for a lock, set +* this paramter to 0. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - ECO successfully enabled
+* CY_SYSCLK_TIMEOUT - Timeout waiting for ECO lock +* +*******************************************************************************/ +uint32_t Cy_SysClk_EcoEnable(uint32_t timeoutus) +{ + uint32_t rtnval; + + /* first set ECO enable */ + SRSS->CLK_ECO_CONFIG |= _VAL2FLD(SRSS_CLK_ECO_CONFIG_ECO_EN, 1ul); /* 1 = enable */ + + /* now do the timeout wait for ECO_STATUS, bit ECO_OK */ + for (; + ((_FLD2VAL(SRSS_CLK_ECO_STATUS_ECO_READY, SRSS->CLK_ECO_STATUS) == 0ul)) &&(timeoutus != 0ul); + timeoutus--) + { + Cy_SysLib_DelayUs(1u); + } + + rtnval = ((timeoutus == 0ul) ? CY_SYSCLK_TIMEOUT : CY_SYSCLK_SUCCESS); + return rtnval; +} + + +/* ========================================================================== */ +/* ==================== INPUT MULTIPLEXER SECTION ===================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_ClkPathSetSource +****************************************************************************//** +* +* Configures the source for the specified clock path. +* +* \param clkPath Selects which clock path to configure; 0 is the first clock +* path, which is the FLL. +* +* \param source \ref cy_en_clkpath_in_sources_t +* +*******************************************************************************/ +void Cy_SysClk_ClkPathSetSource(uint32_t clkPath, cy_en_clkpath_in_sources_t source) +{ + if (source >= CY_SYSCLK_CLKPATH_IN_DSI) + { + SRSS->CLK_DSI_SELECT[clkPath] = _VAL2FLD(SRSS_CLK_DSI_SELECT_DSI_MUX, (uint32_t)source); + SRSS->CLK_PATH_SELECT[clkPath] = _VAL2FLD(SRSS_CLK_PATH_SELECT_PATH_MUX, (uint32_t)CY_SYSCLK_CLKPATH_IN_DSIMUX); + } + else + { + SRSS->CLK_PATH_SELECT[clkPath] = _VAL2FLD(SRSS_CLK_PATH_SELECT_PATH_MUX, (uint32_t)source); + } +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkPathGetSource +****************************************************************************//** +* +* Reports which source is selected for the path mux. +* +* \param clkPath Selects which clock path to report; 0 is the first clock path, +* which is the FLL. +* +* \return \ref cy_en_clkpath_in_sources_t +* +*******************************************************************************/ +cy_en_clkpath_in_sources_t Cy_SysClk_ClkPathGetSource(uint32_t clkPath) +{ + cy_en_clkpath_in_sources_t rtnval = + (cy_en_clkpath_in_sources_t )_FLD2VAL(SRSS_CLK_PATH_SELECT_PATH_MUX, SRSS->CLK_PATH_SELECT[clkPath]); + if (rtnval == CY_SYSCLK_CLKPATH_IN_DSIMUX) + { + rtnval = (cy_en_clkpath_in_sources_t)(CY_SYSCLK_CLKPATH_IN_DSI | + (_FLD2VAL(SRSS_CLK_DSI_SELECT_DSI_MUX, SRSS->CLK_DSI_SELECT[clkPath]))); + } + return rtnval; +} + + +/* ========================================================================== */ +/* =========================== FLL SECTION ============================ */ +/* ========================================================================== */ +/* min and max FLL output frequencies, in Hz */ +#define CY_SYSCLK_MIN_FLL_CCO_OUTPUT_FREQ 48000000ul +#define CY_SYSCLK_MIN_FLL_OUTPUT_FREQ (CY_SYSCLK_MIN_FLL_CCO_OUTPUT_FREQ / 2u) +#define CY_SYSCLK_MAX_FLL_OUTPUT_FREQ 200000000ul +/* FLL CCO settling time, in microseconds */ +#define CY_SYSCLK_FLL_CCO_SETTLING_TIME 1ul + +/******************************************************************************* +* Function Name: Cy_SysClk_FllConfigure +****************************************************************************//** +* +* Configures the FLL. +* +* \param inputFreq frequency of input source, in Hz +* +* \param outputFreq Desired FLL output frequency, in Hz. Allowable range is +* 24 MHz to 100 MHz (200 MHz with a relatively poor duty cycle. If the output +* frequency is less than 48 MHz, FLL_OUTPUT_DIV must be set; the output divide by +* 2 option is required. +* +* \param outputMode \ref cy_en_fll_pll_output_mode_t +* If output mode is bypass, then the output frequency equals the input source +* frequency regardless of the frequency parameter values. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - FLL successfully configured
+* CY_SYSCLK_INVALID_STATE - FLL not configured because it is enabled
+* CY_SYSCLK_BAD_PARAM - desired output frequency is out of valid range +* +* \note +* Do not call this function when the FLL is enabled. If it is, then this function +* returns immediately with an error return value and no register updates. +*******************************************************************************/ +uint32_t Cy_SysClk_FllConfigure(uint32_t inputFreq, uint32_t outputFreq, cy_en_fll_pll_output_mode_t outputMode) +{ + uint32_t returnStatus = CY_SYSCLK_SUCCESS; + + /* check for errors */ + if (_FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_ENABLE, SRSS->CLK_FLL_CONFIG) != 0u) /* 1 = enabled */ + { + returnStatus = CY_SYSCLK_INVALID_STATE; + } + else if ((outputFreq < CY_SYSCLK_MIN_FLL_OUTPUT_FREQ) || (CY_SYSCLK_MAX_FLL_OUTPUT_FREQ < outputFreq)) /* invalid output frequency */ + { + returnStatus = CY_SYSCLK_BAD_PARAM; + } + else + { /* return status is OK */ + } + + /* no error */ + if (returnStatus == CY_SYSCLK_SUCCESS) /* no errors */ + { + /* If output mode is bypass (input routed directly to output), then done. + The output frequency equals the input frequency regardless of the + frequency parameters. */ + if (outputMode != CY_SYSCLK_FLLPLL_OUTPUT_INPUT) + { + cy_stc_fll_manual_config_t config; + uint32_t ccoFreq; + + config.outputMode = outputMode; + /* TRM step 1a,b. Determine if output division by 2 is required. */ + config.enableOutputDiv = (bool)((outputFreq < CY_SYSCLK_MIN_FLL_CCO_OUTPUT_FREQ) ? 1ul : 0ul); + /* TRM step 1c. Compute the CCO frequency from the output division. */ + ccoFreq = outputFreq * ((uint32_t)(config.enableOutputDiv) + 1ul); + /* TRM step 1d,e. Compute the CCO range value from the CCO frequency */ + config.ccoRange = (ccoFreq >= 150000000ul ? CY_SYSCLK_FLL_CCO_RANGE4 : + (ccoFreq >= 113000000ul ? CY_SYSCLK_FLL_CCO_RANGE3 : + (ccoFreq >= 85000000ul ? CY_SYSCLK_FLL_CCO_RANGE2 : + (ccoFreq >= 64000000ul ? CY_SYSCLK_FLL_CCO_RANGE1 : CY_SYSCLK_FLL_CCO_RANGE0)))); + /* TRM step 3. Compute the FLL reference divider value. + Formula is REF_DIV = (1 / precision) * (inputFreq / ccoFreq) + Precision is assumed to be 0.0553%. + Therefore REF_DIV = 1808.019 * inputFreq / ccoFreq + Result is rounded up. */ + config.refDiv = (uint32_t)ceilf((1808.019f * (float32_t)inputFreq) / (float32_t)ccoFreq); + /* TRM step 4. Set the lock tolerance. + Output frequency accuracy = precision * lock tolerance. + Generally a value of 5 is acceptable. */ + config.lockTolerance = 20ul; + /* TRM step 5. Compute the FLL MULT value. Note that we can't integer multiply + ccoFreq * refDiv because it may overflow a 32-bit integer. */ + config.fllMult = CY_SYSCLK_DIV_ROUND(ccoFreq, CY_SYSCLK_DIV_ROUND(inputFreq, config.refDiv)); + /* TRM step 6. Calculate the settling count, using a 1-usec settling time. */ + config.settlingCount = CY_SYSCLK_DIV_ROUNDUP(inputFreq * CY_SYSCLK_FLL_CCO_SETTLING_TIME, 1000000ul); + /* TRM step 7. Calculate the CCO igain and pgain. */ + { + /* CCO gain values based on CCO_RANGE bitfield values */ + const float32_t kCco[] = {46.17112083f, 61.42259619f, 81.71201510f, 108.70353626f, 144.61103156f}; + + /* igain and pgain bitfield values correspond to: 1/256, 1/128, ..., 4, 8 */ + const float32_t gains[] = {0.00390625f, 0.0078125f, 0.015625f, 0.03125f, 0.0625f, 0.125f, 0.25f, + 0.5f, 1.0f, 2.0f, 4.0f, 8.0f}; + + float32_t temp = 0.9f / ((float32_t)(kCco[config.ccoRange] * ((float32_t) config.refDiv / ((float32_t)inputFreq / 1000.0f) ))); + + /* find the largest IGAIN value that is less than kCCO * refDiv /inputFreq */ + for(config.igain = CY_SYSCLK_N_ELMTS(gains) - 1ul; + (gains[config.igain] >= temp) && (config.igain != 0ul); + config.igain--){} + /* then find the largest PGAIN value such that (IGAIN + PGAIN) is less than + kCCO * refDiv /inputFreq */ + for(config.pgain = CY_SYSCLK_N_ELMTS(gains) - 1ul; + ((gains[config.igain] + gains[config.pgain]) >= temp) && (config.pgain != 0ul); + config.pgain--){} + /* final check for exceeding limit; adjust IGAIN and PGAIN downward if needed. */ + while(((gains[config.igain] + gains[config.pgain]) >= temp) && + ((config.igain != 0ul) || (config.pgain != 0ul))) + { + if (config.igain != 0ul) + { + config.igain--; + } + else if (config.pgain != 0ul) + { + config.pgain--; + } + else /* both are zero; exit loop; done the best we can */ + { + } + } + } + + /* configure FLL based on calculated values */ + returnStatus = Cy_SysClk_FllManualConfigure(&config); + } /* if not bypass output mode */ + + else + { /* bypass mode */ + /* update CLK_FLL_CONFIG3 register with divide by 2 parameter */ + CY_SYSCLK_CLR_SET(SRSS->CLK_FLL_CONFIG3, SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, (uint32_t)outputMode); + } + } /* if no error */ + + return (returnStatus); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_FllManualConfigure +****************************************************************************//** +* +* Manually configures the FLL based on user inputs. +* +* \param config \ref cy_stc_fll_manual_config_t +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - FLL successfully configured
+* CY_SYSCLK_INVALID_STATE - FLL not configured because it is enabled +* +* \note +* Do not call this function when the FLL is enabled. If it is, then this function +* returns immediately with an error return value and no register updates. +*******************************************************************************/ +uint32_t Cy_SysClk_FllManualConfigure(const cy_stc_fll_manual_config_t *config) +{ + uint32_t returnStatus = CY_SYSCLK_SUCCESS; + + /* check for errors */ + if (_FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_ENABLE, SRSS->CLK_FLL_CONFIG) != 0u) /* 1 = enabled */ + { + returnStatus = CY_SYSCLK_INVALID_STATE; + } + else + { /* return status is OK */ + } + + /* no error */ + if (returnStatus == CY_SYSCLK_SUCCESS) /* no errors */ + { + /* update CLK_FLL_CONFIG register with 2 parameters; FLL_ENABLE is already 0 */ + uint32_t reg = _VAL2FLD(SRSS_CLK_FLL_CONFIG_FLL_MULT, config->fllMult); + SRSS->CLK_FLL_CONFIG = reg | _VAL2FLD(SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV, (uint32_t)(config->enableOutputDiv)); + /* update CLK_FLL_CONFIG2 register with 2 parameters */ + reg = _VAL2FLD(SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV, config->refDiv); + SRSS->CLK_FLL_CONFIG2 = reg | _VAL2FLD(SRSS_CLK_FLL_CONFIG2_LOCK_TOL, config->lockTolerance); + /* update CLK_FLL_CONFIG3 register with 4 parameters */ + reg = _VAL2FLD(SRSS_CLK_FLL_CONFIG3_FLL_LF_IGAIN, config->igain); + reg |= _VAL2FLD(SRSS_CLK_FLL_CONFIG3_FLL_LF_PGAIN, config->pgain); + reg |= _VAL2FLD(SRSS_CLK_FLL_CONFIG3_SETTLING_COUNT, config->settlingCount); + SRSS->CLK_FLL_CONFIG3 = reg | _VAL2FLD(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, (uint32_t)(config->outputMode)); + /* update CLK_FLL_CONFIG4 register with 1 parameter; preserve other bits */ + CY_SYSCLK_CLR_SET(SRSS->CLK_FLL_CONFIG4, SRSS_CLK_FLL_CONFIG4_CCO_RANGE, (uint32_t)(config->ccoRange)); + } /* if no error */ + + return (returnStatus); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_FllGetConfiguration +****************************************************************************//** +* +* Reports the FLL configuration settings. +* +* \param config \ref cy_stc_fll_manual_config_t +* +*******************************************************************************/ +void Cy_SysClk_FllGetConfiguration(cy_stc_fll_manual_config_t *config) +{ + /* read 2 parameters from CLK_FLL_CONFIG register */ + uint32_t tempReg = SRSS->CLK_FLL_CONFIG; + config->fllMult = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_MULT, tempReg); + config->enableOutputDiv = (bool)_FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV, tempReg); + /* read 2 parameters from CLK_FLL_CONFIG2 register */ + tempReg = SRSS->CLK_FLL_CONFIG2; + config->refDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV, tempReg); + config->lockTolerance = _FLD2VAL(SRSS_CLK_FLL_CONFIG2_LOCK_TOL, tempReg); + /* read 4 parameters from CLK_FLL_CONFIG3 register */ + tempReg = SRSS->CLK_FLL_CONFIG3; + config->igain = _FLD2VAL(SRSS_CLK_FLL_CONFIG3_FLL_LF_IGAIN, tempReg); + config->pgain = _FLD2VAL(SRSS_CLK_FLL_CONFIG3_FLL_LF_PGAIN, tempReg); + config->settlingCount = _FLD2VAL(SRSS_CLK_FLL_CONFIG3_SETTLING_COUNT, tempReg); + config->outputMode = (cy_en_fll_pll_output_mode_t)_FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, tempReg); + /* read 1 parameter from CLK_FLL_CONFIG4 register */ + config->ccoRange = (cy_en_fll_cco_ranges_t)_FLD2VAL(SRSS_CLK_FLL_CONFIG4_CCO_RANGE, SRSS->CLK_FLL_CONFIG4); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_FllEnable +****************************************************************************//** +* +* Enables the FLL. The FLL should be configured before calling this function. +* +* \param timeoutus amount of time in micro seconds to wait for FLL to lock. +* If lock doesn't occur, FLL is stopped. To avoid waiting for lock set this to 0, +* and manually check for lock using \ref Cy_SysClk_FllGetLockStatus. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - FLL successfully enabled
+* CY_SYSCLK_TIMEOUT - Timeout waiting for FLL lock +* +*******************************************************************************/ +uint32_t Cy_SysClk_FllEnable(uint32_t timeoutus) +{ + uint32_t rtnval; + bool nonZeroTimeout = (timeoutus != 0ul); + + /* first set the CCO enable bit */ + SRSS->CLK_FLL_CONFIG4 |= _VAL2FLD(SRSS_CLK_FLL_CONFIG4_CCO_ENABLE, 1ul); /* 1 = enable */ + + /* Wait until CCO is ready */ + for (; (_FLD2VAL(SRSS_CLK_FLL_STATUS_CCO_READY, SRSS->CLK_FLL_STATUS) == 0ul) && + (timeoutus != 0ul); + timeoutus--) + { + Cy_SysLib_DelayUs(1u); + } + + /* Set the FLL enable bit, if CCO is ready */ + if ((!nonZeroTimeout) || (nonZeroTimeout && (timeoutus != 0ul))) + { + SRSS->CLK_FLL_CONFIG |= _VAL2FLD(SRSS_CLK_FLL_CONFIG_FLL_ENABLE, 1ul); /* 1 = enable */ + } + + /* now do the timeout wait for FLL_STATUS, bit LOCKED */ + for (; (_FLD2VAL(SRSS_CLK_FLL_STATUS_LOCKED, SRSS->CLK_FLL_STATUS) == 0ul) && + (timeoutus != 0ul); + timeoutus--) + { + Cy_SysLib_DelayUs(1u); + } + + /* If lock doesn't occur, FLL is stopped. */ + if (nonZeroTimeout && (timeoutus == 0ul)) + { + Cy_SysClk_FllDisable(); + } + + rtnval = ((timeoutus == 0ul) ? CY_SYSCLK_TIMEOUT : CY_SYSCLK_SUCCESS); + return rtnval; +} + + +/* ========================================================================== */ +/* =========================== PLL SECTION ============================ */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_PllConfigure +****************************************************************************//** +* +* Configures a given PLL. +* The configuration formula used is: +* Fout = pll_clk * (P / Q / div_out), where: +* Fout is the desired output frequency +* pll_clk is the frequency of the input source +* P is the feedback divider. Its value is in bitfield FEEDBACK_DIV. +* Q is the reference divider. Its value is in bitfield REFERENCE_DIV. +* div_out is the reference divider. Its value is in bitfield OUTPUT_DIV. +* +* \param clkPath Selects which PLL to configure. 1 is the first PLL; 0 is invalid. +* +* \param inputFreq frequency of input source, in Hz; allowed range is 4 MHz to 64 MHz. +* +* \param outputFreq desired output frequency, in Hz; allowed range 1 MHz to 400 MHz, in 4-MHz steps. +* +* \param outputMode \ref cy_en_fll_pll_output_mode_t. If output mode is bypass, then +* the output frequency equals the input source frequency regardless of the +* frequency parameter values. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - PLL successfully configured
+* CY_SYSCLK_INVALID_STATE - PLL not configured because it is enabled
+* CY_SYSCLK_BAD_PARAM - invalid clock path number, or input or desired output frequency is out of valid range +* +* \note +* Do not call this function when the PLL is enabled. If it is, then this function +* returns immediately with an error return value and no register updates. +*******************************************************************************/ +uint32_t Cy_SysClk_PllConfigure(uint32_t clkPath, uint32_t inputFreq, uint32_t outputFreq, + cy_en_fll_pll_output_mode_t outputMode) +{ + uint32_t returnStatus = CY_SYSCLK_SUCCESS; + + /* check for error */ + if ((inputFreq < 4000000ul) || (64000000ul < inputFreq)) /* invalid input frequency */ + { + returnStatus = CY_SYSCLK_BAD_PARAM; + } + else if ((outputFreq < 1000000ul) || (400000000ul < outputFreq)) /* invalid output frequency */ + { + returnStatus = CY_SYSCLK_BAD_PARAM; + } + else if ((clkPath == 0ul) || (clkPath > SRSS_NUM_PLL)) /* invalid clock path number */ + { + returnStatus = CY_SYSCLK_BAD_PARAM; + } + else if (_FLD2VAL(SRSS_CLK_PLL_CONFIG_ENABLE, SRSS->CLK_PLL_CONFIG[clkPath - 1ul]) != 0u) /* 1 = enabled */ + { + returnStatus = CY_SYSCLK_INVALID_STATE; + } + else + { /* returnStatus is OK */ + } + + /* no errors */ + if (returnStatus == CY_SYSCLK_SUCCESS) + { + uint32_t pBest = 0ul, qBest = 0ul, outBest = 0ul; + + /* If output mode is bypass (input routed directly to output), then done. + The output frequency equals the input frequency regardless of the + frequency parameters. */ + if (outputMode != CY_SYSCLK_FLLPLL_OUTPUT_INPUT) + { + /* for each possible value of OUTPUT_DIV and REFERENCE_DIV (Q), try + to find a value for FEEDBACK_DIV (P) that gives an output frequency + as close as possible to the desired output frequency. */ + uint32_t p, q, out; + uint32_t foutBest = 0ul; /* to ensure at least one pass through the for loops below */ + + /* OUTPUT_DIV is 9 bits; range is 2 to 2^9 - 1 */ + for (out = 2ul; (out < 512ul) && (foutBest != outputFreq); out++) + { + /* REFERENCE_DIV (Q) is 5 bits; allowed range is 1 to 2^5 - 1 */ + for (q = 1ul; (q < 31ul) && (foutBest != outputFreq); q++) + { + /* calculate a test value for FEEDBACK_DIV (P) */ + p = CY_SYSCLK_DIV_ROUND(outputFreq * q * out, inputFreq); + /* FEEDBACK_DIV is 7 bits; allowed range is 1 to 50 */ + if ((1u <= p) && (p <= 50u)) + { + /* Calculate what output frequency will actually be produced. + If it's closer to the target than what we have so far, then + save it. */ + uint32_t fout = ((p * inputFreq) / q) / out; + if ((uint32_t)abs((int32_t)fout - (int32_t)outputFreq) < + (uint32_t)abs((int32_t)foutBest - (int32_t)outputFreq)) + { + foutBest = fout; + pBest = p; qBest = q; outBest = out; + } + } + /* exit loops if foutBest equals outputFreq */ + } + } + } /* if not bypass output mode */ + + /* configure PLL based on calculated values */ + returnStatus = Cy_SysClk_PllManualConfigure(clkPath, pBest, qBest, outBest, outputMode); + + } /* if no error */ + + return (returnStatus); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PllManualConfigure +****************************************************************************//** +* +* Manually configures a PLL based on user inputs. +* +* \param clkPath Selects which PLL to configure. 1 is the first PLL; 0 is invalid. +* +* \param feedbackDiv +* Sets the feedback divider for the selected PLL, valid range is 1 to 50 +* +* \param referenceDiv +* Sets reference divider of PLL, valid range is 1 to 31. (Input Frequency / +* reference divider must be in the range of 4 MHz to 8 MHz. +* +* \param outputDiv +* Sets the output divider, valid range is 1 to 255. To use the PLL as the source +* of an hf_clk this value must be 2 or greater. +* +* \param outputMode +* \ref cy_en_fll_pll_output_mode_t +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - PLL successfully configured
+* CY_SYSCLK_INVALID_STATE - PLL not configured because it is enabled
+* CY_SYSCLK_BAD_PARAM - invalid clock path number +* +* \note +* Do not call this function when the PLL is enabled. If it is, then this function +* returns immediately with an error return value and no register updates. +*******************************************************************************/ +uint32_t Cy_SysClk_PllManualConfigure(uint32_t clkPath, uint32_t feedbackDiv, uint32_t referenceDiv, + uint32_t outputDiv, cy_en_fll_pll_output_mode_t outputMode) +{ + uint32_t returnStatus = CY_SYSCLK_SUCCESS; + + /* check for error */ + if ((clkPath == 0ul) || (clkPath > SRSS_NUM_PLL)) /* invalid clock path number */ + { + returnStatus = CY_SYSCLK_BAD_PARAM; + } + else if (_FLD2VAL(SRSS_CLK_PLL_CONFIG_ENABLE, SRSS->CLK_PLL_CONFIG[clkPath - 1ul]) != 0u) /* 1 = enabled */ + { + returnStatus = CY_SYSCLK_INVALID_STATE; + } + else + { /* returnStatus is OK */ + } + + /* no errors */ + if (returnStatus == CY_SYSCLK_SUCCESS) + { + clkPath--; /* to correctly access PLL config registers structure */ + /* If output mode is bypass (input routed directly to output), then done. + The output frequency equals the input frequency regardless of the + frequency parameters. */ + if (outputMode != CY_SYSCLK_FLLPLL_OUTPUT_INPUT) + { + CY_SYSCLK_CLR_SET(SRSS->CLK_PLL_CONFIG[clkPath], SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV, feedbackDiv); + CY_SYSCLK_CLR_SET(SRSS->CLK_PLL_CONFIG[clkPath], SRSS_CLK_PLL_CONFIG_REFERENCE_DIV, referenceDiv); + CY_SYSCLK_CLR_SET(SRSS->CLK_PLL_CONFIG[clkPath], SRSS_CLK_PLL_CONFIG_OUTPUT_DIV, outputDiv); + } + + CY_SYSCLK_CLR_SET(SRSS->CLK_PLL_CONFIG[clkPath], SRSS_CLK_PLL_CONFIG_BYPASS_SEL, (uint32_t)outputMode); + } /* if no error */ + + return (returnStatus); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PllGetConfiguration +****************************************************************************//** +* +* Reports configuration settings for a PLL. +* +* \param clkPath Selects which PLL to report. 1 is the first PLL; 0 is invalid. +* +* \param feedbackDiv +* Pointer to storage for the feedback divider for the selected PLL. +* +* \param referenceDiv +* Pointer to storage for the reference divider for the selected PLL. +* +* \param outputDiv +* Pointer to storage for the output divider for the selected PLL. +* +* \param outputMode +* \ref cy_en_fll_pll_output_mode_t +* +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - PLL data successfully reported
+* CY_SYSCLK_BAD_PARAM - invalid clock path number +* +*******************************************************************************/ +uint32_t Cy_SysClk_PllGetConfiguration(uint32_t clkPath, uint32_t *feedbackDiv, uint32_t *referenceDiv, + uint32_t *outputDiv, cy_en_fll_pll_output_mode_t *outputMode) +{ + uint32_t rtnval = CY_SYSCLK_BAD_PARAM; + if ((clkPath != 0ul) && (clkPath <= SRSS_NUM_PLL)) + { + uint32_t tempReg = SRSS->CLK_PLL_CONFIG[clkPath - 1ul]; + *feedbackDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV, tempReg); + *referenceDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_REFERENCE_DIV, tempReg); + *outputDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_OUTPUT_DIV, tempReg); + *outputMode = (cy_en_fll_pll_output_mode_t)_FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, tempReg); + rtnval = CY_SYSCLK_SUCCESS; + } + return (rtnval); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PllEnable +****************************************************************************//** +* +* Enables the PLL. The PLL should be configured before calling this function. +* +* \param clkPath Selects which PLL to enable. 1 is the first PLL; 0 is invalid. +* +* \param timeoutus amount of time in microseconds to wait for the PLL to lock. +* If lock doesn't occur, PLL is stopped. To avoid waiting for lock set this to 0, +* and manually check for lock using \ref Cy_SysClk_PllGetLockStatus. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - PLL successfully enabled
+* CY_SYSCLK_TIMEOUT - Timeout waiting for PLL lock
+* CY_SYSCLK_BAD_PARAM - invalid clock path number +* +*******************************************************************************/ +uint32_t Cy_SysClk_PllEnable(uint32_t clkPath, uint32_t timeoutus) +{ + uint32_t rtnval = CY_SYSCLK_BAD_PARAM; + if ((clkPath != 0ul) && (clkPath <= SRSS_NUM_PLL)) + { + clkPath--; /* to correctly access PLL config and status registers structures */ + /* first set the PLL enable bit */ + SRSS->CLK_PLL_CONFIG[clkPath] |= _VAL2FLD(SRSS_CLK_PLL_CONFIG_ENABLE, 1ul); /* 1 = enable */ + + /* now do the timeout wait for PLL_STATUS, bit LOCKED */ + for (; (_FLD2VAL(SRSS_CLK_PLL_STATUS_LOCKED, SRSS->CLK_PLL_STATUS[clkPath]) == 0ul) && + (timeoutus != 0ul); + timeoutus--) + { + Cy_SysLib_DelayUs(1u); + } + rtnval = ((timeoutus == 0ul) ? CY_SYSCLK_TIMEOUT : CY_SYSCLK_SUCCESS); + } + return (rtnval); +} + + +/* ========================================================================== */ +/* ==================== Clock Measurement section ==================== */ +/* ========================================================================== */ + +/* Cy_SysClk_InitClkMeasurementCounters() input parameters saved for use later in other functions. */ +static uint32_t clk1FregHz; +static uint32_t clk1Count1; + +/******************************************************************************* +* Function Name: Cy_SysClk_InitClkMeasurementCounters +****************************************************************************//** +* +* Initializes clock measurement counters. +* Measurement counters allow you to measure one clock (clock2) versus another +* clock (clock1). This is done with two hardware counters. One counter (counter1), +* which is clocked off of clock1, is loaded with an initial value and it counts down. +* A second counter (counter2), which is clocked off of clock2, counts up until +* the first counter is done counting down. +* The frequency of clock2 can be determined with the following equation: +* clock2 frequency = (count2/count1) * clock1 frequency +* +* \param clock1 selects which clock is used as the measurement clock +* +* \param clock1FreqHz the frequency of clock1 in Hz +* +* \param count1 sets the initial value for count1 +* +* \param clock2 selects the clock that will be measured by clock1 +* +* \return Error / status code:
+* CY_SYSCLK_INVALID_STATE if already doing a measurement
+* CY_SYSCLK_BAD_PARAM if invalid clock input parameter
+* else CY_SYSCLK_SUCCESS +* +*******************************************************************************/ +uint32_t Cy_SysClk_InitClkMeasurementCounters(cy_en_meas_clks_t clock1, uint32_t clock1FreqHz, + uint32_t count1, cy_en_meas_clks_t clock2) +{ + uint32_t rtnval = CY_SYSCLK_INVALID_STATE; + if (_FLD2VAL(SRSS_CLK_CAL_CNT1_CAL_COUNTER_DONE, SRSS->CLK_CAL_CNT1) != 0ul/*1 = done*/) + { + /* if clock1 is a slow clock, + select it in SRSS_CLK_OUTPUT_SLOW.SLOW_SEL0, + select it in SRSS_CLK_OUTPUT_FAST.FAST_SEL0 = SLOW_SEL0 + else if clock1 is a fast clock, + select it in SRSS_CLK_OUTPUT_FAST.FAST_SEL0, + else error, do nothing and return. + + if clock2 is a slow clock, + select it in SRSS_CLK_OUTPUT_SLOW.SLOW_SEL1, + select it in SRSS_CLK_OUTPUT_FAST.FAST_SEL1 = SLOW_SEL1 + else if clock2 is a fast clock, + select it in SRSS_CLK_OUTPUT_FAST.FAST_SEL1, + else error, do nothing and return. + */ + rtnval = CY_SYSCLK_BAD_PARAM; + if ((clock1 < CY_SYSCLK_MEAS_CLK_LAST_CLK) && (clock2 < CY_SYSCLK_MEAS_CLK_LAST_CLK)) + { + if (clock1 < CY_SYSCLK_MEAS_CLK_FAST_CLKS) + { /* slow clock */ + SRSS->CLK_OUTPUT_SLOW = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_SLOW, SRSS_CLK_OUTPUT_SLOW_SLOW_SEL0, (uint32_t)clock1); + SRSS->CLK_OUTPUT_FAST = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_FAST, SRSS_CLK_OUTPUT_FAST_FAST_SEL0, 7ul/*slow_sel0 output*/); + } /* clock1 slow clock */ + else + { /* fast clock */ + if (clock1 < CY_SYSCLK_MEAS_CLK_PATH_CLKS) + { /* ECO, EXT, ALTHF */ + SRSS->CLK_OUTPUT_FAST = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_FAST, SRSS_CLK_OUTPUT_FAST_FAST_SEL0, (uint32_t)clock1); + } + else + { /* PATH or HFCLK */ + SRSS->CLK_OUTPUT_FAST = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_FAST, SRSS_CLK_OUTPUT_FAST_FAST_SEL0, + (((uint32_t)clock1 >> 8) & 0x0Ful) /*use enum bits [11:8]*/); + if (clock1 < CY_SYSCLK_MEAS_CLK_HF_CLKS) + { /* PATH select */ + SRSS->CLK_OUTPUT_FAST = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_FAST, SRSS_CLK_OUTPUT_FAST_PATH_SEL0, + ((uint32_t)clock1 & 0x0Ful) /*use enum bits [3:0]*/); + } + else + { /* HFCLK select */ + SRSS->CLK_OUTPUT_FAST = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_FAST, SRSS_CLK_OUTPUT_FAST_HFCLK_SEL0, + ((uint32_t)clock1 & 0x0Ful) /*use enum bits [3:0]*/); + } + } + } /* clock1 fast clock */ + + if (clock2 < CY_SYSCLK_MEAS_CLK_FAST_CLKS) + { /* slow clock */ + SRSS->CLK_OUTPUT_SLOW = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_SLOW, SRSS_CLK_OUTPUT_SLOW_SLOW_SEL1, (uint32_t)clock2); + SRSS->CLK_OUTPUT_FAST = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_FAST, SRSS_CLK_OUTPUT_FAST_FAST_SEL1, 7ul/*slow_sel1 output*/); + } /* clock2 slow clock */ + else + { /* fast clock */ + if (clock2 < CY_SYSCLK_MEAS_CLK_PATH_CLKS) + { /* ECO, EXT, ALTHF */ + SRSS->CLK_OUTPUT_FAST = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_FAST, SRSS_CLK_OUTPUT_FAST_FAST_SEL1, (uint32_t)clock2); + } + else + { /* PATH or HFCLK */ + SRSS->CLK_OUTPUT_FAST = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_FAST, SRSS_CLK_OUTPUT_FAST_FAST_SEL1, + (((uint32_t)clock2 >> 8) & 0x0Ful) /*use enum bits [11:8]*/); + if (clock2 < CY_SYSCLK_MEAS_CLK_HF_CLKS) + { /* PATH select */ + SRSS->CLK_OUTPUT_FAST = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_FAST, SRSS_CLK_OUTPUT_FAST_PATH_SEL1, + ((uint32_t)clock2 & 0x0Ful) /*use enum bits [3:0]*/); + } + else + { /* HFCLK select */ + SRSS->CLK_OUTPUT_FAST = _CLR_SET_FLD32U(SRSS->CLK_OUTPUT_FAST, SRSS_CLK_OUTPUT_FAST_HFCLK_SEL1, + ((uint32_t)clock2 & 0x0Ful) /*use enum bits [3:0]*/); + } + } + } /* clock2 fast clock */ + + /* Save the remaining input parameters for use later, in other functions. + No error checking is done on these parameters.*/ + clk1FregHz = clock1FreqHz; + clk1Count1 = count1; + + rtnval = CY_SYSCLK_SUCCESS; + } /* if (clock1 < CY_SYSCLK_MEAS_CLK_LAST_CLK && clock2 < CY_SYSCLK_MEAS_CLK_LAST_CLK) */ + } /* if (not done) */ + return (rtnval); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_StartClkMeasurementCounters +****************************************************************************//** +* +* Starts the calibration counters. +* +* \return Error / status code:
+* CY_SYSCLK_INVALID_STATE if already doing a measurement
+* else CY_SYSCLK_SUCCESS +* +* \note Cy_SysClk_InitClkMeasurementCounters() must have been called previously. +*******************************************************************************/ +uint32_t Cy_SysClk_StartClkMeasurementCounters(void) +{ + uint32_t rtnval = CY_SYSCLK_INVALID_STATE; + if (_FLD2VAL(SRSS_CLK_CAL_CNT1_CAL_COUNTER_DONE, SRSS->CLK_CAL_CNT1) != 0ul/*1 = done*/) + { + /* Counting starts when this register is written with a nonzero value. */ + SRSS->CLK_CAL_CNT1 = clk1Count1; + rtnval = CY_SYSCLK_SUCCESS; + } + return (rtnval); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkMeasurementCountersGetClock2Freq +****************************************************************************//** +* +* Returns the frequency of clock 2 in Hz. The following equation is used: +* clock2 frequency = (count2/count1) * clock1 frequency +* +* \return Frequency of clock 2 in Hz +* +* \note This must only be called if the counters are done. +*******************************************************************************/ +uint32_t Cy_SysClk_ClkMeasurementCountersGetClock2Freq(void) +{ + return (uint32_t) + CY_SYSCLK_DIV_ROUND((uint64_t)_FLD2VAL(SRSS_CLK_CAL_CNT2_CAL_COUNTER2, SRSS->CLK_CAL_CNT2) * clk1FregHz, clk1Count1); +} + +/* ========================================================================== */ +/* ========================== TRIM SECTION ============================ */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_IloTrim +****************************************************************************//** +* +* Trims the ILO to be as close to 32,768 Hz as possible. The clock measurement +* counters should be used to obtain the current frequency of the ILO. This +* frequency should then be passed into this function. This function will then +* use this information to trim the ILO as close as possible to 32,768 Hz. +* +* \param iloFreq current ILO frequency as measured by the measurement counters +* +* \return The achieved ILO frequency in Hz +* +* \note The watchdog timer (WDT) must be unlocked before calling this function. +*******************************************************************************/ +/* target frequency */ +#define CY_SYSCLK_ILO_TARGET_FREQ 32768u + +uint32_t Cy_SysClk_IloTrim(uint32_t iloFreq) +{ + /* Nominal trim step size is 1.5% of "the frequency". Using the target frequency. */ + const uint32_t trimStep = CY_SYSCLK_DIV_ROUND((uint32_t)CY_SYSCLK_ILO_TARGET_FREQ * 15ul, 1000ul); + /* Get the current trim value, and adjust it up or down the appropriate + number of steps. Calculate the new frequency. */ + uint32_t newTrim; + uint32_t newFreq; + uint32_t curTrim = _FLD2VAL(SRSS_CLK_TRIM_ILO_CTL_ILO_FTRIM, SRSS->CLK_TRIM_ILO_CTL); + if (iloFreq > CY_SYSCLK_ILO_TARGET_FREQ) + { /* reduce the trim value; calculate new frequency */ + newTrim = curTrim - CY_SYSCLK_DIV_ROUND(iloFreq - CY_SYSCLK_ILO_TARGET_FREQ, trimStep); + newFreq = iloFreq - (trimStep * (curTrim - newTrim)); + } + else + { /* iloFreq too low. Increase the trim value; calculate new frequency. */ + newTrim = curTrim + CY_SYSCLK_DIV_ROUND(CY_SYSCLK_ILO_TARGET_FREQ - iloFreq, trimStep); + newFreq = iloFreq + (trimStep * (newTrim - curTrim)); + } + + /* Update the trim value */ + CY_SYSCLK_CLR_SET(SRSS->CLK_TRIM_ILO_CTL, SRSS_CLK_TRIM_ILO_CTL_ILO_FTRIM, newTrim); + + return newFreq; +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PiloTrim +****************************************************************************//** +* +* Trims the PILO to be as close to 32,768 Hz as possible. The clock measurement +* counters should be used to obtain the current frequency of the PILO. This +* frequency should then be passed into this function. This function will then +* use this information to trim the PILO as close as possible to 32,768Hz. +* +* \param piloFreq current PILO frequency as measured by the measurement counters +* +* \return The achieved PILO frequency in Hz +* +*******************************************************************************/ +/* target frequency */ +#define CY_SYSCLK_PILO_TARGET_FREQ 32768u +/* nominal trim step size */ +#define CY_SYSCLK_PILO_TRIM_STEP 1000u + +uint32_t Cy_SysClk_PiloTrim(uint32_t piloFreq) +{ + /* Get the current trim value, and adjust it up or down the appropriate + number of steps. Calculate the new frequency. */ + uint32_t newTrim; + uint32_t newFreq; + uint32_t curTrim = _FLD2VAL(SRSS_CLK_TRIM_PILO_CTL_PILO_CFREQ, SRSS->CLK_TRIM_PILO_CTL); + if (piloFreq > CY_SYSCLK_PILO_TARGET_FREQ) + { /* reduce the trim value; calculate new frequency */ + newTrim = curTrim - CY_SYSCLK_DIV_ROUND(piloFreq - CY_SYSCLK_PILO_TARGET_FREQ, CY_SYSCLK_PILO_TRIM_STEP); + newFreq = piloFreq - (CY_SYSCLK_PILO_TRIM_STEP * (curTrim - newTrim)); + } + else + { /* piloFreq too low. Increase the trim value; calculate new frequency. */ + newTrim = curTrim + CY_SYSCLK_DIV_ROUND(CY_SYSCLK_PILO_TARGET_FREQ - piloFreq, CY_SYSCLK_PILO_TRIM_STEP); + newFreq = piloFreq + (CY_SYSCLK_PILO_TRIM_STEP * (newTrim - curTrim)); + } + + /* Update the trim value */ + CY_SYSCLK_CLR_SET(SRSS->CLK_TRIM_PILO_CTL, SRSS_CLK_TRIM_PILO_CTL_PILO_CFREQ, newTrim); + + return newFreq; +} + +/* ========================================================================== */ +/* =========================== WCO SECTION ============================ */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_WcoConfigureCsv +****************************************************************************//** +* +* Configure the WCO clock supervisor (CSV). +* +* \param config \ref cy_stc_wco_csv_config_t +* +* \note +* If loss detection is enabled, writes to other register bits are ignored. +* Therefore loss detection is disabled before writing the config structure +* members to the CTL register. Note that one of the config structure members is +* an enable bit. +*******************************************************************************/ +void Cy_SysClk_WcoConfigureCsv(const cy_stc_wco_csv_config_t *config) +{ + #if SRSS_WCOCSV_PRESENT != 0 + /* First clear all bits, including the enable bit; disable loss detection. */ + SRSS->CLK_CSV_WCO_CTL = 0ul; + /* Then write the structure elements (which include an enable bit) to the register. */ + SRSS->CLK_CSV_WCO_CTL = _VAL2FLD(SRSS_CLK_CSV_WCO_CTL_CSV_MUX, (uint32_t)config->SupervisorClock) | + _VAL2FLD(SRSS_CLK_CSV_WCO_CTL_CSV_LOSS_WINDOW, (uint32_t)(config->LossWindow)) | + _VAL2FLD(SRSS_CLK_CSV_WCO_CTL_CSV_LOSS_ACTION, (uint32_t)(config->LossAction)) | + _VAL2FLD(SRSS_CLK_CSV_WCO_CTL_CSV_LOSS_EN, config->enableLossDetection); + #endif /* SRSS_WCOCSV_PRESENT != 0 */ +} + + +/* ========================================================================== */ +/* ======================== clk_hf[n] SECTION ========================= */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_HfClockConfigureCsv +****************************************************************************//** +* +* Configures the ClkHf clock supervisor (CSV). +* +* \param hfClk selects which ClkHf CSV to configure. +* +* \param config \ref cy_stc_hf_csv_config_t +* +* \note +* If loss detection is enabled, writes to other register bits are ignored. +* Therefore loss detection is disabled before writing the config structure +* members to the CTL register. Note that one of the config structure members is +* an enable bit. +*******************************************************************************/ +void Cy_SysClk_HfClockConfigureCsv(uint32_t hfClk, const cy_stc_hf_csv_config_t *config) +{ + #if SRSS_MASK_HFCSV != 0 + /* First update the limit bits; this can be done regardless of enable state. */ + SRSS->CLK_CSV[hfClk].HF_LIMIT = _VAL2FLD(CLK_CSV_HF_LIMIT_UPPER_LIMIT, config->FrequencyUpperLimit) | + _VAL2FLD(CLK_CSV_HF_LIMIT_LOWER_LIMIT, config->FrequencyLowerLimit); + /* Then clear all CTL register bits, including the enable bit; disable loss detection. */ + SRSS->CLK_CSV[hfClk].HF_CTL = 0ul; + /* Finally, write the structure elements (which include an enable bit) to the CTL register. */ + SRSS->CLK_CSV[hfClk].HF_CTL = _VAL2FLD(CLK_CSV_HF_CTL_CSV_LOSS_EN, config->enableLossDetection) | + _VAL2FLD(CLK_CSV_HF_CTL_CSV_LOSS_ACTION, (uint32_t)(config->LossAction)) | + _VAL2FLD(CLK_CSV_HF_CTL_CSV_FREQ_EN, config->enableFrquencyFaultDetection) | + _VAL2FLD(CLK_CSV_HF_CTL_CSV_FREQ_ACTION, (uint32_t)(config->FrequencyAction)) | + _VAL2FLD(CLK_CSV_HF_CTL_CSV_LOSS_WINDOW, (uint32_t)(config->LossWindow)) | + _VAL2FLD(CLK_CSV_HF_CTL_CSV_MUX, (uint32_t)(config->SupervisorClock)) | + _VAL2FLD(CLK_CSV_HF_CTL_CSV_FREQ_WINDOW, config->SupervisingWindow); + #endif /* SRSS_MASK_HFCSV != 0 */ +} + +/* ========================================================================== */ +/* ======================== clk_peri SECTION ========================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphGetFrequency +****************************************************************************//** +* +* Reports the frequency of the output of a given peripheral divider. +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t +* +* \param dividerNum specifies which divider of the selected type to configure +* +* \return The frequency, in Hz +* +* \note +* The reported frequency may be zero, which indicates unknown. This happens if +* the source input is clk_ext, ECO, clk_althf, dsi_out, or clk_altlf. +* +*******************************************************************************/ +uint32_t Cy_SysClk_PeriphGetFrequency(cy_en_divider_types_t dividerType, uint32_t dividerNum) +{ + uint32_t rtnval = 0ul; /* 0 = unknown frequency */ + + /* FLL or PLL configuration parameters */ + union + { + cy_stc_fll_manual_config_t fll; + struct + { + uint32_t feedbackDiv; + uint32_t referenceDiv; + uint32_t outputDiv; + } pll; + } fllpll = {0ul}; + + /* variables holding intermediate clock sources and dividers */ + cy_en_fll_pll_output_mode_t mode = CY_SYSCLK_FLLPLL_OUTPUT_AUTO; /* FLL or PLL mode; n/a for direct */ + uint32_t locked = 0ul; /* FLL or PLL lock status; n/a for direct */ + cy_en_clkpath_in_sources_t source; /* source input for path (FLL, PLL, or direct) */ + uint32_t source_freq; /* source clock frequency, in Hz */ + cy_en_hf_clk_sources_t path; /* source input for root 0 (clk_hf[0]) */ + uint32_t path_freq = 0ul; /* path (FLL, PLL, or direct) frequency, in Hz */ + uint32_t root_div; /* root prescaler (1/2/4/8) */ + uint32_t clk_hf0_div; /* clk_hf[0] predivider to clk_peri */ + + /* clk_peri divider to selected peripheral clock */ + struct + { + uint32_t integer; + uint32_t frac; + } clkdiv = {0ul, 0ul}; + + /* Start by finding the source input for root 0 (clk_hf[0]) */ + path = Cy_SysClk_HfClockGetSource(0ul); + + if (path == CY_SYSCLK_HFCLK_IN_CLKPATH0) /* FLL? (always path #0) */ + { + Cy_SysClk_FllGetConfiguration(&fllpll.fll); + source = Cy_SysClk_ClkPathGetSource(0ul); + mode = fllpll.fll.outputMode; + locked = Cy_SysClk_FllGetLockStatus(); + } + else if ((uint32_t)path <= (uint32_t)SRSS_NUM_PLL) /* PLL? (always path #1 - N)*/ + { + (void)Cy_SysClk_PllGetConfiguration((uint32_t)path, &fllpll.pll.feedbackDiv, &fllpll.pll.referenceDiv, + &fllpll.pll.outputDiv, &mode); + source = Cy_SysClk_ClkPathGetSource((uint32_t)path); + locked = Cy_SysClk_PllGetLockStatus((uint32_t)path); + } + else /* assume clk_path < SRSS_NUM_CLKPATH */ + { /* Direct select path. Use PLL function to get the source. */ + source = Cy_SysClk_ClkPathGetSource((uint32_t)path); + } + + /* get the frequency of the source, i.e., the path mux input */ + switch(source) + { + case CY_SYSCLK_CLKPATH_IN_IMO: /* IMO frequency is fixed at 8 MHz */ + source_freq = 8000000ul; /*Hz*/ + break; + case CY_SYSCLK_CLKPATH_IN_ILO: /* ILO and WCO frequencies are nominally 32.768 kHz */ + case CY_SYSCLK_CLKPATH_IN_WCO: + source_freq = 32768ul; /*Hz*/ + break; + default: + /* don't know the frequency of clk_ext, ECO, clk_althf, dsi_out, or clk_altlf */ + source_freq = 0ul; /* unknown frequency */ + break; + } + if (source_freq != 0ul) + { + /* Calculate the path frequency */ + if (path == CY_SYSCLK_HFCLK_IN_CLKPATH0) /* FLL? (always path #0) */ + { + path_freq = source_freq; /* for bypass mode */ + /* if not bypass mode, apply the dividers calculation */ + if ((mode == CY_SYSCLK_FLLPLL_OUTPUT_OUTPUT) || ((mode != CY_SYSCLK_FLLPLL_OUTPUT_INPUT) && (locked != 0ul))) + { + /* Ffll_out = Ffll_clk * FLL_MULT / FLL_REF_DIV / (FLL_OUTPUT_DIV + 1), where: + * FLL_MULT, REFERENCE_DIV, and OUTPUT_DIV are FLL configuration register bitfields + * Check for possible divide by 0. + */ + if (fllpll.fll.refDiv != 0ul) + { + path_freq = (uint32_t)(((uint64_t)path_freq * (uint64_t)fllpll.fll.fllMult) / + (uint64_t)fllpll.fll.refDiv) / + ((uint32_t)(fllpll.fll.enableOutputDiv) + 1ul); + } + else + { + path_freq = 0ul; /* error, one of the divisors is 0 */ + } + } + } + else if ((uint32_t)path <= (uint32_t)SRSS_NUM_PLL) /* PLL? (always path #1 - N)*/ + { + path_freq = source_freq; /* for bypass mode */ + /* if not bypass mode, apply the dividers calculation */ + if ((mode == CY_SYSCLK_FLLPLL_OUTPUT_OUTPUT) || ((mode != CY_SYSCLK_FLLPLL_OUTPUT_INPUT) && (locked != 0ul))) + { + /* Fpll_out = Fpll_clk * FEEDBACK_DIV / REFERENCE_DIV / OUTPUT_DIV, where: + * FEEDBACK_DIV, REFERENCE_DIV, and OUTPUT_DIV are PLL configuration register bitfields + * Check for possible divide by 0. + */ + if ((fllpll.pll.referenceDiv != 0ul) && (fllpll.pll.outputDiv != 0ul)) + { + path_freq = (uint32_t)(((uint64_t)source_freq * (uint64_t)fllpll.pll.feedbackDiv) / + (uint64_t)fllpll.pll.referenceDiv) / + (uint32_t)fllpll.pll.outputDiv; + } + else + { + path_freq = 0ul; /* error, one of the divisors is 0 */ + } + } + } + else /* assume clk_path < SRSS_NUM_CLKPATH */ + { /* direct select path */ + path_freq = source_freq; + } + + /* get the prescaler value for root 0, or clk_hf[0]: 1/2/4/8 */ + root_div = 1ul << (uint32_t)Cy_SysClk_HfClockGetDivider(0ul); + + /* get the predivider value for clk_hf[0] to clk_peri */ + clk_hf0_div = (uint32_t)Cy_SysClk_PeriClkGetDivider() + 1ul; + + /* get the divider value for clk_peri to the selected peripheral clock */ + switch(dividerType) + { + case CY_SYSCLK_DIV_8_BIT: + case CY_SYSCLK_DIV_16_BIT: + clkdiv.integer = (uint32_t)Cy_SysClk_PeriphGetDivider(dividerType, dividerNum); + /* frac = 0 means it's an integer divider */ + break; + case CY_SYSCLK_DIV_16_5_BIT: + case CY_SYSCLK_DIV_24_5_BIT: + (void)Cy_SysClk_PeriphGetFracDivider(dividerType, dividerNum, &clkdiv.integer, &clkdiv.frac); + break; + default: + break; + } + /* Divide the path input frequency down, and return the result. + Stepping through the following code shows the frequency at each stage. + */ + rtnval = path_freq / root_div; /* clk_hf[0] frequency */ + rtnval /= clk_hf0_div; /* clk_peri frequency */ + /* For fractional dividers, the divider is (int + 1) + frac/32. + * Use the fractional value to round the divider to the nearest integer. + */ + rtnval /= (clkdiv.integer + 1ul + ((clkdiv.frac >= 16ul) ? 1ul : 0ul)); /* peripheral divider output frequency */ + } + + return rtnval; +} + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysclk/cy_sysclk.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysclk/cy_sysclk.h new file mode 100644 index 0000000000..b05df13f73 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysclk/cy_sysclk.h @@ -0,0 +1,2165 @@ +/***************************************************************************//** +* \file cy_sysclk.h +* \version 1.0 +* +* Provides an API declaration of the sysclk driver. +* +******************************************************************************** +* \copyright +* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_sysclk System Clock (SysClk) +* \{ +* The sysclk driver contains an API for configuring system and peripheral clocks. +* Most of the sysclk driver API functions are simple wrappers for writing to registers +* to configure or manage a particular clock. +* +* In the API reference for this driver each clock has its own section, so all the +* information to manage that clock is in the same place. +* +* \section group_sysclk_configuration Configuration Considerations +* +* \warning When the device is in the Ultra-Low Power (ULP) mode, the maximum frequency of all the clocks is limited to +* the 50 MHz with the exception for the slow clock which is limited to 25 MHz. +* +* There are no general sysclk configuration concerns. Some clocks (for example the PLL) require configuration. +* For such a clock the API provides a configuration structure and a Configure() function to set up the clock. +* See notes on individual function definitions. +* +* \section group_sysclk_more_information More Information +* +* See the Clock Component datasheet. +* See also the sysclk chapter of the device technical reference manual (TRM). +* +* \section group_sysclk_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
1.2RNo reliance on undefined behavior.Calculation of absolute value in FLL and PLL configure.
10.1RThe value of an expression of integer type shall not be implicitly converted to a different, underlying type if the expression is complex.Using a Cypress defined macro to access memory mapped objects. +* Using a Cypress defined macro to divide with rounding.
10.3RA composite integer expression is being cast to a wider type.Using a Cypress defined macro to access memory mapped objects. Calculating clock parameters.
10.4RA composite floating point expression is being cast to double, or unsigned.Using the C library sqrt() function. Casting a floating point calculation result to an integer.
10.5RThe value of an expression of integer type shall not be implicitly converted to a different, underlying type if the expression is complex.Using a Cypress defined macro to access memory mapped objects.
12.1AExtra parentheses recommended.Ternary operator uses constants; extra parentheses not needed.
13.4RThe controlling expression of a for statement shall not contain any objects of floating type.Scanning through a list of floating point values.
18.4RUnions shall not be used.Clock path in \ref Cy_SysClk_PeriphGetFrequency() may use either FLL or PLL.
19.7AA function shall be used in preference to a function-like macro.Function-like macros are used to achieve more efficient code.
+* +* \section group_sysclk_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_sysclk_macro Macros +* \{ +* \defgroup group_sysclk_macro_return Function return values +* \} +* \defgroup group_sysclk_imo Internal Main Oscillator (IMO) +* \defgroup group_sysclk_eco External Crystal Oscillator (ECO) +* \defgroup group_sysclk_muxes Input Multiplexers +* \defgroup group_sysclk_fll Frequency Locked Loop (FLL) +* \defgroup group_sysclk_pll Phase Locked Loop (PLL) +* \defgroup group_sysclk_ilo Internal Low-Speed Oscillator (ILO) +* \defgroup group_sysclk_pilo Precision Internal Low-Speed Oscillator (PILO) +* \defgroup group_sysclk_calclk Clock Measurement +* \defgroup group_sysclk_trim Clock Trim +* \defgroup group_sysclk_wco Watch Crystal Oscillator (WCO) +* \defgroup group_sysclk_clk_hf High-Frequency Clocks +* \defgroup group_sysclk_clk_fast Fast Clock +* \defgroup group_sysclk_clk_peripheral Peripherals Clocks +* \defgroup group_sysclk_clk_slow Slow Clock +* \defgroup group_sysclk_clk_lf Low-Frequency Clock +* \defgroup group_sysclk_clk_timer Timer Clock +* \defgroup group_sysclk_clk_pump Pump Clock +* \defgroup group_sysclk_clk_bak Backup Domain Clock +*/ + +#if !defined(__CY_SYSCLK_H__) +#define __CY_SYSCLK_H__ + +#include "cy_device_headers.h" +#include "syslib/cy_syslib.h" +#include + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/** +* \addtogroup group_sysclk_macro +* \{ +*/ + +/** Driver major version */ +#define CY_SYSCLK_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_SYSCLK_DRV_VERSION_MINOR 0 + +/** +* \addtogroup group_sysclk_returns +* \{ +* Specifies return values meaning +*/ +/** Command completed with no errors */ +#define CY_SYSCLK_SUCCESS 0ul +/** Invalid function input parameter */ +#define CY_SYSCLK_BAD_PARAM 1ul +/** Status of calibration counters: STARTED */ +#define CY_SYSCLK_STARTED 7ul +/** Status of calibration counters: FINISHED */ +#define CY_SYSCLK_FINISHED 8ul +/** Timeout occurred */ +#define CY_SYSCLK_TIMEOUT 0x10ul +/** Clock is in an invalid state */ +#define CY_SYSCLK_INVALID_STATE 0x11ul +/** \} group_sysclk_returns */ +/** \} group_sysclk_macro */ + +/** \cond INTERNAL */ +/* Generates shorter code for setting register bitfields */ +#define CY_SYSCLK_CLR_SET(reg, field, value) (reg) = _CLR_SET_FLD32U((reg), field, value) +/* Calculate a / b with rounding to the nearest integer. a and b must have the same sign. */ +#define CY_SYSCLK_DIV_ROUND(a, b) (((a) + ((b) / 2u)) / (b)) +/* Calculate a / b with rounding up if remainder != 0. a and b must both be positive. */ +#define CY_SYSCLK_DIV_ROUNDUP(a, b) ((((a) - 1u) / (b)) + 1u) +/** \endcond */ + +/** +* \addtogroup group_sysclk_imo +* \{ +*/ + +/* ========================================================================== */ +/* =========================== IMO SECTION ============================ */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_ImoEnable +****************************************************************************//** +* +* Enables the internal main oscillator (IMO). +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ImoEnable(void) +{ + SRSS->CLK_IMO_CONFIG |= _VAL2FLD(SRSS_CLK_IMO_CONFIG_ENABLE, 1u); /* 1 = enable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ImoDisable +****************************************************************************//** +* +* Disables the internal main oscillator (IMO). +* +* \note +* If the IMO is the source of hf_clk[0] then disabling the IMO disables the CPU. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ImoDisable(void) +{ + SRSS->CLK_IMO_CONFIG &= ~_VAL2FLD(SRSS_CLK_IMO_CONFIG_ENABLE, 1u); /* 0 = disable */ +} +/** \} group_sysclk_imo */ + + +/** +* \addtogroup group_sysclk_eco +* \{ +*/ + +/* ========================================================================== */ +/* =========================== ECO SECTION ============================ */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_EcoConfigure +****************************************************************************//** +* +* This function configures the external crystal oscillator (ECO) trim bits based +* on crystal characteristics. This function should be called only when the ECO is +* disabled. +* +* \param freq Operating frequency of the crystal in Hz. +* +* \param cLoad Crystal load capacitance in pF. +* +* \param esr Effective series resistance of the crystal in ohms. +* +* \param driveLevel Crystal drive level in uW. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - ECO configuration completed successfully
+* CY_SYSCLK_BAD_PARAM - One or more invalid parameters
+* CY_SYSCLK_INVALID_STATE - ECO already enabled +* +* \note +* The following calculations are implemented, generally in floating point: +* freqMHz = freq / 1,000,000 +* max amplitude Vpp = 1,000 * sqrt(drivelevel / 2 / esr) / 3.14 / freqMHz / cLoad +* gm_min mA/V = 5 * 4 * 3.14 * 3.14 * freqMhz^2 * cLoad^2 * 4 * esr / 1,000,000,000 +* # amplifier sections = INT(gm_min / 4.5) +* atrim = if max amplitude < 0.5 then error +* else 2 * the following: +* max amplitude < 0.6: 0 +* max amplitude < 0.7: 1 +* max amplitude < 0.8: 2 +* max amplitude < 0.9: 3 +* max amplitude < 1.15: 5 +* max amplitude < 1.275: 6 +* max amplitude >= 1.275: 7 +* wdtrim = if max amplitude < 0.5 then error +* else 2 * the following: +* max amplitude < 1.2: INT(5 * max amplitude) - 2 +* max amplitude >= 1.2: 3 +* gtrim = if # amplifier sections > 3 then error +* else the following: +* # amplifier sections > 1: # amplifier sections +* # amplifier sections = 1: 0 +* # amplifier sections < 1: 1 +* rtrim = if gtrim = error then error +* else the following: +* freqMHz > 26.8: 0 +* freqMHz > 23.33: 1 +* freqMHz > 16.5: 2 +* freqMHz <= 16.5: 3 +* ftrim = if atrim = error then error +* else INT(atrim / 2) +* +* \note +* This function returns immediately if the ECO is enabled. +*******************************************************************************/ +uint32_t Cy_SysClk_EcoConfigure(uint32_t freq, uint32_t cLoad, uint32_t esr, uint32_t driveLevel); + +/******************************************************************************* +* Function Name: Cy_SysClk_EcoEnable +****************************************************************************//** +* +* Enables the external crystal oscillator (ECO). This function should be called +* after \ref Cy_SysClk_EcoConfigure. +* +* \param timeoutus Amount of time in microseconds to wait for the ECO to lock. +* If a lock does not occur, the ECO is stopped. To avoid waiting for a lock, set +* this parameter to 0. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - ECO successfully enabled
+* CY_SYSCLK_TIMEOUT - Timeout waiting for ECO lock +* +*******************************************************************************/ +uint32_t Cy_SysClk_EcoEnable(uint32_t timeoutus); + +/******************************************************************************* +* Function Name: Cy_SysClk_EcoDisable +****************************************************************************//** +* +* Disables the external crystal oscillator (ECO). This function should not be +* called if the ECO is sourcing clk_hf[0]. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_EcoDisable(void) +{ + SRSS->CLK_ECO_CONFIG &= ~_VAL2FLD(SRSS_CLK_ECO_CONFIG_ECO_EN, 1u); /* 0 = disable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_EcoGetStatus +****************************************************************************//** +* +* Reports the current status of the external crystal oscillator (ECO). +* +* \return +* 0 = ECO does not have sufficient amplitude
+* 1 = ECO has sufficient amplitude but may not be meeting accuracy and duty cycle specifications
+* 2 = ECO has fully stabilized +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_EcoGetStatus(void) +{ + uint32_t retval = (SRSS->CLK_ECO_STATUS & 3ul); /* bit 0 = ECO_OK, bit 1 = ECO_READY */ + /* if ECO is not ready, just report the ECO_OK bit. Otherwise report 2 = ECO ready */ + return (((retval & 2ul) == 0) ? retval : 2ul); +} +/** \} group_sysclk_eco */ + + +/** +* \addtogroup group_sysclk_muxes +* \{ +*/ + +/* ========================================================================== */ +/* ==================== INPUT MULTIPLEXER SECTION ===================== */ +/* ========================================================================== */ +/** +* Configures two multiplexers: a DSI multiplexer and a path multiplexer. The +* outputs of these multiplexers generally drive the FLL and the PLLs. See +* CLK_DSI_SELECT registers, DSI_MUX bits, and CLK_PATH_SELECT registers, +* PATH_MUX bits. Used with functions \ref Cy_SysClk_ClkPathSetSource and +* \ref Cy_SysClk_ClkPathGetSource. +* +* \note +* Each path multiplexer output is a source for the corresponding FLL/PLL input +* source multiplexer. +* +* \note The PDL driver cannot use the DSI outputs as sources. This must be done +* through DSI configuration using PSoC Creator. +*/ +typedef enum +{ + CY_SYSCLK_CLKPATH_IN_IMO = 0u, /**< Select the IMO as the output of the path mux */ + CY_SYSCLK_CLKPATH_IN_EXT = 1u, /**< Select the EXT as the output of the path mux */ + CY_SYSCLK_CLKPATH_IN_ECO = 2u, /**< Select the ECO as the output of the path mux */ + CY_SYSCLK_CLKPATH_IN_ALTHF = 3u, /**< Select the ALTHF as the output of the path mux */ + CY_SYSCLK_CLKPATH_IN_DSIMUX = 4u, /**< Select the DSI MUX output as the output of the path mux */ + CY_SYSCLK_CLKPATH_IN_DSI = 0x100u, /**< Select a DSI signal (0 - 15) as the output of the DSI mux and path mux */ + CY_SYSCLK_CLKPATH_IN_ILO = 0x110u, /**< Select the ILO (16) as the output of the DSI mux and path mux */ + CY_SYSCLK_CLKPATH_IN_WCO = 0x111u, /**< Select the WCO (17) as the output of the DSI mux and path mux */ + CY_SYSCLK_CLKPATH_IN_ALTLF = 0x112u, /**< Select the ALTLF (18) as the output of the DSI mux and path mux */ + CY_SYSCLK_CLKPATH_IN_PILO = 0x113u /**< Select the PILO (19) as the output of the DSI mux and path mux */ +} cy_en_clkpath_in_sources_t; + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkPathSetSource +****************************************************************************//** +* +* Configures the source for the specified clock path. +* +* \param clkPath Selects which clock path to configure; 0 is the first clock +* path, which is the FLL. +* +* \param source \ref cy_en_clkpath_in_sources_t +* +*******************************************************************************/ +void Cy_SysClk_ClkPathSetSource(uint32_t clkPath, cy_en_clkpath_in_sources_t source); + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkPathGetSource +****************************************************************************//** +* +* Reports which source is selected for the path mux. +* +* \param clkPath Selects which clock path to report; 0 is the first clock path, +* which is the FLL. +* +* \return \ref cy_en_clkpath_in_sources_t +* +*******************************************************************************/ +cy_en_clkpath_in_sources_t Cy_SysClk_ClkPathGetSource(uint32_t clkPath); +/** \} group_sysclk_muxes */ + + +/** +* \addtogroup group_sysclk_fll +* \{ +*/ + +/* ========================================================================== */ +/* =========================== FLL SECTION ============================ */ +/* ========================================================================== */ +/** FLL and PLL output mode. +* See registers CLK_FLL_CONFIG3 and CLK_PLL_CONFIG0, bits BYPASS_SEL. +*/ +typedef enum +{ + CY_SYSCLK_FLLPLL_OUTPUT_AUTO = 0u, /**< Output FLL/PLL input source when not locked, and FLL/PLL output when locked. */ + CY_SYSCLK_FLLPLL_OUTPUT_AUTO1 = 1u, /**< Same as AUTO */ + CY_SYSCLK_FLLPLL_OUTPUT_INPUT = 2u, /**< Output FLL/PLL input source regardless of lock status. */ + CY_SYSCLK_FLLPLL_OUTPUT_OUTPUT = 3u /**< Output FLL/PLL output regardless of lock status. This can be dangerous if used to clock hf_clk as FLL/PLL output may be unstable. */ +} cy_en_fll_pll_output_mode_t; + +/** FLL current-controlled oscillator (CCO) frequency ranges. +* See register CLK_FLL_CONFIG4, bits CCO_RANGE. +*/ +typedef enum +{ + CY_SYSCLK_FLL_CCO_RANGE0, /**< Target frequency is in range 48 - 64 MHz. */ + CY_SYSCLK_FLL_CCO_RANGE1, /**< Target frequency is in range 64 - 85 MHz. */ + CY_SYSCLK_FLL_CCO_RANGE2, /**< Target frequency is in range 85 - 113 MHz. */ + CY_SYSCLK_FLL_CCO_RANGE3, /**< Target frequency is in range 113 - 150 MHz. */ + CY_SYSCLK_FLL_CCO_RANGE4 /**< Target frequency is in range 150 - 200 MHz. */ +} cy_en_fll_cco_ranges_t; + +/** Structure containing information for manual configuration of FLL. +*/ +typedef struct +{ + uint32_t fllMult; /**< CLK_FLL_CONFIG register, FLL_MULT bits */ + uint32_t refDiv; /**< CLK_FLL_CONFIG2 register, FLL_REF_DIV bits */ + cy_en_fll_cco_ranges_t ccoRange; /**< CLK_FLL_CONFIG4 register, CCO_RANGE bits */ + bool enableOutputDiv; /**< CLK_FLL_CONFIG register, FLL_OUTPUT_DIV bit */ + uint32_t lockTolerance; /**< CLK_FLL_CONFIG2 register, LOCK_TOL bits */ + uint32_t igain; /**< CLK_FLL_CONFIG3 register, FLL_LF_IGAIN bits */ + uint32_t pgain; /**< CLK_FLL_CONFIG3 register, FLL_LF_PGAIN bits */ + uint32_t settlingCount; /**< CLK_FLL_CONFIG3 register, SETTLING_COUNT bits */ + cy_en_fll_pll_output_mode_t outputMode; /**< CLK_FLL_CONFIG3 register, BYPASS_SEL bits */ +} cy_stc_fll_manual_config_t; + +/******************************************************************************* +* Function Name: Cy_SysClk_FllConfigure +****************************************************************************//** +* +* Configures the FLL. +* +* \param inputFreq frequency of input source, in Hz +* +* \param outputFreq Desired FLL output frequency, in Hz. Allowable range is +* 24 MHz to 100 MHz (200 MHz with a relatively poor duty cycle. If the output +* frequency is less than 48 MHz, FLL_OUTPUT_DIV must be set; the output divide by +* 2 option is required. +* +* \param outputMode \ref cy_en_fll_pll_output_mode_t +* If output mode is bypass, then the output frequency equals the input source +* frequency regardless of the frequency parameter values. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - FLL successfully configured
+* CY_SYSCLK_INVALID_STATE - FLL not configured because it is enabled
+* CY_SYSCLK_BAD_PARAM - desired output frequency is out of valid range +* +* \note +* Do not call this function when the FLL is enabled. If it is, then this function +* returns immediately with an error return value and no register updates. +*******************************************************************************/ +uint32_t Cy_SysClk_FllConfigure(uint32_t inputFreq, uint32_t outputFreq, cy_en_fll_pll_output_mode_t outputMode); + +/******************************************************************************* +* Function Name: Cy_SysClk_FllManualConfigure +****************************************************************************//** +* +* Manually configures the FLL based on user inputs. +* +* \param config \ref cy_stc_fll_manual_config_t +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - FLL successfully configured
+* CY_SYSCLK_INVALID_STATE - FLL not configured because it is enabled +* +* \note +* Do not call this function when the FLL is enabled. If it is, then this function +* returns immediately with an error return value and no register updates. +*******************************************************************************/ +uint32_t Cy_SysClk_FllManualConfigure(const cy_stc_fll_manual_config_t *config); + +/******************************************************************************* +* Function Name: Cy_SysClk_FllGetConfiguration +****************************************************************************//** +* +* Reports the FLL configuration settings. +* +* \param config \ref cy_stc_fll_manual_config_t +* +*******************************************************************************/ +void Cy_SysClk_FllGetConfiguration(cy_stc_fll_manual_config_t *config); + +/******************************************************************************* +* Function Name: Cy_SysClk_FllEnable +****************************************************************************//** +* +* Enables the FLL. The FLL should be configured before calling this function. +* +* \param timeoutus amount of time in micro seconds to wait for FLL to lock. +* If lock doesn't occur, FLL is stopped. To avoid waiting for lock set this to 0, +* and manually check for lock using \ref Cy_SysClk_FllGetLockStatus. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - FLL successfully enabled
+* CY_SYSCLK_TIMEOUT - Timeout waiting for FLL lock +* +*******************************************************************************/ +uint32_t Cy_SysClk_FllEnable(uint32_t timeoutus); + +/******************************************************************************* +* Function Name: Cy_SysClk_FllGetLockStatus +****************************************************************************//** +* +* Returns lock status of the FLL +* +* \return 0 = not locked, 1 = locked +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_FllGetLockStatus(void) +{ + return (uint32_t)(_FLD2VAL(SRSS_CLK_FLL_STATUS_LOCKED, SRSS->CLK_FLL_STATUS)); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_FllLostLock +****************************************************************************//** +* +* Reports whether or not the FLL lost its lock since the last time this function +* was called. Clears the lost lock indicator. +* +* \return 0 = didn't lose lock, 1 = lost lock +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_FllLostLock(void) +{ + uint32_t retval = _FLD2VAL(SRSS_CLK_FLL_STATUS_UNLOCK_OCCURRED, SRSS->CLK_FLL_STATUS); + /* write a 1 to clear the unlock occurred bit */ + SRSS->CLK_FLL_STATUS = _VAL2FLD(SRSS_CLK_FLL_STATUS_UNLOCK_OCCURRED, 1u); + return (retval); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_FllDisable +****************************************************************************//** +* +* Disables the FLL and the CCO. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_FllDisable(void) +{ + SRSS->CLK_FLL_CONFIG &= ~_VAL2FLD(SRSS_CLK_FLL_CONFIG_FLL_ENABLE, 1u); /* 0 = disable */ + SRSS->CLK_FLL_CONFIG4 &= ~_VAL2FLD(SRSS_CLK_FLL_CONFIG4_CCO_ENABLE, 1u); /* 0 = disable */ +} +/** \} group_sysclk_fll */ + + +/** +* \addtogroup group_sysclk_pll +* \{ +*/ + +/* ========================================================================== */ +/* =========================== PLL SECTION ============================ */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_PllConfigure +****************************************************************************//** +* +* Configures a given PLL. +* The configuration formula used is: +* Fout = pll_clk * (P / Q / div_out), where: +* Fout is the desired output frequency +* pll_clk is the frequency of the input source +* P is the feedback divider. Its value is in bitfield FEEDBACK_DIV. +* Q is the reference divider. Its value is in bitfield REFERENCE_DIV. +* div_out is the reference divider. Its value is in bitfield OUTPUT_DIV. +* +* \param clkPath Selects which PLL to configure. 1 is the first PLL; 0 is invalid. +* +* \param inputFreq frequency of input source, in Hz; allowed range is 4 MHz to 64 MHz. +* +* \param outputFreq desired output frequency, in Hz; allowed range 1 MHz to 400 MHz, in 4-MHz steps. +* +* \param outputMode \ref cy_en_fll_pll_output_mode_t. If output mode is bypass, then +* the output frequency equals the input source frequency regardless of the +* frequency parameter values. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - PLL successfully configured
+* CY_SYSCLK_INVALID_STATE - PLL not configured because it is enabled
+* CY_SYSCLK_BAD_PARAM - invalid clock path number, or input or desired output frequency is out of valid range +* +* \note +* Do not call this function when the PLL is enabled. If it is, then this function +* returns immediately with an error return value and no register updates. +*******************************************************************************/ +uint32_t Cy_SysClk_PllConfigure(uint32_t clkPath, uint32_t inputFreq, uint32_t outputFreq, + cy_en_fll_pll_output_mode_t outputMode); + +/******************************************************************************* +* Function Name: Cy_SysClk_PllManualConfigure +****************************************************************************//** +* +* Manually configures a PLL based on user inputs. +* +* \param clkPath Selects which PLL to configure. 1 is the first PLL; 0 is invalid. +* +* \param feedbackDiv +* Sets the feedback divider for the selected PLL, valid range is 1 to 50 +* +* \param referenceDiv +* Sets reference divider of PLL, valid range is 1 to 31. (Input Frequency / +* reference divider must be in the range of 4 MHz to 8 MHz. +* +* \param outputDiv +* Sets the output divider, valid range is 1 to 255. To use the PLL as the source +* of an hf_clk this value must be 2 or greater. +* +* \param outputMode +* \ref cy_en_fll_pll_output_mode_t +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - PLL successfully configured
+* CY_SYSCLK_INVALID_STATE - PLL not configured because it is enabled
+* CY_SYSCLK_BAD_PARAM - invalid clock path number +* +* \note +* Do not call this function when the PLL is enabled. If it is, then this function +* returns immediately with an error return value and no register updates. +*******************************************************************************/ +uint32_t Cy_SysClk_PllManualConfigure(uint32_t clkPath, uint32_t feedbackDiv, uint32_t referenceDiv, + uint32_t outputDiv, cy_en_fll_pll_output_mode_t outputMode); + +/******************************************************************************* +* Function Name: Cy_SysClk_PllGetConfiguration +****************************************************************************//** +* +* Reports configuration settings for a PLL. +* +* \param clkPath Selects which PLL to report. 1 is the first PLL; 0 is invalid. +* +* \param feedbackDiv +* Pointer to storage for the feedback divider for the selected PLL. +* +* \param referenceDiv +* Pointer to storage for the reference divider for the selected PLL. +* +* \param outputDiv +* Pointer to storage for the output divider for the selected PLL. +* +* \param outputMode +* \ref cy_en_fll_pll_output_mode_t +* +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - PLL data successfully reported
+* CY_SYSCLK_BAD_PARAM - invalid clock path number +* +*******************************************************************************/ +uint32_t Cy_SysClk_PllGetConfiguration(uint32_t clkPath, uint32_t *feedbackDiv, uint32_t *referenceDiv, + uint32_t *outputDiv, cy_en_fll_pll_output_mode_t *outputMode); + +/******************************************************************************* +* Function Name: Cy_SysClk_PllEnable +****************************************************************************//** +* +* Enables the PLL. The PLL should be configured before calling this function. +* +* \param clkPath Selects which PLL to enable. 1 is the first PLL; 0 is invalid. +* +* \param timeoutus amount of time in microseconds to wait for the PLL to lock. +* If lock doesn't occur, PLL is stopped. To avoid waiting for lock set this to 0, +* and manually check for lock using \ref Cy_SysClk_PllGetLockStatus. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - PLL successfully enabled
+* CY_SYSCLK_TIMEOUT - Timeout waiting for PLL lock
+* CY_SYSCLK_BAD_PARAM - invalid clock path number +* +*******************************************************************************/ +uint32_t Cy_SysClk_PllEnable(uint32_t clkPath, uint32_t timeoutus); + +/******************************************************************************* +* Function Name: Cy_SysClk_PllGetLockStatus +****************************************************************************//** +* +* Reports the lock status of the selected PLL. +* +* \param clkPath Selects which PLL to check. 1 is the first PLL; 0 is invalid. +* +* \return 0 = not locked, 1 = locked, 0xFF = invalid clock path number +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_PllGetLockStatus(uint32_t clkPath) +{ + uint32_t retval = 0xFFul; /* invalid clock path number */ + if ((clkPath != 0ul) && (clkPath <= SRSS_NUM_PLL)) + { + retval = _FLD2VAL(SRSS_CLK_PLL_STATUS_LOCKED, SRSS->CLK_PLL_STATUS[clkPath - 1ul]); + } + return (retval); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PllLostLock +****************************************************************************//** +* +* Reports whether or not the selected PLL lost its lock since the last time this +* function was called. Clears the lost lock indicator. +* +* \param clkPath Selects which PLL to check. 1 is the first PLL; 0 is invalid. +* +* \return 0 = didn't lose lock, 1 = lost lock, 0xFF = invalid clock path number +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_PllLostLock(uint32_t clkPath) +{ + uint32_t retval = 0xFFul; /* invalid clock path number */ + if ((clkPath != 0ul) && (clkPath <= SRSS_NUM_PLL)) + { + retval = _FLD2VAL(SRSS_CLK_PLL_STATUS_UNLOCK_OCCURRED, SRSS->CLK_PLL_STATUS[clkPath - 1ul]); + /* write a 1 to clear the unlock occurred bit */ + SRSS->CLK_PLL_STATUS[clkPath - 1ul] = _VAL2FLD(SRSS_CLK_PLL_STATUS_UNLOCK_OCCURRED, 1u); + } + return (retval); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PllDisable +****************************************************************************//** +* +* Disables the selected PLL. +* +* \param clkPath Selects which PLL to disable. 1 is the first PLL; 0 is invalid. +* +* \return Error / status code:
+* CY_SYSCLK_SUCCESS - PLL successfully disabled
+* CY_SYSCLK_BAD_PARAM - invalid clock path number +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_PllDisable(uint32_t clkPath) +{ + uint32_t retval = CY_SYSCLK_BAD_PARAM; + if ((clkPath != 0ul) && (clkPath <= SRSS_NUM_PLL)) + { + SRSS->CLK_PLL_CONFIG[clkPath - 1ul] &= ~_VAL2FLD(SRSS_CLK_PLL_CONFIG_ENABLE, 1u); /* 0 = disable */ + retval = CY_SYSCLK_SUCCESS; + } + return (retval); +} +/** \} group_sysclk_pll */ + + +/** +* \addtogroup group_sysclk_ilo +* \{ +*/ + +/* ========================================================================== */ +/* =========================== ILO SECTION ============================ */ +/* ========================================================================== */ +/** ILO trim modes */ +typedef enum +{ + CY_SYSCLK_ILO_TRIM_BLOCKING = 0u, /**< Function doesn't return until trim completes. */ + CY_SYSCLK_ILO_TRIM_NONBLOCKING = 1u /**< Function returns immediately, must be called multiple times until it is finished. */ +} cy_en_ilo_trim_modes_t; + +/******************************************************************************* +* Function Name: Cy_SysClk_IloEnable +****************************************************************************//** +* +* Enables the ILO. +* +* \note The watchdog timer (WDT) must be unlocked before calling this function. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_IloEnable(void) +{ + SRSS->CLK_ILO_CONFIG |= _VAL2FLD(SRSS_CLK_ILO_CONFIG_ENABLE, 1u); /* 1 = enable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_IloDisable +****************************************************************************//** +* +* Disables the ILO. ILO can't be disabled if WDT is enabled. +* +* \note The watchdog timer (WDT) must be unlocked before calling this function. +* Do not call this function if the WDT is enabled, because the WDT is clocked by +* the ILO. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_IloDisable(void) +{ + SRSS->CLK_ILO_CONFIG &= ~_VAL2FLD(SRSS_CLK_ILO_CONFIG_ENABLE, 1u); /* 0 = disable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_IloHibernateOn +****************************************************************************//** +* +* Controls whether the ILO stays on during a hibernate, or through an XRES or +* brown-out detect (BOD) event. +* +* \param on +* 1 = ILO stays on during hibernate or across XRES/BOD. 0 = ILO turns off for +* hibernate or XRES/BOD. +* +* \note Writes to the register/bit are ignored if the watchdog (WDT) is locked. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_IloHibernateOn(bool on) +{ + CY_SYSCLK_CLR_SET(SRSS->CLK_ILO_CONFIG, SRSS_CLK_ILO_CONFIG_HVILO_BACKUP, (uint32_t)on); +} +/** \} group_sysclk_ilo */ + + +/** +* \addtogroup group_sysclk_pilo +* \{ +*/ + +/* ========================================================================== */ +/* =========================== PILO SECTION =========================== */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_PiloEnable +****************************************************************************//** +* +* Enables the PILO. +* +* \note Requires 1 msec, for delay between enabling the PILO and releasing the +* PILO reset. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PiloEnable(void) +{ + SRSS->CLK_PILO_CONFIG |= _VAL2FLD(SRSS_CLK_PILO_CONFIG_PILO_EN, 1u); /* 1 = enable */ + Cy_SysLib_Delay(1/*msec*/); + /* release the reset and enable clock output */ + SRSS->CLK_PILO_CONFIG |= (_VAL2FLD(SRSS_CLK_PILO_CONFIG_PILO_RESET_N, 1u) | + _VAL2FLD(SRSS_CLK_PILO_CONFIG_PILO_CLK_EN, 1u)); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PiloDisable +****************************************************************************//** +* +* Disables the PILO. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PiloDisable(void) +{ + /* Clear PILO_EN, PILO_RESET_N, and PILO_CLK_EN bitfields. This disables the + PILO and holds the PILO in a reset state. */ + SRSS->CLK_PILO_CONFIG &= ~(_VAL2FLD(SRSS_CLK_PILO_CONFIG_PILO_EN, 1u) | + _VAL2FLD(SRSS_CLK_PILO_CONFIG_PILO_RESET_N, 1u) | + _VAL2FLD(SRSS_CLK_PILO_CONFIG_PILO_CLK_EN, 1u));} +/** \} group_sysclk_pilo */ + + +/** +* \addtogroup group_sysclk_calclk +* \{ +*/ + +/* ========================================================================== */ +/* ==================== CLOCK MEASUREMENT SECTION ===================== */ +/* ========================================================================== */ +/** Defines all possible clock sources. */ +typedef enum +{ + CY_SYSCLK_MEAS_CLK_ILO = 1u, + CY_SYSCLK_MEAS_CLK_WCO = 2u, + CY_SYSCLK_MEAS_CLK_ALTLF = 4u, + CY_SYSCLK_MEAS_CLK_IMO = 6u, + CY_SYSCLK_MEAS_CLK_PILO = 8u, + CY_SYSCLK_MEAS_CLK_FAST_CLKS = 0x100u, + CY_SYSCLK_MEAS_CLK_ECO = 0x101u, + CY_SYSCLK_MEAS_CLK_EXT = 0x102u, + CY_SYSCLK_MEAS_CLK_ALTHF = 0x103u, + CY_SYSCLK_MEAS_CLK_PATH_CLKS = 0x500u, + CY_SYSCLK_MEAS_CLK_PATH0 = 0x500u, + CY_SYSCLK_MEAS_CLK_PATH1 = 0x501u, + CY_SYSCLK_MEAS_CLK_PATH2 = 0x502u, + CY_SYSCLK_MEAS_CLK_PATH3 = 0x503u, + CY_SYSCLK_MEAS_CLK_PATH4 = 0x504u, + CY_SYSCLK_MEAS_CLK_PATH5 = 0x505u, + CY_SYSCLK_MEAS_CLK_PATH6 = 0x506u, + CY_SYSCLK_MEAS_CLK_PATH7 = 0x507u, + CY_SYSCLK_MEAS_CLK_PATH8 = 0x508u, + CY_SYSCLK_MEAS_CLK_PATH9 = 0x509u, + CY_SYSCLK_MEAS_CLK_PATH10 = 0x50Au, + CY_SYSCLK_MEAS_CLK_PATH11 = 0x50Bu, + CY_SYSCLK_MEAS_CLK_PATH12 = 0x50Cu, + CY_SYSCLK_MEAS_CLK_PATH13 = 0x50Du, + CY_SYSCLK_MEAS_CLK_PATH14 = 0x50Eu, + CY_SYSCLK_MEAS_CLK_PATH15 = 0x50Fu, + CY_SYSCLK_MEAS_CLK_HF_CLKS = 0x600u, + CY_SYSCLK_MEAS_CLK_HFCLK0 = 0x600u, + CY_SYSCLK_MEAS_CLK_HFCLK1 = 0x601u, + CY_SYSCLK_MEAS_CLK_HFCLK2 = 0x602u, + CY_SYSCLK_MEAS_CLK_HFCLK3 = 0x603u, + CY_SYSCLK_MEAS_CLK_HFCLK4 = 0x604u, + CY_SYSCLK_MEAS_CLK_HFCLK5 = 0x605u, + CY_SYSCLK_MEAS_CLK_HFCLK6 = 0x606u, + CY_SYSCLK_MEAS_CLK_HFCLK7 = 0x607u, + CY_SYSCLK_MEAS_CLK_HFCLK8 = 0x608u, + CY_SYSCLK_MEAS_CLK_HFCLK9 = 0x609u, + CY_SYSCLK_MEAS_CLK_HFCLK10 = 0x60Au, + CY_SYSCLK_MEAS_CLK_HFCLK11 = 0x60Bu, + CY_SYSCLK_MEAS_CLK_HFCLK12 = 0x60Cu, + CY_SYSCLK_MEAS_CLK_HFCLK13 = 0x60Du, + CY_SYSCLK_MEAS_CLK_HFCLK14 = 0x60Eu, + CY_SYSCLK_MEAS_CLK_HFCLK15 = 0x60Fu, + CY_SYSCLK_MEAS_CLK_LAST_CLK = 0x610u +} cy_en_meas_clks_t; + +/******************************************************************************* +* Function Name: Cy_SysClk_InitClkMeasurementCounters +****************************************************************************//** +* +* Initializes clock measurement counters. +* Measurement counters allow you to measure one clock (clock2) versus another +* clock (clock1). This is done with two hardware counters. One counter (counter1), +* which is clocked off of clock1, is loaded with an initial value and it counts down. +* A second counter (counter2), which is clocked off of clock2, counts up until +* the first counter is done counting down. +* The frequency of clock2 can be determined with the following equation: +* clock2 frequency = (count2/count1) * clock1 frequency +* +* \param clock1 selects which clock is used as the measurement clock +* +* \param clock1FreqHz the frequency of clock1 in Hz +* +* \param count1 sets the initial value for count1 +* +* \param clock2 selects the clock that will be measured by clock1 +* +* \return Error / status code:
+* CY_SYSCLK_INVALID_STATE if already doing a measurement
+* CY_SYSCLK_BAD_PARAM if invalid clock input parameter
+* else CY_SYSCLK_SUCCESS +* +*******************************************************************************/ +uint32_t Cy_SysClk_InitClkMeasurementCounters(cy_en_meas_clks_t clock1, uint32_t clock1FreqHz, + uint32_t count1, cy_en_meas_clks_t clock2); + +/******************************************************************************* +* Function Name: Cy_SysClk_StartClkMeasurementCounters +****************************************************************************//** +* +* Starts the calibration counters. +* +* \return Error / status code:
+* CY_SYSCLK_INVALID_STATE if already doing a measurement
+* else CY_SYSCLK_SUCCESS +* +* \note Cy_SysClk_InitClkMeasurementCounters() must have been called previously. +*******************************************************************************/ +uint32_t Cy_SysClk_StartClkMeasurementCounters(void); + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkMeasurementCountersDone +****************************************************************************//** +* +* Checks if the calibration counters are done +* +* \return Status of calibration counters:
+* CY_SYSCLK_FINISHED if done
+* CY_SYSCLK_STARTED if not +* +*******************************************************************************/ +__STATIC_INLINE int32_t Cy_SysClk_ClkMeasurementCountersDone(void) +{ + return ((_FLD2VAL(SRSS_CLK_CAL_CNT1_CAL_COUNTER_DONE, SRSS->CLK_CAL_CNT1) == 0ul/*0 = not done*/) ? + CY_SYSCLK_STARTED : CY_SYSCLK_FINISHED); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkMeasurementCountersGetClock2Freq +****************************************************************************//** +* +* Returns the frequency of clock 2 in Hz. The following equation is used: +* clock2 frequency = (count2/count1) * clock1 frequency +* +* \return Frequency of clock 2 in Hz +* +* \note This must only be called if the counters are done. +*******************************************************************************/ +uint32_t Cy_SysClk_ClkMeasurementCountersGetClock2Freq(void); +/** \} group_sysclk_calclk */ + + +/** +* \addtogroup group_sysclk_trim +* \{ +*/ + +/* ========================================================================== */ +/* ========================== TRIM SECTION ============================ */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_IloTrim +****************************************************************************//** +* +* Trims the ILO to be as close to 32,768 Hz as possible. The clock measurement +* counters should be used to obtain the current frequency of the ILO. This +* frequency should then be passed into this function. This function will then +* use this information to trim the ILO as close as possible to 32,768 Hz. +* +* \param iloFreq current ILO frequency as measured by the measurement counters +* +* \return The achieved ILO frequency in Hz +* +* \note The watchdog timer (WDT) must be unlocked before calling this function. +*******************************************************************************/ +uint32_t Cy_SysClk_IloTrim(uint32_t iloFreq); + +/******************************************************************************* +* Function Name: Cy_SysClk_PiloTrim +****************************************************************************//** +* +* Trims the PILO to be as close to 32,768 Hz as possible. The clock measurement +* counters should be used to obtain the current frequency of the PILO. This +* frequency should then be passed into this function. This function will then +* use this information to trim the PILO as close as possible to 32,768Hz. +* +* \param piloFreq current PILO frequency as measured by the measurement counters +* +* \return The achieved PILO frequency in Hz +* +*******************************************************************************/ +uint32_t Cy_SysClk_PiloTrim(uint32_t piloFreq); + +/** \} group_sysclk_trim */ + + +/** +* \addtogroup group_sysclk_wco +* \{ +*/ + +/* ========================================================================== */ +/* =========================== WCO SECTION ============================ */ +/* ========================================================================== */ +/** WCO bypass modes */ +typedef enum +{ + CY_SYSCLK_WCO_NOT_BYPASSED = 0u, /**< WCO is not bypassed crystal is used */ + CY_SYSCLK_WCO_BYPASSED = 1u /**< WCO is bypassed external clock must be supplied on XTAL pin */ +} cy_en_wco_bypass_modes_t; + +/** WCO CSV supervisor clock selections */ +typedef enum +{ + CY_SYSCLK_WCO_CSV_SUPERVISOR_ILO, + CY_SYSCLK_WCO_CSV_SUPERVISOR_ALTLF, + CY_SYSCLK_WCO_CSV_SUPERVISOR_PILO +} cy_en_wco_csv_supervisor_clock_t; + +/** +* Clock supervisor clock loss window. There must be one clock of the supervised +* clock within this many clocks of the supervising clock. +* See registers CLK_CSV_HF_CTL and CLK_CSV_WCO_CTL, bitfield CSV_LOSS_WINDOW. +*/ +typedef enum +{ + CY_SYSCLK_CSV_LOSS_4_CYCLES = 0u, /**< 1 clock must be seen within 4 cycles of the supervising clock. */ + CY_SYSCLK_CSV_LOSS_8_CYCLES = 1u, /**< 1 clock must be seen within 8 cycles of the supervising clock. */ + CY_SYSCLK_CSV_LOSS_16_CYCLES = 2u, /**< 1 clock must be seen within 16 cycles of the supervising clock. */ + CY_SYSCLK_CSV_LOSS_32_CYCLES = 3u, /**< 1 clock must be seen within 32 cycles of the supervising clock. */ + CY_SYSCLK_CSV_LOSS_64_CYCLES = 4u, /**< 1 clock must be seen within 64 cycles of the supervising clock. */ + CY_SYSCLK_CSV_LOSS_128_CYCLES = 5u, /**< 1 clock must be seen within 128 cycles of the supervising clock. */ + CY_SYSCLK_CSV_LOSS_256_CYCLES = 6u, /**< 1 clock must be seen within 256 cycles of the supervising clock. */ + CY_SYSCLK_CSV_LOSS_512_CYCLES = 7u /**< 1 clock must be seen within 512 cycles of the supervising clock. */ +} cy_en_csv_loss_window_t; + +/** +* Clock supervisor error actions. See register CLK_CSV_HF_CTL[CSV_FREQ_ACTION and CSV_LOSS_ACTION]. +*/ +typedef enum +{ + CY_SYSCLK_CSV_ERROR_IGNORE = 0u, /**< Ignore the error reported by the clock supervisor. */ + CY_SYSCLK_CSV_ERROR_FAULT = 1u, /**< Trigger a fault when an error is reported by the clock supervisor. */ + CY_SYSCLK_CSV_ERROR_RESET = 2u, /**< Trigger a reset when an error is reported by the clock supervisor. */ + CY_SYSCLK_CSV_ERROR_FAULT_RESET = 3u /**< Trigger a fault then reset when an error is reported by the supervisor. */ +} cy_en_csv_error_actions_t; + +/** +* This structure is used to configure the clock supervisor for the WCO. +*/ +typedef struct +{ + cy_en_wco_csv_supervisor_clock_t SupervisorClock; /**< supervisor clock selection */ + uint32_t enableLossDetection; /**< 1= enabled, 0= disabled. Note that if loss detection is enabled, writes to other register bits are ignored. */ + cy_en_csv_loss_window_t LossWindow; /**< \ref cy_en_csv_loss_window_t */ + cy_en_csv_error_actions_t LossAction; /**< \ref cy_en_csv_error_actions_t */ +} cy_stc_wco_csv_config_t; + +/******************************************************************************* +* Function Name: Cy_SysClk_WcoEnable +****************************************************************************//** +* +* Enables the WCO. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_WcoEnable(void) +{ + BACKUP->CTL |= _VAL2FLD(BACKUP_CTL_WCO_EN, 1u); /* 1 = enable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_WcoDisable +****************************************************************************//** +* +* Disables the WCO. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_WcoDisable(void) +{ + BACKUP->CTL &= ~_VAL2FLD(BACKUP_CTL_WCO_EN, 1u); /* 0 = disable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_WcoBypass +****************************************************************************//** +* +* Sets whether the WCO is bypassed or not. If it is bypassed then a 32-kHz clock +* must be provided on the wco_in pin. +* +* \param bypass \ref cy_en_wco_bypass_modes_t +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_WcoBypass(cy_en_wco_bypass_modes_t bypass) +{ + CY_SYSCLK_CLR_SET(BACKUP->CTL, BACKUP_CTL_WCO_BYPASS, bypass); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_WcoConfigureCsv +****************************************************************************//** +* +* Configure the WCO clock supervisor (CSV). +* +* \param config \ref cy_stc_wco_csv_config_t +* +* \note +* If loss detection is enabled, writes to other register bits are ignored. +* Therefore loss detection is disabled before writing the config structure +* members to the CTL register. Note that one of the config structure members is +* an enable bit. +*******************************************************************************/ +void Cy_SysClk_WcoConfigureCsv(const cy_stc_wco_csv_config_t *config); +/** \} group_sysclk_wco */ + + +/** +* \addtogroup group_sysclk_clk_hf +* \{ +*/ + +/* ========================================================================== */ +/* ======================== clk_hf[n] SECTION ========================= */ +/* ========================================================================== */ +/** +* Selects which hf_clk input, or root mux, to configure. +* See CLK_ROOT_SELECT registers, bits ROOT_MUX. +* Used with functions \ref Cy_SysClk_HfClockSetSource and \ref Cy_SysClk_HfClockGetSource. +*/ +typedef enum +{ + CY_SYSCLK_HFCLK_IN_CLKPATH0 = 0u, /**< hf_clk input is Clock Path 0 */ + CY_SYSCLK_HFCLK_IN_CLKPATH1 = 1u, /**< hf_clk input is Clock Path 1 */ + CY_SYSCLK_HFCLK_IN_CLKPATH2 = 2u, /**< hf_clk input is Clock Path 2 */ + CY_SYSCLK_HFCLK_IN_CLKPATH3 = 3u, /**< hf_clk input is Clock Path 3 */ + CY_SYSCLK_HFCLK_IN_CLKPATH4 = 4u, /**< hf_clk input is Clock Path 4 */ + CY_SYSCLK_HFCLK_IN_CLKPATH5 = 5u, /**< hf_clk input is Clock Path 5 */ + CY_SYSCLK_HFCLK_IN_CLKPATH6 = 6u, /**< hf_clk input is Clock Path 6 */ + CY_SYSCLK_HFCLK_IN_CLKPATH7 = 7u, /**< hf_clk input is Clock Path 7 */ + CY_SYSCLK_HFCLK_IN_CLKPATH8 = 8u, /**< hf_clk input is Clock Path 8 */ + CY_SYSCLK_HFCLK_IN_CLKPATH9 = 9u, /**< hf_clk input is Clock Path 9 */ + CY_SYSCLK_HFCLK_IN_CLKPATH10 = 10u, /**< hf_clk input is Clock Path 10 */ + CY_SYSCLK_HFCLK_IN_CLKPATH11 = 11u, /**< hf_clk input is Clock Path 11 */ + CY_SYSCLK_HFCLK_IN_CLKPATH12 = 12u, /**< hf_clk input is Clock Path 12 */ + CY_SYSCLK_HFCLK_IN_CLKPATH13 = 13u, /**< hf_clk input is Clock Path 13 */ + CY_SYSCLK_HFCLK_IN_CLKPATH14 = 14u, /**< hf_clk input is Clock Path 14 */ + CY_SYSCLK_HFCLK_IN_CLKPATH15 = 15u, /**< hf_clk input is Clock Path 15 */ +} cy_en_hf_clk_sources_t; + +/** +* hf_clk divider values. See CLK_ROOT_SELECT registers, bits ROOT_DIV. +* Used with functions \ref Cy_SysClk_HfClockSetDivider and \ref Cy_SysClk_HfClockGetDivider. +*/ +typedef enum +{ + CY_SYSCLK_HFCLK_NO_DIVIDE = 0u, /**< don't divide hf_clk. */ + CY_SYSCLK_HFCLK_DIVIDE_BY_2 = 1u, /**< divide hf_clk by 2 */ + CY_SYSCLK_HFCLK_DIVIDE_BY_4 = 2u, /**< divide hf_clk by 4 */ + CY_SYSCLK_HFCLK_DIVIDE_BY_8 = 3u /**< divide hf_clk by 8 */ +} cy_en_hf_clk_dividers_t; + +/** +* hf_clk clock supervisor input sources. See register CLK_CSV_HF_CTL[CSV_MUX]. +*/ +typedef enum +{ + CY_SYSCLK_HFCLK_CSV_SUPERVISOR_IMO = 0u, /**< Supervising clock is the IMO. */ + CY_SYSCLK_HFCLK_CSV_SUPERVISOR_EXT = 1u, /**< Supervising clock is the external clock */ + CY_SYSCLK_HFCLK_CSV_SUPERVISOR_ALTHF = 2u /**< Supervising clock is clk_althf */ +} cy_en_hfclk_csv_supervisor_clock_t; + +/** +* This structure is used to configure the clock supervisor for hf_clk. +*/ +typedef struct +{ + cy_en_hfclk_csv_supervisor_clock_t SupervisorClock; /**< \ref cy_en_hfclk_csv_supervisor_clock_t */ + uint32_t SupervisingWindow; /**< Number of supervising clock cycles */ + uint32_t enableFrquencyFaultDetection; /**< 1= enabled, 0= disabled */ + uint32_t FrequencyLowerLimit; /**< Lowest frequency in kHz that supervised clock can go */ + uint32_t FrequencyUpperLimit; /**< Highest frequency in kHz that supervised clock can go */ + cy_en_csv_error_actions_t FrequencyAction; /**< \ref cy_en_csv_error_actions_t */ + uint32_t enableLossDetection; /**< 1= enabled, 0= disabled */ + cy_en_csv_loss_window_t LossWindow; /**< \ref cy_en_csv_loss_window_t */ + cy_en_csv_error_actions_t LossAction; /**< \ref cy_en_csv_error_actions_t */ +} cy_stc_hf_csv_config_t; + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkHfEnable +****************************************************************************//** +* +* Enables the selected ClkHf. +* +* \param clkHf Selects which ClkHf to enable. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkHfEnable(uint32_t clkHf) +{ + SRSS->CLK_ROOT_SELECT[clkHf] |= _VAL2FLD(SRSS_CLK_ROOT_SELECT_ENABLE, 1ul); /* 1 = enable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkHfDisable +****************************************************************************//** +* +* Disables the selected ClkHf. +* +* \param clkHf Selects which ClkHf to enable. +* +* \note ClkHf[0] cannot be disabled. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkHfDisable(uint32_t clkHf) +{ + SRSS->CLK_ROOT_SELECT[clkHf] &= ~_VAL2FLD(SRSS_CLK_ROOT_SELECT_ENABLE, 1ul); /* 0 = disable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_HfClockSetSource +****************************************************************************//** +* +* Selects the source of the selected ClkHf. +* +* \param hfClk Which ClkHf mux to configure. +* +* \param source \ref cy_en_hf_clk_sources_t +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_HfClockSetSource(uint32_t hfClk, cy_en_hf_clk_sources_t source) +{ + CY_SYSCLK_CLR_SET(SRSS->CLK_ROOT_SELECT[hfClk], SRSS_CLK_ROOT_SELECT_ROOT_MUX, source); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_HfClockGetSource +****************************************************************************//** +* +* Reports the source of the selected ClkHf. +* +* \param hfClk selects which ClkHf to get the source of. +* +* \return \ref cy_en_hf_clk_sources_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_hf_clk_sources_t Cy_SysClk_HfClockGetSource(uint32_t hfClk) +{ + return (cy_en_hf_clk_sources_t)(_FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_MUX, SRSS->CLK_ROOT_SELECT[hfClk])); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_HfClockSetDivider +****************************************************************************//** +* +* Sets the pre-divider for a ClkHf. +* +* \param hfClk selects which ClkHf divider to configure. +* +* \param divider \ref cy_en_hf_clk_dividers_t +* +* \note Also call \ref Cy_SysClk_HfClockSetSource to set the ClkHf source. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_HfClockSetDivider(uint32_t hfClk, cy_en_hf_clk_dividers_t divider) +{ + CY_SYSCLK_CLR_SET(SRSS->CLK_ROOT_SELECT[hfClk], SRSS_CLK_ROOT_SELECT_ROOT_DIV, divider); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_HfClockGetDivider +****************************************************************************//** +* +* Reports the pre-divider value for a ClkHf. +* +* \param hfClk selects which ClkHf to check divider of. +* +* \return \ref cy_en_hf_clk_dividers_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_hf_clk_dividers_t Cy_SysClk_HfClockGetDivider(uint32_t hfClk) +{ + return (cy_en_hf_clk_dividers_t)(_FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_DIV, SRSS->CLK_ROOT_SELECT[hfClk])); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_HfClockConfigureCsv +****************************************************************************//** +* +* Configures the ClkHf clock supervisor (CSV). +* +* \param hfClk selects which ClkHf CSV to configure. +* +* \param config \ref cy_stc_hf_csv_config_t +* +* \note +* If loss detection is enabled, writes to other register bits are ignored. +* Therefore loss detection is disabled before writing the config structure +* members to the CTL register. Note that one of the config structure members is +* an enable bit. +*******************************************************************************/ +void Cy_SysClk_HfClockConfigureCsv(uint32_t hfClk, const cy_stc_hf_csv_config_t *config); +/** \} group_sysclk_clk_hf */ + + +/** +* \addtogroup group_sysclk_clk_fast +* \{ +*/ + +/* ========================================================================== */ +/* ========================= clk_fast SECTION ========================= */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_FastClkSetDivider +****************************************************************************//** +* +* Sets the clock divider for the fast clock, which sources the main processor. +* The source of this divider is hf_clk[0]. +* +* \param divider divider value between 0 and 255. +* Causes integer division of (divider value + 1), or division by 1 to 256. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_FastClkSetDivider(uint32_t divider) +{ + CY_SYSCLK_CLR_SET(CPUSS->CM4_CLOCK_CTL, CPUSS_CM4_CLOCK_CTL_FAST_INT_DIV, divider); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_FastClkGetDivider +****************************************************************************//** +* +* Returns the clock divider for the fast clock. +* +* \return The divider value for the fast clock. +* The integer division done is by (divider value + 1), or division by 1 to 256. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_FastClkGetDivider(void) +{ + return _FLD2VAL(CPUSS_CM4_CLOCK_CTL_FAST_INT_DIV, CPUSS->CM4_CLOCK_CTL); +} +/** \} group_sysclk_clk_fast */ + + +/** +* \addtogroup group_sysclk_clk_peripheral +* \{ +*/ + +/* ========================================================================== */ +/* ======================== clk_peri SECTION ========================== */ +/* ========================================================================== */ +/** Programmable clock divider types */ +typedef enum +{ + CY_SYSCLK_DIV_8_BIT = 0u, /**< Divider Type is an 8 bit divider */ + CY_SYSCLK_DIV_16_BIT = 1u, /**< Divider Type is a 16 bit divider */ + CY_SYSCLK_DIV_16_5_BIT = 2u, /**< Divider Type is a 16.5 bit fractional divider */ + CY_SYSCLK_DIV_24_5_BIT = 3u /**< Divider Type is a 24.5 bit fractional divider */ +} cy_en_divider_types_t; + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriClkSetDivider +****************************************************************************//** +* +* Sets the clock divider for the peripheral clock tree. All peripheral clock +* dividers are sourced from this clock. Also the Cortex M0+ clock divider is +* sourced from this clock. The source of this divider is hf_clk[0] +* +* \param divider divider value between 0 and 255 +* Causes integer division of (divider value + 1), or division by 1 to 256. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PeriClkSetDivider(uint32_t divider) +{ + CY_SYSCLK_CLR_SET(CPUSS->CM0_CLOCK_CTL, CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV, divider); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriClkGetDivider +****************************************************************************//** +* +* Returns the clock divider of peripheral (peri) clock +* +* \return The divider value. +* The integer division done is by (divider value + 1), or division by 1 to 256. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_PeriClkGetDivider(void) +{ + return _FLD2VAL(CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV, CPUSS->CM0_CLOCK_CTL); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphSetDivider +****************************************************************************//** +* +* Sets one of the programmable clock dividers. This is only used for integer +* dividers. Use \ref Cy_SysClk_PeriphSetFracDivider for setting factional dividers. +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t +* +* \param dividerNum the divider number. +* +* \param dividerValue divider value +* Causes integer division of (divider value + 1), or division by 1 to 256 +* (8-bit divider) or 1 to 65536 (16-bit divider). +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PeriphSetDivider(cy_en_divider_types_t dividerType, + uint32_t dividerNum, uint32_t dividerValue) +{ + switch(dividerType) + { + case CY_SYSCLK_DIV_8_BIT: + CY_SYSCLK_CLR_SET(PERI->DIV_8_CTL[dividerNum], PERI_DIV_8_CTL_INT8_DIV, dividerValue); + break; + case CY_SYSCLK_DIV_16_BIT: + CY_SYSCLK_CLR_SET(PERI->DIV_16_CTL[dividerNum], PERI_DIV_16_CTL_INT16_DIV, dividerValue); + break; + /* the following divider types are invalid for this function, and are ignored */ + case CY_SYSCLK_DIV_16_5_BIT: + case CY_SYSCLK_DIV_24_5_BIT: + default: + break; + } +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphGetDivider +****************************************************************************//** +* +* Returns the integer divider value for the specified divider. One works for +* integer dividers. Use \ref Cy_SysClk_PeriphGetFracDivider to get the fractional +* divider value +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t +* +* \param dividerNum specifies which divider of the selected type to configure +* +* \return The divider value. +* The integer division done is by (divider value + 1), or division by 1 to 256 +* (8-bit divider) or 1 to 65536 (16-bit divider). +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_PeriphGetDivider(cy_en_divider_types_t dividerType, uint32_t dividerNum) +{ + uint32_t retval = 0; /* returns 0 if invalid dividerType */ + + switch(dividerType) + { + case CY_SYSCLK_DIV_8_BIT: + retval = _FLD2VAL(PERI_DIV_8_CTL_INT8_DIV, PERI->DIV_8_CTL[dividerNum]); + break; + case CY_SYSCLK_DIV_16_BIT: + retval = _FLD2VAL(PERI_DIV_16_CTL_INT16_DIV, PERI->DIV_16_CTL[dividerNum]); + break; + /* the following divider types are invalid for this function, and result in an error return */ + case CY_SYSCLK_DIV_16_5_BIT: + case CY_SYSCLK_DIV_24_5_BIT: + default: + break; + } + + return retval; +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphSetFracDivider +****************************************************************************//** +* +* Sets one of the programmable clock dividers. This function should only be used +* for fractional clock dividers. +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t +* +* \param dividerNum specifies which divider of the selected type to configure +* +* \param dividerIntValue the integer divider value +* The source of the divider is peri_clk, which is a divided version of hf_clk[0]. +* The divider value causes integer division of (divider value + 1), or division +* by 1 to 65536 (16-bit divider) or 1 to 16777216 (24-bit divider). +* +* \param dividerFracValue the fraction part of the divider +* The fractional divider can be 1-32, thus it divides the clock by 1/32 for each +* count. To divide the clock by 11/32nds set this value to 11. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PeriphSetFracDivider(cy_en_divider_types_t dividerType, uint32_t dividerNum, + uint32_t dividerIntValue, uint32_t dividerFracValue) +{ /* see CDT 238859 */ + switch(dividerType) + { + case CY_SYSCLK_DIV_16_5_BIT: + CY_SYSCLK_CLR_SET(PERI->DIV_16_5_CTL[dividerNum], PERI_DIV_16_5_CTL_INT16_DIV, dividerIntValue); + CY_SYSCLK_CLR_SET(PERI->DIV_16_5_CTL[dividerNum], PERI_DIV_16_5_CTL_FRAC5_DIV, dividerFracValue); + break; + case CY_SYSCLK_DIV_24_5_BIT: + CY_SYSCLK_CLR_SET(PERI->DIV_24_5_CTL[dividerNum], PERI_DIV_24_5_CTL_INT24_DIV, dividerIntValue); + CY_SYSCLK_CLR_SET(PERI->DIV_24_5_CTL[dividerNum], PERI_DIV_24_5_CTL_FRAC5_DIV, dividerFracValue); + break; + /* the following divider types are invalid for this function, and are ignored */ + case CY_SYSCLK_DIV_8_BIT: + case CY_SYSCLK_DIV_16_BIT: + default: + break; + } +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphGetFracDivider +****************************************************************************//** +* +* Reports the integer and fractional parts of the divider +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t +* +* \param dividerNum specifies which divider of the selected type to configure +* +* \param *dividerIntValue pointer to return integer divider value +* +* \param *dividerFracValue pointer to return fractional divider value +* +* \return None. Loads pointed-to variables. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PeriphGetFracDivider(cy_en_divider_types_t dividerType, uint32_t dividerNum, + uint32_t *dividerIntValue, uint32_t *dividerFracValue) +{ + switch(dividerType) + { + case CY_SYSCLK_DIV_16_5_BIT: + *dividerIntValue = _FLD2VAL(PERI_DIV_16_5_CTL_INT16_DIV, PERI->DIV_16_5_CTL[dividerNum]); + *dividerFracValue = _FLD2VAL(PERI_DIV_16_5_CTL_FRAC5_DIV, PERI->DIV_16_5_CTL[dividerNum]); + break; + case CY_SYSCLK_DIV_24_5_BIT: + *dividerIntValue = _FLD2VAL(PERI_DIV_24_5_CTL_INT24_DIV, PERI->DIV_24_5_CTL[dividerNum]); + *dividerFracValue = _FLD2VAL(PERI_DIV_24_5_CTL_FRAC5_DIV, PERI->DIV_24_5_CTL[dividerNum]); + break; + /* the following divider types are invalid for this function, and are ignored */ + case CY_SYSCLK_DIV_8_BIT: + case CY_SYSCLK_DIV_16_BIT: + default: + break; + } +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphAssignDivider +****************************************************************************//** +* +* Assigns a programmable divider to a selected IP block, such as a TCPWM or SCB. +* +* \param ipBlock specifies ip block to connect the clock divider to. +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t +* +* \param dividerNum specifies which divider of the selected type to configure +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PeriphAssignDivider(en_clk_dst_t ipBlock, cy_en_divider_types_t dividerType, + uint32_t dividerNum) +{ + PERI->CLOCK_CTL[ipBlock] = _VAL2FLD(PERI_CLOCK_CTL_TYPE_SEL, dividerType) | + _VAL2FLD(PERI_CLOCK_CTL_DIV_SEL, dividerNum); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphGetAssignedDivider +****************************************************************************//** +* +* Reports which clock divider is assigned to a selected IP block. +* +* \param ipBlock specifies ip block to connect the clock divider to. +* +* \return The divider type and #, where bits [7:6] = type, bits[5:0] = divider +* number within that type +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_PeriphGetAssignedDivider(en_clk_dst_t ipBlock) +{ + return PERI->CLOCK_CTL[ipBlock] & 0xFFul; /* bits [7:6] = TYPE_SEL, bits[5:0] = DIV_SEL */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphEnableDivider +****************************************************************************//** +* +* Enables the selected divider. +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t +* +* \param dividerNum specifies which divider of the selected type to configure +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PeriphEnableDivider(cy_en_divider_types_t dividerType, uint32_t dividerNum) +{ + PERI->DIV_CMD = _CLR_SET_FLD32U(PERI->DIV_CMD, PERI_DIV_CMD_TYPE_SEL, dividerType); + PERI->DIV_CMD = _CLR_SET_FLD32U(PERI->DIV_CMD, PERI_DIV_CMD_DIV_SEL, dividerNum); + PERI->DIV_CMD = _CLR_SET_FLD32U(PERI->DIV_CMD, PERI_DIV_CMD_ENABLE, 1ul); /* 1 = enable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphDisableDivider +****************************************************************************//** +* +* Disables the selected divider. +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t. +* +* \param dividerNum specifies which divider of the selected type to configure. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PeriphDisableDivider(cy_en_divider_types_t dividerType, uint32_t dividerNum) +{ + PERI->DIV_CMD = _CLR_SET_FLD32U(PERI->DIV_CMD, PERI_DIV_CMD_TYPE_SEL, dividerType); + PERI->DIV_CMD = _CLR_SET_FLD32U(PERI->DIV_CMD, PERI_DIV_CMD_DIV_SEL, dividerNum); + PERI->DIV_CMD = _CLR_SET_FLD32U(PERI->DIV_CMD, PERI_DIV_CMD_DISABLE, 1); /* 1 = disable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphPhaseDisableDivider +****************************************************************************//** +* +* Disables a selected divider, preparatory to aligning it with another divider; +* see \ref Cy_SysClk_PeriphPhaseAlignDivider. +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t. +* +* \param dividerNum specifies which divider of the selected type to configure. +* +* \note +* To phase-align a divider, do the following: +* 1. Call this function. +* 2. Call the appropriate Cy_SysClk_PeriphSet...Divider function to configure the +* divider. +* 3. Call Cy_SysClk_PeriphPhaseAlignDivider to enable the divider and do the phase +* alignment. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PeriphPhaseDisableDivider(cy_en_divider_types_t dividerType, uint32_t dividerNum) +{ + /* specify the divider and disable it */ + PERI->DIV_CMD = _VAL2FLD(PERI_DIV_CMD_DISABLE, 1u) /* 1 = disable */ | + _VAL2FLD(PERI_DIV_CMD_TYPE_SEL, dividerType) | + _VAL2FLD(PERI_DIV_CMD_DIV_SEL, dividerNum); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphPhaseAlignDivider +****************************************************************************//** +* +* First disables a selected divider (\ref Cy_SysClk_PeriphPhaseDisableDivider), +* then aligns that divider to another programmable divider, and enables the +* selected divider. +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t. +* +* \param dividerNum specifies which divider of the selected type to configure. +* +* \param dividerTypePA type of divider to phase-align to; \ref cy_en_divider_types_t. +* +* \param dividerNumPA divider number of type specified to phase align to. +* +* \note +* To phase-align a divider to clk_peri, set dividerTypePA to 3 and dividerNumPA +* to 255. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_PeriphPhaseAlignDivider(cy_en_divider_types_t dividerType, uint32_t dividerNum, + cy_en_divider_types_t dividerTypePA, uint32_t dividerNumPA) +{ + /* first disable the divider that is to be phase-aligned */ + Cy_SysClk_PeriphPhaseDisableDivider(dividerType, dividerNum); + /* then specify the reference divider, and the divider, and enable the divider */ + PERI->DIV_CMD = _VAL2FLD(PERI_DIV_CMD_ENABLE, 1u) /* 1 = enable */ | + _VAL2FLD(PERI_DIV_CMD_PA_TYPE_SEL, dividerTypePA) | + _VAL2FLD(PERI_DIV_CMD_PA_DIV_SEL, dividerNumPA) | + _VAL2FLD(PERI_DIV_CMD_TYPE_SEL, dividerType) | + _VAL2FLD(PERI_DIV_CMD_DIV_SEL, dividerNum); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_PeriphGetFrequency +****************************************************************************//** +* +* Reports the frequency of the output of a given peripheral divider. +* +* \param dividerType specifies which type of divider to use; \ref cy_en_divider_types_t +* +* \param dividerNum specifies which divider of the selected type to configure +* +* \return The frequency, in Hz. +* +* \note +* The reported frequency may be zero, which indicates unknown. This happens if +* the source input is clk_ext, ECO, clk_althf, dsi_out, or clk_altlf. +* +*******************************************************************************/ +uint32_t Cy_SysClk_PeriphGetFrequency(cy_en_divider_types_t dividerType, uint32_t dividerNum); +/** \} group_sysclk_clk_peripheral */ + + +/** +* \addtogroup group_sysclk_clk_slow +* \{ +*/ + +/* ========================================================================== */ +/* ========================= clk_slow SECTION ========================= */ +/* ========================================================================== */ +/******************************************************************************* +* Function Name: Cy_SysClk_SlowClkSetDivider +****************************************************************************//** +* +* Sets the clock divider for the slow clock. The source of this clock is the +* peripheral clock (ClkPeri), which is sourced from hf_clk[0]. +* +* \param divider Divider value between 0 and 255. +* Causes integer division of (divider value + 1), or division by 1 to 256. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_SlowClkSetDivider(uint32_t divider) +{ + CY_SYSCLK_CLR_SET(CPUSS->CM0_CLOCK_CTL, CPUSS_CM0_CLOCK_CTL_SLOW_INT_DIV, divider); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_SlowClkGetDivider +****************************************************************************//** +* +* Reports the divider value for the slow clock. +* +* \return The divider value. +* The integer division done is by (divider value + 1), or division by 1 to 256. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_SlowClkGetDivider(void) +{ + return _FLD2VAL(CPUSS_CM0_CLOCK_CTL_SLOW_INT_DIV, CPUSS->CM0_CLOCK_CTL); +} +/** \} group_sysclk_clk_slow */ + + +/** +* \addtogroup group_sysclk_clk_lf +* \{ +*/ + +/* ========================================================================== */ +/* ========================== clk_lf SECTION ========================== */ +/* ========================================================================== */ +/** +* Low frequency (lf_clk) input sources. See CLK_SELECT register, LFCLK_SEL bits. +* Used with functions \ref Cy_SysClk_LfClkSetSource, and \ref Cy_SysClk_LfClkGetSource. +*/ +typedef enum +{ + CY_SYSCLK_LFCLK_IN_ILO = 0u, /**< lf_clk is sourced by the internal low speed oscillator (ILO) */ + CY_SYSCLK_LFCLK_IN_WCO = 1u, /**< lf_clk is sourced by the watch crystal oscillator (WCO) */ + CY_SYSCLK_LFCLK_IN_ALTLF = 2u, /**< lf_clk is sourced by the Alternate Low Frequency Clock (ALTLF) */ + CY_SYSCLK_LFCLK_IN_PILO = 3u /**< lf_clk is sourced by the precision low speed oscillator (PILO) */ +} cy_en_lfclk_input_sources_t; + + +/******************************************************************************* +* Function Name: Cy_SysClk_LfClkSetSource +****************************************************************************//** +* +* Sets the source for the low frequency clock(lf_clk). +* +* \param source \ref cy_en_lfclk_input_sources_t +* +* \note The watchdog timer (WDT) must be unlocked before calling this function. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_LfClkSetSource(cy_en_lfclk_input_sources_t source) +{ + CY_SYSCLK_CLR_SET(SRSS->CLK_SELECT, SRSS_CLK_SELECT_LFCLK_SEL, source); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_LfClkGetSource +****************************************************************************//** +* +* Reports the source for the low frequency clock (lf_clk). +* +* \return \ref cy_en_lfclk_input_sources_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_lfclk_input_sources_t Cy_SysClk_LfClkGetSource(void) +{ + return (cy_en_lfclk_input_sources_t)(_FLD2VAL(SRSS_CLK_SELECT_LFCLK_SEL, SRSS->CLK_SELECT)); +} +/** \} group_sysclk_clk_lf */ + + +/** +* \addtogroup group_sysclk_clk_timer +* \{ +*/ + +/* ========================================================================== */ +/* ======================== clk_timer SECTION ========================= */ +/* ========================================================================== */ +/** +* Timer clock (clk_timer) input sources. See CLK_TIMER_CTL register, TIMER_SEL +* and TIMER_HF0_DIV bits. Used with functions \ref Cy_SysClk_ClkTimerSetSource, and +* \ref Cy_SysClk_ClkTimerGetSource. +*/ +typedef enum +{ + CY_SYSCLK_CLKTIMER_IN_IMO = 0u, /**< clk_timer is sourced by the internal main oscillator (IMO) */ + CY_SYSCLK_CLKTIMER_IN_HF0_NODIV = 1u, /**< clk_timer is sourced by clk_hf0 undivided */ + CY_SYSCLK_CLKTIMER_IN_HF0_DIV2 = 0x101u, /**< clk_timer is sourced by clk_hf0 divided by 2 */ + CY_SYSCLK_CLKTIMER_IN_HF0_DIV4 = 0x201u, /**< clk_timer is sourced by clk_hf0 divided by 4 */ + CY_SYSCLK_CLKTIMER_IN_HF0_DIV8 = 0x301u /**< clk_timer is sourced by clk_hf0 divided by 8 */ +} cy_en_clktimer_input_sources_t; + + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkTimerSetSource +****************************************************************************//** +* +* Sets the source for the timer clock (clk_timer). The timer clock can be used +* as a source for SYSTICK and one or more of the energy profiler counters. +* +* \param source \ref cy_en_clktimer_input_sources_t +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkTimerSetSource(cy_en_clktimer_input_sources_t source) +{ + /* set both fields TIMER_SEL and TIMER_HF0_DIV with the same input value */ + SRSS->CLK_TIMER_CTL = + (SRSS->CLK_TIMER_CTL & ~(SRSS_CLK_TIMER_CTL_TIMER_SEL_Msk | SRSS_CLK_TIMER_CTL_TIMER_HF0_DIV_Msk)) | + (uint32_t)source; +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkTimerGetSource +****************************************************************************//** +* +* Reports the source for the timer clock (clk_timer). +* +* \return \ref cy_en_clktimer_input_sources_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_clktimer_input_sources_t Cy_SysClk_ClkTimerGetSource(void) +{ + /* return both fields TIMER_SEL and TIMER_HF0_DIV as a single combined value */ + return (cy_en_clktimer_input_sources_t) + (SRSS->CLK_TIMER_CTL & (SRSS_CLK_TIMER_CTL_TIMER_SEL_Msk | SRSS_CLK_TIMER_CTL_TIMER_HF0_DIV_Msk)); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkTimerSetDivider +****************************************************************************//** +* +* Sets the divider for the timer clock (clk_timer). +* +* \param divider Divider value; valid range is 0 to 255. Divides the selected +* source (\ref Cy_SysClk_ClkTimerSetSource) by the (value + 1). +* +* \note +* Do not change the divider value while the timer clock is enabled. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkTimerSetDivider(uint32_t divider) +{ + CY_SYSCLK_CLR_SET(SRSS->CLK_TIMER_CTL, SRSS_CLK_TIMER_CTL_TIMER_DIV, divider); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkTimerGetDivider +****************************************************************************//** +* +* Reports the divider value for the timer clock (clk_timer). +* +* \return The divider value +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysClk_ClkTimerGetDivider(void) +{ + return (uint32_t)_FLD2VAL(SRSS_CLK_TIMER_CTL_TIMER_DIV, SRSS->CLK_TIMER_CTL); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkTimerEnable +****************************************************************************//** +* +* Enables the timer clock (clk_timer). The timer clock can be used as a source +* for SYSTICK and one or more of the energy profiler counters. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkTimerEnable(void) +{ + SRSS->CLK_TIMER_CTL |= _VAL2FLD(SRSS_CLK_TIMER_CTL_ENABLE, 1ul); /* 1 = enable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkTimerDisable +****************************************************************************//** +* +* Disables the timer clock (clk_timer). +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkTimerDisable(void) +{ + SRSS->CLK_TIMER_CTL &= ~_VAL2FLD(SRSS_CLK_TIMER_CTL_ENABLE, 1ul); /* 0 = disable */ +} +/** \} group_sysclk_clk_timer */ + +/** +* \addtogroup group_sysclk_clk_pump +* \{ +*/ + +/* ========================================================================== */ +/* ========================= clk_pump SECTION ========================= */ +/* ========================================================================== */ +/** +* Pump clock (clk_pump) input sources. See CLK_SELECT register, PUMP_SEL bits. +* Used with functions \ref Cy_SysClk_ClkPumpSetSource, and +* \ref Cy_SysClk_ClkPumpGetSource. +*/ +typedef enum +{ + CY_SYSCLK_PUMP_IN_CLKPATH0, /**< Pump clock input is clock path 0 */ + CY_SYSCLK_PUMP_IN_CLKPATH1, /**< Pump clock input is clock path 1 */ + CY_SYSCLK_PUMP_IN_CLKPATH2, /**< Pump clock input is clock path 2 */ + CY_SYSCLK_PUMP_IN_CLKPATH3, /**< Pump clock input is clock path 3 */ + CY_SYSCLK_PUMP_IN_CLKPATH4, /**< Pump clock input is clock path 4 */ + CY_SYSCLK_PUMP_IN_CLKPATH5, /**< Pump clock input is clock path 5 */ + CY_SYSCLK_PUMP_IN_CLKPATH6, /**< Pump clock input is clock path 6 */ + CY_SYSCLK_PUMP_IN_CLKPATH7, /**< Pump clock input is clock path 7 */ + CY_SYSCLK_PUMP_IN_CLKPATH8, /**< Pump clock input is clock path 8 */ + CY_SYSCLK_PUMP_IN_CLKPATH9, /**< Pump clock input is clock path 9 */ + CY_SYSCLK_PUMP_IN_CLKPATH10, /**< Pump clock input is clock path 10 */ + CY_SYSCLK_PUMP_IN_CLKPATH11, /**< Pump clock input is clock path 11 */ + CY_SYSCLK_PUMP_IN_CLKPATH12, /**< Pump clock input is clock path 12 */ + CY_SYSCLK_PUMP_IN_CLKPATH13, /**< Pump clock input is clock path 13 */ + CY_SYSCLK_PUMP_IN_CLKPATH14, /**< Pump clock input is clock path 14 */ + CY_SYSCLK_PUMP_IN_CLKPATH15 /**< Pump clock input is clock path 15 */ +} cy_en_clkpump_input_sources_t; + +/** +* Pump clock (clk_pump) divide options. See CLK_SELECT register, PUMP_DIV bits. +* Used with functions \ref Cy_SysClk_ClkPumpSetDivider, and +* \ref Cy_SysClk_ClkPumpGetDivider. +*/ +typedef enum +{ + CY_SYSCLK_PUMP_NO_DIV, /**< No division on pump clock */ + CY_SYSCLK_PUMP_DIV_2, /**< Pump clock divided by 2 */ + CY_SYSCLK_PUMP_DIV_4, /**< Pump clock divided by 4 */ + CY_SYSCLK_PUMP_DIV_8, /**< Pump clock divided by 8 */ + CY_SYSCLK_PUMP_DIV_16 /**< Pump clock divided by 16 */ +} cy_en_clkpump_divide_t; + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkPumpSetSource +****************************************************************************//** +* +* Sets the source for the pump clock (clk_pump). The pump clock can be used for +* the analog pumps in the CTBm block. +* +* \param source \ref cy_en_clkpump_input_sources_t +* +* \note +* Do not change the source while the pump clock is enabled. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkPumpSetSource(cy_en_clkpump_input_sources_t source) +{ + CY_SYSCLK_CLR_SET(SRSS->CLK_SELECT, SRSS_CLK_SELECT_PUMP_SEL, source); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkPumpGetSource +****************************************************************************//** +* +* Reports the source for the pump clock (clk_pump). +* +* \return \ref cy_en_clkpump_input_sources_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_clkpump_input_sources_t Cy_SysClk_ClkPumpGetSource(void) +{ + return (cy_en_clkpump_input_sources_t)_FLD2VAL(SRSS_CLK_SELECT_PUMP_SEL, SRSS->CLK_SELECT); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkPumpSetDivider +****************************************************************************//** +* +* Sets the divider of the pump clock (clk_pump). +* +* \param divider \ref cy_en_clkpump_divide_t +* +* \note +* Do not change the divider value while the pump clock is enabled. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkPumpSetDivider(cy_en_clkpump_divide_t divider) +{ + CY_SYSCLK_CLR_SET(SRSS->CLK_SELECT, SRSS_CLK_SELECT_PUMP_DIV, divider); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkPumpGetDivider +****************************************************************************//** +* +* Reports the divider value for the pump clock (clk_pump). +* +* \return \ref cy_en_clkpump_divide_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_clkpump_divide_t Cy_SysClk_ClkPumpGetDivider(void) +{ + return (cy_en_clkpump_divide_t)_FLD2VAL(SRSS_CLK_SELECT_PUMP_DIV, SRSS->CLK_SELECT); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkPumpEnable +****************************************************************************//** +* +* Enables the pump clock (clk_pump). The pump clock can be used for the analog +* pumps in the CTBm block. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkPumpEnable(void) +{ + SRSS->CLK_SELECT |= _VAL2FLD(SRSS_CLK_SELECT_PUMP_ENABLE, 1ul); /* 1 = enable */ +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkPumpDisable +****************************************************************************//** +* +* Disables the pump clock (clk_pump). +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkPumpDisable(void) +{ + SRSS->CLK_SELECT &= ~_VAL2FLD(SRSS_CLK_SELECT_PUMP_ENABLE, 1ul); /* 0 = disable */ +} +/** \} group_sysclk_clk_pump */ + +/** +* \addtogroup group_sysclk_clk_bak +* \{ +*/ + +/* ========================================================================== */ +/* ========================== clk_bak SECTION ========================= */ +/* ========================================================================== */ +/** +* Backup domain clock (clk_bak) input sources. See BACKUP->CTL register, +* CLK_SEL bits. Used with functions \ref Cy_SysClk_ClkBakSetSource, and +* \ref Cy_SysClk_ClkBakGetSource. +*/ +typedef enum +{ + CY_SYSCLK_BAK_IN_WCO, /**< Backup domain clock input is WCO */ + CY_SYSCLK_BAK_IN_CLKLF /**< Backup domain clock input is clk_lf */ +} cy_en_clkbak_input_sources_t; + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkBakSetSource +****************************************************************************//** +* +* Sets the source for the backup domain clock (clk_bak). +* +* \param source \ref cy_en_clkbak_input_sources_t +* +* \note +* Clk_lf is not available in all power modes. For this reason, WCO is the +* preferred source. If the WCO is routed through the clk_lf multiplexer +* (see \ref Cy_SysClk_LfClkSetSource), select WCO directly - do not select clk_lf. +*******************************************************************************/ +__STATIC_INLINE void Cy_SysClk_ClkBakSetSource(cy_en_clkbak_input_sources_t source) +{ + CY_SYSCLK_CLR_SET(BACKUP->CTL, BACKUP_CTL_CLK_SEL, source); +} + +/******************************************************************************* +* Function Name: Cy_SysClk_ClkBakGetSource +****************************************************************************//** +* +* Reports the source for the backup domain clock (clk_bak). +* +* \return \ref cy_en_clkbak_input_sources_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_clkbak_input_sources_t Cy_SysClk_ClkBakGetSource(void) +{ + return (cy_en_clkbak_input_sources_t)_FLD2VAL(BACKUP_CTL_CLK_SEL, BACKUP->CTL); +} + +/** \} group_sysclk_clk_bak */ + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* __CY_SYSCLK_H__ */ + +/** \} group_sysclk */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysint/cy_sysint.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysint/cy_sysint.c new file mode 100644 index 0000000000..cb724ba75c --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysint/cy_sysint.c @@ -0,0 +1,369 @@ +/***************************************************************************//** +* \file +* \version 1.0 +* +* \brief +* Provides an API implementation of the sysint driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_sysint.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************************* +* Function Name: Cy_SysInt_Init +****************************************************************************//** +* +* \brief Initializes the referenced interrupt by setting the priority and the +* interrupt vector. Note that the interrupt vector will only be relocated if the +* vector table was moved to __ramVectors in SRAM. Otherwise it is ignored. +* +* Use the CMSIS core function NVIC_EnableIRQ(config.intrSrc) +* to enable it. For CM0+, this function also configures the interrupt mux +* connected to the NVIC. Use the CMSIS core function +* NVIC_EnableIRQ(config.intrCm0p) to enable it. +* +* \param config +* Interrupt configuration structure +* +* \param userIsr +* Address of the ISR +* +*******************************************************************************/ +cy_en_sysint_status_t Cy_SysInt_Init(const cy_stc_sysint_t* config, cy_israddress userIsr) +{ + cy_en_sysint_status_t status = CY_SYSINT_SUCCESS; + + if(NULL != config) + { + #if (CY_CPU_CORTEX_M0P) + if (config->intrSrc < 0) + { + NVIC_SetPriority(config->intrSrc, config->intrPriority); + } + else + { + /* Configure the interrupt mux */ + Cy_SysInt_SetIntSource(config); + NVIC_SetPriority((IRQn_Type)(config->intrCm0p), config->intrPriority); + } + #else + /* Set the priority */ + NVIC_SetPriority(config->intrSrc, config->intrPriority); + #endif + + /* Only set the new vector if it was moved to __ramVectors */ + if (SCB->VTOR == (uint32_t)&__ramVectors) + { + (void)Cy_SysInt_SetVector(config, userIsr); + } + } + else + { + status = CY_SYSINT_BAD_PARAM; + } + + return(status); +} + + +#if CY_CPU_CORTEX_M0P || defined (CY_DOXYGEN) + +/******************************************************************************* +* Function Name: Cy_SysInt_SetIntSource +****************************************************************************//** +* +* \brief Configures the interrupt mux for the specified CM0+ NVIC channel. +* +* Setting this value to 240 disconnects the interrupt source and will +* effectively deactivate the interrupt. +* +* \param config +* Interrupt configuration structure. This must be a positive number. +* +*******************************************************************************/ +void Cy_SysInt_SetIntSource(const cy_stc_sysint_t* config) +{ + /* Calculation of variables and masks */ + uint8_t intrMux = config->intrCm0p; + uint8_t regPos = intrMux >> CY_SYSINT_CM0P_MUX_SHIFT; + uint8_t bitPos = (intrMux - (regPos << CY_SYSINT_CM0P_MUX_SHIFT)) << CY_SYSINT_CM0P_MUX_SCALE; + uint32_t bitMask = (uint32_t)(CY_SYSINT_CM0P_MUX_MASK << bitPos); + uint32_t bitMaskClr = (uint32_t)(~bitMask); + uint32_t bitMaskSet = ((config->intrSrc << bitPos) & bitMask); + + uint32_t tempReg; + + switch(regPos) + { + case CY_SYSINT_CM0P_MUX0: + tempReg = CPUSS->CM0_INT_CTL0 & bitMaskClr; + CPUSS->CM0_INT_CTL0 = tempReg | bitMaskSet; + break; + case CY_SYSINT_CM0P_MUX1: + tempReg = CPUSS->CM0_INT_CTL1 & bitMaskClr; + CPUSS->CM0_INT_CTL1 = tempReg | bitMaskSet; + break; + case CY_SYSINT_CM0P_MUX2: + tempReg = CPUSS->CM0_INT_CTL2 & bitMaskClr; + CPUSS->CM0_INT_CTL2 = tempReg | bitMaskSet; + break; + case CY_SYSINT_CM0P_MUX3: + tempReg = CPUSS->CM0_INT_CTL3 & bitMaskClr; + CPUSS->CM0_INT_CTL3 = tempReg | bitMaskSet; + break; + case CY_SYSINT_CM0P_MUX4: + tempReg = CPUSS->CM0_INT_CTL4 & bitMaskClr; + CPUSS->CM0_INT_CTL4 = tempReg | bitMaskSet; + break; + case CY_SYSINT_CM0P_MUX5: + tempReg = CPUSS->CM0_INT_CTL5 & bitMaskClr; + CPUSS->CM0_INT_CTL5 = tempReg | bitMaskSet; + break; + case CY_SYSINT_CM0P_MUX6: + tempReg = CPUSS->CM0_INT_CTL6 & bitMaskClr; + CPUSS->CM0_INT_CTL6 = tempReg | bitMaskSet; + break; + case CY_SYSINT_CM0P_MUX7: + tempReg = CPUSS->CM0_INT_CTL7 & bitMaskClr; + CPUSS->CM0_INT_CTL7 = tempReg | bitMaskSet; + break; + default: + break; + } +} + + +/******************************************************************************* +* Function Name: Cy_SysInt_GetIntSource +****************************************************************************//** +* +* \brief Gets the interrupt source of CM0+ NVIC channel. +* +* \return +* Interrupt source. A returned value of 240 denotes that the interrupt source +* is disconnected. +* +*******************************************************************************/ +uint32_t Cy_SysInt_GetIntSource(IRQn_CM0P_Type muxSel) +{ + /* Calculation of variables */ + uint8_t regPos = muxSel >> CY_SYSINT_CM0P_MUX_SHIFT; + uint8_t bitPos = (muxSel - (regPos << CY_SYSINT_CM0P_MUX_SHIFT)) << CY_SYSINT_CM0P_MUX_SCALE; + uint32_t bitMask = (uint32_t)(CY_SYSINT_CM0P_MUX_MASK << bitPos); + + uint32_t tempReg; + + switch(regPos) + { + case CY_SYSINT_CM0P_MUX0: + tempReg = (uint32_t)((CPUSS->CM0_INT_CTL0 & bitMask) >> bitPos); + break; + case CY_SYSINT_CM0P_MUX1: + tempReg = (uint32_t)((CPUSS->CM0_INT_CTL1 & bitMask) >> bitPos); + break; + case CY_SYSINT_CM0P_MUX2: + tempReg = (uint32_t)((CPUSS->CM0_INT_CTL2 & bitMask) >> bitPos); + break; + case CY_SYSINT_CM0P_MUX3: + tempReg = (uint32_t)((CPUSS->CM0_INT_CTL3 & bitMask) >> bitPos); + break; + case CY_SYSINT_CM0P_MUX4: + tempReg = (uint32_t)((CPUSS->CM0_INT_CTL4 & bitMask) >> bitPos); + break; + case CY_SYSINT_CM0P_MUX5: + tempReg = (uint32_t)((CPUSS->CM0_INT_CTL5 & bitMask) >> bitPos); + break; + case CY_SYSINT_CM0P_MUX6: + tempReg = (uint32_t)((CPUSS->CM0_INT_CTL6 & bitMask) >> bitPos); + break; + case CY_SYSINT_CM0P_MUX7: + tempReg = (uint32_t)((CPUSS->CM0_INT_CTL7 & bitMask) >> bitPos); + break; + default: + tempReg = CY_SYSINT_CM0P_MUX_ERROR; + break; + } + return tempReg; +} +#endif + +/******************************************************************************* +* Function Name: Cy_SysInt_GetState +****************************************************************************//** +* +* \brief Gets the enabled/disabled state of the Interrupt. +* +* For CM0+, this function returns the state of the CM0+ interrupt mux output +* feeding into the NVIC. +* +* \param config +* Interrupt configuration structure +* +* \return +* 1 if enabled, 0 if disabled +* +*******************************************************************************/ +uint32_t Cy_SysInt_GetState(const cy_stc_sysint_t* config) +{ + #if CY_CPU_CORTEX_M0P + if (config->intrSrc < 0) + { + return (*(NVIC->ISER) >> config->intrSrc) & CY_SYSINT_STATE_MASK; + } + else + { + return (*(NVIC->ISER) >> config->intrCm0p) & CY_SYSINT_STATE_MASK; + } + #else + return (*(NVIC->ISER) >> config->intrSrc) & CY_SYSINT_STATE_MASK; + #endif +} + + +/******************************************************************************* +* Function Name: Cy_SysInt_SetVector +****************************************************************************//** +* +* \brief Changes the ISR vector for the Interrupt. +* +* For CM0+, this function sets the interrupt vector for the interrupt mux +* output feeding into the NVIC. +* +* Note that this function relies on the assumption that the vector table is +* relocated to __ramVectors[RAM_VECTORS_SIZE] in SRAM. Otherwise it will +* return the address of the default ISR location in Flash vector table. +* +* \param config +* Interrrupt configuration structure +* +* \param userIsr +* Address of the ISR to set in the interrupt vector table +* +* \return +* Previous address of the ISR in the interrupt vector table, before the +* function call +* +*******************************************************************************/ +cy_israddress Cy_SysInt_SetVector(const cy_stc_sysint_t* config, cy_israddress userIsr) +{ + cy_israddress prevIsr; + + #if CY_CPU_CORTEX_M0P + /* Only set the new vector if it was moved to __ramVectors */ + if (SCB->VTOR == (uint32_t)&__ramVectors) + { + if (config->intrSrc < 0) + { + prevIsr = __ramVectors[CY_INT_IRQ_BASE + config->intrSrc]; + __ramVectors[CY_INT_IRQ_BASE + config->intrSrc] = userIsr; + } + else + { + prevIsr = __ramVectors[CY_INT_IRQ_BASE + config->intrCm0p]; + __ramVectors[CY_INT_IRQ_BASE + config->intrCm0p] = userIsr; + } + } + else + { + if (config->intrSrc < 0) + { + prevIsr = __Vectors[CY_INT_IRQ_BASE + config->intrSrc]; + } + else + { + prevIsr = __Vectors[CY_INT_IRQ_BASE + config->intrCm0p]; + } + } + #else + /* Only set the new vector if it was moved to __ramVectors */ + if (SCB->VTOR == (uint32_t)&__ramVectors) + { + prevIsr = __ramVectors[CY_INT_IRQ_BASE + config->intrSrc]; + __ramVectors[CY_INT_IRQ_BASE + config->intrSrc] = userIsr; + } + else + { + prevIsr = __Vectors[CY_INT_IRQ_BASE + config->intrSrc]; + } + #endif + + return prevIsr; +} + + +/******************************************************************************* +* Function Name: Cy_SysInt_GetVector +****************************************************************************//** +* +* \brief Gets the address of the current ISR vector for the Interrupt. +* +* For CM0+, this function returns the interrupt vector for the interrupt mux +* output feeding into the NVIC. +* +* Note that this function relies on the assumption that the vector table is +* relocated to __ramVectors[RAM_VECTORS_SIZE] in SRAM. +* +* \param config +* Interrupt configuration structure +* +* \return +* Address of the ISR in the interrupt vector table +* +*******************************************************************************/ +cy_israddress Cy_SysInt_GetVector(const cy_stc_sysint_t* config) +{ + #if CY_CPU_CORTEX_M0P + /* Only return the SRAM ISR address if it was moved to __ramVectors */ + if (SCB->VTOR == (uint32_t)&__ramVectors) + { + if (config->intrSrc < 0) + { + return __ramVectors[CY_INT_IRQ_BASE + config->intrSrc]; + } + else + { + return __ramVectors[CY_INT_IRQ_BASE + config->intrCm0p]; + } + } + else + { + if (config->intrSrc < 0) + { + return __Vectors[CY_INT_IRQ_BASE + config->intrSrc]; + } + else + { + return __Vectors[CY_INT_IRQ_BASE + config->intrCm0p]; + } + } + #else + /* Only return the SRAM ISR address if it was moved to __ramVectors */ + if (SCB->VTOR == (uint32_t)&__ramVectors) + { + return __ramVectors[CY_INT_IRQ_BASE + config->intrSrc]; + } + else + { + return __Vectors[CY_INT_IRQ_BASE + config->intrSrc]; + } + #endif +} + + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysint/cy_sysint.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysint/cy_sysint.h new file mode 100644 index 0000000000..df84a2d5c9 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysint/cy_sysint.h @@ -0,0 +1,343 @@ +/***************************************************************************//** +* \file cy_sysint.h +* \version 1.0 +* +* \brief +* Provides an API declaration of the sysint driver +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_sysint System Interrupt (SysInt) +* \{ +* The SysInt driver provides an API to configure the device peripheral interrupts. +* It provides a lightweight interface to complement the CMSIS core NVIC API. +* The provided functions are applicable for all cores in a device and they can +* be used to configure and connect device peripheral interrupts to one or more +* cores. +* +* \n +* Initialization +* +* To configure an interrupt, call Cy_SysInt_Init(). +* Populate the configuration structure (cy_stc_sysint_t) and pass it as a parameter +* along with the ISR address. This initializes the interrupt and +* instructs the CPU to jump to the specified ISR vector upon a valid trigger. +* +* Populating the interrupt configuration structure differs slightly for the CM0+ core. +* This core supports only up to 32 peripheral interrupt channels. To allow all device +* interrupts to be routable to the NVIC of this core, there exists a 240:1 multiplexer +* at each of the 32 NVIC channels. Hence the configuration structure (cy_stc_sysint_t) +* must specify the device interrupt source (intSrc) and the CM0+ NVIC mux (intrCm0p). +* +* \n +* Enable +* +* After initializing an interrupt, use the CMSIS Core NVIC_EnableIRQ() function to +* enable it. The parameter used in this function call differs between the CM0+ cores +* and non-CM0+ cores due to the previously mentioned architectural differences. +* Given an initialization structure named config, the function should be called as +* follows: +* +* - Non-CM0+ : NVIC_EnableIRQ(config.intrSrc) +* - CM0+ : NVIC_EnableIRQ(config.intrCm0p) +* +* \section group_sysint_section_configuration_considerations Configuration Considerations +* +* For the Cortex-M0+ core, NVIC mux positions 28, 29, 30, and 31 are reserved for +* internal use by Cypress. These should not be used by the application code. +* +* \section group_sysint_more_information More Information +* +* Refer to the technical reference manual (TRM) and the device datasheet. +* +* +* \section group_sysint_MISRA MISRA-C Compliance +* +* The sysint driver does not have any specific deviations. +* +* \section group_sysint_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_sysint_macro Macro +* \defgroup group_sysint_globals Global variables +* \defgroup group_sysint_functions Functions +* \defgroup group_sysint_data_structures Data structures +* \defgroup group_sysint_enums Enumerated Types +*/ + + +#if !defined(CY_SYSINT_H) +#define CY_SYSINT_H + +#include +#include "syslib/cy_syslib.h" +#include "cy_device_headers.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/*************************************** +* Global Variable +***************************************/ + +/** +* \addtogroup group_sysint_globals +* \{ +*/ + +extern const cy_israddress __Vectors[]; /**< Vector table in Flash */ +extern cy_israddress __ramVectors[]; /**< Relocated vector table in SRAM */ + +/** \} group_sysint_globals */ + + +/*************************************** +* Global Interrupt +***************************************/ + +/** +* \addtogroup group_sysint_macro +* \{ +*/ + +/** Driver major version */ +#define CY_SYSINT_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_SYSINT_DRV_VERSION_MINOR 0 + +/** SysInt driver ID */ +#define CY_SYSINT_ID CY_PDL_DRV_ID(0x15u) + +/** \} group_sysint_macro */ + + +/*************************************** +* Enumeration +***************************************/ + +/** +* \addtogroup group_sysint_enums +* \{ +*/ + +/** +* SysInt Driver error codes +*/ +typedef enum +{ + CY_SYSINT_SUCCESS = 0x00u, /**< Returned successful */ + CY_SYSINT_BAD_PARAM = CY_SYSINT_ID | CY_PDL_STATUS_ERROR | 0x01u, /**< Bad parameter was passed */ +} cy_en_sysint_status_t; + +/** +* Enumeration values for Cortex-M0+ NVIC multiplexer selection. +* Deep-sleep wakeup-capability is determined by the CPUSS_CM0_DPSLP_IRQ_NR +* parameter, where the first N number of muxes have the capability to trigger +* deep-sleep interrupts. A deep-sleep capable interrupt source must be +* connected to one of these muxes to be able to trigger in deep-sleep. +*/ +typedef enum { + NvicMux0 = 0, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 0 */ + NvicMux1 = 1, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 1 */ + NvicMux2 = 2, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 2 */ + NvicMux3 = 3, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 3 */ + NvicMux4 = 4, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 4 */ + NvicMux5 = 5, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 5 */ + NvicMux6 = 6, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 6 */ + NvicMux7 = 7, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 7 */ + NvicMux8 = 8, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 8 */ + NvicMux9 = 9, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 9 */ + NvicMux10 = 10, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 10 */ + NvicMux11 = 11, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 11 */ + NvicMux12 = 12, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 12 */ + NvicMux13 = 13, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 13 */ + NvicMux14 = 14, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 14 */ + NvicMux15 = 15, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 15 */ + NvicMux16 = 16, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 16 */ + NvicMux17 = 17, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 17 */ + NvicMux18 = 18, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 18 */ + NvicMux19 = 19, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 19 */ + NvicMux20 = 20, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 20 */ + NvicMux21 = 21, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 21 */ + NvicMux22 = 22, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 22 */ + NvicMux23 = 23, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 23 */ + NvicMux24 = 24, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 24 */ + NvicMux25 = 25, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 25 */ + NvicMux26 = 26, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 26 */ + NvicMux27 = 27, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 27 */ + NvicMux28 = 28, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 28 */ + NvicMux29 = 29, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 29 */ + NvicMux30 = 30, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 30 */ + NvicMux31 = 31, /**< NVIC Mux for mapping intrSrc to CM0+ NVIC input 31 */ +} IRQn_CM0P_Type; + +/** \} group_sysint_enums */ + + +/*************************************** +* Configuration Structure +***************************************/ + +/** +* \addtogroup group_sysint_data_structures +* \{ +*/ + +/** +* Initialization configuration structure for a single interrupt channel +*/ +typedef struct { + IRQn_Type intrSrc; /**< Interrupt source */ + IRQn_CM0P_Type intrCm0p; /**< (CM0+ only) Maps intrSrc to 32 available CM0+ NVIC inputs */ + uint32_t intrPriority; /**< Interrupt priority number (Refer to __NVIC_PRIO_BITS) */ +} cy_stc_sysint_t; + +/** \} group_sysint_data_structures */ + + +/*************************************** +* Constants +***************************************/ + +/** \cond INTERNAL */ + +#define CY_INT_IRQ_BASE (16u) /**< Start location of interrupts in the vector table */ +#define CY_SYSINT_STATE_MASK (1ul) /**< Mask for interrupt state */ +#define CY_SYSINT_STIR_MASK (0xfful) /**< Mask for software trigger interrupt register */ +#define CY_SYSINT_CM0P_MUX_MASK (0xfful) /**< CM0+ NVIC multiplexer mask */ +#define CY_SYSINT_CM0P_MUX_SHIFT (2u) /**< CM0+ NVIC multiplexer shift */ +#define CY_SYSINT_CM0P_MUX_SCALE (3u) /**< CM0+ NVIC multiplexer scaling value */ + +#define CY_SYSINT_CM0P_MUX0 (0u) /**< CM0+ NVIC multiplexer register 0 */ +#define CY_SYSINT_CM0P_MUX1 (1u) /**< CM0+ NVIC multiplexer register 1 */ +#define CY_SYSINT_CM0P_MUX2 (2u) /**< CM0+ NVIC multiplexer register 2 */ +#define CY_SYSINT_CM0P_MUX3 (3u) /**< CM0+ NVIC multiplexer register 3 */ +#define CY_SYSINT_CM0P_MUX4 (4u) /**< CM0+ NVIC multiplexer register 4 */ +#define CY_SYSINT_CM0P_MUX5 (5u) /**< CM0+ NVIC multiplexer register 5 */ +#define CY_SYSINT_CM0P_MUX6 (6u) /**< CM0+ NVIC multiplexer register 6 */ +#define CY_SYSINT_CM0P_MUX7 (7u) /**< CM0+ NVIC multiplexer register 7 */ + +#define CY_SYSINT_CM0P_MUX_ERROR (0xfffffffful) /**< Invalid CM0+ NVIC multiplexer error code */ + +/** \endcond */ + + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_sysint_functions +* \{ +*/ +cy_en_sysint_status_t Cy_SysInt_Init(const cy_stc_sysint_t* config, cy_israddress userIsr); +uint32_t Cy_SysInt_GetState(const cy_stc_sysint_t* config); +cy_israddress Cy_SysInt_SetVector(const cy_stc_sysint_t* config, cy_israddress userIsr); +cy_israddress Cy_SysInt_GetVector(const cy_stc_sysint_t* config); +__STATIC_INLINE void Cy_SysInt_SetIntSourceNMI(const cy_stc_sysint_t* config); +__STATIC_INLINE uint32_t Cy_SysInt_GetIntSourceNMI(void); +#if (CY_CPU_CORTEX_M0P) + void Cy_SysInt_SetIntSource(const cy_stc_sysint_t* config); + uint32_t Cy_SysInt_GetIntSource(IRQn_CM0P_Type muxSel); +#else + __STATIC_INLINE void Cy_SysInt_SoftwareTrig(const cy_stc_sysint_t* config); +#endif + + +/******************************************************************************* +* Function Name: Cy_SysInt_SetIntSourceNMI +****************************************************************************//** +* +* \brief Sets the interrupt source of NMI. +* +* Setting this value to 240 disconnects the interrupt source from the NMI. The +* interrupt source must be a positive number. +* +* For CM0+, this function sets the interrupt mux output feeding into the +* NVIC as the source for NMI. +* +* \param config +* Interrupt configuration structure +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysInt_SetIntSourceNMI(const cy_stc_sysint_t* config) +{ + #if CY_CPU_CORTEX_M0P + CPUSS->CM0_NMI_CTL = config->intrCm0p; + #else + CPUSS->CM4_NMI_CTL = config->intrSrc; + #endif +} + + +/******************************************************************************* +* Function Name: Cy_SysInt_GetIntSourceNMI +****************************************************************************//** +* +* \brief Gets the interrupt source of the NMI. +* +* \return +* Interrupt Source. A value of 240 means that there is no interrupt source +* for the NMI, and an interrupt can be triggered only through software. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_SysInt_GetIntSourceNMI(void) +{ + #if CY_CPU_CORTEX_M0P + return (CPUSS->CM0_NMI_CTL); + #else + return (CPUSS->CM4_NMI_CTL); + #endif +} + + +#if (!CY_CPU_CORTEX_M0P) || defined (CY_DOXYGEN) + +/******************************************************************************* +* Function Name: Cy_SysInt_SoftwareTrig +****************************************************************************//** +* +* \brief Triggers an interrupt using software (Not applicable for CM0+). +* +* Note Only privileged software can enable unprivileged access to the +* Software Trigger Interrupt Register (STIR). +* +* \param config +* Interrupt configuration structure +* +*******************************************************************************/ +__STATIC_INLINE void Cy_SysInt_SoftwareTrig(const cy_stc_sysint_t* config) +{ + NVIC->STIR = config->intrSrc & CY_SYSINT_STIR_MASK; +} + +#endif + +/** \} group_sysint_functions */ + +#if defined(__cplusplus) +} +#endif + +#endif /* CY_SYSINT_H */ + +/** \} group_sysint */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syslib/cy_syslib.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syslib/cy_syslib.c new file mode 100644 index 0000000000..7aedbebc3b --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syslib/cy_syslib.c @@ -0,0 +1,654 @@ +/***************************************************************************//** +* \file cy_syslib.c +* \version 1.0 +* +* Description: +* Provides system API implementation for the Cypress PDL 3.0 syslib driver. +* +******************************************************************************** +* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_syslib.h" +#include "ipc/cy_ipc_drv.h" + +/* Flash wait states (LP mode at 1.1v) */ +#define CY_SYSLIB_FLASH_LP_WS_0_FREQ_MAX ( 24UL) +#define CY_SYSLIB_FLASH_LP_WS_1_FREQ_MAX ( 48UL) +#define CY_SYSLIB_FLASH_LP_WS_2_FREQ_MAX ( 72UL) +#define CY_SYSLIB_FLASH_LP_WS_3_FREQ_MAX ( 96UL) +#define CY_SYSLIB_FLASH_LP_WS_4_FREQ_MAX (120UL) + +/* Flash wait states (ULP mode at 0.9v) */ +#define CY_SYSLIB_FLASH_ULP_WS_0_FREQ_MAX ( 16UL) +#define CY_SYSLIB_FLASH_ULP_WS_1_FREQ_MAX ( 33UL) +#define CY_SYSLIB_FLASH_ULP_WS_2_FREQ_MAX ( 50UL) + +/* ROM wait states for the slow clock domain (LP mode at 1.1v) */ +#define CY_SYSLIB_ROM_LP_SLOW_WS_0_FREQ_MAX (100UL) +#define CY_SYSLIB_ROM_LP_SLOW_WS_1_FREQ_MAX (120UL) + +/* ROM wait states for the slow clock domain (ULP mode at 0.9v) */ +#define CY_SYSLIB_ROM_ULP_SLOW_WS_0_FREQ_MAX ( 25UL) +#define CY_SYSLIB_ROM_ULP_SLOW_WS_1_FREQ_MAX ( 50UL) + +/* ROM wait states for the fast clock domain (LP mode at 1.1v) */ +#define CY_SYSLIB_ROM_LP_FAST_WS_0_FREQ_MAX (120UL) + +/* ROM wait states for the slow clock domain (ULP mode at 0.9v) */ +#define CY_SYSLIB_ROM_ULP_FAST_WS_0_FREQ_MAX ( 50UL) + +/* SRAM wait states for the slow clock domain (LP mode at 1.1v) */ +#define CY_SYSLIB_RAM_LP_SLOW_WS_0_FREQ_MAX (100UL) +#define CY_SYSLIB_RAM_LP_SLOW_WS_1_FREQ_MAX (120UL) + +/* SRAM wait states for the slow clock domain (ULP mode at 0.9v) */ +#define CY_SYSLIB_RAM_ULP_SLOW_WS_0_FREQ_MAX ( 25UL) +#define CY_SYSLIB_RAM_ULP_SLOW_WS_1_FREQ_MAX ( 50UL) + +/* SRAM wait states for the fast clock domain (LP mode at 1.1v) */ +#define CY_SYSLIB_RAM_LP_FAST_WS_0_FREQ_MAX (120UL) + +/* SRAM wait states for the fast clock domain (ULP mode at 0.9v) */ +#define CY_SYSLIB_RAM_ULP_FAST_WS_0_FREQ_MAX ( 50UL) + + +#if !defined(NDEBUG) + char_t cy_assertFileName[CY_MAX_FILE_NAME_SIZE]; + uint32_t cy_assertLine; +#endif /* NDEBUG */ + +#if (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) + cy_stc_fault_frame_t cy_faultFrame; +#endif /* (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) */ + + +static void Cy_SysLib_SetWaitStates_ULP(uint32_t clkHfMHz); +static void Cy_SysLib_SetWaitStates_LP(uint32_t clkHfMHz); + + +/******************************************************************************* +* Function Name: Cy_SysLib_Delay +****************************************************************************//** +* +* The function delays by the specified number of milliseconds. +* By default, the number of cycles to delay is calculated based on the +* SystemCoreClock. +* If the parameter is bigger than CY_DELAY_MS_OVERFLOW(32kHz delay), run an +* additional loop to prevent an overflow. +* +* \param milliseconds The number of milliseconds to delay. +* +*******************************************************************************/ +void Cy_SysLib_Delay(uint32_t milliseconds) +{ + while (milliseconds > CY_DELAY_MS_OVERFLOW) + { + /* This loop prevents overflow. + * At 100MHz, milliseconds * cy_delayFreqKhz it overflows at about 42 seconds + */ + Cy_SysLib_DelayCycles(cy_delay32kMs); + milliseconds -= CY_DELAY_MS_OVERFLOW; + } + + Cy_SysLib_DelayCycles(milliseconds * cy_delayFreqKhz); +} + + +/******************************************************************************* +* Function Name: Cy_SysLib_DelayUs +****************************************************************************//** +* +* The function delays by the specified number of microseconds. +* By default, the number of cycles to delay is calculated based on the +* SystemCoreClock. +* +* \param microseconds The number of microseconds to delay. +* +*******************************************************************************/ +void Cy_SysLib_DelayUs(uint16_t microseconds) +{ + Cy_SysLib_DelayCycles((uint32_t) microseconds * cy_delayFreqMhz); +} + + +/******************************************************************************* +* Function Name: Cy_SysLib_Halt +****************************************************************************//** +* +* This function halts the CPU but only the CPU which calls the function. +* It doesn't affect other CPUs. +* +* \param reason The value to be used during debugging. +* +* \note The function executes the BKPT instruction for halting CPU and is +* intended to be used for debug purposes. A regular use case requires +* Debugger attachment before the function call. +* The BKPT instruction causes the CPU to enter the Debug state. Debug +* tools can use this to investigate the system state, when the +* instruction at a particular address is reached. +* +* \note Execution of a BKPT instruction without a debugger attached produces +* a fault. The fault results in the HardFault exception being taken +* or causes Lockup state if it occurs in the NMI or HardFault handler. +* The default HardFault handler make a software reset if the build option +* is release mode (NDEBUG). If the build option is debug mode, the system +* will stay in the infinite loop of the Cy_SysLib_ProcessingFault() +* function. +* +*******************************************************************************/ +__NO_RETURN void Cy_SysLib_Halt(uint32_t reason) +{ + if(0u != reason) + { + /* To remove an unreferenced local variable warning */ + } + + #if defined (__ARMCC_VERSION) + __breakpoint(0x0); + while(1u) {} + #elif defined(__GNUC__) + __asm(" bkpt 1"); + __builtin_unreachable(); + #elif defined (__ICCARM__) + __asm(" bkpt 1"); + #else + #error "Unsupported toolchain" + #endif /* (__ARMCC_VERSION) */ +} + + +/******************************************************************************* +* Function Name: Cy_SysLib_ClearFlashCacheAndBuffer +****************************************************************************//** +* +* This function invalidates the flash cache and buffer. It ensures the valid +* data is read from flash instead of using outdated data from the cache. +* The caches' LRU structure is also reset to their default state. +* +* \note The operation takes a maximum of three clock cycles on the slowest of +* the clk_slow and clk_fast clocks. +* +*******************************************************************************/ +void Cy_SysLib_ClearFlashCacheAndBuffer(void) +{ + FLASHC->FLASH_CMD = FLASHC_FLASH_CMD_INV_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SysLib_GetResetReason +****************************************************************************//** +* +* The function returns the cause for the latest reset(s) that occurred in +* the system. The reset causes in the registers are two separated parts which +* are HFCLK error and system faults. +* The return results are consolidated reset causes for both parts by +* reading both RES_CAUSE and RES_CAUSE2 registers. +* +* \return The cause of a system reset. +* +* | Name | Value +* |-------------------------------|--------------------- +* | CY_SYSLIB_RESET_HWWDT | 0x00001 (bit0) +* | CY_SYSLIB_RESET_ACT_FAULT | 0x00002 (bit1) +* | CY_SYSLIB_RESET_DPSLP_FAULT | 0x00004 (bit2) +* | CY_SYSLIB_RESET_CSV_WCO_LOSS | 0x00008 (bit3) +* | CY_SYSLIB_RESET_SOFT | 0x00010 (bit4) +* | CY_SYSLIB_RESET_SWWDT0 | 0x00020 (bit5) +* | CY_SYSLIB_RESET_SWWDT1 | 0x00040 (bit6) +* | CY_SYSLIB_RESET_SWWDT2 | 0x00080 (bit7) +* | CY_SYSLIB_RESET_SWWDT3 | 0x00100 (bit8) +* | CY_SYSLIB_RESET_HFCLK_LOSS | 0x10000 (bit16) +* | CY_SYSLIB_RESET_HFCLK_ERR | 0x20000 (bit17) +* +*******************************************************************************/ +uint32_t Cy_SysLib_GetResetReason(void) +{ + uint32_t retVal; + + retVal = SRSS->RES_CAUSE | + ((CY_LO16(SRSS->RES_CAUSE2) > 0u) ? CY_SYSLIB_RESET_HFCLK_LOSS : 0u) | + ((CY_HI16(SRSS->RES_CAUSE2) > 0u) ? CY_SYSLIB_RESET_HFCLK_ERR : 0u); + + return (retVal); +} + + +/******************************************************************************* +* Function Name: Cy_SysLib_GetNumHfclkResetCause +****************************************************************************//** +* +* This function returns the number of HF_CLK which is a reset cause (RES_CAUSE2) +* by a loss or an error of the high frequency clock. +* +* The Clock supervisors (CSV) can make a reset as CSV_FREQ_ACTION setting +* when a CSV frequency anomaly is detected. The function returns the index +* of HF_CLK, if a reset occurred due to an anomaly HF_CLK. There are two +* different options for monitoring on HF_CLK which are a frequency loss +* and a frequency error. +* +* \return +* - The number HF_CLK from Clock Supervisor High Frequency Loss: Bits[15:0] +* - The number HF_CLK from Clock Supervisor High Frequency error: Bits[31:16] +* +*******************************************************************************/ +uint32_t Cy_SysLib_GetNumHfclkResetCause(void) +{ + return (SRSS->RES_CAUSE2); +} + + +/******************************************************************************* +* Function Name: Cy_SysLib_ClearResetReason +****************************************************************************//** +* +* This function clears the values of RES_CAUSE and RES_CAUSE2. +* +*******************************************************************************/ +void Cy_SysLib_ClearResetReason(void) +{ + SRSS->RES_CAUSE = SRSS->RES_CAUSE; + SRSS->RES_CAUSE2 = SRSS->RES_CAUSE2; +} + + +#if (CY_CPU_CORTEX_M0P) || defined(CY_DOXYGEN) +/******************************************************************************* +* Function Name: Cy_SysLib_SoftResetCM4 +****************************************************************************//** +* +* This function performs a CM4 Core software reset using the CM4_PWR_CTL +* register. +* +* \note This function should be called only when the CM4 core is in Deep +* Sleep mode. +* \note This function will not reset CM0+ Core. +* +*******************************************************************************/ +void Cy_SysLib_SoftResetCM4(void) +{ + volatile uint32_t msg = CY_IPC_DATA_FOR_CM4_SOFT_RESET; + + /* Tries to acquire the IPC structure and pass the arguments to SROM API. + * SROM API parameters: + * ipcPtr: IPC_STRUCT0 - IPC Structure 0 reserved for M0+ Secure Access. + * notifyEvent_Intr: 1u - IPC Interrupt Structure 1 is used for Releasing IPC 0 (M0+ NMI Handler). + * msgPtr: &msg - The address of SRAM with the API's parameters. + */ + if(CY_IPC_DRV_SUCCESS != Cy_IPC_DRV_SendMsgPtr(IPC_STRUCT0, 1u, (void *) &msg)) + { + CY_ASSERT(0u != 0u); + } +} +#endif /* CY_CPU_CORTEX_M0P || defined(CY_DOXYGEN) */ + + +/******************************************************************************* +* Function Name: Cy_SysLib_GetUniqueId +****************************************************************************//** +* +* This function returns the silicon unique ID. +* The ID includes Die lot[3]#, Die Wafer#, Die X, Die Y, DIE Sort# and +* Die Minor# +* +* \return +* A combined 64-bit unique ID. +* [63:56] - DIE_MINOR +* [55:48] - DIE_SORT +* [47:40] - DIE_Y +* [39:32] - DIE_X +* [31:24] - DIE_WAFER +* [23:16] - DIE_LOT[2] +* [15: 8] - DIE_LOT[1] +* [ 7: 0] - DIE_LOT[0] +* +*******************************************************************************/ +uint64_t Cy_SysLib_GetUniqueId(void) +{ + uint64_t uniqueId; + + uniqueId = ((uint64_t)SFLASH->DIE_MINOR << CY_UNIQUE_ID_DIE_MINOR_Pos) | + ((uint64_t)SFLASH->DIE_SORT << CY_UNIQUE_ID_DIE_SORT_Pos) | + ((uint64_t)SFLASH->DIE_Y << CY_UNIQUE_ID_DIE_Y_Pos) | + ((uint64_t)SFLASH->DIE_X << CY_UNIQUE_ID_DIE_X_Pos) | + ((uint64_t)SFLASH->DIE_WAFER << CY_UNIQUE_ID_DIE_WAFER_Pos) | + ((uint64_t)SFLASH->DIE_LOT[2u] << CY_UNIQUE_ID_DIE_LOT_2_Pos) | + ((uint64_t)SFLASH->DIE_LOT[1u] << CY_UNIQUE_ID_DIE_LOT_1_Pos) | + ((uint64_t)SFLASH->DIE_LOT[0u] << CY_UNIQUE_ID_DIE_LOT_0_Pos); + + return (uniqueId); +} + + +#if (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) || defined(CY_DOXYGEN) +/******************************************************************************* +* Function Name: Cy_SysLib_FaultHandler +****************************************************************************//** +* +* This function stores the ARM Cortex registers into a non-zero init area for +* debugging. This function calls Cy_SysLib_ProcessingFault() after storing all +* the information. +* +* \param faultStackAddr The address of the stack pointer, indicates the lowest +* address in the fault stack frame to be stored. +* \note This function stores the fault stack frame only for the first occurred +* fault. +* \note This function sets two flags into the fault structure: one checks +* which core cause fault, another checks the type of fault for CM4 core. +* The flags should be cleared after analysis of the stored +* register values, to have possibility to distinguish the next fault. +* \note The PDL doesn't provide an API which can analyse the stored register +* values. A user has to add additional functions for the analysis, +* if necessary. +* \note The CY_ARM_FAULT_DEBUG macro defines if the Fault Handler is enabled. +* By default it is set to CY_ARM_FAULT_DEBUG_ENABLED and enables the +* Fault Handler. +* If there is a necessity to save memory or have some specific custom +* handler, etc. then CY_ARM_FAULT_DEBUG should be redefined as +* CY_ARM_FAULT_DEBUG_DISABLED. To do this the following definition should +* be added to the compiler Command Line (through the project Build +* Settings): "-D CY_ARM_FAULT_DEBUG=0". +* +*******************************************************************************/ +void Cy_SysLib_FaultHandler(uint32_t const *faultStackAddr) +{ + #if (CY_CPU_CORTEX_M0P) + if(CY_CM0P_FAULT_TYPE != cy_faultFrame.fault) + { + cy_faultFrame.fault = CY_CM0P_FAULT_TYPE; /* CM0P fault occurred. */ + #elif (CY_CPU_CORTEX_M4) + if(CY_CM4_FAULT_TYPE != cy_faultFrame.fault) + { + cy_faultFrame.fault = CY_CM4_FAULT_TYPE; /* CM4 fault occurred. */ + /* Stores the Configurable Fault Status Register state with the fault cause */ + cy_faultFrame.cfsr = SCB->CFSR; + cy_faultFrame.faultType = CY_NON_FPU_FAULT_TYPE; + #endif /* CY_CPU_CORTEX_M0P */ + /* Stores general registers */ + cy_faultFrame.r0 = faultStackAddr[CY_R0_Pos]; + cy_faultFrame.r1 = faultStackAddr[CY_R1_Pos]; + cy_faultFrame.r2 = faultStackAddr[CY_R2_Pos]; + cy_faultFrame.r3 = faultStackAddr[CY_R3_Pos]; + cy_faultFrame.r12 = faultStackAddr[CY_R12_Pos]; + cy_faultFrame.lr = faultStackAddr[CY_LR_Pos]; + cy_faultFrame.pc = faultStackAddr[CY_PC_Pos]; + cy_faultFrame.psr = faultStackAddr[CY_PSR_Pos]; + + #if (CY_CPU_CORTEX_M4) && ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U))) + /* Checks cumulative exception bits for floating-point exceptions */ + if(0U != (__get_FPSCR() & (CY_FPSCR_IXC_Msk | CY_FPSCR_IDC_Msk))) + { + cy_faultFrame.faultType = CY_FPU_FAULT_TYPE; + cy_faultFrame.s0 = faultStackAddr[CY_S0_Pos]; + cy_faultFrame.s1 = faultStackAddr[CY_S1_Pos]; + cy_faultFrame.s2 = faultStackAddr[CY_S2_Pos]; + cy_faultFrame.s3 = faultStackAddr[CY_S3_Pos]; + cy_faultFrame.s4 = faultStackAddr[CY_S4_Pos]; + cy_faultFrame.s5 = faultStackAddr[CY_S5_Pos]; + cy_faultFrame.s6 = faultStackAddr[CY_S6_Pos]; + cy_faultFrame.s7 = faultStackAddr[CY_S7_Pos]; + cy_faultFrame.s8 = faultStackAddr[CY_S8_Pos]; + cy_faultFrame.s9 = faultStackAddr[CY_S9_Pos]; + cy_faultFrame.s10 = faultStackAddr[CY_S10_Pos]; + cy_faultFrame.s11 = faultStackAddr[CY_S11_Pos]; + cy_faultFrame.s12 = faultStackAddr[CY_S12_Pos]; + cy_faultFrame.s13 = faultStackAddr[CY_S13_Pos]; + cy_faultFrame.s14 = faultStackAddr[CY_S14_Pos]; + cy_faultFrame.s15 = faultStackAddr[CY_S15_Pos]; + cy_faultFrame.fpscr = faultStackAddr[CY_FPSCR_Pos]; + } + #endif /* CY_CPU_CORTEX_M4 && __FPU_PRESENT */ + } + + Cy_SysLib_ProcessingFault(); +} + + +/******************************************************************************* +* Function Name: Cy_SysLib_ProcessingFault +****************************************************************************//** +* +* This function determines how to process the current fault state. By default +* in case of exception the system will stay in the infinite loop of this +* function. +* +* \note This function has WEAK option, so the user can redefine the function +* for a custom processing. +* For example the function redefinition could be constructed from fault +* stack processing and NVIC_SystemReset() function call. +* +*******************************************************************************/ +CY_WEAK void Cy_SysLib_ProcessingFault(void) +{ + while(1u) {} +} +#endif /* (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) || defined(CY_DOXYGEN) */ + + +/******************************************************************************* +* Function Name: Cy_SysLib_SetWaitStates +****************************************************************************//** +* +* Sets the number of clock cycles the cache will wait for, before it samples +* data coming back from ROM, SRAM, and Flash. +* +* Call this function before increasing the HFClk0 High Frequency clock. +* Call this function optionally after lowering the HFClk0 High Frequency clock +* in order to improve the CPU performance. +* +* Also, call this function before switching core supply regulator voltage (LDO +* or SIMO Buck) from 1.1V to 0.9V. +* Call this function optionally after switching core supply regulator voltage +* from 0.9V to 1.1V in order to improve the CPU performance. +* +* \param ulpMode The device power mode. +* true, if the device should be switched to the ULP mode (nominal voltage of +* the core supply regulator should be switched to 0.9V); +* false, if the device should be switched to the LP mode (nominal voltage of +* the core supply regulator should be switched to 1.1V). +* +* \note Refer to the device TRM for low power modes description. +* +* \param clkHfMHz The HFClk0 clock frequency in MHz. +* +*******************************************************************************/ +void Cy_SysLib_SetWaitStates(bool ulpMode, uint32_t clkHfMHz) +{ + if (ulpMode) + { + Cy_SysLib_SetWaitStates_ULP(clkHfMHz); + } + else + { + Cy_SysLib_SetWaitStates_LP(clkHfMHz); + } +} + + +/******************************************************************************* +* Function Name: Cy_SysLib_SetWaitStates_LP +****************************************************************************//** +* +* Sets the ROM, SRAM, and Flash wait states for the low power mode. +* This function is called by Cy_SysLib_SetWaitStates(). +* +*******************************************************************************/ +static void Cy_SysLib_SetWaitStates_LP(uint32_t clkHfMHz) +{ + uint32_t waitStates; + + /* ROM */ + if (clkHfMHz < CY_SYSLIB_ROM_LP_SLOW_WS_0_FREQ_MAX) + { + waitStates = 0UL; + } else if (clkHfMHz <= CY_SYSLIB_ROM_LP_SLOW_WS_1_FREQ_MAX) + { + waitStates = 1UL; + } else + { + waitStates = 3UL; + } + CPUSS->ROM_CTL = _CLR_SET_FLD32U(CPUSS->ROM_CTL, CPUSS_ROM_CTL_SLOW_WS, waitStates); + + if (clkHfMHz <= CY_SYSLIB_ROM_LP_FAST_WS_0_FREQ_MAX) + { + waitStates = 0UL; + } else + { + waitStates = 3UL; + } + CPUSS->ROM_CTL = _CLR_SET_FLD32U(CPUSS->ROM_CTL, CPUSS_ROM_CTL_FAST_WS, waitStates); + + /* SRAM */ + if (clkHfMHz < CY_SYSLIB_RAM_LP_SLOW_WS_0_FREQ_MAX) + { + waitStates = 0UL; + } else if (clkHfMHz <= CY_SYSLIB_RAM_LP_SLOW_WS_1_FREQ_MAX) + { + waitStates = 1UL; + } else + { + waitStates = 3UL; + } + CPUSS->RAM0_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM0_CTL0, CPUSS_RAM0_CTL0_SLOW_WS, waitStates); + #if defined (RAMC1_PRESENT) && (RAMC1_PRESENT == 1UL) + CPUSS->RAM1_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM1_CTL0, CPUSS_RAM1_CTL0_SLOW_WS, waitStates); + #endif /* defined (RAMC1_PRESENT) && (RAMC1_PRESENT == 1UL) */ + #if defined (RAMC2_PRESENT) && (RAMC2_PRESENT == 1UL) + CPUSS->RAM2_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM2_CTL0, CPUSS_RAM2_CTL0_SLOW_WS, waitStates); + #endif /* defined (RAMC2_PRESENT) && (RAMC2_PRESENT == 1UL) */ + + if (clkHfMHz <= CY_SYSLIB_RAM_LP_FAST_WS_0_FREQ_MAX) + { + waitStates = 0UL; + } else + { + waitStates = 3UL; + } + CPUSS->RAM0_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM0_CTL0, CPUSS_RAM0_CTL0_FAST_WS, waitStates); + #if defined (RAMC1_PRESENT) && (RAMC1_PRESENT == 1UL) + CPUSS->RAM1_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM1_CTL0, CPUSS_RAM1_CTL0_SLOW_WS, waitStates); + #endif /* defined (RAMC1_PRESENT) && (RAMC1_PRESENT == 1UL) */ + #if defined (RAMC2_PRESENT) && (RAMC2_PRESENT == 1UL) + CPUSS->RAM2_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM2_CTL0, CPUSS_RAM2_CTL0_SLOW_WS, waitStates); + #endif /* defined (RAMC2_PRESENT) && (RAMC2_PRESENT == 1UL) */ + + /* Flash */ + if (clkHfMHz <= CY_SYSLIB_FLASH_LP_WS_0_FREQ_MAX) + { + waitStates = 0UL; + } else if (clkHfMHz <= CY_SYSLIB_FLASH_LP_WS_1_FREQ_MAX) + { + waitStates = 1UL; + } else if (clkHfMHz <= CY_SYSLIB_FLASH_LP_WS_2_FREQ_MAX) + { + waitStates = 2UL; + } else if (clkHfMHz <= CY_SYSLIB_FLASH_LP_WS_3_FREQ_MAX) + { + waitStates = 3UL; + } else if (clkHfMHz <= CY_SYSLIB_FLASH_LP_WS_4_FREQ_MAX) + { + waitStates = 4UL; + } else + { + waitStates = 5UL; + } + + FLASHC->FLASH_CTL = _CLR_SET_FLD32U(FLASHC->FLASH_CTL, FLASHC_FLASH_CTL_MAIN_WS, waitStates); +} + + +/******************************************************************************* +* Function Name: Cy_SysLib_SetWaitStates_ULP +****************************************************************************//** +* +* Sets the ROM, SRAM, and Flash wait states for the ultra-low power mode. +* This function is called by Cy_SysLib_SetWaitStates(). +* +*******************************************************************************/ +#if (SRSS_SIMOBUCK_PRESENT == 1UL) +static void Cy_SysLib_SetWaitStates_ULP(uint32_t clkHfMHz) +{ + uint32_t waitStates; + + /* ROM */ + if (clkHfMHz < CY_SYSLIB_ROM_ULP_SLOW_WS_0_FREQ_MAX) + { + waitStates = 0UL; + } else if (clkHfMHz <= CY_SYSLIB_ROM_ULP_SLOW_WS_1_FREQ_MAX) + { + waitStates = 1UL; + } else + { + waitStates = 3UL; + } + CPUSS->ROM_CTL = _CLR_SET_FLD32U(CPUSS->ROM_CTL, CPUSS_ROM_CTL_SLOW_WS, waitStates); + + if (clkHfMHz <= CY_SYSLIB_ROM_ULP_FAST_WS_0_FREQ_MAX) + { + waitStates = 0UL; + } else + { + waitStates = 2UL; + } + CPUSS->ROM_CTL = _CLR_SET_FLD32U(CPUSS->ROM_CTL, CPUSS_ROM_CTL_FAST_WS, waitStates); + + /* SRAM */ + if (clkHfMHz < CY_SYSLIB_RAM_ULP_SLOW_WS_0_FREQ_MAX) + { + waitStates = 0UL; + } else if (clkHfMHz <= CY_SYSLIB_RAM_ULP_SLOW_WS_1_FREQ_MAX) + { + waitStates = 1UL; + } else + { + waitStates = 3UL; + } + CPUSS->RAM0_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM0_CTL0, CPUSS_RAM0_CTL0_SLOW_WS, waitStates); + #if defined (RAMC1_PRESENT) && (RAMC1_PRESENT == 1UL) + CPUSS->RAM1_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM1_CTL0, CPUSS_RAM1_CTL0_SLOW_WS, waitStates); + #endif /* defined (RAMC1_PRESENT) && (RAMC1_PRESENT == 1UL) */ + #if defined (RAMC2_PRESENT) && (RAMC2_PRESENT == 1UL) + CPUSS->RAM2_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM2_CTL0, CPUSS_RAM2_CTL0_SLOW_WS, waitStates); + #endif /* defined (RAMC2_PRESENT) && (RAMC2_PRESENT == 1UL) */ + + if (clkHfMHz <= CY_SYSLIB_RAM_ULP_FAST_WS_0_FREQ_MAX) + { + waitStates = 0UL; + } else + { + waitStates = 2UL; + } + CPUSS->RAM0_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM0_CTL0, CPUSS_RAM0_CTL0_FAST_WS, waitStates); + #if defined (RAMC1_PRESENT) && (RAMC1_PRESENT == 1UL) + CPUSS->RAM1_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM1_CTL0, CPUSS_RAM1_CTL0_SLOW_WS, waitStates); + #endif /* defined (RAMC1_PRESENT) && (RAMC1_PRESENT == 1UL) */ + #if defined (RAMC2_PRESENT) && (RAMC2_PRESENT == 1UL) + CPUSS->RAM2_CTL0 = _CLR_SET_FLD32U(CPUSS->RAM2_CTL0, CPUSS_RAM2_CTL0_SLOW_WS, waitStates); + #endif /* defined (RAMC2_PRESENT) && (RAMC2_PRESENT == 1UL) */ + + /* Flash */ + if (clkHfMHz <= CY_SYSLIB_FLASH_ULP_WS_0_FREQ_MAX) + { + waitStates = 0UL; + } else if (clkHfMHz <= CY_SYSLIB_FLASH_ULP_WS_1_FREQ_MAX) + { + waitStates = 1UL; + } else if (clkHfMHz <= CY_SYSLIB_FLASH_ULP_WS_2_FREQ_MAX) + { + waitStates = 2UL; + } else + { + waitStates = 4UL; + } + + FLASHC->FLASH_CTL = _CLR_SET_FLD32U(FLASHC->FLASH_CTL, FLASHC_FLASH_CTL_MAIN_WS, waitStates); +} +#endif /* (SRSS_SIMOBUCK_PRESENT == 1UL) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syslib/cy_syslib.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syslib/cy_syslib.h new file mode 100644 index 0000000000..8bf6b7e0d8 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syslib/cy_syslib.h @@ -0,0 +1,800 @@ +/***************************************************************************//** +* \file cy_syslib.h +* \version 1.0 +* +* Provides an API declaration of the syslib driver. +* +******************************************************************************** +* \copyright +* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_syslib System Library (SysLib) +* \{ +* The system libraries provide APIs that can be called in the user application +* to handle the timing, logical checking or register. +* +* SysLib driver contains a set of different system functions. These functions +* can be called in the application routine. Some features of the system library: +* * Delay functions +* * Register read/write macro +* * Assert and Halt +* * Software reset +* * Reading a reset cause +* * API to invalidate the flash cache and buffer +* * Data manipulation +* * A variable type definition from MISRA-C specifying signedness +* * Cross compiler compatible attributes +* * Get silicon unique ID API +* +* \section group_syslib_configuration Configuration Considerations +* There are no general SysLib configuration concerns. +* +* \section group_syslib_more_information More Information +* Refer to the technical reference manual (TRM). +* +* \section group_syslib_MISRA MISRA Compliance +* The SysLib driver does not have any specific deviations. +* +* \section group_syslib_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_syslib_macro Macro +* \defgroup group_syslib_functions Functions +* \defgroup group_syslib_data_structures Data Structures +* +*/ + +#if !defined(_CY_SYSLIB_H_) +#define _CY_SYSLIB_H_ + +#if !defined(NDEBUG) + #include +#endif /* NDEBUG */ +#include +#include +#include "cy_device_headers.h" + +#if defined(__cplusplus) +extern "C" { +#endif /* defined(__cplusplus) */ + +#if defined( __ICCARM__ ) + /* Suppress the warning for multiple volatile variables in an expression. */ + /* This is common for drivers code and the usage is not order-dependent. */ + #pragma diag_suppress=Pa082 +#endif /* defined( __ICCARM__ ) */ + + +/** +* \addtogroup group_syslib_data_structures +* \{ +*

The base types. Acceptable types from MISRA-C specifying signedness and size. +* These types must not be used. The default types should be used instead. +* These types are left for backward compatibility only.

+*/ + +typedef uint8_t uint8; /**< Alias to uint8_t for backward compatibility */ +typedef uint16_t uint16; /**< Alias to uint16_t for backward compatibility */ +typedef uint32_t uint32; /**< Alias to uint32_t for backward compatibility */ +typedef int8_t int8; /**< Alias to int8_t for backward compatibility */ +typedef int16_t int16; /**< Alias to int16_t for backward compatibility */ +typedef int32_t int32; /**< Alias to int32_t for backward compatibility */ +typedef float float32; /**< Alias to float for backward compatibility */ +typedef double float64; /**< Alias to double for backward compatibility */ +typedef int64_t int64; /**< Alias to int64_t for backward compatibility */ +typedef uint64_t uint64; /**< Alias to uint64_t for backward compatibility */ +/* Signed or unsigned depending on the compiler selection */ +typedef char char8; /**< Alias to char for backward compatibility */ + +/* MISRA rule 6.3 recommends use specific-length typedef for the basic + * numerical types of signed and unsigned variants of char, float, and double. + */ +typedef char char_t; /**< Specific-length typedef for the basic numerical types of char */ +typedef float float32_t; /**< Specific-length typedef for the basic numerical types of float */ +typedef double float64_t; /**< Specific-length typedef for the basic numerical types of double */ + +/******************************************************************************* +* Hardware Register Types +*******************************************************************************/ + +typedef volatile uint8_t reg8; /**< Alias to uint8_t for backward compatibility */ +typedef volatile uint16_t reg16; /**< Alias to uint16_t for backward compatibility */ +typedef volatile uint32_t reg32; /**< Alias to uint32_t for backward compatibility */ + +/******************************************************************************* +* General cytypes +*******************************************************************************/ +/** ARM 32-bit status value */ +typedef uint32_t cy_status; + +/** \cond INTERNAL */ +/** ARM 32-bit status value for backward compatibility with the UDB components. Do not use it in your code. */ +typedef uint32_t cystatus; +/** \endcond */ + +/** \} group_syslib_data_structures */ + +/** +* \addtogroup group_syslib_macro +* \{ +*/ + +/****************************************************************************** +* Macros +*****************************************************************************/ + +#define CY_CPU_CORTEX_M0P (__CORTEX_M == 0) /**< CM0+ core CPU Code */ +#define CY_CPU_CORTEX_M4 (__CORTEX_M == 4) /**< CM4 core CPU Code */ + +/** Macro to disable the Fault Handler */ +#define CY_ARM_FAULT_DEBUG_DISABLED (0u) +/** Macro to enable the Fault Handler */ +#define CY_ARM_FAULT_DEBUG_ENABLED (1u) + +#if !defined(CY_ARM_FAULT_DEBUG) + /** Macro defines if the Fault Handler is enabled. Enabled by default. */ + #define CY_ARM_FAULT_DEBUG (CY_ARM_FAULT_DEBUG_ENABLED) +#endif /* CY_ARM_FAULT_DEBUG */ + +/** +* \defgroup group_syslib_macro_status_codes Status codes +* \{ +* Function status type codes +*/ +#define CY_PDL_STATUS_CODE_Pos (0u) /**< The module status code position in the status code */ +#define CY_PDL_STATUS_TYPE_Pos (16u) /**< The status type position in the status code */ +#define CY_PDL_MODULE_ID_Pos (18u) /**< The software module ID position in the status code */ +#define CY_PDL_STATUS_INFO (0UL << CY_PDL_STATUS_TYPE_Pos) /**< Information status type */ +#define CY_PDL_STATUS_WARNING (1UL << CY_PDL_STATUS_TYPE_Pos) /**< Warning status type */ +#define CY_PDL_STATUS_ERROR (2UL << CY_PDL_STATUS_TYPE_Pos) /**< Error status type */ +#define CY_PDL_MODULE_ID_Msk (0x3FFFu) /**< The software module ID mask */ +/* Get the software PDL module ID */ +#define CY_PDL_DRV_ID(id) ((uint32_t)((uint32_t)((id) & CY_PDL_MODULE_ID_Msk) << CY_PDL_MODULE_ID_Pos)) +#define CY_SYSLIB_ID CY_PDL_DRV_ID(0x11u) /**< SYSLIB PDL ID */ +/** \} group_syslib_macro_status_codes */ + +/** \} group_syslib_macro */ + +/** +* \addtogroup group_syslib_data_structures +* \{ +*/ +/** The SysLib status code structure. */ +typedef enum +{ + CY_SYSLIB_SUCCESS = 0x00UL, /**< Success status code */ + CY_SYSLIB_BAD_PARAM = CY_SYSLIB_ID | CY_PDL_STATUS_ERROR | 0x01UL, /**< Bad parameter status code */ + CY_SYSLIB_TIMEOUT = CY_SYSLIB_ID | CY_PDL_STATUS_ERROR | 0x02UL, /**< Time out status code */ + CY_SYSLIB_INVALID_STATE = CY_SYSLIB_ID | CY_PDL_STATUS_ERROR | 0x03UL, /**< Invalid state status code */ + CY_SYSLIB_UNKNOWN = CY_SYSLIB_ID | CY_PDL_STATUS_ERROR | 0xFFUL /**< Unknown status code */ +} cy_en_syslib_status_t; + +#if (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) +/** The Fault configuration structure. */ +typedef struct +{ + uint32_t fault; /**< Indicates if the fault occurred */ + uint32_t r0; /**< R0 register content */ + uint32_t r1; /**< R1 register content */ + uint32_t r2; /**< R2 register content */ + uint32_t r3; /**< R3 register content */ + uint32_t r12; /**< R12 register content */ + uint32_t lr; /**< LR register content */ + uint32_t pc; /**< PC register content */ + uint32_t psr; /**< PSR register content */ + + #if (CY_CPU_CORTEX_M4) + uint32_t cfsr; /**< CFSR register content */ + uint32_t faultType; /**< FPU or regular fault type */ + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U))) + uint32_t s0; /**< FPU S0 register content */ + uint32_t s1; /**< FPU S1 register content */ + uint32_t s2; /**< FPU S2 register content */ + uint32_t s3; /**< FPU S3 register content */ + uint32_t s4; /**< FPU S4 register content */ + uint32_t s5; /**< FPU S5 register content */ + uint32_t s6; /**< FPU S6 register content */ + uint32_t s7; /**< FPU S7 register content */ + uint32_t s8; /**< FPU S8 register content */ + uint32_t s9; /**< FPU S9 register content */ + uint32_t s10; /**< FPU S10 register content */ + uint32_t s11; /**< FPU S11 register content */ + uint32_t s12; /**< FPU S12 register content */ + uint32_t s13; /**< FPU S13 register content */ + uint32_t s14; /**< FPU S14 register content */ + uint32_t s15; /**< FPU S15 register content */ + uint32_t fpscr; /**< FPU FPSCR register content */ + #endif /* __FPU_PRESENT */ + #endif /* CY_CPU_CORTEX_M4 */ +} cy_stc_fault_frame_t; +#endif /* (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) */ + +/** \} group_syslib_data_structures */ + +/** +* \addtogroup group_syslib_macro +* \{ +*/ + +/** Driver major version */ +#define CY_SYSLIB_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_SYSLIB_DRV_VERSION_MINOR 0 + +/** \cond INTERNAL */ +/** ARM 32-bit Return error / status codes for backward compatibility. +* Do not use them in your code. +*/ +#define CY_RET_SUCCESS (0x00u) /* Successful */ +#define CY_RET_BAD_PARAM (0x01u) /* One or more invalid parameters */ +#define CY_RET_INVALID_OBJECT (0x02u) /* Invalid object specified */ +#define CY_RET_MEMORY (0x03u) /* Memory related failure */ +#define CY_RET_LOCKED (0x04u) /* Resource lock failure */ +#define CY_RET_EMPTY (0x05u) /* No more objects available */ +#define CY_RET_BAD_DATA (0x06u) /* Bad data received (CRC or other error check) */ +#define CY_RET_STARTED (0x07u) /* Operation started, but not necessarily completed yet */ +#define CY_RET_FINISHED (0x08u) /* Operation completed */ +#define CY_RET_CANCELED (0x09u) /* Operation canceled */ +#define CY_RET_TIMEOUT (0x10u) /* Operation timed out */ +#define CY_RET_INVALID_STATE (0x11u) /* Operation not setup or is in an improper state */ +#define CY_RET_UNKNOWN ((cy_status) 0xFFFFFFFFu) /* Unknown failure */ + +/** ARM 32-bit Return error / status codes for backward compatibility with the UDB components. +* Do not use them in your code. +*/ +#define CYRET_SUCCESS (0x00u) /* Successful */ +#define CYRET_BAD_PARAM (0x01u) /* One or more invalid parameters */ +#define CYRET_INVALID_OBJECT (0x02u) /* Invalid object specified */ +#define CYRET_MEMORY (0x03u) /* Memory related failure */ +#define CYRET_LOCKED (0x04u) /* Resource lock failure */ +#define CYRET_EMPTY (0x05u) /* No more objects available */ +#define CYRET_BAD_DATA (0x06u) /* Bad data received (CRC or other error check) */ +#define CYRET_STARTED (0x07u) /* Operation started, but not necessarily completed yet */ +#define CYRET_FINISHED (0x08u) /* Operation completed */ +#define CYRET_CANCELED (0x09u) /* Operation canceled */ +#define CYRET_TIMEOUT (0x10u) /* Operation timed out */ +#define CYRET_INVALID_STATE (0x11u) /* Operation not setup or is in an improper state */ +#define CYRET_UNKNOWN ((cystatus) 0xFFFFFFFFu) /* Unknown failure */ +/** \endcond */ + + +/******************************************************************************* +* Data manipulation defines +*******************************************************************************/ + +/** Get the lower 8 bits of a 16-bit value. */ +#define CY_LO8(x) ((uint8_t) ((x) & 0xFFu)) +/** Get the upper 8 bits of a 16-bit value. */ +#define CY_HI8(x) ((uint8_t) ((uint16_t)(x) >> 8u)) + +/** Get the lower 16 bits of a 32-bit value. */ +#define CY_LO16(x) ((uint16_t) ((x) & 0xFFFFu)) +/** Get the upper 16 bits of a 32-bit value. */ +#define CY_HI16(x) ((uint16_t) ((uint32_t)(x) >> 16u)) + +/** Swap the byte ordering of a 16-bit value */ +#define CY_SWAP_ENDIAN16(x) ((uint16_t)(((x) << 8u) | (((x) >> 8u) & 0x00FFu))) + +/** Swap the byte ordering of a 32-bit value */ +#define CY_SWAP_ENDIAN32(x) ((uint32_t)((((x) >> 24u) & 0x000000FFu) | (((x) & 0x00FF0000u) >> 8u) | \ + (((x) & 0x0000FF00u) << 8u) | ((x) << 24u))) + +/** Swap the byte ordering of a 64-bit value */ +#define CY_SWAP_ENDIAN64(x) ((uint64_t) (((uint64_t) CY_SWAP_ENDIAN32((uint32_t)(x)) << 32u) | \ + CY_SWAP_ENDIAN32((uint32_t)((x) >> 32u)))) + + +/******************************************************************************* +* Memory model definitions +*******************************************************************************/ +#if defined(__ARMCC_VERSION) + + /** To create cross compiler compatible code, use the CY_NOINIT, CY_SECTION, CY_UNUSED, CY_ALIGN + * attributes at the first place of declaration/definition. + * For example: CY_NOINIT uint32_t noinitVar; + */ + #define CY_NOINIT __attribute__ ((section(".noinit"), zero_init)) + #define CY_SECTION(name) __attribute__ ((section(name))) + #define CY_UNUSED __attribute__ ((unused)) + + /* Specifies the minimum alignment (in bytes) for variables of the specified type. */ + #define CY_ALIGN(align) __ALIGNED(align) + #define CY_WEAK __weak + +#elif defined (__GNUC__) + + #define CY_NOINIT __attribute__ ((section(".noinit"))) + #define CY_SECTION(name) __attribute__ ((section(name))) + #define CY_UNUSED __attribute__ ((unused)) + #define CY_ALIGN(align) __ALIGNED(align) + #define CY_WEAK __attribute__ ((weak)) + +#elif defined (__ICCARM__) + + #define CY_PRAGMA(x) _Pragma(#x) + #define CY_NOINIT __no_init + #define CY_SECTION(name) CY_PRAGMA(section = name) + #define CY_UNUSED + #define CY_ALIGN(align) CY_PRAGMA(data_alignment = align) + #define CY_WEAK __weak + +#else + #error "Unsupported toolchain" +#endif /* (__ARMCC_VERSION) */ + +typedef void (* cy_israddress)(void); /**< Type of ISR callbacks */ + +/** \cond INTERNAL */ +/** Type of ISR callbacks for backward compatibility with the UDB components. Do not use it in your code. */ +typedef void (* cyisraddress)(void); +/** \endcond */ + +#if defined (__ICCARM__) + typedef union { cy_israddress __fun; void * __ptr; } cy_intvec_elem; + /** \cond INTERNAL */ + /** Type of ISR callbacks for backward compatibility with the UDB components. Do not use it in your code. */ + typedef union { cyisraddress __fun; void * __ptr; } intvec_elem; + /** \endcond */ +#endif /* defined (__ICCARM__) */ + +#if !defined(NDEBUG) + /** Max size of file name which stores the ASSERT location */ + #define CY_MAX_FILE_NAME_SIZE (24u) + extern char_t cy_assertFileName[CY_MAX_FILE_NAME_SIZE]; /**< Assert buffer */ + extern uint32_t cy_assertLine; /**< Assert line value */ +#endif /* NDEBUG */ + +#if (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) + #define CY_R0_Pos (0u) /**< Position of R0 content in fault structure */ + #define CY_R1_Pos (1u) /**< Position of R1 content in fault structure */ + #define CY_R2_Pos (2u) /**< Position of R2 content in fault structure */ + #define CY_R3_Pos (3u) /**< Position of R3 content in fault structure */ + #define CY_R12_Pos (4u) /**< Position of R12 content in fault structure */ + #define CY_LR_Pos (5u) /**< Position of LR content in fault structure */ + #define CY_PC_Pos (6u) /**< Position of PC content in fault structure */ + #define CY_PSR_Pos (7u) /**< Position of PSR content in fault structure */ + #if (CY_CPU_CORTEX_M0P) + #define CY_CM0P_FAULT_TYPE (0xF0F1F2F3u) /**< Flag for indication CM0P core fault */ + #elif (CY_CPU_CORTEX_M4) + #define CY_CM4_FAULT_TYPE (0xF4F5F6F7u) /**< Flag for indication CM4 core fault */ + #define CY_NON_FPU_FAULT_TYPE (0xA1A2A3A4u) /**< Flag for indication CM4 non floating point fault type */ + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U))) + #define CY_FPU_FAULT_TYPE (0xA8A9AAABu) /**< Flag for indication CM4 core floating point fault type */ + #define CY_FPSCR_IXC_Msk (0x00000010u) /**< Cumulative exception bit for floating-point exceptions */ + #define CY_FPSCR_IDC_Msk (0x00000080u) /**< Cumulative exception bit for floating-point exceptions */ + #define CY_S0_Pos (8u) /**< Position of FPU S0 content in fault structure */ + #define CY_S1_Pos (9u) /**< Position of FPU S1 content in fault structure */ + #define CY_S2_Pos (10u) /**< Position of FPU S2 content in fault structure */ + #define CY_S3_Pos (11u) /**< Position of FPU S3 content in fault structure */ + #define CY_S4_Pos (12u) /**< Position of FPU S4 content in fault structure */ + #define CY_S5_Pos (13u) /**< Position of FPU S5 content in fault structure */ + #define CY_S6_Pos (14u) /**< Position of FPU S6 content in fault structure */ + #define CY_S7_Pos (15u) /**< Position of FPU S7 content in fault structure */ + #define CY_S8_Pos (16u) /**< Position of FPU S8 content in fault structure */ + #define CY_S9_Pos (17u) /**< Position of FPU S9 content in fault structure */ + #define CY_S10_Pos (18u) /**< Position of FPU S10 content in fault structure */ + #define CY_S11_Pos (19u) /**< Position of FPU S11 content in fault structure */ + #define CY_S12_Pos (20u) /**< Position of FPU S12 content in fault structure */ + #define CY_S13_Pos (21u) /**< Position of FPU S13 content in fault structure */ + #define CY_S14_Pos (22u) /**< Position of FPU S14 content in fault structure */ + #define CY_S15_Pos (23u) /**< Position of FPU S15 content in fault structure */ + #define CY_FPSCR_Pos (24u) /**< Position of FPU FPSCR content in fault structure */ + #endif /* __FPU_PRESENT */ + #endif /* CY_CPU_CORTEX_M0P */ + + extern cy_stc_fault_frame_t cy_faultFrame; /**< Fault frame structure */ +#endif /* (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) */ + + +/******************************************************************************* +* Macro Name: CY_GET_REG8(addr) +****************************************************************************//** +* +* Reads the 8-bit value from the specified address. This function can't be +* used to access the Core register, otherwise a fault occurs. +* +* \param addr The register address. +* +* \return The read value. +* +*******************************************************************************/ +#define CY_GET_REG8(addr) (*((const volatile uint8_t *)(addr))) + + +/******************************************************************************* +* Macro Name: CY_SET_REG8(addr, value) +****************************************************************************//** +* +* Writes an 8-bit value to the specified address. This function can't be +* used to access the Core register, otherwise a fault occurs. +* +* \param addr The register address. +* +* \param value The value to write. +* +*******************************************************************************/ +#define CY_SET_REG8(addr, value) (*((volatile uint8_t *)(addr)) = (uint8_t)(value)) + + +/******************************************************************************* +* Macro Name: CY_GET_REG16(addr) +****************************************************************************//** +* +* Reads the 16-bit value from the specified address. +* +* \param addr The register address. +* +* \return The read value. +* +*******************************************************************************/ +#define CY_GET_REG16(addr) (*((const volatile uint16_t *)(addr))) + + +/******************************************************************************* +* Macro Name: CY_SET_REG16(addr, value) +****************************************************************************//** +* +* Writes an 16-bit value to the specified address. +* +* \param addr The register address. +* +* \param value The value to write. +* +*******************************************************************************/ +#define CY_SET_REG16(addr, value) (*((volatile uint16_t *)(addr)) = (uint16_t)(value)) + + +/******************************************************************************* +* Macro Name: CY_GET_REG24(addr) +****************************************************************************//** +* +* Reads the 24-bit value from the specified address. +* +* \param addr The register address. +* +* \return The read value. +* +*******************************************************************************/ +#define CY_GET_REG24(addr) (uint32_t) ((*((const volatile uint8_t *)(addr))) | \ + (uint32_t) ((*((const volatile uint8_t *)(addr) + 1)) << 8u) | \ + (uint32_t) ((*((const volatile uint8_t *)(addr) + 2)) << 16u)) + + +/******************************************************************************* +* Macro Name: CY_SET_REG24(addr, value) +****************************************************************************//** +* +* Writes an 24-bit value to the specified address. +* +* \param addr The register address. +* +* \param value The value to write. +* +*******************************************************************************/ +#define CY_SET_REG24(addr, value) do \ + { \ + (*((volatile uint8_t *) (addr))) = (uint8_t)(value); \ + (*((volatile uint8_t *) (addr) + 1)) = (uint8_t)((value) >> 8u); \ + (*((volatile uint8_t *) (addr) + 2)) = (uint8_t)((value) >> 16u); \ + } \ + while(0u); + + +/******************************************************************************* +* Macro Name: CY_GET_REG32(addr) +****************************************************************************//** +* +* Reads the 32-bit value from the specified register. The address is the little +* endian order (LSB in lowest address) +* +* \param addr The register address. +* +* \return The read value. +* +*******************************************************************************/ +#define CY_GET_REG32(addr) (*((const volatile uint32_t *)(addr))) + + +/******************************************************************************* +* Macro Name: CY_SET_REG32(addr, value) +****************************************************************************//** +* +* Writes a 32-bit value to the specified register. The address is the little +* endian order (LSB in lowest address) +* +* \param addr The register address. +* +* \param value The value to write. +* +*******************************************************************************/ +#define CY_SET_REG32(addr, value) (*((volatile uint32_t *)(addr)) = (uint32_t)(value)) + + +/******************************************************************************* +* Macro Name: CY_ASSERT +****************************************************************************//** +* +* The macro that evaluates the expression and, if it is false (evaluates to 0), +* the processor is halted. Cy_Halt() is called when the logical expression is +* false to halt the processor. +* The ASSERT location of the file name (including path to file) and line number +* will be stored in a non-zero init area for debugging. They can be accessed +* by cy_assertFileName and assertLine global variables. +* +* \note This macro is evaluated unless NDEBUG is not defined. +* If NDEBUG is defined, just empty do while cycle is generated for this macro +* for the sake of consistency and to avoid MISRA violation. +* NDEBUG is defined by default for a Release build setting and not defined for +* a Debug build setting. +* +* \param x The logical expression. Asserts if false. +* +*******************************************************************************/ +#if !defined(NDEBUG) + #define CY_ASSERT(x) do \ + { \ + if(0u == (uint32_t)(x)) \ + { \ + (void) strncpy(cy_assertFileName, __FILE__, CY_MAX_FILE_NAME_SIZE); \ + cy_assertLine = (uint32_t)(__LINE__); \ + Cy_Halt((uint32_t)0u); \ + } \ + } \ + while(0u) +#else + #define CY_ASSERT(x) do \ + { \ + } \ + while(0u) +#endif /* !defined(NDEBUG) */ + + +/******************************************************************************* +* Macro Name: _CLR_SET_FLD32U +****************************************************************************//** +* +* The macro for setting a register with a name field and value for providing +* get-clear-modify-write operations. +* +*******************************************************************************/ +#define _CLR_SET_FLD32U(reg, field, value) (((reg) & ((uint32_t)(~(field ## _Msk)))) | (_VAL2FLD(field, value))) + + +/******************************************************************************* +* Macro Name: _BOOL2FLD +****************************************************************************//** +* +* Returns a field mask if the value is not false. +* Returns 0, if the value is false. +* +*******************************************************************************/ +#define _BOOL2FLD(field, value) ((value != false) ? field ## _Msk : 0UL) + + +/******************************************************************************* +* Macro Name: _FLD2BOOL +****************************************************************************//** +* +* Returns true, if the value includes the field mask. +* Returns false, if the value doesn't include the field mask. +* +*******************************************************************************/ +#define _FLD2BOOL(field, value) ((value & field ## _Msk) != 0UL) + + +/****************************************************************************** +* Constants +*****************************************************************************/ +/** Defines a 32-kHz clock delay */ +#define CY_DELAY_MS_OVERFLOW (0x8000u) + +/** +* \defgroup group_syslib_macro_reset_cause Reset cause +* \{ +* Define RESET_CAUSE mask values +*/ +/** A basic WatchDog Timer (WDT) reset has occurred since the last power cycle. */ +#define CY_SYSLIB_RESET_HWWDT (0x0001u) +/** The fault logging system requested a reset from its Active logic. */ +#define CY_SYSLIB_RESET_ACT_FAULT (0x0002u) +/** The fault logging system requested a reset from its DeepSleep logic. */ +#define CY_SYSLIB_RESET_DPSLP_FAULT (0x0004u) +/** The clock supervision logic requested a reset due to loss of a watch-crystal clock. */ +#define CY_SYSLIB_RESET_CSV_WCO_LOSS (0x0008u) +/** The CPU requested a system reset through it's SYSRESETREQ. This can be done via a debugger probe or in firmware. */ +#define CY_SYSLIB_RESET_SOFT (0x0010u) +/** The Multi-Counter Watchdog timer #0 reset has occurred since last power cycle. */ +#define CY_SYSLIB_RESET_SWWDT0 (0x0020u) +/** The Multi-Counter Watchdog timer #1 reset has occurred since last power cycle. */ +#define CY_SYSLIB_RESET_SWWDT1 (0x0040u) +/** The Multi-Counter Watchdog timer #2 reset has occurred since last power cycle. */ +#define CY_SYSLIB_RESET_SWWDT2 (0x0080u) +/** The Multi-Counter Watchdog timer #3 reset has occurred since last power cycle. */ +#define CY_SYSLIB_RESET_SWWDT3 (0x0100u) +/** The clock supervision logic requested a reset due to loss of a high-frequency clock. */ +#define CY_SYSLIB_RESET_HFCLK_LOSS (0x10000UL) +/** The clock supervision logic requested a reset due to frequency error of a high-frequency clock. */ +#define CY_SYSLIB_RESET_HFCLK_ERR (0x20000UL) + +/** \} group_syslib_macro_reset_cause */ + +/** Bit[31:24] Opcode = 0x1B (SoftReset) + * Bit[7:1] Type = 1 (Only CM4 reset) + */ +#define CY_IPC_DATA_FOR_CM4_SOFT_RESET (0x1B000002UL) + +/** +* \defgroup group_syslib_macro_unique_id Unique ID +* \{ +* Unique ID fields positions +*/ +#define CY_UNIQUE_ID_DIE_MINOR_Pos (56u) /**< Position of DIE_MINOR field in the silicon Unique ID */ +#define CY_UNIQUE_ID_DIE_SORT_Pos (48u) /**< Position of DIE_SORT field in the silicon Unique ID */ +#define CY_UNIQUE_ID_DIE_Y_Pos (40u) /**< Position of DIE_Y field in the silicon Unique ID */ +#define CY_UNIQUE_ID_DIE_X_Pos (32u) /**< Position of DIE_X field in the silicon Unique ID */ +#define CY_UNIQUE_ID_DIE_WAFER_Pos (24u) /**< Position of DIE_WAFER field in the silicon Unique ID */ +#define CY_UNIQUE_ID_DIE_LOT_2_Pos (16u) /**< Position of DIE_LOT_2 field in the silicon Unique ID */ +#define CY_UNIQUE_ID_DIE_LOT_1_Pos (8u) /**< Position of DIE_LOT_1 field in the silicon Unique ID */ +#define CY_UNIQUE_ID_DIE_LOT_0_Pos (0u) /**< Position of DIE_LOT_0 field in the silicon Unique ID */ + +/** \} group_syslib_macro_unique_id */ + +/** \} group_syslib_macro */ + +/****************************************************************************** +* Function prototypes +******************************************************************************/ + +/** +* \addtogroup group_syslib_functions +* \{ +*/ + +void Cy_SysLib_Delay(uint32_t milliseconds); +void Cy_SysLib_DelayUs(uint16_t microseconds); +/** Delays for the specified number of cycles. + * The function is implemented in assembler for each supported compiler. + * \param cycles The number of cycles to delay. + */ +void Cy_SysLib_DelayCycles(uint32_t cycles); +__NO_RETURN void Cy_SysLib_Halt(uint32_t reason); +void Cy_SysLib_ClearFlashCacheAndBuffer(void); +uint32_t Cy_SysLib_GetResetReason(void); +uint32_t Cy_SysLib_GetNumHfclkResetCause(void); +void Cy_SysLib_ClearResetReason(void); +uint64_t Cy_SysLib_GetUniqueId(void); +#if (CY_CPU_CORTEX_M0P) + void Cy_SysLib_SoftResetCM4(void); +#endif /* CY_CPU_CORTEX_M0P */ +#if (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) || defined(CY_DOXYGEN) + void Cy_SysLib_FaultHandler(uint32_t const *faultStackAddr); + CY_WEAK void Cy_SysLib_ProcessingFault(void); +#endif /* (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) */ +void Cy_SysLib_SetWaitStates(bool ulpMode, uint32_t clkHfMHz); + + +/******************************************************************************* +* Function Name: Cy_SysLib_EnterCriticalSection +****************************************************************************//** +* +* Cy_SysLib_EnterCriticalSection disables interrupts and returns a value +* indicating whether interrupts were previously enabled. +* +* \note Implementation of Cy_SysLib_EnterCriticalSection manipulates the IRQ +* enable bit with interrupts still enabled. +* +* \return +* Returns the current interrupt status. Returns 0 if interrupts were +* previously enabled or 1 if interrupts were previously disabled. +* +*******************************************************************************/ +uint32_t Cy_SysLib_EnterCriticalSection(void); + + +/******************************************************************************* +* Function Name: Cy_SysLib_ExitCriticalSection +****************************************************************************//** +* +* Re-enables interrupts if they were enabled before +* Cy_SysLib_EnterCriticalSection() was called. The argument should be the value +* returned from \ref Cy_SysLib_EnterCriticalSection(). +* +* \param savedIntrStatus +* Puts the saved interrupts status returned by +* the \ref Cy_SysLib_EnterCriticalSection(). +* +*******************************************************************************/ +void Cy_SysLib_ExitCriticalSection(uint32_t savedIntrStatus); + +/** \cond INTERNAL */ +/** Backward compatibility define for the CyDelay() API for the UDB components. +* Do not use it in your code. +*/ +#define CyDelay (Cy_SysLib_Delay) +/** Backward compatibility define for the CyDelayUs() API for the UDB components. +* Do not use it in your code. +*/ +#define CyDelayUs (Cy_SysLib_DelayUs) +/** Backward compatibility define for the CyDelayCycles() API for the UDB components. +* Do not use it in your code. +*/ +#define CyDelayCycles (Cy_SysLib_DelayCycles) +/** Backward compatibility define for the Cy_Halt() API. +* Do not use it in your code. +*/ +#define Cy_Halt (Cy_SysLib_Halt) +/** Backward compatibility define for the Cy_ClearFlashCacheAndBuffer() API. +* Do not use it in your code. +*/ +#define Cy_ClearFlashCacheAndBuffer (Cy_SysLib_ClearFlashCacheAndBuffer) +/** Backward compatibility define for the Cy_SYSLIB_GetResetReason() API. +* Do not use it in your code. +*/ +#define Cy_SYSLIB_GetResetReason (Cy_SysLib_GetResetReason) +/** Backward compatibility define for the Cy_SYSLIB_GetNumHFCLKResetCause() API. +* Do not use it in your code. +*/ +#define Cy_SYSLIB_GetNumHFCLKResetCause (Cy_SysLib_GetNumHfclkResetCause) +/** Backward compatibility define for the Cy_SYSLIB_ClearResetReason() API. +* Do not use it in your code. +*/ +#define Cy_SYSLIB_ClearResetReason (Cy_SysLib_ClearResetReason) +/** Backward compatibility define for the Cy_SYSLIB_GetUniqueId() API. +* Do not use it in your code. +*/ +#define Cy_SYSLIB_GetUniqueId (Cy_SysLib_GetUniqueId) +/** Backward compatibility define for the Cy_SYSLIB_SoftResetCM4() API. +* Do not use it in your code. +*/ +#define Cy_SYSLIB_SoftResetCM4 (Cy_SysLib_SoftResetCM4) +#if (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) || defined(CY_DOXYGEN) + /** Backward compatibility define for the Cy_SYSLIB_FaultHandler() API. + * Do not use it in your code. + */ + #define Cy_SYSLIB_FaultHandler (Cy_SysLib_FaultHandler) + /** Backward compatibility define for the Cy_SYSLIB_ProcessingFault() API. + * Do not use it in your code. + */ + #define Cy_SYSLIB_ProcessingFault (Cy_SysLib_ProcessingFault) +#endif /* (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) */ +/** Backward compatibility define for the Cy_SYSLIB_SetWaitStates() API. +* Do not use it in your code. +*/ +#define Cy_SYSLIB_SetWaitStates (Cy_SysLib_SetWaitStates) +/** Backward compatibility define for the CyEnterCriticalSection() API for the UDB components. +* Do not use it in your code. +*/ +#define CyEnterCriticalSection (Cy_SysLib_EnterCriticalSection) +/** Backward compatibility define for the CyExitCriticalSection() API for the UDB components. +* Do not use it in your code. +*/ +#define CyExitCriticalSection (Cy_SysLib_ExitCriticalSection) +/** \endcond */ + +/** \} group_syslib_functions */ + +#if defined(__cplusplus) +} +#endif /* defined(__cplusplus) */ + +#endif /* _CY_SYSLIB_H_ */ + +/** \} group_syslib */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syspm/cy_syspm.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syspm/cy_syspm.c new file mode 100644 index 0000000000..4d79820a23 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syspm/cy_syspm.c @@ -0,0 +1,1879 @@ +/***************************************************************************//** +* \file cy_syspm.c +* \version 1.0 +* +* This driver provides the source code to the API for the power management. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ +#include "cy_syspm.h" + +static cy_stc_syspm_callback_t* callbackRoot = NULL; +static uint32_t currentRegisteredCallbacksNumber = 0u; + +static void Cy_SysPm_SetDelayAfterDeepSleep(void); + +#if(0u != SRSS_SIMOBUCK_PRESENT) + + static void Cy_SysPm_SetVoltageBitForFlash(bool setBit); + +#endif /* (0u != SRSS_SIMOBUCK_PRESENT) */ + + +/******************************************************************************* +* Function Name: Cy_SysPm_ReadStatus +****************************************************************************//** +* +* Reads the status of the core(s). +* +* \return The current power mode. See \ref group_syspm_return_status. +* +*******************************************************************************/ +uint32_t Cy_SysPm_ReadStatus(void) +{ + uint32_t interruptState; + uint32_t pmStatus = 0u; + interruptState = Cy_SysLib_EnterCriticalSection(); + + /* Check whether CM4 is in DeepSleep mode*/ + if((0u != _FLD2VAL(CPUSS_CM4_STATUS_SLEEPING, CPUSS->CM4_STATUS)) && + (0u != _FLD2VAL(CPUSS_CM4_STATUS_SLEEPDEEP, CPUSS->CM4_STATUS))) + { + pmStatus |= CY_SYSPM_STATUS_CM4_DEEPSLEEP; + } + /* Check whether CM4 is in Sleep mode*/ + else if(0u != _FLD2VAL(CPUSS_CM4_STATUS_SLEEPING, CPUSS->CM4_STATUS)) + { + pmStatus |= CY_SYSPM_STATUS_CM4_SLEEP; + } + else + { + pmStatus |= CY_SYSPM_STATUS_CM4_ACTIVE; + } + + /* Check whether CM0p is in DeepSleep mode*/ + if((0u != _FLD2VAL(CPUSS_CM0_STATUS_SLEEPING, CPUSS->CM0_STATUS)) && + (0u != _FLD2VAL(CPUSS_CM0_STATUS_SLEEPDEEP, CPUSS->CM0_STATUS))) + { + pmStatus |= (uint32_t) CY_SYSPM_STATUS_CM0_DEEPSLEEP; + } + /* Check whether CM0p is in Sleep mode*/ + else if (0u != _FLD2VAL(CPUSS_CM0_STATUS_SLEEPING, CPUSS->CM0_STATUS)) + { + pmStatus |= CY_SYSPM_STATUS_CM0_SLEEP; + } + else + { + pmStatus |= CY_SYSPM_STATUS_CM0_ACTIVE; + } + + /* Check whether device is in Low Power mode by reading + * the Active Reference status + */ + if(0u != (_FLD2VAL(SRSS_PWR_CTL_ACT_REF_DIS, SRSS->PWR_CTL))) + { + pmStatus |= CY_SYSPM_STATUS_SYSTEM_LOWPOWER; + } + Cy_SysLib_ExitCriticalSection(interruptState); + + return(pmStatus); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_Sleep +****************************************************************************//** +* +* Sets a CPU core to Sleep mode. +* +* Puts the core into the Sleep power mode, if none of callback functions were +* registered. +* +* If at least one callback function with CY_SYSPM_SLEEP type was registered, the +* next algorithm is executed. +* Prior to entering Sleep mode, all callback functions with CY_SYSPM_SLEEP type +* with CY_SYSPM_CHECK_READY parameter are called allowing a driver +* to signal whether it is ready to enter the low power mode. If any of +* callbacks with CY_SYSPM_SLEEP type with CY_SYSPM_CHECK_READY parameter +* returns CY_SYSPM_FAIL the remaining callback with CY_SYSPM_SLEEP type with +* CY_SYSPM_CHECK_READY parameter calls are skipped. +* After a CY_SYSPM_FAIL, all of the CY_SYSPM_SLEEP callbacks with +* CY_SYSPM_CHECK_FAIL parameter are executed that correspond to the callback +* with callbacks with CY_SYSPM_SLEEP type with CY_SYSPM_CHECK_READY +* parameter calls that occurred up to the point of failure. Sleep mode is not +* entered and the Cy_SysPm_Sleep API returns CY_SYSPM_FAIL. +* +* If all of the callbacks with CY_SYSPM_SLEEP type with CY_SYSPM_CHECK_READY +* parameter calls return CY_SYSPM_SUCCESS then all callbacks with CY_SYSPM_SLEEP +* type with CY_SYSPM_CHECK_FAIL parameters calls are skipped and all callbacks +* with CY_SYSPM_SLEEP type and CY_SYSPM_BEFORE_ENTER parameter calls are +* executed, allowing peripherals to prepare for Sleep. Sleep mode is then +* entered for the CPU. This is a CPU-centric power mode. It means that the CPU +* has entered Sleep mode and its main clock is removed. It is identical to +* Active from a peripheral point of view. Any enabled interrupts can cause a +* wakeup from Sleep mode. +* +* After wakeup from Sleep all of the registered callbacks with CY_SYSPM_SLEEP +* type and with CY_SYSPM_AFTER_EXIT parameter are executed to return peripherals +* to Active operation. The Cy_SysPm_Sleep API returns CY_SYSPM_SUCCESS. +* No callbacks with CY_SYSPM_SLEEP type with CY_SYSPM_BEFORE_ENTER parameter or +* callbacks with CY_SYSPM_SLEEP type and CY_SYSPM_AFTER_EXIT parameter callbacks +* are executed if Sleep mode is not entered. +* +* \param enWaitFor Selects wait for action. See \ref cy_en_syspm_waitfor_t. +* +* \return +* CY_SYSPM_SUCCESS - Entered and exited from Sleep
+* CY_SYSPM_FAIL - Sleep not entered. See \ref cy_en_syspm_status_t. +* +*******************************************************************************/ +cy_en_syspm_status_t Cy_SysPm_Sleep(cy_en_syspm_waitfor_t enWaitFor) +{ + uint32_t interruptState; + cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS; + + /* Call registered callback functions with CY_SYSPM_CHECK_READY parameter */ + if(0u != currentRegisteredCallbacksNumber) + { + retVal = (cy_en_syspm_status_t) Cy_SysPm_ExecuteCallback(CY_SYSPM_SLEEP, CY_SYSPM_CHECK_READY, 0u); + } + + /* The device (core) can switch into Sleep power mode only when + * all executed registered callback functions with CY_SYSPM_CHECK_READY + * parameter returned CY_SYSPM_SUCCESS. + */ + if(retVal == CY_SYSPM_SUCCESS) + { + /* Call registered callback functions with CY_SYSPM_BEFORE_ENTER + * parameter. Return value is ignored. + */ + interruptState = Cy_SysLib_EnterCriticalSection(); + if(0u != currentRegisteredCallbacksNumber) + { + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_SLEEP, CY_SYSPM_BEFORE_ENTER, 0u); + } + + /* CPU enters Sleep power mode upon execution of WFI/WFE */ + SCB->SCR = _CLR_SET_FLD32U((SCB->SCR), SCB_SCR_SLEEPDEEP, 0u); + + if(enWaitFor != CY_SYSPM_WAIT_FOR_EVENT) + { + __WFI(); + } + else + { + __WFE(); + } + Cy_SysLib_ExitCriticalSection(interruptState); + + /* Call registered callback functions with CY_SYSPM_AFTER_EXIT + * parameter. Return value is ignored. + */ + if(0u != currentRegisteredCallbacksNumber) + { + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_SLEEP, CY_SYSPM_AFTER_EXIT, 0u); + } + } + else + { + /* Execute callback functions with CY_SYSPM_CHECK_FAIL parameter to + * undo everything done in the CY_SYSPM_CHECK_READY callback. Return + * value is ignored. + */ + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_SLEEP, CY_SYSPM_CHECK_FAIL, (uint32_t) retVal); + retVal = CY_SYSPM_FAIL; + } + return retVal; +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_DeepSleep +****************************************************************************//** +* +* Sets a CPU core to DeepSleep mode. +* +* Puts the core into the Deep Sleep power mode. Prior to entering Deep Sleep +* mode, all callbacks with CY_SYSPM_DEEPSLEEP type with CY_SYSPM_CHECK_READY +* parameter registered callbacks are called, allowing a driver to signal whether +* it is ready to enter the power mode. If any CY_SYSPM_DEEPSLEEP +* type with CY_SYSPM_CHECK_READY parameter call returns CY_SYSPM_FAIL, the +* remaining callback CY_SYSPM_DEEPSLEEP type with CY_SYSPM_CHECK_READY parameter +* calls are skipped. After a CY_SYSPM_FAIL, all of the callbacks with +* CY_SYSPM_DEEPSLEEP type with CY_SYSPM_CHECK_FAIL parameter are executed that +* correspond to the callbacks with CY_SYSPM_DEEPSLEEP type with +* CY_SYSPM_CHECK_READY parameter calls that occurred up to the point of failure. +* Deep Sleep mode is not entered and the Cy_SysPm_Sleep API returns +* CY_SYSPM_FAIL. +* +* If all callbacks with CY_SYSPM_DEEPSLEEP type with CY_SYSPM_CHECK_READY +* parameter calls return CY_SYSPM_SUCCESS, then all callbacks with +* CY_SYSPM_DEEPSLEEP type with CY_SYSPM_CHECK_FAIL parameter calls are skipped +* and all callbacks with CY_SYSPM_DEEPSLEEP type with CY_SYSPM_BEFORE_ENTER +* parameter calls are executed, allowing peripherals to prepare for Deep Sleep. +* Deep Sleep mode is then entered. Any enabled interrupts can cause a wakeup +* from Deep Sleep mode. +* +* If the firmware attempts to enter this mode before the system is ready (that +* is, when PWR_CONTROL.LPM_READY = 0), then the device will go into the (LP) +* Sleep mode instead and automatically enter the DeepSleep mode when the +* system is ready. +* +* The SRSS puts the whole device into DeepSleep mode when all the processors +* are in SLEEPDEEP, there are no busy peripherals, the debugger is not active, +* and the DEEPSLEEP circuits in the SRSS are ready (PWR_CONTROL.LPM_READY=1). +* +* Peripherals not needing a clock or that receive a clock from their external +* interface (e.g. I2C/SPI) continue operating. All circuits using the current +* from Vccdpslp supply are under the current limitation that is controlled +* by DeepSleep regulator. +* +* Wakeup occurs when an interrupt is received from a DeepSleep active +* peripheral. For more details, see the corresponding peripheral's datasheet. +* +* A normal wakeup from DeepSleep returns to either LPActive, LPSleep, Active, or +* Sleep, depending on the previous state and programmed behaviour for the +* particular wakeup interrupt. +* +* After wakeup from Deep Sleep, all of the registered callbacks with +* CY_SYSPM_DEEPSLEEP type with CY_SYSPM_AFTER_EXIT are executed to return +* peripherals to Active operation. The Cy_SysPm_DeepSleep API returns +* CY_SYSPM_SUCCESS. No callbacks are executed with CY_SYSPM_DEEPSLEEP type with +* CY_SYSPM_BEFORE_ENTER or CY_SYSPM_AFTER_EXIT parameter, if Deep Sleep +* mode is not entered. +* +* \param enWaitFor Selects wait for action. See \ref cy_en_syspm_waitfor_t. +* +* \return +* CY_SYSPM_SUCCESS - Entered and exited from DeepSleep
+* CY_SYSPM_FAIL - DeepSleep not entered. See \ref cy_en_syspm_status_t. +* +*******************************************************************************/ +cy_en_syspm_status_t Cy_SysPm_DeepSleep(cy_en_syspm_waitfor_t enWaitFor) +{ + uint32_t interruptState; + cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS; + + /* Call registered callback functions with CY_SYSPM_CHECK_READY parameter */ + if(0u != currentRegisteredCallbacksNumber) + { + retVal = (cy_en_syspm_status_t) Cy_SysPm_ExecuteCallback(CY_SYSPM_DEEPSLEEP, CY_SYSPM_CHECK_READY, 0u); + } + + /* The device (core) can switch into Deep Sleep power mode only when + * all executed registered callback functions with CY_SYSPM_CHECK_READY + * parameter returned CY_SYSPM_SUCCESS. + */ + if(retVal == CY_SYSPM_SUCCESS) + { + /* Call registered callback functions with CY_SYSPM_BEFORE_ENTER + * parameter. Return value is ignored. + */ + interruptState = Cy_SysLib_EnterCriticalSection(); + if(0u != currentRegisteredCallbacksNumber) + { + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_DEEPSLEEP, CY_SYSPM_BEFORE_ENTER, 0u); + } + Cy_SysPm_SetDelayAfterDeepSleep(); + + /* CPU enters DeepSleep mode upon execution of WFI/WFE */ + SCB->SCR = _CLR_SET_FLD32U((SCB->SCR), SCB_SCR_SLEEPDEEP, 1u); + + if(enWaitFor != CY_SYSPM_WAIT_FOR_EVENT) + { + __WFI(); + } + else + { + __WFE(); + } + Cy_SysLib_ExitCriticalSection(interruptState); + + /* Call registered callback functions with CY_SYSPM_AFTER_EXIT + * parameter. Return value is ignored. + */ + if(0u != currentRegisteredCallbacksNumber) + { + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_DEEPSLEEP, CY_SYSPM_AFTER_EXIT, 0u); + } + } + else + { + /* Execute callbacks functions with CY_SYSPM_CHECK_FAIL parameter to + * undo everything done in the CY_SYSPM_CHECK_READY callback. Return + * value is ignored. + */ + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_DEEPSLEEP, CY_SYSPM_CHECK_FAIL, (uint32_t) retVal); + retVal = CY_SYSPM_FAIL; + } + return retVal; +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_Hibernate +****************************************************************************//** +* +* Sets the device into Hibernate mode. +* +* Puts the core into the Hibernate power mode. Prior to entering Hibernate mode +* all callbacks with CY_SYSPM_HIBERNATE type are executed. +* At the first time callbacks with CY_SYSPM_HIBERNATE type and with +* CY_SYSPM_CHECK_READY parameter are called allowing a driver to signal it is +* not ready to enter the power mode. If any of callbacks CY_SYSPM_HIBERNATE type +* with CY_SYSPM_CHECK_READY parameter call returns CY_SYSPM_FAIL the +* remaining CY_SYSPM_HIBERNATE callbacks with CY_SYSPM_CHECK_READY parameter +* calls are skipped. After a CY_SYSPM_FAIL all of the CY_SYSPM_HIBERNATE +* callbacks with CY_SYSPM_CHECK_FAIL parameter are executed that correspond to +* the CY_SYSPM_HIBERNATE callbacks with CY_SYSPM_CHECK_READY parameter calls +* that occurred up to the point of failure. Hibernate mode is not entered +* and the Cy_SysPm_Hibernate API returns CY_SYSPM_FAIL. +* +* If all CY_SYSPM_HIBERNATE callbacks with CY_SYSPM_CHECK_READY parameter calls +* return CY_SYSPM_SUCCESS, then all CY_SYSPM_HIBERNATE callbacks with +* CY_SYSPM_CHECK_FAIL calls are skipped and all CY_SYSPM_HIBERNATE callbacks +* CY_SYSPM_BEFORE_ENTER parameter calls are executed allowing peripherals to +* prepare for Hibernate. I/O output state is frozen and Hibernate mode is then +* entered. In Hibernate mode all internal supplies are off and no internal state +* is retained. There is no handshake with the CPUs and the chip will begin entry +* to Hibernate immediately. +* +* A wakeup from Hibernate is triggered by toggling the wakeup pin(s), a WDT +* match, or back up domain alarm expiration depending on how the HIBERNATE +* register is configured. A wakeup causes a normal boot procedure to occur. +* To configure the wakeup pin(s), a Digital Input Pin must be configured, and +* resistively pulled up or down to the inverse state of the wakeup polarity. To +* distinguish a wakeup from the Hibernate mode and a general reset event, +* Cy_SysLib_GetResetReason() function can be used. The wakeup pin is +* active-low by default. The wakeup pin polarity can be changed with the +* \ref Cy_SysPm_WakeupPinLevel() function. This function call will not return if +* Hibernate mode is entered. The CY_SYSPM_HIBERNATE callbacks with +* CY_SYSPM_AFTER_EXIT parameter are never executed. +* +* This function freezes IO cells implicitly. It is not possible to enter +* the Hibernate mode before freezing the IO cells. The IO cells remain frozen +* after waking from Hibernate mode until firmware unfreezes them +* with a \ref Cy_SysPm_IoUnfreeze() function call. +* +* \return +* CY_SYSPM_SUCCESS - Not valid as hibernate; can only exit through a reset.
+* CY_SYSPM_FAIL - Hibernate not entered. See \ref cy_en_syspm_status_t. +* +*******************************************************************************/ +cy_en_syspm_status_t Cy_SysPm_Hibernate(void) +{ + cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS; + + /* Call registered callback functions with CY_SYSPM_CHECK_READY parameter */ + if(0u != currentRegisteredCallbacksNumber) + { + retVal = (cy_en_syspm_status_t) Cy_SysPm_ExecuteCallback(CY_SYSPM_HIBERNATE, CY_SYSPM_CHECK_READY, 0u); + } + + /* The device (core) can switch into Hibernate power mode only when + * all executed registered callback functions with CY_SYSPM_CHECK_READY + * parameter returned CY_SYSPM_SUCCESS. + */ + if(retVal == CY_SYSPM_SUCCESS) + { + /* Call registered callback functions with CY_SYSPM_BEFORE_ENTER + * parameter. Return value is ignored. + */ + (void) Cy_SysLib_EnterCriticalSection(); + if(0u != currentRegisteredCallbacksNumber) + { + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_HIBERNATE, CY_SYSPM_BEFORE_ENTER, 0u); + } + + /* Safe retain bit-fields before entering into Hibernate power mode. */ + SRSS->PWR_HIBERNATE &= CY_SYSPM_PWR_RETAIN_HIBERNATE_STATUS; + + /* All three writes to HIBERNATE register use same value: + * PWR_HIBERNATE.FREEZE=1, .UNLOCK=0x3A, .HIBERANTE=1, + */ + SRSS->PWR_HIBERNATE |= CY_SYSPM_PWR_HIBERNATE_UNLOCK | + _VAL2FLD(SRSS_PWR_HIBERNATE_FREEZE, 1u) | + _VAL2FLD(SRSS_PWR_HIBERNATE_HIBERNATE, 1u); + + SRSS->PWR_HIBERNATE |= CY_SYSPM_PWR_HIBERNATE_UNLOCK | + _VAL2FLD(SRSS_PWR_HIBERNATE_FREEZE, 1u) | + _VAL2FLD(SRSS_PWR_HIBERNATE_HIBERNATE, 1u); + + SRSS->PWR_HIBERNATE |= CY_SYSPM_PWR_HIBERNATE_UNLOCK | + _VAL2FLD(SRSS_PWR_HIBERNATE_FREEZE, 1u) | + _VAL2FLD(SRSS_PWR_HIBERNATE_HIBERNATE, 1u); + + /* Wait for transition */ + __WFI(); + + /* The callback functions calls with CY_SYSPM_AFTER_EXIT parameter in + * Hibernate power mode is is not applicable as device wake-up is made + * on device reboot. + */ + + /* A wakeup from Hibernate is performed by toggling of wakeup pins, or + * WDT matches, or Backup domain alarm expires. Depends on what item is + * configured in HIBERNATE register. After a wakeup event, a normal Boot + * procedure occurs. No need to exit from the critical section. + */ + } + else + { + /* Execute callback functions with CY_SYSPM_CHECK_FAIL parameter to + * undo everything done in the CY_SYSPM_CHECK_READY callback. Return + * value is ignored. + */ + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_HIBERNATE, CY_SYSPM_CHECK_FAIL, (uint32_t) retVal); + retVal = CY_SYSPM_FAIL; + } + return retVal; +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_EnterLpMode +****************************************************************************//** +* +* Sets device into Low Power mode. +* +* The low power (LPActive/LPSleep) modes are similar to the Active/Sleep modes. +* The difference is that the current is limited and some functions have limited +* features/performance. +* +* The feature of the low power mode is limited current. Restrictions are placed +* on the clock frequencies and allowed peripherals to achieve current limit. +* +* Before entering low power mode, the user should configure the system so the total +* current drawn from Vccd is less that value presented in the technical +* reference manual (TRM). Refer to TRM for the maximum load for low power +* operation and clock limitations in low power mode with different core supply +* regulator voltages. +* +* * Peripherals can use the knowledge of LPActive/LPSleep mode to make +* trade-offs that consume less current. For more details, see the corresponding +* peripheral's datasheet. +* * High-speed clock sources are available with appropriate predivider settings +* to limit the system current. +* Refer to the TRM for the maximum frequency values for low power operation using +* different Core Regulators output voltages. +* +* Puts the device into the Low Power mode. Prior to entering Low Power mode, all +* registered CY_SYSPM_ENTER_LP_MODE callbacks with CY_SYSPM_CHECK_READY +* parameter are called. This allows a driver to signal it is not ready to enter the +* Low Power mode. If any CY_SYSPM_ENTER_LP_MODE callbacks with +* CY_SYSPM_CHECK_READY parameter call returns CY_SYSPM_FAIL the remaining +* CY_SYSPM_ENTER_LP_MODE callbacks with CY_SYSPM_CHECK_READY parameter calls are +* skipped. +* After a CY_SYSPM_FAIL all of the CY_SYSPM_ENTER_LP_MODE callbacks with +* CY_SYSPM_CHECK_FAIL parameter are executed that correspond to the +* CY_SYSPM_ENTER_LP_MODE callbacks with CY_SYSPM_CHECK_READY parameter calls +* that occurred up to the point of failure. Low Power mode is not entered and +* the Cy_SysPm_EnterLpMode API returns CY_SYSPM_FAIL. +* +* If all CY_SYSPM_ENTER_LP_MODE callbacks with CY_SYSPM_CHECK_READY parameter +* calls return CY_SYSPM_SUCCESS then all CY_SYSPM_ENTER_LP_MODE callbacks with +* CY_SYSPM_CHECK_FAIL calls are skipped and all CY_SYSPM_ENTER_LP_MODE callbacks +* with CY_SYSPM_BEFORE_ENTER parameter calls are executed. This allows peripherals +* to prepare for Low Power. Low Power mode is then entered. +* +* After entering Low Power mode, all of the registered CY_SYSPM_ENTER_LP_MODE +* callbacks with CY_SYSPM_AFTER_EXIT parameter are executed to complete +* preparing peripherals for Low Power operation. The Cy_SysPm_EnterLpMode API +* returns CY_SYSPM_SUCCESS. No CY_SYSPM_ENTER_LP_MODE callbacks with +* CY_SYSPM_BEFORE_ENTER or CY_SYSPM_AFTER_EXIT parameter are executed, if Low +* Power mode is not entered. +* +* \note The callbacks are not executed if device already is not in low power +* mode. +* +* \return +* CY_SYSPM_SUCCESS - Entered LPActive mode or device is already in LPActive.
+* CY_SYSPM_FAIL - LPActive mode not entered or low power circuits are not ready +* to enter into low power mode. See \ref cy_en_syspm_status_t. +* +*******************************************************************************/ +cy_en_syspm_status_t Cy_SysPm_EnterLpMode(void) +{ + uint32_t interruptState; + cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS; + + /* Check whether device is in Low Power mode */ + if(0u == (_FLD2VAL(SRSS_PWR_CTL_ACT_REF_DIS, SRSS->PWR_CTL))) + { + /* The entering into low power mode is permitted when low + * power circuits are ready to enter into low power mode. + */ + if(0u != _FLD2VAL(SRSS_PWR_CTL_LPM_READY, SRSS->PWR_CTL)) + { + /* Call registered callback functions with CY_SYSPM_CHECK_READY parameter */ + if(0u != currentRegisteredCallbacksNumber) + { + retVal = (cy_en_syspm_status_t) Cy_SysPm_ExecuteCallback(CY_SYSPM_ENTER_LP_MODE, CY_SYSPM_CHECK_READY, 0u); + } + + /* The device (core) can switch into Low power mode only when + * all executed registered callback functions with CY_SYSPM_CHECK_READY + * parameter returned CY_SYSPM_SUCCESS. + */ + if(retVal == CY_SYSPM_SUCCESS) + { + + /* Call registered callback functions with CY_SYSPM_BEFORE_ENTER + * parameter. Return value is ignored. + */ + interruptState = Cy_SysLib_EnterCriticalSection(); + if(0u != currentRegisteredCallbacksNumber) + { + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_ENTER_LP_MODE, CY_SYSPM_BEFORE_ENTER, 0u); + } + /* Configure low-power operating mode for Linear Core regulator */ + if(Cy_SysPm_LdoIsEnabled()) + { + SRSS->PWR_CTL |= (_VAL2FLD(SRSS_PWR_CTL_LINREG_LPMODE, 1u) | + _VAL2FLD(SRSS_PWR_CTL_PORBOD_LPMODE, 1u) | + _VAL2FLD(SRSS_PWR_CTL_BGREF_LPMODE, 1u)); + } + else + { + /* Configure low-power operating mode for SIMO Buck regulator */ + SRSS->PWR_CTL |= (_VAL2FLD(SRSS_PWR_CTL_PORBOD_LPMODE, 1u) | + _VAL2FLD(SRSS_PWR_CTL_BGREF_LPMODE, 1u)); + } + + /* This wait time allows the circuits to remove their dependence on + * Active mode circuits, such as the Active Reference + */ + Cy_SysLib_DelayUs(CY_SYSPM_PWR_ACTIVE_TO_LP_WAIT_US); + + /* Disabling active reference */ + SRSS->PWR_CTL |= _VAL2FLD(SRSS_PWR_CTL_ACT_REF_DIS, 1u); + + Cy_SysLib_ExitCriticalSection(interruptState); + + /* Call registered callback functions with CY_SYSPM_AFTER_EXIT + * parameter. Return value is ignored. + */ + if(0u != currentRegisteredCallbacksNumber) + { + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_ENTER_LP_MODE, CY_SYSPM_AFTER_EXIT, 0u); + } + } + else + { + /* Execute callbacks functions with CY_SYSPM_CHECK_FAIL parameter to + * undo everything done in the CY_SYSPM_CHECK_READY callback. Return + * value is ignored. + */ + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_ENTER_LP_MODE, CY_SYSPM_CHECK_FAIL, (uint32_t) retVal); + retVal = CY_SYSPM_FAIL; + } + } + else + { + retVal = CY_SYSPM_FAIL; + } + } + else + { + /* Do nothing as device is already in low-power mode. */ + } + return retVal; +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_ExitLpMode +****************************************************************************//** +* +* Sets device out of Low Power mode. +* +* Returns device to the Active mode. In active power mode, operating current can +* be increased to the normal mode limit. Clock frequencies also can be increased +* to the normal mode limit. Refer to the device TRM for current and frequency +* limitations in Active power mode. +* +* Prior to exiting Low Power mode, all registered CY_SYSPM_EXIT_LP_MODE callbacks +* with CY_SYSPM_CHECK_READY parameter are called. This allows +* a driver to signal it is not ready to exit the +* Low Power mode. If any CY_SYSPM_EXIT_LP_MODE callbacks with +* CY_SYSPM_CHECK_READY parameter call returns CY_SYSPM_FAIL, the remaining +* CY_SYSPM_EXIT_LP_MODE callbacks with CY_SYSPM_CHECK_READY parameter calls are +* skipped. After a CY_SYSPM_FAIL, all of the CY_SYSPM_EXIT_LP_MODE callbacks with +* CY_SYSPM_CHECK_FAIL parameter are executed that correspond to the +* CY_SYSPM_EXIT_LP_MODE callbacks with CY_SYSPM_CHECK_READY parameter calls that +* occurred up to the point of failure. Active mode is not entered and the +* Cy_SysPm_ExitLpMode API returns CY_SYSPM_FAIL. +* +* If all CY_SYSPM_EXIT_LP_MODE callbacks with CY_SYSPM_CHECK_READY calls return +* CY_SYSPM_SUCCESS then all CY_SYSPM_EXIT_LP_MODE callbacks with +* CY_SYSPM_CHECK_FAIL parameter calls are skipped and all CY_SYSPM_EXIT_LP_MODE +* callbacks CY_SYSPM_BEFORE_ENTER parameter calls are executed allowing +* peripherals to prepare for Active mode. Low Power mode is then exited. +* +* After exiting Low Power mode all of the registered callbacks are executed +* CY_SYSPM_EXIT_LP_MODE callbacks with CY_SYSPM_AFTER_EXIT parameter to complete +* preparing peripherals for Active mode operation. The Cy_SysPm_ExitLpMode API +* returns CY_SYSPM_SUCCESS. No CY_SYSPM_EXIT_LP_MODE callbacks with +* CY_SYSPM_BEFORE_ENTER or CY_SYSPM_AFTER_EXIT parameter are executed if Low +* Power mode is not exited. +* +* \note The callbacks are not executed if device is already not in a low power +* mode. +* +* \return +* CY_SYSPM_SUCCESS - Exited from LPActive power mode, or device is already in +* Active power.
+* CY_SYSPM_FAIL - the exit from LPActive mode not done, +* see \ref cy_en_syspm_status_t. +* +* \warning This function blocks as it waits until Active Reference is ready +* to enter into normal mode. +* +*******************************************************************************/ +cy_en_syspm_status_t Cy_SysPm_ExitLpMode(void) +{ + uint32_t interruptState; + uint32_t timeOut = CY_SYSPM_WAIT_DELAY_TRYES; + cy_en_syspm_status_t retVal = CY_SYSPM_SUCCESS; + + /* Check if device is in Low Power mode */ + if(0u != (_FLD2VAL(SRSS_PWR_CTL_ACT_REF_DIS, SRSS->PWR_CTL))) + { + /* Call registered callback functions with CY_SYSPM_CHECK_READY parameter */ + if(0u != currentRegisteredCallbacksNumber) + { + retVal = (cy_en_syspm_status_t) Cy_SysPm_ExecuteCallback(CY_SYSPM_EXIT_LP_MODE, CY_SYSPM_CHECK_READY, 0u); + } + + /* The device (core) can switch into Low power mode only in condition + * that all executed registered callback functions with CY_SYSPM_CHECK_READY + * parameter returned CY_SYSPM_SUCCESS + */ + if(retVal == CY_SYSPM_SUCCESS) + { + /* Call registered callback functions with CY_SYSPM_BEFORE_ENTER + * parameter. Return value is ignored. + */ + interruptState = Cy_SysLib_EnterCriticalSection(); + if(0u != currentRegisteredCallbacksNumber) + { + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_EXIT_LP_MODE, CY_SYSPM_BEFORE_ENTER, 0u); + } + + /* Set normal operation mode for Linear Core regulator in condition + * that it is enabled + */ + if(Cy_SysPm_LdoIsEnabled()) + { + SRSS->PWR_CTL &= ((uint32_t)~(_VAL2FLD(SRSS_PWR_CTL_LINREG_LPMODE, 1u))); + } + + /* Configure normal operating mode for POR/BOD circuits and for + * Bandgap Voltage and Current References. + */ + SRSS->PWR_CTL &= ((uint32_t)~(_VAL2FLD(SRSS_PWR_CTL_PORBOD_LPMODE, 1u) | + _VAL2FLD(SRSS_PWR_CTL_ACT_REF_DIS, 1u) | + _VAL2FLD(SRSS_PWR_CTL_VREFBUF_LPMODE, 1u))); + + /* This wait time allows Active Reference to settle */ + Cy_SysLib_DelayUs(CY_SYSPM_PWR_LP_TO_ACTIVE_WAIT_BEFORE_US); + + while((0u == _FLD2VAL(SRSS_PWR_CTL_ACT_REF_OK, SRSS->PWR_CTL)) && (0u != timeOut)) + { + timeOut--; + } + + if(0u == timeOut) + { + retVal = CY_SYSPM_TIMEOUT; + } + + /* Configure the normal operation mode */ + SRSS->PWR_CTL &= (uint32_t) (~_VAL2FLD(SRSS_PWR_CTL_BGREF_LPMODE, 1u)); + + /* This wait time allows the settle Active Reference */ + Cy_SysLib_DelayUs(CY_SYSPM_PWR_LP_TO_ACTIVE_WAIT_AFTER_US); + + Cy_SysLib_ExitCriticalSection(interruptState); + + /* Call registered callback functions with CY_SYSPM_AFTER_EXIT + * parameter. Return value is ignored. + */ + if(0u != currentRegisteredCallbacksNumber) + { + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_EXIT_LP_MODE, CY_SYSPM_AFTER_EXIT, 0u); + } + } + else + { + /* Execute callback functions with CY_SYSPM_CHECK_FAIL parameter to + * undo everything done in the CY_SYSPM_CHECK_READY callback. Return + * value is ignored. + */ + (void) Cy_SysPm_ExecuteCallback(CY_SYSPM_EXIT_LP_MODE, CY_SYSPM_CHECK_FAIL, (uint32_t) retVal); + retVal = CY_SYSPM_FAIL; + } + } + else + { + /* Do nothing as device is already in active power mode. */ + } + return retVal; +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_SleepOnExit +****************************************************************************//** +* +* Set Sleep on the Exit mode. +* +* This API gives a possibility to keep the system in a sleep mode at all times +* and only wakeup to run a single interrupt and then immediately go back to +* sleep. +* +* \param +* enable true - enable Sleep on the Exit mode
false - disable +* Sleep on the Exit mode. +* +*******************************************************************************/ +void Cy_SysPm_SleepOnExit(bool enable) +{ + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + + if(enable) + { + /* Enable SleepOnExit mode */ + SCB->SCR |= _VAL2FLD(SCB_SCR_SLEEPONEXIT, 1u); + } + else + { + /* Disable SleepOnExit mode */ + SCB->SCR &= ((uint32_t) ~(_VAL2FLD(SCB_SCR_SLEEPONEXIT, 1u))); + } + Cy_SysLib_ExitCriticalSection(interruptState); +} + +#if(0u != SRSS_SIMOBUCK_PRESENT) + /******************************************************************************* + * Function Name: Cy_SysPm_SwitchToSimoBuck + ****************************************************************************//** + * + * Switch the power supply regulator to Single-Input Multiple Output (SIMO) + * Buck regulator instead of Linear Regulator. The SIMO Buck core regulator + * can supply Vccd with higher efficiency than the Linear core regulator (LDO) + * under some conditions, such as high external supply voltages. + * + * Before change from LDO to SIMO buck ensure that: + * * Circuit board has connected Vccbuck1 to Vccd and also populated the + * necessary external components for SIMO Buck regulator, including an + * inductor and a capacitor for each output. + * Refer to the device TRM for more details. + * + * * Operating frequencies are reduced so it is within the static timing + * closure limits at the new frequency. + * + * * Current consumption on the core is reduced to meet 0.9 V (nominal) output + * voltage. The main reason is that while changing from LDO to SIMO Buck, + * the switch happens on 0.9 V (nominal). + * + * * Appropriate Wait states values are set for Flash using the + * Cy_SysLib_SetWaitStates() function. Refer to the System Library (syslib) driver + * for more details. + * + * In general, use the next sequence to obtain SIMO Buck 0.9 V (nominal): + * 1) Set appropriate wait states for ULP by calling + * Cy_SysLib_SetWaitStates(true, hfClkFreqMz), where hfClkFreqMz - + * desired frequency of HfClk0 in MHz. + * + * 2) Set 0.9 V (nominal) for LDO regulator. + * + * 3) Switch the regulators by calling the Cy_SysPm_SwitchToSimoBuck() function. + * + * To obtain SIMO Buck 1.1 V (nominal) use next sequence: + * 1) Set appropriate wait states for ULP by calling + * Cy_SysLib_SetWaitStates(true, hfClkFreqMz), where hfClkFreqMz - + * desired frequency of HfClk0 in MHz + * + * 2) Set 0.9 V (nominal) for LDO regulator + * + * 3) Switch the regulators by calling the Cy_SysPm_SwitchToSimoBuck() function + * + * 4) Change SIMO Buck output voltage by calling the + * Cy_SysPm_SimoBuckSetVoltage1(CY_SYSPM_SIMO_BUCK_OUT1_VOLTAGE_1_1V) + * + * 5) Set appropriate wait states for LP by calling + * Cy_SysLib_SetWaitStates(false, hfClkFreqMz), where hfClkFreqMz - + * desired frequency of HfClk0 in MHz + * + * \warning System does not have a way to know when Vccd is settled at actual + * 0.9 V or 1.1 V for transition, as this voltage depends on conditions + * including load current. The firmware works with + * nominal 0.9 V and 1.1 V voltages. + * + * \warning Please be aware that the Flash access time when core + * output voltage is 0.9 V (nominal) is longer that using 1.1 V (nominal). + * Therefore the clock to the Flash should be decreased. Use the + * Cy_SysLib_SetWaitStates() function to set appropriate wait state values + * for Flash. Call the Cy_SysLib_SetWaitStates() function before + * Cy_SysPm_SwitchToSimoBuck() if you want to change voltage + * into 0.9 V (nominal). Call the Cy_SysLib_SetWaitStates() function after + * Cy_SysPm_SwitchToSimoBuck() if you change voltage from 0.9 V (nominal) + * to 1.1 V (nominal). + * + * \warning There is no way to back to Linear Regulator after SIMO Buck + * regulator supply core. + * + * In addition if 0.9 V (nominal) output is set, the Flash works + * in Read only operation. + * + * If 1.1 V (nominal) output is set, the Flash works in Read and Write + * operation and clock frequencies may be increased up to the static + * timing closure limits for the new voltage. + * Refer to the device TRM for more details. + * + * \note + * Function is applicable for devices with SIMO Buck Regulator. + * + * Function does not have effect if SIMO Buck regulator is already enabled. + * + *******************************************************************************/ + void Cy_SysPm_SwitchToSimoBuck(void) + { + /* Check is the SIMO Buck regulator already enabled */ + if(!Cy_SysPm_SimoBuckIsEnabled()) + { + /* Disable the DeepSleep, nWell, and Retention regulators */ + SRSS->PWR_CTL |= (_VAL2FLD(SRSS_PWR_CTL_DPSLP_REG_DIS, 1u) | + _VAL2FLD(SRSS_PWR_CTL_RET_REG_DIS, 1u) | + _VAL2FLD(SRSS_PWR_CTL_NWELL_REG_DIS, 1u)); + + /* Configure SIMO Buck regulator */ + SRSS->PWR_BUCK_CTL = _CLR_SET_FLD32U((SRSS->PWR_BUCK_CTL), + SRSS_PWR_BUCK_CTL_BUCK_OUT1_SEL, + (uint32_t) CY_SYSPM_SIMO_BUCK_OUT1_VOLTAGE_0_9V); + + SRSS->PWR_BUCK_CTL |= _VAL2FLD(SRSS_PWR_BUCK_CTL_BUCK_EN, 1u); + SRSS->PWR_BUCK_CTL |= _VAL2FLD(SRSS_PWR_BUCK_CTL_BUCK_OUT1_EN, 1u); + + /* Wait for SIMO Buck is stable */ + Cy_SysLib_DelayUs(CY_SYSPM_SIMO_BUCK_CORE_SUPPLY_STABLE_US); + + /* Disable linear regulator LDO as Vbuckout1 and LDO are shorted */ + SRSS->PWR_CTL |= _VAL2FLD(SRSS_PWR_CTL_LINREG_DIS, 1u); + } + } + + + /******************************************************************************* + * Function Name: Cy_SysPm_SimoBuckSetVoltage1 + ****************************************************************************//** + * + * Set the output 1 voltage for an SIMO Buck regulator that can supply cores. + * This output can supply cores instead of the Linear regulator. + * + * When changing from a higher voltage to a lower voltage make sure that: + * * Operating frequency is reduced so it is within the static timing closure + * limits at the new frequency. + * + * * Appropriate Wait states values are set for Flash using the + * Cy_SysLib_SetWaitStates() function. Refer to the System Library (syslib) driver + * for more details. + * + * \warning Please be aware that the Flash access time when core + * output voltage is 0.9 V (nominal) is longer that using 1.1 V (nominal). + * Therefore, the clock to the Flash should be decreased. + * + * In addition if 0.9 V (nominal) output is set, the Flash works in + * Read-only operation. + * + * When changing from a lower voltage to a higher voltage, make sure that + * appropriate wait states values are set for Flash using the + * Cy_SysLib_SetWaitStates() function. Refer to the System Library (syslib) driver + * for more details. + * + * If 1.1 V (nominal) output is set, the Flash works in Read and Write + * operations and clock frequency may now be increased up to the static + * timing closure limits for the new voltage. + * + * \warning System does not have a way to know when Vccd is settled at actual + * 0.9 V or 1.1 V for transition, as this voltage depends on conditions + * including load current. The firmware works with nominal + * 0.9 V and 1.1 V voltages. + * + * \param + * voltage Desired output 1 regulator voltage (Vccbuck1). + * See \ref cy_en_syspm_simo_buck_voltage1_t + * + *******************************************************************************/ + void Cy_SysPm_SimoBuckSetVoltage1(cy_en_syspm_simo_buck_voltage1_t voltage) + { + /* Check is the required voltage is equal to current voltage */ + if(voltage != Cy_SysPm_SimoBuckGetVoltage1()) + { + /* Set analog signal bit for flash before voltage is changed + * from 1.1V to 0.9V + */ + if(CY_SYSPM_SIMO_BUCK_OUT1_VOLTAGE_0_9V == voltage) + { + Cy_SysPm_SetVoltageBitForFlash(true); + } + + /* The system may continue operating while the voltage on Vccd + * discharges to the new voltage. The time it takes to reach the + * new voltage depends on conditions, including the load current on + * Vccd and the external capacitor size. + */ + SRSS->PWR_BUCK_CTL = + _CLR_SET_FLD32U((SRSS->PWR_BUCK_CTL), SRSS_PWR_BUCK_CTL_BUCK_OUT1_SEL, (uint32_t) voltage); + + /* Delay for the supply to stabilize at the new voltage is required + * when changing from a lower voltage to a higher voltage. + */ + if(CY_SYSPM_SIMO_BUCK_OUT1_VOLTAGE_1_1V == voltage) + { + Cy_SysLib_DelayUs(CY_SYSPM_SIMO_BUCK_IS_STABLE_US); + + /* Set analog signal bit for flash before voltage is changed + * from 0.9 V to 1.1 V. + */ + Cy_SysPm_SetVoltageBitForFlash(false); + } + } + } + + + /******************************************************************************* + * Function Name: Cy_SysPm_SimoBuckGetVoltage1 + ****************************************************************************//** + * + * Get current nominal output 1 voltage (Vccbuck1) of the SIMO Buck regulator. + * + * \note The actual device output 1 voltage (Vccbuck1) can be different from the + * actual voltage as actual voltage value depends on conditions including + * load current. + * + * \note The actual device output 1 voltage (Vccbuck1) can be different from the + * nominal voltage as actual voltage value depends on conditions including + * load current. + * + * \return + * Nominal output voltage 1 (Vccbuck1) of the SIMO Buck regulator. + * See \ref cy_en_syspm_simo_buck_voltage1_t. + * + *******************************************************************************/ + cy_en_syspm_simo_buck_voltage1_t Cy_SysPm_SimoBuckGetVoltage1(void) + { + uint32_t retVal; + retVal = _FLD2VAL(SRSS_PWR_BUCK_CTL_BUCK_OUT1_SEL, SRSS->PWR_BUCK_CTL); + + return((cy_en_syspm_simo_buck_voltage1_t) retVal); + } + + + /******************************************************************************* + * Function Name: Cy_SysPm_EnableVoltage2 + ****************************************************************************//** + * + * Enable output 2 voltage (Vbuckrf) of the SIMO Buck regulator. The output 2 + * voltage (Vbuckrf) of the SIMO Buck regulator is used to supply the BLE HW block. + * + * The SIMO Buck regulator should be enabled before the Cy_SysPm_EnableVoltage2() + * function call. + * + * \note The function does not have effect if SIMO Buck regulator is disabled. + * + *******************************************************************************/ + void Cy_SysPm_EnableVoltage2(void) + { + if(!Cy_SysPm_SimoBuckIsEnabled()) + { + /* Enable SIMO Buck output 2 */ + SRSS->PWR_BUCK_CTL2 |= _VAL2FLD(SRSS_PWR_BUCK_CTL2_BUCK_OUT2_EN, 1u); + + /* Wait until output is stable */ + Cy_SysLib_DelayUs(CY_SYSPM_SIMO_BUCK_BLE_SUPPLY_STABLE_US); + } + } + + + /******************************************************************************* + * Function Name: Cy_SysPm_EnableVoltage2 + ****************************************************************************//** + * + * Disable output 2 voltage (Vbuckrf) of the SIMO Buck regulator. The output 2 + * voltage (Vbuckrf) of the SIMO Buck regulator is used to supply the BLE HW block. + * + *******************************************************************************/ + void Cy_SysPm_DisableVoltage2(void) + { + /* Disable Vbuck2 output */ + SRSS->PWR_BUCK_CTL2 &= ((uint32_t) ~ (_VAL2FLD(SRSS_PWR_BUCK_CTL2_BUCK_OUT2_EN, 1u))); + } + + + /******************************************************************************* + * Function Name: Cy_SysPm_SimoBuckSetVoltage2 + ****************************************************************************//** + * + * Set current voltage 2 voltage of the SIMO Buck regulator. + * + * \param + * voltage voltage of Linear regulator. + * See \ref cy_en_syspm_simo_buck_voltage2_t. + * + *******************************************************************************/ + void Cy_SysPm_SimoBuckSetVoltage2(cy_en_syspm_simo_buck_voltage2_t voltage) + { + if(voltage != Cy_SysPm_SimoBuckGetVoltage2()) + { + SRSS->PWR_BUCK_CTL2 = + _CLR_SET_FLD32U((SRSS->PWR_BUCK_CTL2), SRSS_PWR_BUCK_CTL2_BUCK_OUT2_SEL, (uint32_t) voltage); + + Cy_SysLib_DelayUs(CY_SYSPM_SIMO_BUCK_IS_STABLE_US); + } + + } + + + /******************************************************************************* + * Function Name: Cy_SysPm_SimoBuckGetVoltage2 + ****************************************************************************//** + * + * Get current output 2 voltage (Vbuckrf) of the SIMO Buck regulator. + * + * \note The actual device output 2 voltage (Vbuckrf) can be different from the + * nominal voltage as actual voltage value depends on conditions including + * load current. + * + * \return + * Nominal output voltage of the SIMO Buck regulator output 2 voltage (Vbuckrf). + * See \ref cy_en_syspm_simo_buck_voltage2_t. + * + *******************************************************************************/ + cy_en_syspm_simo_buck_voltage2_t Cy_SysPm_SimoBuckGetVoltage2(void) + { + uint32_t retVal; + retVal = _FLD2VAL(SRSS_PWR_BUCK_CTL2_BUCK_OUT2_SEL, SRSS->PWR_BUCK_CTL2); + + return((cy_en_syspm_simo_buck_voltage2_t) retVal); + } + + + /******************************************************************************* + * Function Name: Cy_SysPm_SimoBuckOutputIsEnabled + ****************************************************************************//** + * + * Get current output status of the SIMO Buck outputs. + * + * \param + * output SIMO Buck regulator output. See \ref cy_en_syspm_buck_out_t. + * + * \return + * current state of requested output. True if requested output is enabled. + * False if requested output is disabled. + * + *******************************************************************************/ + bool Cy_SysPm_SimoBuckOutputIsEnabled(cy_en_syspm_buck_out_t output) + { + bool retVal; + if(output == CY_SYSPM_BUCK_VBUCK_1) + { + retVal = ((0u != _FLD2VAL(SRSS_PWR_BUCK_CTL_BUCK_OUT1_EN, SRSS->PWR_BUCK_CTL)) ? true : false); + } + else + { + if((0u != _FLD2VAL(SRSS_PWR_BUCK_CTL2_BUCK_OUT2_HW_SEL, SRSS->PWR_BUCK_CTL2)) || + (0u != _FLD2VAL(SRSS_PWR_BUCK_CTL2_BUCK_OUT2_EN, SRSS->PWR_BUCK_CTL2))) + { + retVal = true; + } + else + { + retVal = false; + } + } + return(retVal); + } + + + /******************************************************************************* + * Function Name: Cy_SysPm_SimoBuckIsEnabled + ****************************************************************************//** + * + * Get current status of SIMO Buck regulator. + * + * \return + * current state of the SIMO Buck regulator. True if SIMO Buck regulator is enabled, + * false if it is disabled + * + *******************************************************************************/ + bool Cy_SysPm_SimoBuckIsEnabled(void) + { + return((0u !=_FLD2VAL(SRSS_PWR_BUCK_CTL_BUCK_EN, SRSS->PWR_BUCK_CTL)) ? true : false); + } + + + /******************************************************************************* + * Function Name: Cy_SysPm_SimoBuckSetHwControl + ****************************************************************************//** + * + * Set hardware control for SIMO Buck output 2 (Vbuckrf) + * + * Hardware control for Vbuckrf output. When this bit is set, the value in + * BUCK_OUT2_EN is ignored and a hardware signal is used instead. If the + * product has supporting hardware, it can directly control the enable signal + * for Vbuckrf. + * + * \param + * output enable/disable SIMO Buck regulator outputs, + * see \ref cy_en_syspm_buck_out. + * + *******************************************************************************/ + void Cy_SysPm_SimoBuckSetHwControl(bool hwControl) + { + if(hwControl) + { + SRSS->PWR_BUCK_CTL2 |= _VAL2FLD(SRSS_PWR_BUCK_CTL2_BUCK_OUT2_HW_SEL, 1u); + } + else + { + SRSS->PWR_BUCK_CTL2 &= ((uint32_t)~(_VAL2FLD(SRSS_PWR_BUCK_CTL2_BUCK_OUT2_HW_SEL, 1u))); + } + } + + + /******************************************************************************* + * Function Name: Cy_SysPm_SimoBuckGetHwControl + ****************************************************************************//** + * + * Get hardware control for Vbuckrf + * + * Hardware control for Vbuckrf output. When this bit is set, the value in + * BUCK_OUT2_EN is ignored and a hardware signal is used instead. If the + * product has supporting hardware, it can directly control the enable signal + * for Vbuckrf. + * + * \return + * true if HW control is set, false if FW control is set for SIMO Buck output 2 + * + *******************************************************************************/ + bool Cy_SysPm_SimoBuckGetHwControl(void) + { + return((0u != _FLD2VAL(SRSS_PWR_BUCK_CTL2_BUCK_OUT2_HW_SEL, SRSS->PWR_BUCK_CTL2)) ? true : false); + } + +#endif /* (0u != SRSS_SIMOBUCK_PRESENT) */ + + +/******************************************************************************* +* Function Name: Cy_SysPm_LdoSetVoltage +****************************************************************************//** +* +* Set the voltage on linear regulator (LDO). +* When changing from a higher voltage to a lower voltage make sure that: +* * Operating frequencies are reduced so these are within the static timing +* closure limits at the new frequency. +* +* * Current consumption on core is reduced to meet new output voltage. +* +* * Appropriate Wait states values are set for Flash using the +* Cy_SysLib_SetWaitStates() function. Refer to the System Library (syslib) driver +* for more details. +* +* \warning Please be aware that the Flash access time in condition that core +* output voltage is 0.9 V (nominal) is longer that using 1.1 V (nominal). +* Therefore the clock to the Flash should be decreased. +* +* In addition if 0.9 V (nominal) output is set, the Flash works in Read +* only operation. +* +* When changing from a lower voltage to a higher voltage make sure that +* appropriate Wait states values is set for Flash using the +* Cy_SysLib_SetWaitStates() function. Refer to System Library (syslib) driver +* for more details. +* +* If 1.1 V (nominal) output is set, the Flash works in Read and Write +* operations. Clock frequency may now be increased up to the static +* timing closure limits for the new voltage. +* +* \note The actual device Vccd voltage can be different from the +* nominal voltage as actual voltage value depends on conditions including +* load current. +* +* \param +* voltage Desired output regulator voltage. +* See \ref cy_en_syspm_ldo_voltage_t voltage +* +*******************************************************************************/ +void Cy_SysPm_LdoSetVoltage(cy_en_syspm_ldo_voltage_t voltage) +{ + if(voltage != Cy_SysPm_LdoGetVoltage()) + { + /* Set analog signal bit for flash before voltage is changed + * from 1.1V to 0.9V + */ + if(CY_SYSPM_LDO_VOLTAGE_0_9V == voltage) + { + Cy_SysPm_SetVoltageBitForFlash(true); + } + + /* The system may continue operating while the voltage on Vccd + * discharges to the new voltage. The time it takes to reach the + * new voltage depends on conditions, including the load current on + * Vccd and the external capacitor size + */ + SRSS->PWR_TRIM_PWRSYS_CTL = + _CLR_SET_FLD32U((SRSS->PWR_TRIM_PWRSYS_CTL), SRSS_PWR_TRIM_PWRSYS_CTL_ACT_REG_TRIM, voltage); + + if(CY_SYSPM_LDO_VOLTAGE_1_1V == voltage) + { + /* Delay for the supply to stabilize at the new higher voltage */ + Cy_SysLib_DelayUs(CY_SYSPM_LDO_IS_STABLE_US); + + /* Set analog signal bit to flash macro register after output voltage is 1.1 V */ + Cy_SysPm_SetVoltageBitForFlash(false); + } + } +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_LdoGetVoltage +****************************************************************************//** +* +* Get current output voltage value of Linear regulator. +* +* \note The actual device Vccd voltage can be different from the +* nominal voltage as actual voltage value depends on conditions including +* load current. +* +* \return +* Nominal output voltage of the Linear regulator. +* See \ref cy_en_syspm_ldo_voltage_t. +* +*******************************************************************************/ +cy_en_syspm_ldo_voltage_t Cy_SysPm_LdoGetVoltage(void) +{ + uint32_t retVal; + retVal = _FLD2VAL(SRSS_PWR_TRIM_PWRSYS_CTL_ACT_REG_TRIM, SRSS->PWR_TRIM_PWRSYS_CTL); + + return((cy_en_syspm_ldo_voltage_t) retVal); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_LdoIsEnabled +****************************************************************************//** +* +* Read the current status of Linear regulator. +* +* \return +* True means the Linear regulator is enabled. False means it is if disabled +* +*******************************************************************************/ +bool Cy_SysPm_LdoIsEnabled(void) +{ + return((0u != _FLD2VAL(SRSS_PWR_CTL_LINREG_DIS, SRSS->PWR_CTL)) ? false : true); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_WakeupPinLevel +****************************************************************************//** +* +* This function enables/disables wakeup pins and configure their active +* (high or low) level. +* +* A wake up from the Hibernate mode can be performed by toggling the wakeup pins, +* causing a normal boot procedure to occur. A wakeup is supported by up to +* two pins with programmable polarity. These pins may be connected to IO pins +* or on-chip peripherals under some conditions. +* Setting the wakeup pin to this level will cause a wakeup from the Hibernate +* mode. The wakeup pins are active-low by default. +* +* Configure only one pin at one API call. +* +* \param +* pinNum Selects the wakeup pin. The valid range is [0-1]. The number of the pin. +* +* \param enPinLevel Selects polarity. See \ref cy_en_syspm_pinstate_t. +* +* pinNum value corresponds to an appropriate pin. For example, value 1 +* corresponds to second wakeup pin. For information about wakeup pin +* assignment in specific families devices, refer to the appropriate device +* TRM. +* +*******************************************************************************/ +void Cy_SysPm_WakeupPinLevel(uint32_t pinNum, cy_en_syspm_pinstate_t enPinLevel) +{ + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + + pinNum &= CY_SYSPM_PWR_MASK_HIBPIN_PIN_MASK; + + if (CY_SYSPM_PIN_HIGH_LEVEL == enPinLevel) + { + /* Set high level of selected wakeup pin */ + SRSS->PWR_HIBERNATE |= + _VAL2FLD(SRSS_PWR_HIBERNATE_MASK_HIBPIN, (CY_SYSPM_WAKEUP_PIN_BIT << pinNum)) | + _VAL2FLD(SRSS_PWR_HIBERNATE_POLARITY_HIBPIN, (CY_SYSPM_WAKEUP_PIN_BIT << pinNum)); + } + else if(CY_SYSPM_PIN_LOW_LEVEL == enPinLevel) + { + /* Set low level of selected wakeup pin */ + SRSS->PWR_HIBERNATE |= + _VAL2FLD(SRSS_PWR_HIBERNATE_MASK_HIBPIN, (CY_SYSPM_WAKEUP_PIN_BIT << pinNum)); + + SRSS->PWR_HIBERNATE &= + ((uint32_t) ~_VAL2FLD(SRSS_PWR_HIBERNATE_POLARITY_HIBPIN, (CY_SYSPM_WAKEUP_PIN_BIT << pinNum))); + } + else + { + /* Disable selected wakeup pin */ + SRSS->PWR_HIBERNATE &= + ((uint32_t) ~_VAL2FLD(SRSS_PWR_HIBERNATE_MASK_HIBPIN, (CY_SYSPM_WAKEUP_PIN_BIT << pinNum))); + } + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_WakeupLpCompLevel +****************************************************************************//** +* +* This function is configure wakeup low-power comparators (LPComp) and +* assigns their active (high or low) level. +* +* A wake up from the Hibernate mode can be performed by toggling the LPComps, +* causing a normal boot procedure to occur. A wakeup is supported by up to +* two LPComps with programmable polarity. These LPComp may be connected to IO +* pins or on-chip peripherals under some conditions. +* Setting the LPComp to this level will cause a wakeup from the Hibernate +* mode. The wakeup LPComp are active-low by default. +* +* Configure one of the LPComps at one API call. +* +* \note The Low-power comparators should be configured and enabled before +* switching into the Hibernate low power mode. Refer to LPComp +* driver description for more details. +* +* \param +* lpCompNum Selects the LPComp. The valid range is [0-1]. The number of the LPComp. +* +* \param enLpCompLevel Selects polarity. See \ref cy_en_syspm_lpcomp_state_t. +* +* lpCompNum value corresponds to an appropriate LPComp. For example, value 1 +* corresponds to second LP Comparator. For information about wakeup LPComp +* assignment in specific families devices, refer to the appropriate device +* TRM. +* +*******************************************************************************/ +void Cy_SysPm_WakeupLpCompLevel(uint32_t lpCompNum, cy_en_syspm_lpcomp_state_t enLpCompLevel) +{ + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + + lpCompNum &= CY_SYSPM_LPCOMPARATOR_MASK; + + if(CY_SYSPM_LPCOMP_HIGH_LEVEL == enLpCompLevel) + { + /* Set high level of selected wakeup pin */ + SRSS->PWR_HIBERNATE |= + _VAL2FLD(SRSS_PWR_HIBERNATE_MASK_HIBPIN, CY_SYSPM_LPCOMPARATOR_BIT << lpCompNum) | + _VAL2FLD(SRSS_PWR_HIBERNATE_POLARITY_HIBPIN, (CY_SYSPM_LPCOMPARATOR_BIT << lpCompNum)); + } + else if(CY_SYSPM_LPCOMP_LOW_LEVEL == enLpCompLevel) + { + /* Set low level of selected wakeup pin */ + SRSS->PWR_HIBERNATE |= + _VAL2FLD(SRSS_PWR_HIBERNATE_MASK_HIBPIN, (CY_SYSPM_LPCOMPARATOR_BIT << lpCompNum)); + + SRSS->PWR_HIBERNATE &= + ((uint32_t) ~_VAL2FLD(SRSS_PWR_HIBERNATE_POLARITY_HIBPIN, (CY_SYSPM_LPCOMPARATOR_BIT << lpCompNum))); + } + else + { + /* Disable selected wakeup pin */ + SRSS->PWR_HIBERNATE &= + ((uint32_t) ~_VAL2FLD(SRSS_PWR_HIBERNATE_MASK_HIBPIN, (CY_SYSPM_LPCOMPARATOR_BIT << lpCompNum))); + } + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_WakeupWdt +****************************************************************************//** +* +* This function enables/disables the Watchdog (WDT) to wake up the device from +* Hibernate power mode after WDT interrupt. +* +* \note The WDT should be configured and enabled before entering into Hibernate +* power mode. +* +* A wakeup from the Hibernate mode can be performed by the Watchdog interrupt, +* causing a normal boot procedure to occur. +* The wakeup is performed by a WDT interrupt and a normal boot procedure +* after device reset. Device can wake up from Hibernate after WDT device reset, +* if WDT was not configured to wake up the device on its interrupt and WDT +* was enabled. +* Refer to Watchdog Timer (WDT) driver description for more details. +* +* \param +* configureWdt true if WDT interrupt should wake up device from Hibernate and
+* false if WDT interrupt should not wake up device from Hibernate. +* +*******************************************************************************/ +void Cy_SysPm_WakeupWdt(bool configureWdt) +{ + if(configureWdt) + { + SRSS->PWR_HIBERNATE |= _VAL2FLD(SRSS_PWR_HIBERNATE_MASK_HIBWDT, 1u); + } + else + { + SRSS->PWR_HIBERNATE &= ((uint32_t) (~_VAL2FLD(SRSS_PWR_HIBERNATE_MASK_HIBWDT, 1u))); + } +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_WakeupRtc +****************************************************************************//** +* +* This function enables/disables the alarms from RTC to wake up the device from +* Hibernate power mode after RTC alarm assert. +* +* \note The RTC alarm should be configured and enabled before entering into +* Hibernate power mode. +* +* A wakeup from the Hibernate mode can be performed by the RTC alarm, +* causing a normal boot procedure to occur. +* The wakeup is performed by the RTC alarm and a normal boot procedure +* after device reset. +* Refer to Real-Time Clock (RTC) driver description for more details. +* +* \param +* configureRtc true if RTC alarm should wake up device from Hibernate
+* false if RTC alarm should not wake up device from Hibernate +* +*******************************************************************************/ +void Cy_SysPm_WakeupRtc(bool configureRtc) +{ + if(configureRtc) + { + SRSS->PWR_HIBERNATE |= _VAL2FLD(SRSS_PWR_HIBERNATE_MASK_HIBALARM, 1u); + } + else + { + SRSS->PWR_HIBERNATE &= ((uint32_t) ~_VAL2FLD(SRSS_PWR_HIBERNATE_MASK_HIBALARM, 1u)); + } +} + + + +/******************************************************************************* +* Function Name: Cy_SysPm_RegisterCallback +****************************************************************************//** +* +* Registers a new syspm callback. +* +* \note The registered callbacks will be executed in order of how callbacks were +* registered: the first registered callback will be always the first executed. And the +* last registered callback will be executed as the last callback. +* +* A callback is a function called after an event in a driver or +* middleware-module has occurred. The handler callback API will be executed if +* specific event occurs. See \ref cy_stc_syspm_callback_t. +* +* \param +* handler syspm callback structure. See \ref cy_stc_syspm_callback_t. +* +* \return +* True: callback was registered;
+* False: callback was not registered. +* +* It is allowed to register up to 32 callbacks. +* +*******************************************************************************/ +bool Cy_SysPm_RegisterCallback(cy_stc_syspm_callback_t* handler) +{ + uint32_t interruptState; + volatile bool regCallbackReturnValue = true; + cy_stc_syspm_callback_t* currentCallback = callbackRoot; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + /* Check if the maximum callbacks were registered */ + if((CY_SYSPM_PWR_MAX_CALLBACKS_NUMBER > currentRegisteredCallbacksNumber) && + (handler->Callback != NULL)) + { + /* Check if was at least one callback registered */ + if(callbackRoot == NULL) + { + callbackRoot = handler; + handler->nextItm = NULL; + + currentRegisteredCallbacksNumber++; + } + else + { + /* Check was the required callback already registered */ + while(regCallbackReturnValue && (currentCallback->nextItm != NULL)) + { + if((currentCallback == handler) && (currentCallback->base == handler->base)) + { + /* Condition to switch-off from checking loop and return false as requested callback is + * already registered + */ + regCallbackReturnValue = false; + } + + currentCallback = currentCallback->nextItm; + } + + /* Check last element of callback list */ + if((currentCallback == handler) && (currentCallback->base == handler->base)) + { + /* Condition to switch of from checking and return false */ + regCallbackReturnValue = false; + } + + if(false != regCallbackReturnValue) + { + /* Condition when last registered callback was found */ + currentCallback->nextItm = handler; + handler->nextItm = NULL; + + currentRegisteredCallbacksNumber++; + } + } + } + else + { + regCallbackReturnValue = false; + } + Cy_SysLib_ExitCriticalSection(interruptState); + + return(regCallbackReturnValue); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_UnregisterCallback +****************************************************************************//** +* +* Unregister a callback. +* +* The registered callback can be unregistered. Otherwise, false will be +* returned. +* +* \param +* handler the list item and callback handler. See +* \ref cy_stc_syspm_callback_t. +* +* \return +* True: on success
+* False: if it was not unregistered. +* +*******************************************************************************/ +bool Cy_SysPm_UnregisterCallback(cy_stc_syspm_callback_t* handler) +{ + uint32_t interruptState; + volatile bool unRegCallbackValue; + volatile bool unRegCallbackCheckStatus; + + cy_stc_syspm_callback_t* currentCallback = callbackRoot; + cy_stc_syspm_callback_t* nextCallback; + + unRegCallbackCheckStatus = true; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + /* Check if was at least one callback registered */ + if(0u != currentRegisteredCallbacksNumber) + { + if((callbackRoot == handler) && (callbackRoot->base == handler->base)) + { + callbackRoot = callbackRoot->nextItm; + unRegCallbackCheckStatus = false; + unRegCallbackValue = true; + currentRegisteredCallbacksNumber--; + } + + while(unRegCallbackCheckStatus && (currentCallback != NULL)) + { + /* Searching callback by handler */ + if(currentCallback->nextItm == handler) + { + nextCallback = currentCallback->nextItm; + + /* Check is it required callback by it address */ + if((nextCallback->base == handler->base) && (currentCallback->nextItm == handler)) + { + currentCallback->nextItm = handler->nextItm; + unRegCallbackCheckStatus = false; + unRegCallbackValue = true; + currentRegisteredCallbacksNumber--; + } + } + else + { + unRegCallbackValue = false; + } + currentCallback = currentCallback->nextItm; + } + } + else + { + unRegCallbackValue = false; + } + Cy_SysLib_ExitCriticalSection(interruptState); + + return(unRegCallbackValue); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_ExecuteCallback +****************************************************************************//** +* +* Internal API that executes all registered callbacks with type. +* \note The registered callbacks will be executed in order of how callbacks were +* registered: the first registered callback will be first executed. And the +* last registered callback will be executed as the last callback. +* +* Executed callbacks in the registered callback list from index 0 to index +* lastCallback-1. If lastCallback = 0 then all callbacks are executed. Callbacks +* are executed until the first one that returns CY_SYSPM_FAIL. Returns the +* index+1 of the callback that failed. If no callbacks are registered, returns +* CY_SYSPM_SUCCESS. +* +* \param +* type callback type. See \ref cy_en_syspm_callback_type_t. +* +* \param +* mode callback mode. See \ref cy_en_syspm_callback_mode_t. +* +* \param +* lastCallback Index+1 of last registered callback to execute. +* if lastCallback = 0 - Execute all registered callbacks +* +* \return +* CY_SYSPM_SUCCESS Callback successfully completed or nor callbacks registered. +* Something different than CY_SYSPM_SUCCESS - Index+1 of callback that failed. +* +*******************************************************************************/ +uint32_t Cy_SysPm_ExecuteCallback(cy_en_syspm_callback_type_t type, + cy_en_syspm_callback_mode_t mode, + uint32_t lastCallback) +{ + uint32_t executedCallbacksCounter = 0u; + uint32_t retVal = (uint32_t) CY_SYSPM_SUCCESS; + cy_stc_syspm_callback_t* currentCallback = callbackRoot; + + if(0u == lastCallback) + { + lastCallback = CY_SYSPM_PWR_MAX_CALLBACKS_NUMBER; + } + + while((currentCallback != NULL) && (retVal != ((uint32_t) CY_SYSPM_FAIL)) && (0u != lastCallback)) + { + if (currentCallback->type == type) + { + retVal = (uint32_t) currentCallback->Callback(currentCallback->base, currentCallback->content, mode); + executedCallbacksCounter++; + lastCallback--; + } + currentCallback = currentCallback->nextItm; + } + + /* Return Index+1 of callback that failed if callback function returned + * CY_SYSPM_FAIL + */ + if(retVal == (uint32_t) CY_SYSPM_FAIL) + { + retVal = executedCallbacksCounter; + } + return retVal; +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_GetIoFreezeStatus +****************************************************************************//** +* +* Checks whether IoFreeze is enabled. +* +* \return Returns TRUE if IOs are frozen
FALSE if IOs are unfrozen. +* +******************************************************************************/ +bool Cy_SysPm_GetIoFreezeStatus(void) +{ + return(0u != _FLD2VAL(SRSS_PWR_HIBERNATE_FREEZE, SRSS->PWR_HIBERNATE)); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_IoFreeze +****************************************************************************//** +* +* Freezes IOs. +* +* Freezes IO-Cells directly to save the IO-Cell state on a wakeup from the +* Hibernate. You don't need to call this function before entering the +* Hibernate mode, because Cy_SysPm_Hibernate() function freezes IO-Cells +* implicitly. +* +******************************************************************************/ +void Cy_SysPm_IoFreeze(void) +{ + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + + /* Check the FREEZE state to avoid recurrent IO-Cells freeze attempt, + * because the second call to this function will cause an accidental switch + * to the Hibernate mode (the system will enter Hibernate mode immediately + * after writing to Hibernate bit because both UNLOCK and FREEZE were set + * correctly in previous call to this function). + */ + if(0u == _FLD2VAL(SRSS_PWR_HIBERNATE_FREEZE, SRSS->PWR_HIBERNATE)) + { + /* Clear unlock field for correct freeze of IO-Cells */ + SRSS->PWR_HIBERNATE = _CLR_SET_FLD32U((SRSS->PWR_HIBERNATE), SRSS_PWR_HIBERNATE_UNLOCK, 0u); + + /* Preserve last-reset reason and disable overriding by peripherals next + * pin-freeze command + */ + SRSS->PWR_HIBERNATE |= CY_SYSPM_PWR_HIBERNATE_UNLOCK | + _VAL2FLD(SRSS_PWR_HIBERNATE_FREEZE, 1u) | + _VAL2FLD(SRSS_PWR_HIBERNATE_HIBERNATE, 1u); + + /* If reading after writing, read this register three times to delay + * enough time for internal settling. + */ + (void) SRSS->PWR_HIBERNATE; + (void) SRSS->PWR_HIBERNATE; + + /* Second write causes freeze of IO-Cells to save IO-Cell state */ + SRSS->PWR_HIBERNATE = SRSS->PWR_HIBERNATE; + } + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_IoUnfreeze +****************************************************************************//** +* +* Unfreezes the IOs. +* +* The IO-Cells remain frozen after awaking from the Hibernate mode until the +* firmware unfreezes them after booting. The call of this function unfreezes the +* IO-Cells explicitly. +* +* If the firmware intent is to retain the data value on the port, then the +* value must be read and re-written to the data register before calling this +* API. Furthermore, the drive mode must be re-programmed. If this is not done, +* the pin state will change to default state the moment the freeze is removed. +* +*******************************************************************************/ +void Cy_SysPm_IoUnfreeze(void) +{ + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + + /* Preserve last reset reason and wakeup polarity. Then, unfreeze I/O: + * write PWR_HIBERNATE.FREEZE=0, .UNLOCK=0x3A, .HIBERANTE=0, + */ + SRSS->PWR_HIBERNATE = + CY_SYSPM_PWR_HIBERNATE_UNLOCK | (SRSS->PWR_HIBERNATE & CY_SYSPM_PWR_RETAIN_HIBERNATE_STATUS); + + /* If reading stands after writing, read this register three times to delay + * enough time for internal settling. + */ + (void) SRSS->PWR_HIBERNATE; + (void) SRSS->PWR_HIBERNATE; + + /* Lock HIBERNATE mode: write PWR_HIBERNATE.HIBERNATE=0, UNLOCK=0x00, HIBERANTE=0, .TOKEN */ + SRSS->PWR_HIBERNATE &= CY_SYSPM_PWR_RETAIN_HIBERNATE_STATUS; + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_SetDelayAfterDeepSleep +****************************************************************************//** +* +* \Internal function for setting the delay after switching the device from +* DeepSleep power mode. +* +* If ECO or PLL is enabled, the 17 us delay should be +* configured before entering into the DeepSleep. If ECO or PLL are +* disabled, the delay is not required. +* +*******************************************************************************/ +static void Cy_SysPm_SetDelayAfterDeepSleep(void) +{ + uint32_t clkPath = 0u; + uint32_t waitClocks = 0u; + + if (_FLD2VAL(SRSS_CLK_ECO_CONFIG_ECO_EN, SRSS->CLK_ECO_CONFIG) == 0u) + { + while((CY_SYSPM_PWR_MAX_PLL_NUMBER > clkPath) && (CY_SYSPM_PWR_TRIM_WAKE_CNTS != waitClocks)) + { + if(_FLD2VAL(SRSS_CLK_PLL_CONFIG_ENABLE, SRSS->CLK_PLL_CONFIG[clkPath]) != 0u) + { + waitClocks = CY_SYSPM_PWR_TRIM_WAKE_CNTS; + } + clkPath++; + } + } + else + { + waitClocks = CY_SYSPM_PWR_TRIM_WAKE_CNTS; + } + + if(0u != waitClocks) + { + SRSS->PWR_TRIM_WAKE_CTL = + _CLR_SET_FLD32U((SRSS->PWR_TRIM_WAKE_CTL), SRSS_PWR_TRIM_WAKE_CTL_WAKE_DELAY, waitClocks); + } +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_SetVoltageBitForFlash +****************************************************************************//** +* +* Internal function that changes the Vcc setting for flash. +* +* \param +* setBit set/clear bit for flash macro register. This bit should be set when +* voltage for core regulators is less than 0.99 V. This bit should be set if +* output voltage for core regulators is higher than 0.99 V. +* +* +*******************************************************************************/ +static void Cy_SysPm_SetVoltageBitForFlash(bool setBit) +{ + if(setBit) + { + FLASHC_FM_CTL->ANA_CTL0 |= _VAL2FLD(FLASHC_FM_CTL_ANA_CTL0_VCC_SEL, 1u); + } + else + { + FLASHC_FM_CTL->ANA_CTL0 &= ((uint32_t) (~_VAL2FLD(FLASHC_FM_CTL_ANA_CTL0_VCC_SEL, 1u))); + } +} + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syspm/cy_syspm.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syspm/cy_syspm.h new file mode 100644 index 0000000000..1c70f0e65c --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syspm/cy_syspm.h @@ -0,0 +1,820 @@ +/***************************************************************************//** +* \file cy_syspm.h +* \version 1.0 +* +* Provides the function definitions for the power management API. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +* +*******************************************************************************/ + +/** +* \defgroup group_syspm System Power Management (SysPm) +* \{ +* Power Modes +* +* Devices support the following power modes (in the order of +* high-to-low power consumption): Active, Sleep, Low Power (LP) Active, +* LP Sleep, DeepSleep, and Hibernate. +* Active and Sleep are the standard ARM-defined power modes, supported by the +* ARM CPUs. +* DeepSleep is a lower-power mode where high-frequency clocks are disabled. +* Most of the register state is retained and the platform supports saving a +* configurable amount of the SRAM state. +* Hibernate is an even lower power mode that is entered from firmware, +* just like DeepSleep. However, on a wakeup the CPU and all peripherals go +* through a full reset. +* +* The power mode library is used to enter low-power states to reduce system +* power consumption in power sensitive designs. This library allows the user to +* individually power down each CPU into Sleep or DeepSleep. +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
CM0+ ModeCM4 ModePower Mode (SRSS)Mode Description
ActiveActiveNormalAll Clocks and peripherals may operate or optionally can +* be disabled. Current load limitation is set as for +* active power mode(*1).
SleepActiveNormalAll Clocks and peripherals may operate or optionally can +* be disabled. Current load limitation is set as for +* active power mode(*1).
DeepSleepActiveNormalAll Clocks and peripherals may operate or optionally can +* be disabled. Current load limitation is set as for +* active power mode(*1).
SleepSleepNormalAll Clocks and peripherals may operate, CPUs Off. Current load +* limitation is set as for active power mode(*1).
DeepSleepSleepNormalAll Clocks and peripherals may operate, CPUs Off. Current load +* limitation is set as for active power mode(*1).
ActiveDeepSleepNormalAll Clocks and peripherals may operate or optionally can +* be disabled. Current load limitation is set as for +* active power mode(*1).
SleepDeepSleepNormalAll Clocks and peripherals may operate, CPUs Off. Current load +* limitation is set as for active power mode(*1).
DeepSleepDeepSleepDeepSleepAll the MHz clocks are off, but so is the DSI routing, and most Analog +* and voltage references are off by default. Only ILO/WCO may operate, +* limited peripherals.
Active (LPActive)Active (LPActive)Low powerAll the MHz clocks frequencies are decreased to meet current load +* limitations (*1). Peripherals are also slowed and optionally disabled +* to meet current load limitations in LPActive power mode.
Sleep (LPSleep)Active (LPActive)Low powerAll the MHz clocks frequencies are decreased to meet current load +* limitations (*1). Peripherals are also slowed and optionally disabled +* to meet current load limitations in LPActive power mode.
DeepSleepActive (LPActive)Low powerAll the MHz clocks frequencies are decreased to meet current load +* limitations (*1). Peripherals are also slowed and optionally disabled +* to meet current load limitations in LPActive power mode.
Active (LPActive)Sleep (LPSleep)Low powerAll the MHz clocks frequencies are decreased to meet current load +* limitations (*1). Peripherals are also slowed and optionally disabled +* to meet current load limitations in LPActive power mode.
Sleep (LPSleep)Sleep (LPSleep)Low powerAll the MHz clocks frequencies are decreased to meet current load +* limitations (*1). Peripherals are also slowed and optionally disabled +* to meet current load limitations in LPActive power mode. +* CPUs are off.
DeepSleepSleep (LPSleep)Low powerAll the MHz clocks frequencies are decreased to meet current load +* limitations (*1). Peripherals are also slowed and optionally disabled +* to meet current load limitations in LPActive power mode. +* CPUs are off
Active (LPActive)DeepSleepLow powerAll the MHz clocks frequencies are decreased to meet current load +* limitations (*1). Peripherals are also slowed and optionally disabled +* to meet current load limitations in LPActive power mode.
DeepSleepDeepSleepDeepSleepThe entire chip is in a DeepSleep mode, since it forces the MHz +* clocks, DSI, UDBs, most peripherals, analog, etc., to be shut down. +* Only ILO/WCO may operate, limited peripherals
--HibernateOnce Hibernate mode is set, everything goes into Hibernate mode. +* Only ILO may operate to assert wake-up device using WDT or RTC.
+* +* (*1) For more details about power modes and current load limitations refer to +* the device Technical Reference Manual (TRM). +* +* Power modes: +* * Active - In this mode the CPU executes code, and all logic and memories +* are powered. Firmware may decide to disable clocks for specific peripherals +* and to power down specific analog power domains. The chip enters Active upon +* initial reset. For internally-generated resets, the chip enters the most +* recently used power mode among Active and LPActive. +* +* * Sleep - In this mode the CPU does not execute code and its clock is +* stopped. It is identical to ACTIVE from a peripheral point of view. +* +* * LPActive - LPActive (Low Power Active) is similar to Active, with clock +* restrictions and limited/slowed peripheral to achieve a lower system current. +* +* * LPSleep - LPSleep (Low Power Sleep) mode operates the same as Sleep mode +* with the clocking limitations of LPActive mode to further reduce system power. +* +* * DeepSleep - In DeepSleep mode the main system clock is off for CPU, Flash, +* and high-speed logic. Optionally, the low frequency (32.768 kHz) clock +* remains on, and low-frequency peripherals continue operating. +* Peripherals that do not need a clock or receive a clock from their external +* interface (e.g., I2C/SPI) continue operating, and all circuits that draw +* current from the Vccdpslp supply are subject to the current sourcing +* limitations of the DeepSleep Regulator (if the core is supplied by the +* Linear core regulator). If the core is supplied by the SIMO Buck regulator all +* deepsleep peripherals are supplied by Vbuck1. +* A normal wakeup from DeepSleep returns to either LPActive, LPSleep, Active, or +* Sleep, depending on the previous state and programmed behavior for the +* configured wakeup interrupt. +* Likewise, a debug wakeup from DeepSleep returns to LPSleep or Sleep, depending +* on which mode was used to enter DeepSleep. +* +* * Hibernate - Is the lowest power mode available when external supplies are +* present. It is intended for applications in a dormant state. +* Hibernate is implemented using high voltage logic and switches off all +* internal regulators. The Backup domain continues functioning normally. +* The I/O's state is frozen so that the output driver state is held. +* Note in this mode the CPU and all peripherals lose state, so the system and +* firmware reboot on a wakeup event. +* Wakeup is supported from device specific pin(s) with programmable +* polarity. Additionally, unregulated peripherals can wake the device under +* some conditions. For example, a low-power comparator can wake the device by +* comparing two external voltages but may not support comparison to an +* internally-generated voltage. The Backup domain remains functional, and if +* present it can schedule an alarm to wake the device from Hibernate using RTC. +* The combination of Hibernate and Backup alarms can yield low current duty +* cycling for applications, such as waking once per second for a CapSense +* scan. Alternatively, the Watchdog Timer (WDT) can be configured to wake-up the device by +* WDT interrupt. +* Backup memory (BMEM) can be used to store system state for use on the +* next reboot. +* +* The system can wakeup from Hibernate power mode by configuring: +* * Wakeup pins +* * WDT interrupt +* * LPComparator +* * WDT reset - this can be configured without using the syspm driver. Just +* configure and enable the WDT before entering Hibernate power mode. All +* other events require use of the API from the syspm driver. +* +* * XRES - is the state of the part when XRES is applied. This is obviously a +* reset condition, but it is also considered a power mode because some low-power +* applications, such as remote controls, expect very low current consumption +* when XRES is asserted. +* +* * OFF - The OFF state simply represents the state of the part with no power +* applied to it (except perhaps the Backup domain). In some applications, power +* to the device will be switched on and off by another device in the system to +* make the product implement the lowest power consumption level. +* +* Wakeup time after a reset is device-dependent because of the boot run-time. +* The wakeup time varies depending on the number and type of trim parameters and +* the size of device Flash. +* +* For ARM-based devices, an interrupt is required for the CPU to +* wake up. +* +* * All pending interrupts should be cleared before the device is put into a +* low-power mode, even if they are masked. +* +* \section group_syspm_section_configuration Configuration Considerations +* After initial device boot the device goes into Active power mode. After some +* code execution the device could be sent into low power modes. The +* Cy_SysPm_Sleep() and Cy_SysPm_DeepSleep() functions only switch the core that +* calls the function into Sleep or DeepSleep. To set the whole device into Sleep +* or DeepSleep device, ensure that each core calls the sleep functions. +* +* There are situations when the device does not switch into DeepSleep power +* mode immediately after the second core calls Cy_SysPm_DeepSleep(). The device +* will switch into DeepSleep mode automatically a little bit later, after the +* low-power circuits are ready to switch into DeepSleep. +* Refer to the Cy_SysPm_DeepSleep() description for more details. +* +* If you call Cy_SysPm_Hibernate() the device will be switched +* into Hibernate power mode directly, as there is no handshake between cores. +* +* Before switching into LPActive power mode ensure that the device meets the +* current load limitation by decreasing the Mhz clocks, and slowing or disabling +* peripherals. +* Refer to the device TRM for more details about current load limitations in +* different low-power modes. +* +* The syspm driver implements a syspm callbacks mechanism. Using a +* syspm callback, you can perform actions right before entering +* low-power mode, and directly after switching out of low-power mode. With the +* callback mechanism you can prevent switching into low power mode if, for +* example, some required peripheral is not ready to enter into requested +* low-power mode. +* +* Fill in the cy_stc_syspm_callback_t structure for each callback function. +* Each callback function is of the type cy_SysPMCallback. You assign +* the mode for each callback function. Refer to cy_en_syspm_callback_mode_t. +* Also refer to Cy_SysPm_Sleep(), Cy_SysPm_DeepSleep(), Cy_SysPm_EnterLpMode(), +* Cy_SysPm_ExitLpMode(), Cy_SysPm_Hibernate() for more details. +* +* Refer to Cy_SysPm_RegisterCallback() description for more details +* about registering a callback. You may have up to 32 callback functions. +* +* \section group_syspm_section_more_information More Information +* +* For more information on the Power Modes (syspm) driver, +* refer to the Technical Reference Manual (TRM). +* +* \section group_syspm_MISRA MISRA-C Compliance +* The syspm driver does not have any specific deviations. +* +* \section group_syspm_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_syspm_macro Macro +* \defgroup group_syspm_functions Functions +* \defgroup group_syspm_data_structures Data Structures +* \defgroup group_syspm_data_enumerates Enumerated types +*/ + +#ifndef _CY_SYSPM_H_ +#define _CY_SYSPM_H_ + +#include +#include +#include "cy_device_headers.h" +#include "syslib/cy_syslib.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************* +* Register Constants +*******************************************************************************/ + +/** +* \addtogroup group_syspm_macro +* \{ +*/ + +/** Driver major version */ +#define CY_SYSPM_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_SYSPM_DRV_VERSION_MINOR 0 + +/** \cond INTERNAL */ + +/** Internal define for SysPm_DeepSleep() function */ +#define CY_SYSPM_PWR_TRIM_WAKE_CNTS (0x8Bu) + +/** Internal define for Cy_SysPm_ExitLpMode() function */ +#define CY_SYSPM_WAIT_DELAY_TRYES (100u) + +/** Internal define for SysPm_SwitchToSimoBuck() function */ +#define CY_SYSPM_1M_THRESHOLD (1000000u) + +/** Internal define for SysPm_WakeupPinLevel() function */ +#define CY_SYSPM_PWR_MASK_HIBPIN_PIN_MASK (0x03u) + +/** Internal define for SysPm_WakeupPinLevel() function */ +#define CY_SYSPM_WAKEUP_PIN_BIT (1ul) + +/* Internal define for Cy_SysPm_WakeupLpCompLevel() function */ +#define CY_SYSPM_LPCOMPARATOR_BIT (4ul) + +/* Define for mask for LPComs in Cy_SysPm_WakeupLpCompLevel() function */ +#define CY_SYSPM_LPCOMPARATOR_MASK (12u) + +/** \endcond */ + +/** syspm driver identifier */ +#define CY_SYSPM_ID (CY_PDL_DRV_ID(0x10u)) + +/** +* \defgroup group_syspm_return_status Power Mode Status +* \{ +* Current power mode status defines +*/ + +/** CM4 is Active */ +#define CY_SYSPM_STATUS_CM4_ACTIVE (0x01u) + +/** CM4 is in Sleep */ +#define CY_SYSPM_STATUS_CM4_SLEEP (0x02u) + +/** CM4 is in DeepSleep */ +#define CY_SYSPM_STATUS_CM4_DEEPSLEEP (0x04u) + +/** CM4 is Lop Power mode */ +#define CY_SYSPM_STATUS_CM4_LOWPOWER (0x80u) + +/** CM0 is Active */ +#define CY_SYSPM_STATUS_CM0_ACTIVE ((uint32_t) ((uint32_t)0x01u << 8u)) + +/** CM0 is in Sleep */ +#define CY_SYSPM_STATUS_CM0_SLEEP ((uint32_t) ((uint32_t)0x02u << 8u)) + +/** CM0 is in DeepSleep */ +#define CY_SYSPM_STATUS_CM0_DEEPSLEEP ((uint32_t) ((uint32_t)0x04u << 8u)) + +/** CM4 is in Low Power mode */ +#define CY_SYSPM_STATUS_CM0_LOWPOWER ((uint32_t) ((uint32_t)0x80u << 8u)) + +/** Device is in Low Power mode*/ +#define CY_SYSPM_STATUS_SYSTEM_LOWPOWER ((uint32_t) (CY_SYSPM_STATUS_CM0_LOWPOWER | (CY_SYSPM_STATUS_CM4_LOWPOWER))) + +/** \} group_syspm_return_status */ + +/** Define to update token to indicate Hibernate mode transition */ +#define CY_SYSPM_PWR_HIBERNATE_TOKEN_HIBERNATE (0xf1u) + +/** Wait time for transition device from Active into the LPActive */ +#define CY_SYSPM_PWR_ACTIVE_TO_LP_WAIT_US (1u) + +/** Wait time for transition device from Active into the LPActive before Active +* reference is settled +*/ +#define CY_SYSPM_PWR_LP_TO_ACTIVE_WAIT_BEFORE_US (8u) + +/** Wait time for transition device from Active into the LPActive after Active +* reference is settled +*/ +#define CY_SYSPM_PWR_LP_TO_ACTIVE_WAIT_AFTER_US (1u) + +/** Maximum callbacks number */ +#define CY_SYSPM_PWR_MAX_CALLBACKS_NUMBER (32u) + +/** Mask to unlock Hibernate mode */ +#define CY_SYSPM_PWR_HIBERNATE_UNLOCK ((uint32_t) 0x3Au << SRSS_PWR_HIBERNATE_UNLOCK_Pos) + +/** Mask to retain Hibernate status */ +#define CY_SYSPM_PWR_RETAIN_HIBERNATE_STATUS ((uint32_t) SRSS_PWR_HIBERNATE_TOKEN_Msk |\ + SRSS_PWR_HIBERNATE_MASK_HIBALARM_Msk |\ + SRSS_PWR_HIBERNATE_MASK_HIBWDT_Msk |\ + SRSS_PWR_HIBERNATE_POLARITY_HIBPIN_Msk |\ + SRSS_PWR_HIBERNATE_MASK_HIBPIN_Msk) + + +/** Maximum value of callbacks */ +#define CY_SYSPM_PWR_MAX_PLL_NUMBER (16u) + +/** Definition for delay of SIMO Buck supply regulator after it is enabled */ +#define CY_SYSPM_SIMO_BUCK_CORE_SUPPLY_STABLE_US (900u) + +/** Definition for delay of SIMO Buck output 2 */ +#define CY_SYSPM_SIMO_BUCK_BLE_SUPPLY_STABLE_US (600u) + +/** Definition for delay of Linear Regulator after it output voltage +* is changed +*/ +#define CY_SYSPM_LDO_IS_STABLE_US (9u) + +/** Definition for delay of core supply regulator after it output voltage +* is changed +*/ +#define CY_SYSPM_SIMO_BUCK_IS_STABLE_US (200u) +/** \} group_syspm_macro */ + +/******************************************************************************* +* Configuration Structures +*******************************************************************************/ + +/** +* \addtogroup group_syspm_data_enumerates +* \{ +*/ + +/** This enumeration is used to initialize the wakeup pin state */ +typedef enum +{ + CY_SYSPM_PIN_DISABLED, /**< Disable selected wakeup pin */ + CY_SYSPM_PIN_HIGH_LEVEL, /**< Configure high level for selected wakeup-pin */ + CY_SYSPM_PIN_LOW_LEVEL /**< Configure low level for selected wakeup-pin */ +} cy_en_syspm_pinstate_t; + + +/** This enumeration is used to initialize the Low-power Comparator +* (LPComp) state +*/ +typedef enum +{ + CY_SYSPM_LPCOMP_DISABLED, /**< Disable selected LPComp */ + CY_SYSPM_LPCOMP_HIGH_LEVEL, /**< Configure high level for selected LPComp */ + CY_SYSPM_LPCOMP_LOW_LEVEL /**< Configure low level for selected LPComp */ +} cy_en_syspm_lpcomp_state_t; + +/** +* This enumeration is used to initialize a wait action - an interrupt or +* event. Refer to the CMSIS for the WFE and WFI instruction explanations. +*/ +typedef enum +{ + CY_SYSPM_WAIT_FOR_INTERRUPT, /**< Wait for interrupt */ + CY_SYSPM_WAIT_FOR_EVENT /**< Wait for event */ +} cy_en_syspm_waitfor_t; + +/** +* The enumeration for core voltages for both the SIMO Buck and the +* Linear Regulator +*/ +typedef enum +{ + CY_SYSPM_LDO_VOLTAGE_0_9V = 0x05u, /**< 0.9 V nominal core voltage */ + CY_SYSPM_LDO_VOLTAGE_1_1V = 0x17u /**< 1.1 V nominal core voltage */ +} cy_en_syspm_ldo_voltage_t; + +/** +* The enumeration for core voltages for both the SIMO Buck and the +* Linear Regulator +*/ +typedef enum +{ + CY_SYSPM_SIMO_BUCK_OUT1_VOLTAGE_0_9V = 0x01u, /**< 0.9 V nominal core voltage */ + CY_SYSPM_SIMO_BUCK_OUT1_VOLTAGE_1_1V = 0x05u /**< 1.1 V nominal core voltage */ +} cy_en_syspm_simo_buck_voltage1_t; + + +/** +* The enumeration for core voltages for both the SIMO Buck and the +* Linear Regulator +*/ +typedef enum +{ + CY_SYSPM_SIMO_BUCK_OUT2_VOLTAGE_0_95V = 0u, /**< 0.95 V nominal core voltage */ + CY_SYSPM_SIMO_BUCK_OUT2_VOLTAGE_1_0V, /**< 1.0 V nominal core voltage */ + CY_SYSPM_SIMO_BUCK_OUT2_VOLTAGE_1_05V, /**< 1.05 V nominal core voltage */ + CY_SYSPM_SIMO_BUCK_OUT2_VOLTAGE_1_1V, /**< 1.1 V nominal core voltage */ + CY_SYSPM_SIMO_BUCK_OUT2_VOLTAGE_1_2V, /**< 1.2 V nominal core voltage */ + CY_SYSPM_SIMO_BUCK_OUT2_VOLTAGE_1_3V, /**< 1.3 V nominal core voltage */ + CY_SYSPM_SIMO_BUCK_OUT2_VOLTAGE_1_4V, /**< 1.4 V nominal core voltage */ + CY_SYSPM_SIMO_BUCK_OUT2_VOLTAGE_1_5V, /**< 1.5 V nominal core voltage */ +} cy_en_syspm_simo_buck_voltage2_t; + +/** +* The enumeration are used to configure SIMO Buck regulator outputs +*/ +typedef enum +{ + CY_SYSPM_BUCK_VBUCK_1, /**< SIMO Buck output 1 Voltage (Vback1) */ + CY_SYSPM_BUCK_VRF /**< SIMO Buck out 2 Voltage (Vbackrf) */ +} cy_en_syspm_buck_out_t; + +/** SysPm status definitions */ +typedef enum +{ + CY_SYSPM_SUCCESS = 0x00u, /**< Successful */ + CY_SYSPM_BAD_PARAM = CY_SYSPM_ID | CY_PDL_STATUS_ERROR | 0x01u, /**< One or more invalid parameters */ + CY_SYSPM_TIMEOUT = CY_SYSPM_ID | CY_PDL_STATUS_ERROR | 0x02u, /**< Time-out occurs */ + CY_SYSPM_INVALID_STATE = CY_SYSPM_ID | CY_PDL_STATUS_ERROR | 0x03u, /**< Operation not setup or is in an + improper state */ + CY_SYSPM_FAIL = CY_SYSPM_ID | CY_PDL_STATUS_ERROR | 0xFFu /**< Unknown failure */ +} cy_en_syspm_status_t; + +/** +* This enumeration is used for selecting the low power mode on which the +* appropriate registered callback handler will be executed. For example, +* registered callback with type CY_SYSPM_SLEEP will be executed while +* switching into the Sleep power mode. +*/ +typedef enum +{ + CY_SYSPM_SLEEP, /**< Sleep enum callback type */ + CY_SYSPM_DEEPSLEEP, /**< DeepSleep enum callback type */ + CY_SYSPM_HIBERNATE, /**< Hibernate enum callback type */ + CY_SYSPM_ENTER_LP_MODE, /**< Enter LPActive mode enum callback type */ + CY_SYSPM_EXIT_LP_MODE, /**< Exit LPActive mode enum callback type */ +} cy_en_syspm_callback_type_t; + +/** Callback mode enumeration. This enum define the callback mode */ +typedef enum +{ + CY_SYSPM_CHECK_READY, /**< Callbacks with this mode are executed before entering into low-power mode. + It checks if device is ready to enter low-power mode */ + CY_SYSPM_CHECK_FAIL, /**< Callbacks with this mode are executed after the previous callbacks execution + with CY_SYSPM_CHECK_READY returned CY_SYSPM_FAIL. Callback with + CY_SYSPM_CHECK_FAIL mode should rollback the actions which were done in + callbacks executed previously with CY_SYSPM_CHECK_READY */ + CY_SYSPM_BEFORE_ENTER, /**< Actions that should be done before enter low-power mode */ + CY_SYSPM_AFTER_EXIT, /**< Actions that should be done after exit low-power mode */ +} cy_en_syspm_callback_mode_t; + +/** \} group_syspm_data_enumerates */ + +/** +* \addtogroup group_syspm_data_structures +* \{ +*/ + +/** Type for syspm callbacks */ +typedef cy_en_syspm_status_t (*Cy_SysPmCallback) (void *base, void *content, cy_en_syspm_callback_mode_t mode); + +/** The structure which contain the syspm callback configuration elements */ +typedef struct cy_stc_syspm_callback +{ + Cy_SysPmCallback Callback; /**< Callback handler function */ + cy_en_syspm_callback_type_t type; /**< Callback type, see \ref cy_en_syspm_callback_type_t */ + void *base; /**< Base address of HW instance, matches with driver name in + the API for base address */ + void *content; /**< Content for handler function */ + struct cy_stc_syspm_callback *nextItm; /**< Next list item */ +} cy_stc_syspm_callback_t; +/** \} group_syspm_data_structures */ + +/** +* \addtogroup group_syspm_functions +* \{ +*/ +__STATIC_INLINE bool Cy_SysPm_Cm4IsActive(void); +__STATIC_INLINE bool Cy_SysPm_Cm4IsSleep(void); +__STATIC_INLINE bool Cy_SysPm_Cm4IsDeepSleep(void); +__STATIC_INLINE bool Cy_SysPm_Cm4IsLowPower(void); +__STATIC_INLINE bool Cy_SysPm_Cm0IsActive(void); +__STATIC_INLINE bool Cy_SysPm_Cm0IsSleep(void); +__STATIC_INLINE bool Cy_SysPm_Cm0IsDeepSleep(void); +__STATIC_INLINE bool Cy_SysPm_Cm0IsLowPower(void); +__STATIC_INLINE bool Cy_SysPm_IsLowPower(void); + +uint32_t Cy_SysPm_ReadStatus(void); +cy_en_syspm_status_t Cy_SysPm_Sleep(cy_en_syspm_waitfor_t enWaitFor); +cy_en_syspm_status_t Cy_SysPm_DeepSleep(cy_en_syspm_waitfor_t enWaitFor); +cy_en_syspm_status_t Cy_SysPm_Hibernate(void); +cy_en_syspm_status_t Cy_SysPm_EnterLpMode(void); +cy_en_syspm_status_t Cy_SysPm_ExitLpMode(void); +void Cy_SysPm_SleepOnExit(bool enable); + +void Cy_SysPm_WakeupPinLevel(uint32_t pinNum, cy_en_syspm_pinstate_t enPinLevel); +void Cy_SysPm_WakeupLpCompLevel(uint32_t lpCompNum, cy_en_syspm_lpcomp_state_t enLpCompLevel); +void Cy_SysPm_WakeupWdt(bool configureWdt); +void Cy_SysPm_WakeupRtc(bool configureRtc); + +bool Cy_SysPm_RegisterCallback(cy_stc_syspm_callback_t* handler); +bool Cy_SysPm_UnregisterCallback(cy_stc_syspm_callback_t* handler); +uint32_t Cy_SysPm_ExecuteCallback(cy_en_syspm_callback_type_t type, + cy_en_syspm_callback_mode_t mode, + uint32_t lastCallback); + +bool Cy_SysPm_GetIoFreezeStatus(void); +void Cy_SysPm_IoFreeze(void); +void Cy_SysPm_IoUnfreeze(void); + +void Cy_SysPm_LdoSetVoltage(cy_en_syspm_ldo_voltage_t voltage); +cy_en_syspm_ldo_voltage_t Cy_SysPm_LdoGetVoltage(void); +bool Cy_SysPm_LdoIsEnabled(void); + +#if(0u != SRSS_SIMOBUCK_PRESENT) + + void Cy_SysPm_SwitchToSimoBuck(void); + void Cy_SysPm_SimoBuckSetVoltage1(cy_en_syspm_simo_buck_voltage1_t voltage); + cy_en_syspm_simo_buck_voltage1_t Cy_SysPm_SimoBuckGetVoltage1(void); + + void Cy_SysPm_EnableVoltage2(void); + void Cy_SysPm_DisableVoltage2(void); + void Cy_SysPm_SimoBuckSetVoltage2(cy_en_syspm_simo_buck_voltage2_t voltage); + cy_en_syspm_simo_buck_voltage2_t Cy_SysPm_SimoBuckGetVoltage2(void); + + bool Cy_SysPm_SimoBuckOutputIsEnabled(cy_en_syspm_buck_out_t output); + bool Cy_SysPm_SimoBuckIsEnabled(void); + + void Cy_SysPm_SimoBuckSetHwControl(bool hwControl); + bool Cy_SysPm_SimoBuckGetHwControl(void); + +#endif /* (0u != SRSS_SIMOBUCK_PRESENT) */ + + +/******************************************************************************* +* Function Name: Cy_SysPm_Cm4IsActive +****************************************************************************//** +* +* Check if CM4 is in Active mode. +* +* \return +* true - if CM4 is in Active mode, false - if CM4 is not in Active mode. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SysPm_Cm4IsActive(void) +{ + return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM4_ACTIVE) != 0u); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_Cm4IsSleep +****************************************************************************//** +* +* Check if CM4 is in Sleep mode. +* +* \return +* true - if CM4 is in Sleep mode, false - if CM4 is not in Sleep mode. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SysPm_Cm4IsSleep(void) +{ + return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM4_SLEEP) != 0u); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_Cm4IsDeepSleep +****************************************************************************//** +* +* Check if CM4 is in DeepSleep mode. +* +* \return +* true - if CM4 is in DeepSleep mode, false - if CM4 is not in DeepSleep mode. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SysPm_Cm4IsDeepSleep(void) +{ + return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM4_DEEPSLEEP) != 0u); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_Cm4IsLowPower +****************************************************************************//** +* +* Check if CM4 is in LowPower mode. +* +* \return +* true - if CM4 is in LowPower mode, false - if CM4 is not in LowPower mode. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SysPm_Cm4IsLowPower(void) +{ + return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM4_LOWPOWER) != 0u); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_Cm0IsActive +****************************************************************************//** +* +* Check if CM0+ is in Active mode. +* +* \return +* true - if CM0+ is in Active mode, false - if CM0+ is not in Active mode. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SysPm_Cm0IsActive(void) +{ + return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM0_ACTIVE) != 0u); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_Cm0IsSleep +****************************************************************************//** +* +* Check if CM0+ is in Sleep mode. +* +* \return +* true - if CM0+ is in Sleep mode, false - if CM0+ is not in Sleep mode. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SysPm_Cm0IsSleep(void) +{ + return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM0_SLEEP) != 0u); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_Cm0IsDeepSleep +****************************************************************************//** +* +* Check if CM0+ is in DeepSleep mode. +* +* \return +* true - if CM0+ is in DeepSleep mode, false - if CM0+ is not in DeepSleep mode. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SysPm_Cm0IsDeepSleep(void) +{ + return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM0_DEEPSLEEP) != 0u); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_Cm0IsLowPower +****************************************************************************//** +* +* Check if CM0+ is in LowPower mode. +* +* \return +* true - if CM0+ is in LowPower mode, false - if CM0+ is not in LowPower mode. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SysPm_Cm0IsLowPower(void) +{ + return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_CM0_LOWPOWER) != 0u); +} + + +/******************************************************************************* +* Function Name: Cy_SysPm_IsLowPower +****************************************************************************//** +* +* Check if device is in Low Power mode. +* +* \return +* true - system is in Low Power mode, +* false - if system is is not in Low Power mode. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_SysPm_IsLowPower(void) +{ + return((Cy_SysPm_ReadStatus() & CY_SYSPM_STATUS_SYSTEM_LOWPOWER) != 0u); +} + +#ifdef __cplusplus +} +#endif + +#endif /* _CY_SYSPM_H_ */ + +/** \} group_syspm_functions*/ +/** \} group_syspm */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/systick/cy_systick.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/systick/cy_systick.c new file mode 100644 index 0000000000..c9e3ece8cc --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/systick/cy_systick.c @@ -0,0 +1,335 @@ +/***************************************************************************//** +* \file cy_systick.c +* \version 1.0 +* +* Provides the API definitions of the SisTick driver. +* +******************************************************************************** +* \copyright +* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include +#include "cy_systick.h" +#include "syslib/cy_syslib.h" +#include "cy_device_headers.h" + + +static Cy_SysTick_Callback Cy_SysTick_Callbacks[CY_SYS_SYST_NUM_OF_CALLBACKS]; +static void Cy_SysTick_ServiceCallbacks(void); + + +/******************************************************************************* +* Function Name: Cy_SysTick_Init +****************************************************************************//** +* +* Initializes the callback addresses with pointers to NULL, associates the +* SysTick system vector with the function responsible for calling +* registered callback functions, configures the SysTick timer to generate an +* interrupt periodically. +* +* \param clockSource The SysTick clock source \ref cy_en_systick_clock_source_t +* \param interval The SysTick reload value. +* +* \sideeffect Clears the SysTick count flag if it was set. +* +*******************************************************************************/ +void Cy_SysTick_Init(cy_en_systick_clock_source_t clockSource, uint32_t interval) +{ + uint32_t i; + + for (i = 0u; iCTRL |= SysTick_CTRL_ENABLE_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_Disable +****************************************************************************//** +* +* Disables the SysTick timer and its interrupt. +* +* \sideeffect Clears the SysTick count flag if it was set +* +*******************************************************************************/ +void Cy_SysTick_Disable(void) +{ + Cy_SysTick_DisableInterrupt(); + SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_EnableInterrupt +****************************************************************************//** +* +* Enables the SysTick interrupt. +* +* \sideeffect Clears the SysTick count flag if it was set +* +*******************************************************************************/ +void Cy_SysTick_EnableInterrupt(void) +{ + SysTick->CTRL = SysTick->CTRL | SysTick_CTRL_TICKINT_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_DisableInterrupt +****************************************************************************//** +* +* Disables the SysTick interrupt. +* +* \sideeffect Clears the SysTick count flag if it was set +* +*******************************************************************************/ +void Cy_SysTick_DisableInterrupt(void) +{ + SysTick->CTRL = SysTick->CTRL & ~SysTick_CTRL_TICKINT_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_SetReload +****************************************************************************//** +* +* Sets the value the counter is set to on a startup and after it reaches zero. +* This function does not change or reset the current sysTick counter value, so +* it should be cleared using the Cy_SysTick_Clear() API. +* +* \param value: The valid range is [0x0-0x00FFFFFF]. The counter reset value. +* +*******************************************************************************/ +void Cy_SysTick_SetReload(uint32_t value) +{ + SysTick->LOAD = (value & SysTick_LOAD_RELOAD_Msk); +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_GetReload +****************************************************************************//** +* +* Gets the value the counter is set to on a startup and after it reaches zero. +* +* \return The counter reset value. +* +*******************************************************************************/ +uint32_t Cy_SysTick_GetReload(void) +{ + return (SysTick->LOAD); +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_GetValue +****************************************************************************//** +* +* Gets the current SysTick counter value. +* +* \return The current SysTick counter value. +* +*******************************************************************************/ +uint32_t Cy_SysTick_GetValue(void) +{ + return (SysTick->VAL); +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_SetClockSource +****************************************************************************//** +* +* Sets the clock source for the SysTick counter. +* +* Clears the SysTick count flag if it was set. If the clock source is not ready +* this function call will have no effect. After changing the clock source to the +* low frequency clock, the counter and reload register values will remain +* unchanged so the time to the interrupt will be significantly longer and vice +* versa. +* +* Changing the SysTick clock source and/or its frequency will change +* the interrupt interval and that Cy_SysTick_SetReload() should be +* called to compensate this change. +* +* \param clockSource \ref cy_en_systick_clock_source_t Clock source. +* +*******************************************************************************/ +void Cy_SysTick_SetClockSource(cy_en_systick_clock_source_t clockSource) +{ + if (clockSource == CY_SYSTICK_CLOCK_SOURCE_CLK_CPU) + { + SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; + } + else + { + CPUSS->SYSTICK_CTL = _VAL2FLD(CPUSS_SYSTICK_CTL_CLOCK_SOURCE, (uint32_t) clockSource); + SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; + } +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_GetClockSource +****************************************************************************//** +* +* Gets the clock source for the SysTick counter. +* +* \returns \ref cy_en_systick_clock_source_t Clock source +* +*******************************************************************************/ +cy_en_systick_clock_source_t Cy_SysTick_GetClockSource(void) +{ + cy_en_systick_clock_source_t returnValue; + + if ((SysTick->CTRL & SysTick_CTRL_CLKSOURCE_Msk) != 0u) + { + returnValue = CY_SYSTICK_CLOCK_SOURCE_CLK_CPU; + } + else + { + returnValue = (cy_en_systick_clock_source_t)_FLD2VAL(CPUSS_SYSTICK_CTL_CLOCK_SOURCE, CPUSS->SYSTICK_CTL); + } + + return(returnValue); +} + +/******************************************************************************* +* Function Name: Cy_SysTick_GetCountFlag +****************************************************************************//** +* +* The count flag is set, once the SysTick counter reaches zero. +* The flag is cleared on read. +* +* \return Returns a non-zero value if a flag is set, otherwise a zero is +* returned. +* +* \sideeffect Clears the SysTick count flag if it was set. +* +*******************************************************************************/ +uint32_t Cy_SysTick_GetCountFlag(void) +{ + return (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk); +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_Clear +****************************************************************************//** +* +* Clears the SysTick counter for a well-defined startup. +* +*******************************************************************************/ +void Cy_SysTick_Clear(void) +{ + SysTick->VAL = 0u; +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_SetCallback +****************************************************************************//** +* +* This function allows up to five user-defined interrupt service routine +* functions to be associated with the SysTick interrupt. These are specified +* through the use of pointers to the function. +* +* \param number The number of the callback function addresses to be set. +* The valid range is from 0 to 4. +* +* \param function The pointer to the function that will be associated with the +* SysTick ISR for the specified number. +* +* \return Returns the address of the previous callback function. +* The NULL is returned if the specified address in not set. +* +* \sideeffect +* The registered callback functions will be executed in the interrupt. +* +*******************************************************************************/ +Cy_SysTick_Callback Cy_SysTick_SetCallback(uint32_t number, Cy_SysTick_Callback function) +{ + Cy_SysTick_Callback retVal; + + retVal = Cy_SysTick_Callbacks[number]; + Cy_SysTick_Callbacks[number] = function; + return (retVal); +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_GetCallback +****************************************************************************//** +* +* The function gets the specified callback pointer. +* +* \param number The number of the callback function address to get. The valid +* range is from 0 to 4. +* +* \return +* Returns the address of the specified callback function. +* The NULL is returned if the specified address in not initialized. +* +*******************************************************************************/ +Cy_SysTick_Callback Cy_SysTick_GetCallback(uint32_t number) +{ + return ((Cy_SysTick_Callback) Cy_SysTick_Callbacks[number]); +} + + +/******************************************************************************* +* Function Name: Cy_SysTick_ServiceCallbacks +****************************************************************************//** +* +* The system Tick timer interrupt routine. +* +*******************************************************************************/ +static void Cy_SysTick_ServiceCallbacks(void) +{ + uint32_t i; + + /* Verify that tick timer flag was set */ + if (0u != Cy_SysTick_GetCountFlag()) + { + for (i=0u; i < CY_SYS_SYST_NUM_OF_CALLBACKS; i++) + { + if (Cy_SysTick_Callbacks[i] != (void *) 0) + { + (void)(Cy_SysTick_Callbacks[i])(); + } + } + } +} + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/systick/cy_systick.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/systick/cy_systick.h new file mode 100644 index 0000000000..949984ada5 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/systick/cy_systick.h @@ -0,0 +1,170 @@ +/***************************************************************************//** +* \file cy_systick.h +* \version 1.0 +* +* Provides the API declarations of the SysTick driver. +* +******************************************************************************** +* \copyright +* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CY_SYSTICK_H_ +#define _CY_SYSTICK_H_ + +/** +* \defgroup group_arm_system_timer ARM System Timer (SysTick) +* \{ +* Provides a SysTick API. +* +* \section group_systick_configuration Configuration Considerations +* +* The SysTick timer is part of the CPU. The timer is a down counter with a +* 24-bit reload/tick value that is clocked by the FastClk/SlowClk. The timer has +* the capability to generate an interrupt when the set number of ticks expires +* and the counter is reloaded. This interrupt is available as part of the Nested +* Vectored Interrupt Controller (NVIC) for service by the CPU and can be used +* for general purpose timing control in user code. +* +* Changing the SysTick clock source and/or its frequency will change the +* interrupt interval and therefore Cy_SysTick_SetReload() should be called to +* compensate for this change. +* +* Because the timer is independent of the CPU (except for the clock), this can be +* handy in applications requiring precise timing that do not have a dedicated +* timer/counter available for the job. +* +* \section group_systick_more_information More Information +* +* Refer to the SysTick section of the ARM reference guide for complete details +* on the registers and their use. +* +* \section group_systick_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
8.8RequiredAn external object or function shall be declared in one and only one file.The variable is not used within project, so is defined without previous declaration.
+* +* \section group_systick_changelog Changelog +* +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_systick_macro Macro +* \defgroup group_systick_functions Functions +* \defgroup group_systick_data_structures Data Structures +*/ + +#include +#include +#include "syslib/cy_syslib.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \cond */ +extern cy_israddress __ramVectors[]; +typedef void (*Cy_SysTick_Callback)(void); +/** \endcond */ + +/** +* \addtogroup group_systick_data_structures +* \{ +*/ +typedef enum +{ + /** The low frequency clock clk_lf is selected. The precision of this clock depends on whether the low frequency + clock source is a SRSS internal RC oscillator (imprecise) or a device external crystal oscillator (precise) */ + CY_SYSTICK_CLOCK_SOURCE_CLK_LF = 0u, + + /** The internal main oscillator (IMO) clock clk_imo is selected. */ + CY_SYSTICK_CLOCK_SOURCE_CLK_IMO = 1u, + + /** The external crystal oscillator (ECO) clock clk_eco is selected. */ + CY_SYSTICK_CLOCK_SOURCE_CLK_ECO = 2u, + + /** The SRSS clk_timer is selected. The clk_timer is a divided/gated version of clk_hf or clk_imo. */ + CY_SYSTICK_CLOCK_SOURCE_CLK_TIMER = 3u, + + /** The CPU clock is selected. */ + CY_SYSTICK_CLOCK_SOURCE_CLK_CPU = 4u, +} cy_en_systick_clock_source_t; + +/** \} group_systick_data_structures */ + + +/** +* \addtogroup group_systick_functions +* \{ +*/ + +void Cy_SysTick_Init(cy_en_systick_clock_source_t clockSource, uint32_t interval); +void Cy_SysTick_Enable(void); +void Cy_SysTick_Disable(void); +void Cy_SysTick_EnableInterrupt(void); +void Cy_SysTick_DisableInterrupt(void); +void Cy_SysTick_SetReload(uint32_t value); +uint32_t Cy_SysTick_GetReload(void); +uint32_t Cy_SysTick_GetValue(void); +Cy_SysTick_Callback Cy_SysTick_SetCallback(uint32_t number, Cy_SysTick_Callback function); +Cy_SysTick_Callback Cy_SysTick_GetCallback(uint32_t number); +void Cy_SysTick_SetClockSource(cy_en_systick_clock_source_t clockSource); +cy_en_systick_clock_source_t Cy_SysTick_GetClockSource(void); + +uint32_t Cy_SysTick_GetCountFlag(void); +void Cy_SysTick_Clear(void); + +/** \} group_systick_functions */ + + +/** +* \addtogroup group_systick_macro +* \{ +*/ + +/** Driver major version */ +#define SYSTICK_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define SYSTICK_DRV_VERSION_MINOR 0 + +/** Number of the callbacks assigned to the SysTick interrupt */ +#define CY_SYS_SYST_NUM_OF_CALLBACKS (5u) + +/** Interrupt number in the vector table */ +#define CY_SYSTICK_IRQ_NUM (15u) + +/** \} group_systick_macro */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _CY_SYSTICK_H_ */ + +/** \} group_systick */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm.h new file mode 100644 index 0000000000..5288a744be --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm.h @@ -0,0 +1,591 @@ +/***************************************************************************//** +* \file cy_tcpwm.h +* \version 1.0 +* +* The header file of the TCPWM driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_tcpwm Timer Counter PWM (TCPWM) +* \{ +* \defgroup group_tcpwm_common Common +* \defgroup group_tcpwm_counter Timer/Counter (TCPWM) +* \defgroup group_tcpwm_pwm PWM (TCPWM) +* \defgroup group_tcpwm_quaddec Quadrature Decoder (TCPWM) +* \} */ + +/** +* \addtogroup group_tcpwm +* \{ +* +* The TCPWM driver is a multifunction driver that implements core +* microcontroller functionality including Timer Counter, PWM, and +* Quadrature Decoder using the TCPWM block. +* +* The driver is based on a hardware structure designed to share the same +* hardware across the various modes of operation. This structure +* allows a single driver to provide a flexible set of functions. +* +* A TCPWM is a collection of counters that can all be triggered simultaneously. +* For each function call, the base register address of the TCPWM being used must +* be passed first, followed by the index of the counter you want to touch next. +* For some functions, you can manage multiple counters simultaneously. You +* provide a bit field representing each counter, rather than the single counter +* index). +* +* The TCPWM supports three operating modes: +* * Timer/Counter +* * PWM +* * Quadrature Decoder +* +* \n +* \b Timer/Counter +* +* Use this mode whenever a specific timing interval or measurement is +* needed. Examples include: +* * Creating a periodic interrupt for running other system tasks +* * Measuring frequency of an input signal +* * Measuring pulse width of an input signal +* * Measuring time between two external events +* * Counting events +* * Triggering other system resources after x number events +* * Capturing time stamps when events occur +* +* The Timer/Counter has the following features: +* * 16- or 32-bit Timer/Counter +* * Programmable Period Register +* * Programmable Compare Register. Compare value can be swapped with a +* buffered compare value on comparison event +* * Capture with buffer register +* * Count Up, Count Down, or Count Up and Down Counting modes +* * Continuous or One Shot Run modes +* * Interrupt and Output on Overflow, Underflow, Capture, or Compare +* * Start, Reload, Stop, Capture, and Count Inputs +* +* \n +* \b PWM +* +* Use this mode when an output square wave is needed with a specific +* period and duty cycle, such as: +* * Creating arbitrary square wave outputs +* * Driving an LED (changing the brightness) +* * Driving Motors (dead time assertion available) +* +* The PWM has the following features: +* * 16- or 32-bit Counter +* * Two Programmable Period registers that can be swapped on overflow +* * Two Output Compare registers that can be swapped on overflow and/or +* underflow +* * Left Aligned, Right Aligned, Center Aligned, and Asymmetric Aligned modes +* * Continuous or One Shot run modes +* * Pseudo Random mode +* * Two PWM outputs with Dead Time insertion, and programmable polarity +* * Interrupt and Output on Overflow, Underflow, or Compare +* * Start, Reload, Stop, Swap (Capture), and Count Inputs +* +* \n +* \b Quadrature \b Decoder +* +* A quadrature decoder is used to decode the output of a quadrature encoder. +* A quadrature encoder senses the position, velocity, and direction of +* an object (for example a rotating axle, or a spinning mouse ball). +* A quadrature decoder can also be used for precision measurement of speed, +* acceleration, and position of a motor's rotor, or with a rotary switch to +* determine user input. \n +* +* The Quadrature Decoder has the following features: +* * 16- or 32-bit Counter +* * Counter Resolution of x1, x2, and x4 the frequency of the phiA (Count) and +* phiB (Start) inputs +* * Index (Reload) Input to determine absolute position +* * A positive edge on phiA increments the counter when phiB is 0 and decrements +* the counter when phiB is 1 +* +* \section group_tcpwm_configuration Configuration Considerations +* +* For each mode, the TCPWM driver has a configuration structure, an Init +* function, and an Enable function. +* +* Provide the configuration parameters in the appropriate structure (see +* \ref group_tcpwm_data_structures). Then call the appropriate Init function: +* \ref Cy_TCPWM_Counter_Init, \ref Cy_TCPWM_PWM_Init, or +* \ref Cy_TCPWM_QuadDec_Init. Provide the address of the filled structure as a +* parameter. To enable the counter, call the appropriate Enable function: +* \ref Cy_TCPWM_Counter_Enable, \ref Cy_TCPWM_PWM_Enable, or +* \ref Cy_TCPWM_QuadDec_Enable). +* +* Many functions work with an individual counter. You can also manage multiple +* counters simultaneously for certain functions. These are listed in the +* \ref group_tcpwm_functions_common functions +* section of the TCPWM. You can enable, disable, or trigger (in various ways) +* multiple counters simultaneously. For these functions you provide a bit field +* representing each counter in the TCPWM you want to control. You can +* represent the bit field as an ORed mask of each counter, like +* ((1u << cntNumX) | (1u << cntNumX) | (1u << cntNumX)), where X is the counter +* number from 0 to 31. +* +* \note +* * If none of the input terminals (start, reload(index)) are used, the +* software event \ref Cy_TCPWM_TriggerStart or +* \ref Cy_TCPWM_TriggerReloadOrIndex must be called to start the counting. +* * If count input terminal is not used, the \ref CY_TCPWM_INPUT_LEVEL macro +* should be set for the countInputMode parameter and the \ref CY_TCPWM_INPUT_1 +* macro should be set for the countInputMode parameter in the configuration +* structure (\ref group_tcpwm_data_structures) of the appropriate mode. +* +* \section group_tcpwm_more_information More Information +* +* For more information on the TCPWM peripheral, refer to the technical +* reference manual (TRM). +* +* \section group_tcpwm_MISRA MISRA-C Compliance +* The tcpwm driver does not have any specific deviations +* +* \section group_tcpwm_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+*/ + +/** \} group_tcpwm */ + +/** +* \addtogroup group_tcpwm_common +* Common API for the Timer Counter PWM Block. +* \{ +* \defgroup group_tcpwm_macro_common Macro +* \defgroup group_tcpwm_functions_common Functions +* \defgroup group_tcpwm_data_structures_common Data Structures +* \defgroup group_tcpwm_enums Enumerated Types +*/ + + +#if !defined(CY_TCPWM_H) +#define CY_TCPWM_H + +#include +#include +#include +#include "syslib/cy_syslib.h" +#include "cy_device_headers.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** +* \addtogroup group_tcpwm_macro_common +* \{ +*/ + +/** Driver major version */ +#define CY_TCPWM_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_TCPWM_DRV_VERSION_MINOR 0 + + +/****************************************************************************** +* API Constants +******************************************************************************/ + +/** TCPWM driver identifier */ +#define CY_TCPWM_ID (CY_PDL_DRV_ID(0x2Du)) + +/** \defgroup group_tcpwm_input_selection TCPWM Input Selection +* \{ +* Selects which input to use +*/ +#define CY_TCPWM_INPUT_0 (0u) /**< Input is tied to logic 0 */ +#define CY_TCPWM_INPUT_1 (1u) /**< Input is tied to logic 1 */ +#define CY_TCPWM_INPUT_TRIG_0 (2u) /**< Input is connected to the trigger input 0 */ +#define CY_TCPWM_INPUT_TRIG_1 (3u) /**< Input is connected to the trigger input 1 */ +#define CY_TCPWM_INPUT_TRIG_2 (4u) /**< Input is connected to the trigger input 2 */ +#define CY_TCPWM_INPUT_TRIG_3 (5u) /**< Input is connected to the trigger input 3 */ +#define CY_TCPWM_INPUT_TRIG_4 (6u) /**< Input is connected to the trigger input 4 */ +#define CY_TCPWM_INPUT_TRIG_5 (7u) /**< Input is connected to the trigger input 5 */ +#define CY_TCPWM_INPUT_TRIG_6 (8u) /**< Input is connected to the trigger input 6 */ +#define CY_TCPWM_INPUT_TRIG_7 (9u) /**< Input is connected to the trigger input 7 */ +#define CY_TCPWM_INPUT_TRIG_8 (10u) /**< Input is connected to the trigger input 8 */ +#define CY_TCPWM_INPUT_TRIG_9 (11u) /**< Input is connected to the trigger input 9 */ +#define CY_TCPWM_INPUT_TRIG_10 (12u) /**< Input is connected to the trigger input 10 */ +#define CY_TCPWM_INPUT_TRIG_11 (13u) /**< Input is connected to the trigger input 11 */ +#define CY_TCPWM_INPUT_TRIG_12 (14u) /**< Input is connected to the trigger input 12 */ +#define CY_TCPWM_INPUT_TRIG_13 (15u) /**< Input is connected to the trigger input 13 */ + +/** Input is defined by Creator, and Init() function does not need to configure input */ +#define CY_TCPWM_INPUT_CREATOR (65535u) +/** \} group_tcpwm_input_selection */ + +/** +* \defgroup group_tcpwm_input_modes Input Modes +* \{ +* Configures how TCPWM inputs behave +*/ +/** A rising edge triggers the event (Capture, Start, Reload, etc..) */ +#define CY_TCPWM_INPUT_RISINGEDGE (0u) +/** A falling edge triggers the event (Capture, Start, Reload, etc..) */ +#define CY_TCPWM_INPUT_FALLINGEDGE (1u) +/** A rising edge or falling edge triggers the event (Capture, Start, Reload, etc..) */ +#define CY_TCPWM_INPUT_EITHEREDGE (2u) +/** The event is triggered on each edge of the TCPWM clock if the input is high */ +#define CY_TCPWM_INPUT_LEVEL (3u) +/** \} group_tcpwm_input_modes */ + +/** +* \defgroup group_tcpwm_interrupt_sources Interrupt Sources +* \{ +* Interrupt Sources +*/ +#define CY_TCPWM_INT_ON_TC (1u) /**< Interrupt on Terminal count(TC) */ +#define CY_TCPWM_INT_ON_CC (2u) /**< Interrupt on Compare/Capture(CC) */ +#define CY_TCPWM_INT_NONE (0u) /**< No Interrupt */ +#define CY_TCPWM_INT_ON_CC_OR_TC (3u) /**< Interrupt on TC or CC */ +/** \} group_tcpwm_interrupt_sources */ + + +/*************************************** +* Registers Constants +***************************************/ + +/** +* \defgroup group_tcpwm_reg_const Default registers constants +* \{ +* Default constants for CNT Registers +*/ +#define CY_TCPWM_CNT_CTRL_DEFAULT (0x0u) /**< Default value for CTRL register */ +#define CY_TCPWM_CNT_COUNTER_DEFAULT (0x0u) /**< Default value for COUNTER register */ +#define CY_TCPWM_CNT_CC_DEFAULT (0xFFFFFFFFu) /**< Default value for CC register */ +#define CY_TCPWM_CNT_CC_BUFF_DEFAULT (0xFFFFFFFFu) /**< Default value for CC_BUFF register */ +#define CY_TCPWM_CNT_PERIOD_DEFAULT (0xFFFFFFFFu) /**< Default value for PERIOD register */ +#define CY_TCPWM_CNT_PERIOD_BUFF_DEFAULT (0xFFFFFFFFu) /**< Default value for PERIOD_BUFF register */ +#define CY_TCPWM_CNT_TR_CTRL0_DEFAULT (0x10u) /**< Default value for TR_CTRL0 register */ +#define CY_TCPWM_CNT_TR_CTRL1_DEFAULT (0x3FFu) /**< Default value for TR_CTRL1 register */ +#define CY_TCPWM_CNT_TR_CTRL2_DEFAULT (0x3Fu) /**< Default value for TR_CTRL2 register */ +#define CY_TCPWM_CNT_INTR_DEFAULT (0x3u) /**< Default value for INTR register */ +#define CY_TCPWM_CNT_INTR_SET_DEFAULT (0x0u) /**< Default value for INTR_SET register */ +#define CY_TCPWM_CNT_INTR_MASK_DEFAULT (0x0u) /**< Default value for INTR_MASK register */ +/** \} group_tcpwm_reg_const */ + +/** Position of Up counting counter status */ +#define CY_TCPWM_CNT_STATUS_UP_POS (0x1u) +/** Initial value for the counter in the Up counting mode */ +#define CY_TCPWM_CNT_UP_INIT_VAL (0x0u) +/** Initial value for the counter in the Up/Down counting modes */ +#define CY_TCPWM_CNT_UP_DOWN_INIT_VAL (0x1u) +/** \} group_tcpwm_macro_common */ + + +/******************************************************************************* + * Enumerations + ******************************************************************************/ + + /** +* \addtogroup group_tcpwm_enums +* \{ +*/ + +/** TCPWM status definitions */ +typedef enum +{ + CY_TCPWM_SUCCESS = 0x00u, /**< Successful */ + CY_TCPWM_BAD_PARAM = CY_TCPWM_ID | CY_PDL_STATUS_ERROR | 0x01u, /**< One or more invalid parameters */ +} cy_en_tcpwm_status_t; +/** \} group_tcpwm_enums */ + +/******************************************************************************* +* Function Prototypes +*******************************************************************************/ + +/** +* \addtogroup group_tcpwm_functions_common +* \{ +*/ + +__STATIC_INLINE void Cy_TCPWM_Enable_Multiple(TCPWM_Type *base, uint32_t counters); +__STATIC_INLINE void Cy_TCPWM_Disable_Multiple(TCPWM_Type *base, uint32_t counters); +__STATIC_INLINE void Cy_TCPWM_TriggerStart(TCPWM_Type *base, uint32_t counters); +__STATIC_INLINE void Cy_TCPWM_TriggerReloadOrIndex(TCPWM_Type *base, uint32_t counters); +__STATIC_INLINE void Cy_TCPWM_TriggerStopOrKill(TCPWM_Type *base, uint32_t counters); +__STATIC_INLINE void Cy_TCPWM_TriggerCaptureOrSwap(TCPWM_Type *base, uint32_t counters); +__STATIC_INLINE uint32_t Cy_TCPWM_GetInterruptStatus(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_ClearInterrupt(TCPWM_Type *base, uint32_t cntNum, uint32_t source); +__STATIC_INLINE void Cy_TCPWM_SetInterrupt(TCPWM_Type *base, uint32_t cntNum, uint32_t source); +__STATIC_INLINE void Cy_TCPWM_SetInterruptMask(TCPWM_Type *base, uint32_t cntNum, uint32_t mask); +__STATIC_INLINE uint32_t Cy_TCPWM_GetInterruptMask(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE uint32_t Cy_TCPWM_GetInterruptStatusMasked(TCPWM_Type const *base, uint32_t cntNum); + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Enable_Multiple +****************************************************************************//** +* +* Enables the counter(s) in the TCPWM block. Multiple blocks can be started +* simultaneously. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param counters +* A bit field representing each counter in the TCPWM block. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_Enable_Multiple(TCPWM_Type *base, uint32_t counters) +{ + base->CTRL_SET = counters; +} + +/******************************************************************************* +* Function Name: Cy_TCPWM_Disable_Multiple +****************************************************************************//** +* +* Disables the counter(s) in the TCPWM block. Multiple TCPWM can be disabled +* simultaneously. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param counters +* A bit field representing each counter in the TCPWM block. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_Disable_Multiple(TCPWM_Type *base, uint32_t counters) +{ + base->CTRL_CLR = counters; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_TriggerStart +****************************************************************************//** +* +* Triggers a software start on the selected TCPWMs. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param counters +* A bit field representing each counter in the TCPWM block. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_TriggerStart(TCPWM_Type *base, uint32_t counters) +{ + base->CMD_START = counters; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_TriggerReloadOrIndex +****************************************************************************//** +* +* Triggers a software reload event (or index in QuadDec mode). +* +* \param base +* The pointer to a TCPWM instance +* +* \param counters +* A bit field representing each counter in the TCPWM block. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_TriggerReloadOrIndex(TCPWM_Type *base, uint32_t counters) +{ + base->CMD_RELOAD = counters; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_TriggerStopOrKill +****************************************************************************//** +* +* Triggers a stop in the Timer Counter mode, or a kill in the PWM mode. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param counters +* A bit field representing each counter in the TCPWM block. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_TriggerStopOrKill(TCPWM_Type *base, uint32_t counters) +{ + + base->CMD_STOP = counters; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_TriggerCaptureOrSwap +****************************************************************************//** +* +* Triggers a Capture in the Timer Counter mode, and a Swap in the PWM mode. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param counters +* A bit field representing each counter in the TCPWM block. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_TriggerCaptureOrSwap(TCPWM_Type *base, uint32_t counters) +{ + base->CMD_CAPTURE = counters; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_GetInterruptStatus +****************************************************************************//** +* +* Returns which event triggered the interrupt. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +*. See \ref group_tcpwm_interrupt_sources +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_GetInterruptStatus(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].INTR); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_ClearInterrupt +****************************************************************************//** +* +* Clears Active Interrupt Source +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param source +* source to clear. See \ref group_tcpwm_interrupt_sources +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_ClearInterrupt(TCPWM_Type *base, uint32_t cntNum, uint32_t source) +{ + base->CNT[cntNum].INTR = source; + (void)base->CNT[cntNum].INTR; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_SetInterrupt +****************************************************************************//** +* +* Triggers an interrupt via a software write. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param source +* The source to set an interrupt. See \ref group_tcpwm_interrupt_sources. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_SetInterrupt(TCPWM_Type *base, uint32_t cntNum, uint32_t source) +{ + base->CNT[cntNum].INTR_SET = source; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_SetInterruptMask +****************************************************************************//** +* +* Sets an interrupt mask. A 1 means that when the event occurs, it will cause an +* interrupt; a 0 means no interrupt will be triggered. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param mask +*. See \ref group_tcpwm_interrupt_sources +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_SetInterruptMask(TCPWM_Type *base, uint32_t cntNum, uint32_t mask) +{ + base->CNT[cntNum].INTR_MASK = mask; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_GetInterruptMask +****************************************************************************//** +* +* Returns the interrupt mask. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* Interrupt Mask. See \ref group_tcpwm_interrupt_sources +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_GetInterruptMask(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].INTR_MASK); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_GetInterruptStatusMasked +****************************************************************************//** +* +* Returns which masked interrupt triggered the interrupt. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* Interrupt Mask. See \ref group_tcpwm_interrupt_sources +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_GetInterruptStatusMasked(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].INTR_MASKED); +} + +/** \} group_tcpwm_functions_common */ + +/** \} group_tcpwm_common */ + +#if defined(__cplusplus) +} +#endif + +#endif /* CY_TCPWM_H */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_counter.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_counter.c new file mode 100644 index 0000000000..f60b0b50c4 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_counter.c @@ -0,0 +1,137 @@ +/***************************************************************************//** +* \file cy_tcpwm_counter.c +* \version 1.0 +* +* \brief +* The source file of the tcpwm driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_tcpwm_counter.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_Init +****************************************************************************//** +* +* Initializes the counter in the TCPWM block for the Counter operation. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param config +* The pointer to configuration structure. See \ref cy_stc_tcpwm_counter_config_t. +* +* \return error / status code. See \ref cy_en_tcpwm_status_t. +* +*******************************************************************************/ +cy_en_tcpwm_status_t Cy_TCPWM_Counter_Init(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_counter_config_t const *config) +{ + cy_en_tcpwm_status_t status = CY_TCPWM_BAD_PARAM; + + if ((NULL != base) && (NULL != config)) + { + base->CNT[cntNum].CTRL = ( _VAL2FLD(TCPWM_CNT_CTRL_GENERIC, config->clockPrescaler) | + _VAL2FLD(TCPWM_CNT_CTRL_ONE_SHOT, config->runMode) | + _VAL2FLD(TCPWM_CNT_CTRL_UP_DOWN_MODE, config->countDirection) | + _VAL2FLD(TCPWM_CNT_CTRL_MODE, config->compareOrCapture) | + (config->enableCompareSwap ? TCPWM_CNT_CTRL_AUTO_RELOAD_CC_Msk : 0uL)); + + if (CY_TCPWM_COUNTER_COUNT_UP == config->runMode) + { + base->CNT[cntNum].COUNTER = CY_TCPWM_CNT_UP_INIT_VAL; + } + else if (CY_TCPWM_COUNTER_COUNT_DOWN == config->runMode) + { + base->CNT[cntNum].COUNTER = config->period; + } + else + { + base->CNT[cntNum].COUNTER = CY_TCPWM_CNT_UP_DOWN_INIT_VAL; + } + + base->CNT[cntNum].CC = config->compare0; + base->CNT[cntNum].CC_BUFF = config->compare1; + base->CNT[cntNum].PERIOD = config->period; + + if (CY_TCPWM_INPUT_CREATOR != config->countInput) + { + base->CNT[cntNum].TR_CTRL0 = (_VAL2FLD(TCPWM_CNT_TR_CTRL0_CAPTURE_SEL, config->captureInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_RELOAD_SEL, config->reloadInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_START_SEL, config->startInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_STOP_SEL, config->stopInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_COUNT_SEL, config->countInput)); + } + + base->CNT[cntNum].TR_CTRL1 = (_VAL2FLD(TCPWM_CNT_TR_CTRL1_CAPTURE_EDGE, config->captureInputMode) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_RELOAD_EDGE, config->reloadInputMode) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_START_EDGE, config->startInputMode) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_STOP_EDGE, config->stopInputMode) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_COUNT_EDGE, config->countInputMode)); + + base->CNT[cntNum].INTR_MASK = config->interruptSources; + + status = CY_TCPWM_SUCCESS; + } + + return(status); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_DeInit +****************************************************************************//** +* +* De-initializes the counter in the TCPWM block, returns register values to +* default. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param config +* The pointer to configuration structure. See \ref cy_stc_tcpwm_counter_config_t. +* +*******************************************************************************/ +void Cy_TCPWM_Counter_DeInit(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_counter_config_t const *config) +{ + base->CNT[cntNum].CTRL = CY_TCPWM_CNT_CTRL_DEFAULT; + base->CNT[cntNum].COUNTER = CY_TCPWM_CNT_COUNTER_DEFAULT; + base->CNT[cntNum].CC = CY_TCPWM_CNT_CC_DEFAULT; + base->CNT[cntNum].CC_BUFF = CY_TCPWM_CNT_CC_BUFF_DEFAULT; + base->CNT[cntNum].PERIOD = CY_TCPWM_CNT_PERIOD_DEFAULT; + base->CNT[cntNum].PERIOD_BUFF = CY_TCPWM_CNT_PERIOD_BUFF_DEFAULT; + base->CNT[cntNum].TR_CTRL1 = CY_TCPWM_CNT_TR_CTRL1_DEFAULT; + base->CNT[cntNum].TR_CTRL2 = CY_TCPWM_CNT_TR_CTRL2_DEFAULT; + base->CNT[cntNum].INTR = CY_TCPWM_CNT_INTR_DEFAULT; + base->CNT[cntNum].INTR_SET = CY_TCPWM_CNT_INTR_SET_DEFAULT; + base->CNT[cntNum].INTR_MASK = CY_TCPWM_CNT_INTR_MASK_DEFAULT; + + if (CY_TCPWM_INPUT_CREATOR != config->countInput) + { + base->CNT[cntNum].TR_CTRL0 = CY_TCPWM_CNT_TR_CTRL0_DEFAULT; + } +} + + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_counter.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_counter.h new file mode 100644 index 0000000000..c390fd470d --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_counter.h @@ -0,0 +1,484 @@ +/***************************************************************************//** +* \file cy_tcpwm_counter.h +* \version 1.0 +* +* \brief +* The header file of the TCPWM Timer Counter driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_tcpwm_macro_counter Macro +* \defgroup group_tcpwm_functions_counter Functions +* \defgroup group_tcpwm_data_structures_counter Data Structures +* \} */ + +#if !defined(CY_TCPWM_COUNTER_H) +#define CY_TCPWM_COUNTER_H + +#include "cy_tcpwm.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** +* \addtogroup group_tcpwm_counter +* \{ +* Driver API for Timer/Counter. +*/ + +/** +* \addtogroup group_tcpwm_data_structures_counter +* \{ +*/ + +/** Counter Timer configuration structure */ +typedef struct cy_stc_tcpwm_counter_config +{ + uint32_t period; /**< Sets the period of the counter */ + /** Sets the clock prescaler inside the TCWPM block. See \ref group_tcpwm_counter_clk_prescalers */ + uint32_t clockPrescaler; + uint32_t runMode; /**< Sets the Counter Timer Run mode. See \ref group_tcpwm_counter_run_modes */ + uint32_t countDirection; /**< Sets the counter direction. See \ref group_tcpwm_counter_direction */ + /** The counter can either compare or capture a value. See \ref group_tcpwm_counter_compare_capture */ + uint32_t compareOrCapture; + uint32_t compare0; /**< Sets the value for Compare0*/ + uint32_t compare1; /**< Sets the value for Compare1*/ + bool enableCompareSwap; /**< If enabled, the compare values are swapped each time the comparison is true */ + /** Enabled an interrupt on the terminal count, capture or compare. See \ref group_tcpwm_interrupt_sources */ + uint32_t interruptSources; + uint32_t captureInputMode; /**< Configures how the capture input behaves. See \ref group_tcpwm_input_modes */ + /** Selects which input the capture uses, the inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t captureInput; + uint32_t reloadInputMode; /**< Configures how the reload input behaves. See \ref group_tcpwm_input_modes */ + /** Selects which input the reload uses, the inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t reloadInput; + uint32_t startInputMode; /**< Configures how the start input behaves. See \ref group_tcpwm_input_modes */ + /** Selects which input the start uses, the inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t startInput; + uint32_t stopInputMode; /**< Configures how the stop input behaves. See \ref group_tcpwm_input_modes */ + /** Selects which input the stop uses, the inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t stopInput; + uint32_t countInputMode; /**< Configures how the count input behaves. See \ref group_tcpwm_input_modes */ + /** Selects which input the count uses, the inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t countInput; +}cy_stc_tcpwm_counter_config_t; +/** \} group_tcpwm_data_structures_counter */ + +/** +* \addtogroup group_tcpwm_macro_counter +* \{ +* \defgroup group_tcpwm_counter_run_modes Counter Run Modes +* \{ +* Run modes for the counter timer. +*/ +#define CY_TCPWM_COUNTER_ONESHOT (1u) /**< Counter runs once and then stops */ +#define CY_TCPWM_COUNTER_CONTINUOUS (0u) /**< Counter runs forever */ +/** \} group_tcpwm_counter_run_modes */ + +/** \defgroup group_tcpwm_counter_direction Counter Direction +* The counter directions. +* \{ +*/ +#define CY_TCPWM_COUNTER_COUNT_UP (0u) /**< Counter counts up */ +#define CY_TCPWM_COUNTER_COUNT_DOWN (1u) /**< Counter counts down */ +/** Counter counts up and down terminal count only occurs on underflow. */ +#define CY_TCPWM_COUNTER_COUNT_UP_DOWN0 (2u) +/** Counter counts up and down terminal count occurs on both overflow and underflow. */ +#define CY_TCPWM_COUNTER_COUNT_UP_DOWN1 (3u) +/** \} group_tcpwm_counter_direction */ + +/** \defgroup group_tcpwm_counter_clk_prescalers Counter CLK Prescalers +* \{ +* The clock prescaler values. +*/ +#define CY_TCPWM_COUNTER_PRESCALER_DIVBY_1 (0u) /**< Divide by 1 */ +#define CY_TCPWM_COUNTER_PRESCALER_DIVBY_2 (1u) /**< Divide by 2 */ +#define CY_TCPWM_COUNTER_PRESCALER_DIVBY_4 (2u) /**< Divide by 4 */ +#define CY_TCPWM_COUNTER_PRESCALER_DIVBY_8 (3u) /**< Divide by 8 */ +#define CY_TCPWM_COUNTER_PRESCALER_DIVBY_16 (4u) /**< Divide by 16 */ +#define CY_TCPWM_COUNTER_PRESCALER_DIVBY_32 (5u) /**< Divide by 32 */ +#define CY_TCPWM_COUNTER_PRESCALER_DIVBY_64 (6u) /**< Divide by 64 */ +#define CY_TCPWM_COUNTER_PRESCALER_DIVBY_128 (7u) /**< Divide by 128 */ +/** \} group_tcpwm_counter_clk_prescalers */ + +/** \defgroup group_tcpwm_counter_compare_capture Counter Compare Capture +* \{ +* A compare or capture mode. +*/ +#define CY_TCPWM_COUNTER_MODE_CAPTURE (2u) /**< Timer/Counter is in Capture Mode */ +#define CY_TCPWM_COUNTER_MODE_COMPARE (0u) /**< Timer/Counter is in Compare Mode */ +/** \} group_tcpwm_counter_compare_capture */ + +/** \defgroup group_tcpwm_counter_status Counter Status +* \{ +* The counter status. +*/ +#define CY_TCPWM_COUNTER_STATUS_DOWN_COUNTING (0x1uL) /**< Timer/Counter is down counting */ +#define CY_TCPWM_COUNTER_STATUS_UP_COUNTING (0x2uL) /**< Timer/Counter is up counting */ + +/** Timer/Counter is running */ +#define CY_TCPWM_COUNTER_STATUS_COUNTER_RUNNING (TCPWM_CNT_STATUS_RUNNING_Msk) +/** \} group_tcpwm_counter_status */ +/** \} group_tcpwm_macro_counter */ + + +/******************************************************************************* +* Function Prototypes +*******************************************************************************/ + +/** +* \addtogroup group_tcpwm_functions_counter +* \{ +*/ +cy_en_tcpwm_status_t Cy_TCPWM_Counter_Init(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_counter_config_t const *config); +void Cy_TCPWM_Counter_DeInit(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_counter_config_t const *config); +__STATIC_INLINE void Cy_TCPWM_Counter_Enable(TCPWM_Type *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_Counter_Disable(TCPWM_Type *base, uint32_t cntNum); +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetStatus(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetCapture(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetCaptureBuf(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_Counter_SetCompare0(TCPWM_Type *base, uint32_t cntNum, uint32_t compare0); +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetCompare0(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_Counter_SetCompare1(TCPWM_Type *base, uint32_t cntNum, uint32_t compare1); +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetCompare1(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_Counter_EnableCompareSwap(TCPWM_Type *base, uint32_t cntNum, bool enable); +__STATIC_INLINE void Cy_TCPWM_Counter_SetCounter(TCPWM_Type *base, uint32_t cntNum, uint32_t count); +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetCounter(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_Counter_SetPeriod(TCPWM_Type *base, uint32_t cntNum, uint32_t period); +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetPeriod(TCPWM_Type const *base, uint32_t cntNum); + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_Enable +****************************************************************************//** +* +* Enables the counter in the TCPWM block for the Counter operation. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_Counter_Enable(TCPWM_Type *base, uint32_t cntNum) +{ + base->CTRL_SET = (1uL << cntNum); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_Disable +****************************************************************************//** +* +* Disables the counter in the TCPWM block. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_Counter_Disable(TCPWM_Type *base, uint32_t cntNum) +{ + base->CTRL_CLR = (1uL << cntNum); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_GetStatus +****************************************************************************//** +* +* Returns the status of the Counter Timer. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The status. See \ref group_tcpwm_counter_status +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetStatus(TCPWM_Type const *base, uint32_t cntNum) +{ + uint32_t status = base->CNT[cntNum].STATUS; + + /* Generates proper up counting status. Is not generated by HW */ + status &= ~CY_TCPWM_COUNTER_STATUS_UP_COUNTING; + status |= ((~status & CY_TCPWM_COUNTER_STATUS_DOWN_COUNTING & (status >> TCPWM_CNT_STATUS_RUNNING_Pos)) << + CY_TCPWM_CNT_STATUS_UP_POS); + + return(status); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_GetCapture +****************************************************************************//** +* +* Returns the capture value when the capture mode is enabled. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The capture value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetCapture(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].CC); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_GetCaptureBuf +****************************************************************************//** +* +* Returns the buffered capture value when the capture mode is enabled. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The buffered capture value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetCaptureBuf(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].CC_BUFF); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_SetCompare0 +****************************************************************************//** +* +* Sets the compare value for Compare0 when the compare mode is enabled. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param compare0 +* The Compare0 value. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_Counter_SetCompare0(TCPWM_Type *base, uint32_t cntNum, uint32_t compare0) +{ + base->CNT[cntNum].CC = compare0; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_GetCompare0 +****************************************************************************//** +* +* Returns compare value 0. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* Compare value 0. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetCompare0(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].CC); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_SetCompare1 +****************************************************************************//** +* +* Sets the compare value for Compare1 when the compare mode is enabled. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param compare1 +* The Compare1 value. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_Counter_SetCompare1(TCPWM_Type *base, uint32_t cntNum, uint32_t compare1) +{ + base->CNT[cntNum].CC_BUFF = compare1; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_GetCompare1 +****************************************************************************//** +* +* Returns compare value 1. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* Compare value 1. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetCompare1(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].CC_BUFF); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_EnableCompareSwap +****************************************************************************//** +* +* Enables the comparison swap when the comparison value is true. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param enable +* true = swap enabled, false = swap disabled +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_Counter_EnableCompareSwap(TCPWM_Type *base, uint32_t cntNum, bool enable) +{ + if (enable) + { + base->CNT[cntNum].CTRL |= TCPWM_CNT_CTRL_AUTO_RELOAD_CC_Msk; + } + else + { + base->CNT[cntNum].CTRL &= ~TCPWM_CNT_CTRL_AUTO_RELOAD_CC_Msk; + } +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_SetCounter +****************************************************************************//** +* +* Sets the value of the counter. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param count +* The value to write into the counter. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_Counter_SetCounter(TCPWM_Type *base, uint32_t cntNum, uint32_t count) +{ + base->CNT[cntNum].COUNTER = count; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_GetCounter +****************************************************************************//** +* +* Returns the value in the counter. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The current counter value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetCounter(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].COUNTER); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_SetPeriod +****************************************************************************//** +* +* Sets the value of the period register. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param period +* The value to write into a period. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_Counter_SetPeriod(TCPWM_Type *base, uint32_t cntNum, uint32_t period) +{ + base->CNT[cntNum].PERIOD = period; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_Counter_GetPeriod +****************************************************************************//** +* +* Returns the value in the period register. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The current period value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_Counter_GetPeriod(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].PERIOD); +} +/** \} group_tcpwm_functions_counter */ + +/** \} group_tcpwm_counter */ + +#if defined(__cplusplus) +} +#endif + +#endif /* CY_TCPWM_COUNTER_H */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_pwm.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_pwm.c new file mode 100644 index 0000000000..125531d8db --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_pwm.c @@ -0,0 +1,153 @@ +/***************************************************************************//** +* \file cy_tcpwm_pwm.c +* \version 1.0 +* +* \brief +* The source file of the tcpwm driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_tcpwm_pwm.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_Init +****************************************************************************//** +* +* Initializes the counter in the TCPWM block for the PWM operation. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param config +* The pointer to a configuration structure. See \ref cy_stc_tcpwm_pwm_config_t. +* +* \return error / status code. See \ref cy_en_tcpwm_status_t. +* +*******************************************************************************/ +cy_en_tcpwm_status_t Cy_TCPWM_PWM_Init(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_pwm_config_t const *config) +{ + cy_en_tcpwm_status_t status = CY_TCPWM_BAD_PARAM; + + if ((NULL != base) && (NULL != config)) + { + base->CNT[cntNum].CTRL = ( (config->enableCompareSwap ? TCPWM_CNT_CTRL_AUTO_RELOAD_CC_Msk : 0uL) | + (config->enablePeriodSwap ? TCPWM_CNT_CTRL_AUTO_RELOAD_PERIOD_Msk : 0uL) | + _VAL2FLD(TCPWM_CNT_CTRL_ONE_SHOT, config->runMode) | + _VAL2FLD(TCPWM_CNT_CTRL_UP_DOWN_MODE, config->pwmAlignment) | + _VAL2FLD(TCPWM_CNT_CTRL_MODE, config->pwmMode) | + _VAL2FLD(TCPWM_CNT_CTRL_QUADRATURE_MODE, + (config->invertPWMOut | (config->invertPWMOutN << 1u))) | + (config->killMode << CY_TCPWM_PWM_CTRL_SYNC_KILL_OR_STOP_ON_KILL_POS) | + _VAL2FLD(TCPWM_CNT_CTRL_GENERIC, ((CY_TCPWM_PWM_MODE_DEADTIME == config->pwmMode) ? + config->deadTimeClocks : config->clockPrescaler))); + + if (CY_TCPWM_PWM_MODE_PSEUDORANDOM == config->pwmMode) + { + base->CNT[cntNum].COUNTER = CY_TCPWM_CNT_UP_DOWN_INIT_VAL; + base->CNT[cntNum].TR_CTRL2 = CY_TCPWM_PWM_MODE_PR; + } + else + { + if (CY_TCPWM_PWM_LEFT_ALIGN == config->pwmAlignment) + { + base->CNT[cntNum].COUNTER = CY_TCPWM_CNT_UP_INIT_VAL; + base->CNT[cntNum].TR_CTRL2 = CY_TCPWM_PWM_MODE_LEFT; + } + else if (CY_TCPWM_PWM_RIGHT_ALIGN == config->pwmAlignment) + { + base->CNT[cntNum].COUNTER = config->period0; + base->CNT[cntNum].TR_CTRL2 = CY_TCPWM_PWM_MODE_RIGHT; + } + else + { + base->CNT[cntNum].COUNTER = CY_TCPWM_CNT_UP_DOWN_INIT_VAL; + base->CNT[cntNum].TR_CTRL2 = CY_TCPWM_PWM_MODE_CNTR_OR_ASYMM; + } + } + + base->CNT[cntNum].CC = config->compare0; + base->CNT[cntNum].CC_BUFF = config->compare1; + base->CNT[cntNum].PERIOD = config->period0; + base->CNT[cntNum].PERIOD_BUFF = config->period1; + + if (CY_TCPWM_INPUT_CREATOR != config->countInput) + { + base->CNT[cntNum].TR_CTRL0 = (_VAL2FLD(TCPWM_CNT_TR_CTRL0_CAPTURE_SEL, config->swapInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_RELOAD_SEL, config->reloadInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_START_SEL, config->startInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_STOP_SEL, config->killInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_COUNT_SEL, config->countInput)); + } + + base->CNT[cntNum].TR_CTRL1 = (_VAL2FLD(TCPWM_CNT_TR_CTRL1_CAPTURE_EDGE, config->swapInputMode) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_RELOAD_EDGE, config->reloadInputMode) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_START_EDGE, config->startInputMode) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_STOP_EDGE, config->killInputMode) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_COUNT_EDGE, config->countInputMode)); + + base->CNT[cntNum].INTR_MASK = config->interruptSources; + + status = CY_TCPWM_SUCCESS; + } + + return(status); +} + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_DeInit +****************************************************************************//** +* +* De-initializes the counter in the TCPWM block, returns register values to +* default. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param config +* The pointer to a configuration structure. See \ref cy_stc_tcpwm_pwm_config_t. +* +*******************************************************************************/ +void Cy_TCPWM_PWM_DeInit(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_pwm_config_t const *config) +{ + base->CNT[cntNum].CTRL = CY_TCPWM_CNT_CTRL_DEFAULT; + base->CNT[cntNum].COUNTER = CY_TCPWM_CNT_COUNTER_DEFAULT; + base->CNT[cntNum].CC = CY_TCPWM_CNT_CC_DEFAULT; + base->CNT[cntNum].CC_BUFF = CY_TCPWM_CNT_CC_BUFF_DEFAULT; + base->CNT[cntNum].PERIOD = CY_TCPWM_CNT_PERIOD_DEFAULT; + base->CNT[cntNum].PERIOD_BUFF = CY_TCPWM_CNT_PERIOD_BUFF_DEFAULT; + base->CNT[cntNum].TR_CTRL1 = CY_TCPWM_CNT_TR_CTRL1_DEFAULT; + base->CNT[cntNum].TR_CTRL2 = CY_TCPWM_CNT_TR_CTRL2_DEFAULT; + base->CNT[cntNum].INTR = CY_TCPWM_CNT_INTR_DEFAULT; + base->CNT[cntNum].INTR_SET = CY_TCPWM_CNT_INTR_SET_DEFAULT; + base->CNT[cntNum].INTR_MASK = CY_TCPWM_CNT_INTR_MASK_DEFAULT; + + if (CY_TCPWM_INPUT_CREATOR != config->countInput) + { + base->CNT[cntNum].TR_CTRL0 = CY_TCPWM_CNT_TR_CTRL0_DEFAULT; + } +} + + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_pwm.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_pwm.h new file mode 100644 index 0000000000..09c4a3ec47 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_pwm.h @@ -0,0 +1,576 @@ +/***************************************************************************//** +* \file cy_tcpwm_pwm.h +* \version 1.0 +* +* \brief +* The header file of the TCPWM PWM driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_tcpwm_macro_pwm Macro +* \defgroup group_tcpwm_functions_pwm Functions +* \defgroup group_tcpwm_data_structures_pwm Data Structures +* \} */ + +#if !defined(CY_TCPWM_PWM_H) +#define CY_TCPWM_PWM_H + +#include "cy_tcpwm.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** +* \addtogroup group_tcpwm_pwm +* Driver API for PWM. +* \{ +*/ + +/** +* \addtogroup group_tcpwm_data_structures_pwm +* \{ +*/ + +/** PWM configuration structure */ +typedef struct cy_stc_tcpwm_pwm_config +{ + uint32_t pwmMode; /**< Sets the PWM mode. See \ref group_tcpwm_pwm_modes */ + /** Sets the clock prescaler inside the TCWPM block. See \ref group_tcpwm_pwm_clk_prescalers */ + uint32_t clockPrescaler; + uint32_t pwmAlignment; /**< Sets the PWM alignment. See \ref group_tcpwm_pwm_alignment */ + uint32_t deadTimeClocks; /**< The number of dead time-clocks if PWM with dead time is chosen */ + uint32_t runMode; /**< Sets the PWM run mode. See \ref group_tcpwm_pwm_run_modes */ + uint32_t period0; /**< Sets the period0 of the pwm */ + uint32_t period1; /**< Sets the period1 of the pwm */ + bool enablePeriodSwap; /**< Enables swapping of period 0 and period 1 on terminal count */ + uint32_t compare0; /**< Sets the value for Compare0 */ + uint32_t compare1; /**< Sets the value for Compare1 */ + bool enableCompareSwap; /**< If enabled, the compare values are swapped on the terminal count */ + /** Enables an interrupt on the terminal count, capture or compare. See \ref group_tcpwm_interrupt_sources */ + uint32_t interruptSources; + uint32_t invertPWMOut; /**< Inverts the PWM output */ + uint32_t invertPWMOutN; /**< Inverts the PWM_n output */ + uint32_t killMode; /**< Configures the PWM kill modes. See \ref group_tcpwm_pwm_kill_modes */ + uint32_t swapInputMode; /**< Configures how the swap input behaves. See \ref group_tcpwm_input_modes */ + /** Selects which input the swap uses. Inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t swapInput; + uint32_t reloadInputMode; /**< Configures how the reload input behaves. See \ref group_tcpwm_input_modes */ + /** Selects which input the reload uses. The inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t reloadInput; + uint32_t startInputMode; /**< Configures how the start input behaves. See \ref group_tcpwm_input_modes */ + /** Selects which input the start uses. The inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t startInput; + uint32_t killInputMode; /**< Configures how the kill input behaves. See \ref group_tcpwm_input_modes */ + /** Selects which input the kill uses. The inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t killInput; + uint32_t countInputMode; /**< Configures how the count input behaves. See \ref group_tcpwm_input_modes */ + /** Selects which input the count uses. The inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t countInput; +}cy_stc_tcpwm_pwm_config_t; +/** \} group_tcpwm_data_structures_pwm */ + +/** +* \addtogroup group_tcpwm_macro_pwm +* \{ +* \defgroup group_tcpwm_pwm_run_modes PWM run modes +* \{ +* Run modes for the pwm timer. +*/ +#define CY_TCPWM_PWM_ONESHOT (1u) /**< Counter runs once and then stops */ +#define CY_TCPWM_PWM_CONTINUOUS (0u) /**< Counter runs forever */ +/** \} group_tcpwm_pwm_run_modes */ + +/** \defgroup group_tcpwm_pwm_modes PWM modes +* \{ +* Sets the PWM modes. +*/ +#define CY_TCPWM_PWM_MODE_PWM (4u) /**< Standard PWM Mode*/ +#define CY_TCPWM_PWM_MODE_DEADTIME (5u) /**< PWM with deadtime mode*/ +#define CY_TCPWM_PWM_MODE_PSEUDORANDOM (6u) /**< Pseudo Random PWM */ +/** \} group_tcpwm_pwm_modes */ + +/** \defgroup group_tcpwm_pwm_alignment PWM Alignment +* Sets the alignment of the PWM. +* \{ +*/ +#define CY_TCPWM_PWM_LEFT_ALIGN (0u) /**< PWM is left aligned, meaning it starts high */ +#define CY_TCPWM_PWM_RIGHT_ALIGN (1u) /**< PWM is right aligned, meaning it starts low */ +/** PWM is centered aligned, terminal count only occurs on underflow */ +#define CY_TCPWM_PWM_CENTER_ALIGN (2u) +/** PWM is asymmetrically aligned, terminal count occurs on overflow and underflow */ +#define CY_TCPWM_PWM_ASYMMETRIC_ALIGN (3u) +/** \} group_tcpwm_pwm_alignment */ + +/** \defgroup group_tcpwm_pwm_kill_modes PWM kill modes +* Sets the kill mode for the PWM. +* \{ +*/ +#define CY_TCPWM_PWM_STOP_ON_KILL (2u) /**< PWM stops counting on kill */ +#define CY_TCPWM_PWM_SYNCH_KILL (1u) /**< PWM output is killed after next TC*/ +#define CY_TCPWM_PWM_ASYNC_KILL (0u) /**< PWM output is killed instantly */ +/** \} group_tcpwm_pwm_kill_modes */ + +/** \defgroup group_tcpwm_pwm_clk_prescalers PWM CLK Prescaler values +* \{ +* Clock prescaler values. +*/ +#define CY_TCPWM_PWM_PRESCALER_DIVBY_1 (0u) /**< Divide by 1 */ +#define CY_TCPWM_PWM_PRESCALER_DIVBY_2 (1u) /**< Divide by 2 */ +#define CY_TCPWM_PWM_PRESCALER_DIVBY_4 (2u) /**< Divide by 4 */ +#define CY_TCPWM_PWM_PRESCALER_DIVBY_8 (3u) /**< Divide by 8 */ +#define CY_TCPWM_PWM_PRESCALER_DIVBY_16 (4u) /**< Divide by 16 */ +#define CY_TCPWM_PWM_PRESCALER_DIVBY_32 (5u) /**< Divide by 32 */ +#define CY_TCPWM_PWM_PRESCALER_DIVBY_64 (6u) /**< Divide by 64 */ +#define CY_TCPWM_PWM_PRESCALER_DIVBY_128 (7u) /**< Divide by 128 */ +/** \} group_tcpwm_pwm_clk_prescalers */ + +/** \defgroup group_tcpwm_pwm_output_invert PWM output invert +* \{ +* Output invert modes. +*/ +#define CY_TCPWM_PWM_INVERT_ENABLE (1u) /**< Invert the output mode */ +#define CY_TCPWM_PWM_INVERT_DISABLE (0u) /**< Do not invert the output mode */ +/** \} group_tcpwm_pwm_output_invert */ + +/** \defgroup group_tcpwm_pwm_status PWM Status +* \{ +* The counter status. +*/ +#define CY_TCPWM_PWM_STATUS_DOWN_COUNTING (0x1uL) /**< PWM is down counting */ +#define CY_TCPWM_PWM_STATUS_UP_COUNTING (0x2uL) /**< PWM is up counting */ +#define CY_TCPWM_PWM_STATUS_COUNTER_RUNNING (TCPWM_CNT_STATUS_RUNNING_Msk) /**< PWM counter is running */ +/** \} group_tcpwm_pwm_status */ + + +/*************************************** +* Registers Constants +***************************************/ + +/** \cond INTERNAL */ +#define CY_TCPWM_PWM_CTRL_SYNC_KILL_OR_STOP_ON_KILL_POS (2u) +#define CY_TCPWM_PWM_CTRL_SYNC_KILL_OR_STOP_ON_KILL_MASK (0x3uL << CY_TCPWM_PWM_CTRL_SYNC_KILL_OR_STOP_ON_KILL_POS) +/** \endcond */ + +/** \defgroup group_tcpwm_pwm_output_configuration PWM output signal configuration +* \{ +* The configuration of PWM output signal for PWM alignment. +*/ +#define CY_TCPWM_PWM_TR_CTRL2_SET (0uL) /**< Set define for PWM output signal configuration */ +#define CY_TCPWM_PWM_TR_CTRL2_CLEAR (1uL) /**< Clear define for PWM output signal configuration */ +#define CY_TCPWM_PWM_TR_CTRL2_INVERT (2uL) /**< Invert define for PWM output signal configuration */ +#define CY_TCPWM_PWM_TR_CTRL2_NO_CHANGE (3uL) /**< No change define for PWM output signal configuration */ + +/** The configuration of PWM output signal in Pseudo Random Mode */ +#define CY_TCPWM_PWM_MODE_PR (_VAL2FLD(TCPWM_CNT_TR_CTRL2_CC_MATCH_MODE, CY_TCPWM_PWM_TR_CTRL2_NO_CHANGE) | \ + _VAL2FLD(TCPWM_CNT_TR_CTRL2_OVERFLOW_MODE, CY_TCPWM_PWM_TR_CTRL2_NO_CHANGE) | \ + _VAL2FLD(TCPWM_CNT_TR_CTRL2_UNDERFLOW_MODE, CY_TCPWM_PWM_TR_CTRL2_NO_CHANGE)) + +/** The configuration of PWM output signal for Left alignment */ +#define CY_TCPWM_PWM_MODE_LEFT (_VAL2FLD(TCPWM_CNT_TR_CTRL2_CC_MATCH_MODE, CY_TCPWM_PWM_TR_CTRL2_CLEAR) | \ + _VAL2FLD(TCPWM_CNT_TR_CTRL2_OVERFLOW_MODE, CY_TCPWM_PWM_TR_CTRL2_SET) | \ + _VAL2FLD(TCPWM_CNT_TR_CTRL2_UNDERFLOW_MODE, CY_TCPWM_PWM_TR_CTRL2_NO_CHANGE)) + +/** The configuration of PWM output signal for Right alignment */ +#define CY_TCPWM_PWM_MODE_RIGHT (_VAL2FLD(TCPWM_CNT_TR_CTRL2_CC_MATCH_MODE, CY_TCPWM_PWM_TR_CTRL2_SET) | \ + _VAL2FLD(TCPWM_CNT_TR_CTRL2_OVERFLOW_MODE, CY_TCPWM_PWM_TR_CTRL2_NO_CHANGE) | \ + _VAL2FLD(TCPWM_CNT_TR_CTRL2_UNDERFLOW_MODE, CY_TCPWM_PWM_TR_CTRL2_CLEAR)) + +/** The configuration of PWM output signal for Center and Asymmetric alignment */ +#define CY_TCPWM_PWM_MODE_CNTR_OR_ASYMM (_VAL2FLD(TCPWM_CNT_TR_CTRL2_CC_MATCH_MODE, CY_TCPWM_PWM_TR_CTRL2_INVERT) | \ + _VAL2FLD(TCPWM_CNT_TR_CTRL2_OVERFLOW_MODE, CY_TCPWM_PWM_TR_CTRL2_SET) | \ + _VAL2FLD(TCPWM_CNT_TR_CTRL2_UNDERFLOW_MODE, CY_TCPWM_PWM_TR_CTRL2_CLEAR)) +/** \} group_tcpwm_pwm_output_configuration */ +/** \} group_tcpwm_macro_pwm */ + + +/******************************************************************************* +* Function Prototypes +*******************************************************************************/ + +/** +* \addtogroup group_tcpwm_functions_pwm +* \{ +*/ + +cy_en_tcpwm_status_t Cy_TCPWM_PWM_Init(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_pwm_config_t const *config); +void Cy_TCPWM_PWM_DeInit(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_pwm_config_t const *config); +__STATIC_INLINE void Cy_TCPWM_PWM_Enable(TCPWM_Type *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_PWM_Disable(TCPWM_Type *base, uint32_t cntNum); +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetStatus(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_PWM_SetCompare0(TCPWM_Type *base, uint32_t cntNum, uint32_t compare0); +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetCompare0(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_PWM_SetCompare1(TCPWM_Type *base, uint32_t cntNum, uint32_t compare1); +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetCompare1(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_PWM_EnableCompareSwap(TCPWM_Type *base, uint32_t cntNum, bool enable); +__STATIC_INLINE void Cy_TCPWM_PWM_SetCounter(TCPWM_Type *base, uint32_t cntNum, uint32_t count); +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetCounter(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_PWM_SetPeriod0(TCPWM_Type *base, uint32_t cntNum, uint32_t period0); +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetPeriod0(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_PWM_SetPeriod1(TCPWM_Type *base, uint32_t cntNum, uint32_t period1); +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetPeriod1(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_PWM_EnablePeriodSwap(TCPWM_Type *base, uint32_t cntNum, bool enable); + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_Enable +****************************************************************************//** +* +* Enables the counter in the TCPWM block for the PWM operation. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_PWM_Enable(TCPWM_Type *base, uint32_t cntNum) +{ + base->CTRL_SET = (1uL << cntNum); +} + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_Disable +****************************************************************************//** +* +* Disables the counter in the TCPWM block. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_PWM_Disable(TCPWM_Type *base, uint32_t cntNum) +{ + base->CTRL_CLR = (1uL << cntNum); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_GetStatus +****************************************************************************//** +* +* Returns the status of the PWM. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The status. See \ref group_tcpwm_pwm_status +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetStatus(TCPWM_Type const *base, uint32_t cntNum) +{ + uint32_t status = base->CNT[cntNum].STATUS; + + /* Generates proper up counting status, does not generated by HW */ + status &= ~CY_TCPWM_PWM_STATUS_UP_COUNTING; + status |= ((~status & CY_TCPWM_PWM_STATUS_DOWN_COUNTING & (status >> TCPWM_CNT_STATUS_RUNNING_Pos)) << + CY_TCPWM_CNT_STATUS_UP_POS); + + return(status); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_SetCompare0 +****************************************************************************//** +* +* Sets the compare value for Compare0 when the compare mode enabled. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param compare0 +* The Compare0 value. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_PWM_SetCompare0(TCPWM_Type *base, uint32_t cntNum, uint32_t compare0) +{ + base->CNT[cntNum].CC = compare0; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_GetCompare0 +****************************************************************************//** +* +* Returns compare value 0. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* Compare value 0. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetCompare0(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].CC); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_SetCompare1 +****************************************************************************//** +* +* Sets the compare value for Compare1 when the compare mode is enabled. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param compare1 +* The Compare1 value. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_PWM_SetCompare1(TCPWM_Type *base, uint32_t cntNum, uint32_t compare1) +{ + base->CNT[cntNum].CC_BUFF = compare1; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_GetCompare1 +****************************************************************************//** +* +* Returns compare value 1. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* Compare value 1. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetCompare1(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].CC_BUFF); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_EnableCompareSwap +****************************************************************************//** +* +* Enables the comparison swap on OV and/or UN, depending on the PWM alignment. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param enable +* true = swap enabled; false = swap disabled +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_PWM_EnableCompareSwap(TCPWM_Type *base, uint32_t cntNum, bool enable) +{ + if (enable) + { + base->CNT[cntNum].CTRL |= TCPWM_CNT_CTRL_AUTO_RELOAD_CC_Msk; + } + else + { + base->CNT[cntNum].CTRL &= ~TCPWM_CNT_CTRL_AUTO_RELOAD_CC_Msk; + } +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_SetCounter +****************************************************************************//** +* +* Sets the value of the counter. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param count +* The value to write into the counter. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_PWM_SetCounter(TCPWM_Type *base, uint32_t cntNum, uint32_t count) +{ + base->CNT[cntNum].COUNTER = count; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_GetCounter +****************************************************************************//** +* +* Returns the value in the counter. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The current counter value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetCounter(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].COUNTER); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_SetPeriod0 +****************************************************************************//** +* +* Sets the value of the period register. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param period0 +* The value to write into a period. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_PWM_SetPeriod0(TCPWM_Type *base, uint32_t cntNum, uint32_t period0) +{ + base->CNT[cntNum].PERIOD = period0; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_GetPeriod0 +****************************************************************************//** +* +* Returns the value in the period register. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The current period value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetPeriod0(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].PERIOD); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_SetPeriod1 +****************************************************************************//** +* +* Sets the value of the period register. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param period1 +* The value to write into a period1. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_PWM_SetPeriod1(TCPWM_Type *base, uint32_t cntNum, uint32_t period1) +{ + base->CNT[cntNum].PERIOD_BUFF = period1; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_GetPeriod1 +****************************************************************************//** +* +* Returns the value in the period register. +* +* \param base +* The pointer to a COUNTER PWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The current period value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_PWM_GetPeriod1(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].PERIOD_BUFF); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_PWM_EnablePeriodSwap +****************************************************************************//** +* +* Enables a period swap on OV and/or UN, depending on the PWM alignment +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param enable +* true = swap enabled; false = swap disabled +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_PWM_EnablePeriodSwap(TCPWM_Type *base, uint32_t cntNum, bool enable) +{ + if (enable) + { + base->CNT[cntNum].CTRL |= TCPWM_CNT_CTRL_AUTO_RELOAD_PERIOD_Msk; + } + else + { + base->CNT[cntNum].CTRL &= ~TCPWM_CNT_CTRL_AUTO_RELOAD_PERIOD_Msk; + } +} + +/** \} group_tcpwm_functions_pwm */ + +/** \} group_tcpwm_pwm */ + +#if defined(__cplusplus) +} +#endif + +#endif /* CY_TCPWM_PWM_H */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_quaddec.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_quaddec.c new file mode 100644 index 0000000000..9558e49d51 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_quaddec.c @@ -0,0 +1,116 @@ +/***************************************************************************//** +* \file cy_tcpwm_quaddec.c +* \version 1.0 +* +* \brief +* The source file of the tcpwm driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_tcpwm_quaddec.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************************* +* Function Name: Cy_TCPWM_QuadDec_Init +****************************************************************************//** +* +* Initializes the counter in the TCPWM block for the QuadDec operation. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param config +* The pointer to a configuration structure. See \ref cy_stc_tcpwm_quaddec_config_t. +* +* \return error / status code. See \ref cy_en_tcpwm_status_t. +* +*******************************************************************************/ +cy_en_tcpwm_status_t Cy_TCPWM_QuadDec_Init(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_quaddec_config_t const *config) +{ + cy_en_tcpwm_status_t status = CY_TCPWM_BAD_PARAM; + + if ((NULL != base) && (NULL != config)) + { + base->CNT[cntNum].CTRL = ( _VAL2FLD(TCPWM_CNT_CTRL_QUADRATURE_MODE, config->resolution) | + _VAL2FLD(TCPWM_CNT_CTRL_MODE, CY_TCPWM_QUADDEC_CTRL_QUADDEC_MODE)); + + if (CY_TCPWM_INPUT_CREATOR != config->phiAInput) + { + base->CNT[cntNum].TR_CTRL0 = (_VAL2FLD(TCPWM_CNT_TR_CTRL0_COUNT_SEL, config->phiAInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_START_SEL, config->phiBInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_RELOAD_SEL, config->indexInput) | + _VAL2FLD(TCPWM_CNT_TR_CTRL0_STOP_SEL, config->stopInput)); + } + + base->CNT[cntNum].TR_CTRL1 = (_VAL2FLD(TCPWM_CNT_TR_CTRL1_CAPTURE_EDGE, CY_TCPWM_INPUT_LEVEL) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_COUNT_EDGE, CY_TCPWM_INPUT_LEVEL) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_START_EDGE, CY_TCPWM_INPUT_LEVEL) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_RELOAD_EDGE, config->indexInputMode) | + _VAL2FLD(TCPWM_CNT_TR_CTRL1_STOP_EDGE, config->stopInputMode)); + + base->CNT[cntNum].INTR_MASK = config->interruptSources; + + status = CY_TCPWM_SUCCESS; + } + + return(status); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_QuadDec_DeInit +****************************************************************************//** +* +* De-initializes the counter in the TCPWM block, returns register values to +* default. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param config +* The pointer to a configuration structure. See \ref cy_stc_tcpwm_quaddec_config_t. +* +*******************************************************************************/ +void Cy_TCPWM_QuadDec_DeInit(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_quaddec_config_t const *config) +{ + base->CNT[cntNum].CTRL = CY_TCPWM_CNT_CTRL_DEFAULT; + base->CNT[cntNum].COUNTER = CY_TCPWM_CNT_COUNTER_DEFAULT; + base->CNT[cntNum].CC = CY_TCPWM_CNT_CC_DEFAULT; + base->CNT[cntNum].CC_BUFF = CY_TCPWM_CNT_CC_BUFF_DEFAULT; + base->CNT[cntNum].PERIOD = CY_TCPWM_CNT_PERIOD_DEFAULT; + base->CNT[cntNum].PERIOD_BUFF = CY_TCPWM_CNT_PERIOD_BUFF_DEFAULT; + base->CNT[cntNum].TR_CTRL1 = CY_TCPWM_CNT_TR_CTRL1_DEFAULT; + base->CNT[cntNum].TR_CTRL2 = CY_TCPWM_CNT_TR_CTRL2_DEFAULT; + base->CNT[cntNum].INTR = CY_TCPWM_CNT_INTR_DEFAULT; + base->CNT[cntNum].INTR_SET = CY_TCPWM_CNT_INTR_SET_DEFAULT; + base->CNT[cntNum].INTR_MASK = CY_TCPWM_CNT_INTR_MASK_DEFAULT; + + if (CY_TCPWM_INPUT_CREATOR != config->phiAInput) + { + base->CNT[cntNum].TR_CTRL0 = CY_TCPWM_CNT_TR_CTRL0_DEFAULT; + } +} + + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_quaddec.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_quaddec.h new file mode 100644 index 0000000000..adbb7c826f --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/tcpwm/cy_tcpwm_quaddec.h @@ -0,0 +1,281 @@ +/***************************************************************************//** +* \file cy_tcpwm_quaddec.h +* \version 1.0 +* +* \brief +* The header file of the TCPWM Quadrature Decoder driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_tcpwm_macro_quaddec Macro +* \defgroup group_tcpwm_functions_quaddec Functions +* \defgroup group_tcpwm_data_structures_quaddec Data Structures +* \} */ + +#if !defined(CY_TCPWM_QUADDEC_H) +#define CY_TCPWM_QUADDEC_H + +#include "cy_tcpwm.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** +* \addtogroup group_tcpwm_quaddec +* Driver API for Quadrature Decoder. +* \{ +*/ + +/** +* \addtogroup group_tcpwm_data_structures_quaddec +* \{ +*/ + +/** Quadrature Decoder configuration structure */ +typedef struct cy_stc_tcpwm_quaddec_config +{ + /** Selects the quadrature encoding mode. See \ref group_tcpwm_quaddec_resolution */ + uint32_t resolution; + /** Enables an interrupt on the terminal count, capture or compare. See \ref group_tcpwm_interrupt_sources */ + uint32_t interruptSources; + /** Configures how the index input behaves. See \ref group_tcpwm_input_modes */ + uint32_t indexInputMode; + /** Selects which input the index uses. The inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t indexInput; + /** Configures how the stop input behaves. See \ref group_tcpwm_input_modes */ + uint32_t stopInputMode; + /** Selects which input the stop uses. The inputs are device-specific. See \ref group_tcpwm_input_selection */ + uint32_t stopInput; + /** Selects which input the phiA uses. The inputs are device specific. See \ref group_tcpwm_input_selection */ + uint32_t phiAInput; + /** Selects which input the phiB uses. The inputs are device specific. See \ref group_tcpwm_input_selection */ + uint32_t phiBInput; + +}cy_stc_tcpwm_quaddec_config_t; +/** \} group_tcpwm_data_structures_quaddec */ + +/** +* \addtogroup group_tcpwm_macro_quaddec +* \{ +* \defgroup group_tcpwm_quaddec_resolution QuadDec Resolution +* \{ +* The quadrature decoder resolution. +*/ +#define CY_TCPWM_QUADDEC_X1 (0u) /**< X1 mode */ +#define CY_TCPWM_QUADDEC_X2 (1u) /**< X2 mode */ +#define CY_TCPWM_QUADDEC_X4 (2u) /**< X4 mode */ +/** \} group_tcpwm_quaddec_resolution */ + +/** \defgroup group_tcpwm_quaddec_status QuadDec Status +* \{ +* The counter status. +*/ +#define CY_TCPWM_QUADDEC_STATUS_DOWN_COUNTING (0x1uL) /**< QuadDec is down counting */ +#define CY_TCPWM_QUADDEC_STATUS_UP_COUNTING (0x2uL) /**< QuadDec is up counting */ +/** QuadDec the counter is running */ +#define CY_TCPWM_QUADDEC_STATUS_COUNTER_RUNNING (TCPWM_CNT_STATUS_RUNNING_Msk) +/** \} group_tcpwm_quaddec_status */ + + +/*************************************** +* Registers Constants +***************************************/ +/** \cond INTERNAL */ +#define CY_TCPWM_QUADDEC_CTRL_QUADDEC_MODE (0x3uL) /**< Quadrature encoding mode for CTRL register */ +/** \endcond */ +/** \} group_tcpwm_macro_quaddec */ + + +/******************************************************************************* +* Function Prototypes +*******************************************************************************/ + +/** +* \addtogroup group_tcpwm_functions_quaddec +* \{ +*/ + +cy_en_tcpwm_status_t Cy_TCPWM_QuadDec_Init(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_quaddec_config_t const *config); +void Cy_TCPWM_QuadDec_DeInit(TCPWM_Type *base, uint32_t cntNum, cy_stc_tcpwm_quaddec_config_t const *config); +__STATIC_INLINE void Cy_TCPWM_QuadDec_Enable(TCPWM_Type *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_QuadDec_Disable(TCPWM_Type *base, uint32_t cntNum); +__STATIC_INLINE uint32_t Cy_TCPWM_QuadDec_GetStatus(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE uint32_t Cy_TCPWM_QuadDec_GetCapture(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE uint32_t Cy_TCPWM_QuadDec_GetCaptureBuf(TCPWM_Type const *base, uint32_t cntNum); +__STATIC_INLINE void Cy_TCPWM_QuadDec_SetCounter(TCPWM_Type *base, uint32_t cntNum, uint32_t count); +__STATIC_INLINE uint32_t Cy_TCPWM_QuadDec_GetCounter(TCPWM_Type const *base, uint32_t cntNum); + + +/******************************************************************************* +* Function Name: Cy_TCPWM_QuadDec_Enable +****************************************************************************//** +* +* Enables the counter in the TCPWM block for the QuadDec operation. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_QuadDec_Enable(TCPWM_Type *base, uint32_t cntNum) +{ + base->CTRL_SET = (1uL << cntNum); +} + +/******************************************************************************* +* Function Name: Cy_TCPWM_QuadDec_Disable +****************************************************************************//** +* +* Disables the counter in the TCPWM block. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_QuadDec_Disable(TCPWM_Type *base, uint32_t cntNum) +{ + base->CTRL_CLR = (1uL << cntNum); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_QuadDec_GetStatus +****************************************************************************//** +* +* Returns the status of the QuadDec. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The status. See \ref group_tcpwm_quaddec_status +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_QuadDec_GetStatus(TCPWM_Type const *base, uint32_t cntNum) +{ + uint32_t status = base->CNT[cntNum].STATUS; + + /* Generates proper up counting status, does not generated by HW */ + status &= ~CY_TCPWM_QUADDEC_STATUS_UP_COUNTING; + status |= ((~status & CY_TCPWM_QUADDEC_STATUS_DOWN_COUNTING & (status >> TCPWM_CNT_STATUS_RUNNING_Pos)) << + CY_TCPWM_CNT_STATUS_UP_POS); + + return(status); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_QuadDec_GetCapture +****************************************************************************//** +* +* Returns the capture value. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The capture value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_QuadDec_GetCapture(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].CC); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_QuadDec_GetCaptureBuf +****************************************************************************//** +* +* Returns the buffered capture value. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The buffered capture value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_QuadDec_GetCaptureBuf(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].CC_BUFF); +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_QuadDec_SetCounter +****************************************************************************//** +* +* Sets the value of the counter. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \param count +* The value to write into the counter. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_TCPWM_QuadDec_SetCounter(TCPWM_Type *base, uint32_t cntNum, uint32_t count) +{ + base->CNT[cntNum].COUNTER = count; +} + + +/******************************************************************************* +* Function Name: Cy_TCPWM_QuadDec_GetCounter +****************************************************************************//** +* +* Returns the value in the counter. +* +* \param base +* The pointer to a TCPWM instance. +* +* \param cntNum +* The Counter instance number in the selected TCPWM. +* +* \return +* The current counter value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_TCPWM_QuadDec_GetCounter(TCPWM_Type const *base, uint32_t cntNum) +{ + return(base->CNT[cntNum].COUNTER); +} + +/** \} group_tcpwm_functions_quaddec */ + +/** \} group_tcpwm_quaddec */ + +#if defined(__cplusplus) +} +#endif + +#endif /* CY_TCPWM_QUADDEC_H */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/trigmux/cy_trigmux.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/trigmux/cy_trigmux.c new file mode 100644 index 0000000000..f7411e3563 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/trigmux/cy_trigmux.c @@ -0,0 +1,112 @@ +/***************************************************************************//** +* \file +* \version 1.0 +* +* \brief Trigger mux APIs. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ +#include "cy_trigmux.h" + + +/******************************************************************************* +* Function Name: Cy_TrigMux_Connect +****************************************************************************//** +* +* This function connects an input trigger source and output trigger. +* +* \param inTrig +* An input selection for the trigger mux. +* - Bits 11:8 represent the trigger group selection. +* - Bits 6:0 select the input trigger number in the trigger group. +* +* \param outTrig +* The output of the trigger mux. This refers to the consumer of the trigger mux. +* - Bits 11:8 represent the trigger group selection. +* - Bits 6:0 select the output trigger number in the trigger group. +* +* \param invert +* - CY_TR_MUX_TR_INV_ENABLE: The output trigger is inverted. +* - CY_MUX_TR_INV_DISABLE: The output trigger is not inverted. +* +* \param trigType +* - TRIGGER_TYPE_EDGE: The trigger is synchronized to the consumer blocks clock +* and a two-cycle pulse is generated on this clock. +* - TRIGGER_TYPE_LEVEL: The trigger is a simple level output. +* +* \return +* A status +* - 0: Successful connection made. +* - 1: An invalid input selection corresponding to the output. +* Generally when the trigger groups do not match. +* +*******************************************************************************/ +cy_en_trigmux_status_t Cy_TrigMux_Connect(uint32_t inTrig, uint32_t outTrig, uint32_t invert, en_trig_type_t trigType) +{ + volatile uint32_t* trOutCtlAddr; + cy_en_trigmux_status_t retVal = CY_TRIGMUX_BAD_PARAM; + + if ((inTrig & CY_TR_GROUP_MASK) == (outTrig & CY_TR_GROUP_MASK)) + { + trOutCtlAddr = &(PERI->TR_GR[(outTrig & CY_TR_GROUP_MASK) >> CY_TR_GROUP_SHIFT].TR_OUT_CTL[outTrig & CY_TR_MASK]); + + *trOutCtlAddr = _VAL2FLD(PERI_TR_GR_TR_OUT_CTL_TR_SEL, inTrig) | + _VAL2FLD(PERI_TR_GR_TR_OUT_CTL_TR_INV, invert) | + _VAL2FLD(PERI_TR_GR_TR_OUT_CTL_TR_EDGE, trigType); + + retVal = CY_TRIGMUX_SUCCESS; + } + + return retVal; +} + + +/******************************************************************************* +* Function Name: Cy_TrigMux_SwTrigger +****************************************************************************//** +* +* This function generates a software trigger on an input trigger line. +* All output triggers connected to this input trigger will be triggered. +* The function also verifies that there is no activated trigger before +* generating another activation. +* +* \param trigLine +* The input of the trigger mux. +* - Bit 12 represents if the signal is an input/output. +* - Bits 11:8 represent the trigger group selection. +* - Bits 6:0 select the output trigger number in the trigger group. +* +* \param cycles +* The number of cycles during which the trigger remains activated. +* - The valid range: 1-254 cycles. +* +* \return +* A status +* - 0: If there was not an already activated trigger. +* - 1: If there was an already activated trigger. +* +*******************************************************************************/ +cy_en_trigmux_status_t Cy_TrigMux_SwTrigger(uint32_t trigLine, uint32_t cycles) +{ + cy_en_trigmux_status_t retVal = CY_TRIGMUX_INVALID_STATE; + + if (PERI_TR_CMD_ACTIVATE_Msk != (PERI->TR_CMD & PERI_TR_CMD_ACTIVATE_Msk)) + { + PERI->TR_CMD = _VAL2FLD(PERI_TR_CMD_TR_SEL, (trigLine & CY_TR_MASK)) | + _VAL2FLD(PERI_TR_CMD_GROUP_SEL, ((trigLine & CY_TR_GROUP_MASK) >> CY_TR_GROUP_SHIFT)) | + _VAL2FLD(PERI_TR_CMD_COUNT, cycles) | + _VAL2FLD(PERI_TR_CMD_OUT_SEL, (trigLine & CY_TR_OUT_CTL_MASK) >> CY_TR_OUT_CTL_SHIFT) | + _VAL2FLD(PERI_TR_CMD_ACTIVATE, CY_TR_ACTIVATE_ENABLE); + + retVal = CY_TRIGMUX_SUCCESS; + } + + return retVal; +} + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/trigmux/cy_trigmux.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/trigmux/cy_trigmux.h new file mode 100644 index 0000000000..d9e44467f7 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/trigmux/cy_trigmux.h @@ -0,0 +1,199 @@ +/******************************************************************************* +* \file cy_trigmux.h +* \version 1.0 +* +* This file provides constants and parameter values for the Trigger multiplexer driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_trigmux Trigger multiplexer (TrigMux) +* \{ +* The trigger multiplexer provides access to the multiplexer that selects a set +* of trigger output signals from different peripheral blocks to route them to the +* specific trigger input of another peripheral block. +* +* The TrigMux driver is based on the trigger multiplexer's hardware block. +* The Trigger multiplexer block consists of multiple trigger multiplexers. +* These trigger multiplexers are grouped in trigger groups. All the trigger +* multiplexers in the trigger group share similar input options. The trigger +* multiplexer groups are either reduction multiplexers or distribution multiplexers. +* The reduction multiplexer groups have input options that are the trigger outputs +* coming from the different peripheral blocks and the reduction multiplexer groups +* route them to intermediate signals. The distribution multiplexer groups have input +* options from these intermediate signals and route them back to multiple peripheral +* blocks as their trigger inputs. +* +* The trigger architecture of the PSoC device is explained in the technical reference +* manual (TRM). Refer to the TRM to better understand the trigger multiplexer routing +* architecture available. +* +* \section group_trigmux_section_Configuration_Considerations Configuration Considerations +* +* +* To route a trigger signal from one peripheral in the PSoC +* to another, the user must configure a reduction multiplexer and a distribution +* multiplexer. The Cy_TrigMux_connect() is used to configure a trigger multiplexer connection. +* The user will need two calls of this API, one for the reduction multiplexer and another +* for the distribution multiplexer, to achieve the trigger connection from a source +* peripheral to a destination peripheral. The Cy_TrigMux_connect() function has two main +* parameters, inTrig and outTrig that refer to the input and output trigger signals +* connected using the multiplexer. +* +* These parameters are represented in the following format: +* \image html trigmux/docs/trigmux_parameter.png +* In addition, the Cy_TrigMux_connect() function also has an invert and trigger type parameter. +* Refer to the API reference for a detailed description of this parameter. +* All the constants associated with the different trigger signals in the system +* (input and output) are defined as constants in the device configuration header file. +* The constants for TrigMux in the device configuration header file are divided into four +* types based on the signal being input/output and being part of a reduction/distribution +* trigger multiplexer. +* +* The four types of the input/output parameters are: +* 1) The parameters for the reduction multiplexer's inputs (input signals of TrigMux); +* 2) The parameters for the reduction multiplexer's outputs (intermediate signals); +* 3) The parameters for the distribution multiplexer's inputs (intermediate signals); +* 4) The parameters for the distribution multiplexer's outputs (output signals of TrigMux). +* Refer to the TRM for a more detailed description of this architecture and different options. +* +* The steps to connect one peripheral block to the other: +* +* Step 1. Find the trigger group number in the Trigger Group Inputs section of the device +* configuration header file that corresponds to the output of the first peripheral block. +* For example, TRIG10_IN_CPUSS_DW0_TR_OUT4 input of the reduction multiplexers belongs +* to Trigger Group 10. +* +* Step 2. Find the trigger group number in the Trigger Group Outputs section of the device +* configuration header file that corresponds to the input of the second peripheral block. +* For example, TRIG3_OUT_TCPWM1_TR_IN0 output of the distribution multiplexer belongs to +* Trigger Group 3. +* +* Step 3. Find the same trigger group number in the Trigger Group Inputs section of the +* device configuration header file that corresponds to the trigger group number found in +* Step 1. Select the reduction multiplexer output that can be connected to the trigger group +* found in Step 2. For example, TRIG3_IN_TR_GROUP10_OUTPUT5 means that Reduction Multiplexer +* Output 5 of Trigger Group 10 can be connected to Trigger Group 3. +* +* Step 4. Find the same trigger group number in the Trigger Group Outputs section of the +* device configuration header file that corresponds to the trigger group number found in Step 2. +* Select the distribution multiplexer input that can be connected to the trigger group found +* in Step 1. For example, TRIG10_OUT_TR_GROUP3_INPUT1 means that the Distribution Multiplexer +* Input 1 of Trigger Group 3 can be connected to the output of the reduction multiplexer +* in Trigger Group 10 found in Step 3. +* +* Step 5. Call Cy_TrigMux_Connect() API twice: the first call - with the constants for the +* inTrig and outTrig parameters found in Steps 1 and Step 4, the second call - with the +* constants for the inTrig and outTrig parameters found in Steps 2 and Step 3. +* For example, +* Cy_TrigMux_Connect(TRIG10_IN_CPUSS_DW0_TR_OUT4, TRIG10_OUT_TR_GROUP3_INPUT1, +* TR_MUX_TR_INV_DISABLE, TRIGGER_TYPE_LEVEL); +* Cy_TrigMux_Connect(TRIG3_IN_TR_GROUP10_OUTPUT5, TRIG3_OUT_TCPWM1_TR_IN0, +* TR_MUX_TR_INV_DISABLE, TRIGGER_TYPE_LEVEL); +* +* \section group_trigmux_more_information More Information +* For more information on the TrigMux peripheral, refer to the technical reference manual (TRM). +* +* \section group_trigmux_MISRA MISRA-C Compliance +* The TrigMux driver does not have any specific deviations. +* +* \section group_trigmux_Changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_trigmux_macro Macro +* \defgroup group_trigmux_functions Functions +* \defgroup group_trigmux_enums Enumerated Types +*/ + +#if !defined(CY_TRIGMUX_H) +#define CY_TRIGMUX_H + +#include "cy_device_headers.h" +#include "syslib/cy_syslib.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** +* \addtogroup group_trigmux_macro +* \{ +*/ + +/** The driver major version */ +#define CY_TRIGMUX_DRV_VERSION_MAJOR 1 + +/** The driver minor version */ +#define CY_TRIGMUX_DRV_VERSION_MINOR 0 + +/**< TRIGMUX PDL ID */ +#define CY_TRIGMUX_ID CY_PDL_DRV_ID(0x33u) /**< The trigger multiplexer driver identifier */ + +#define CY_TR_MUX_TR_INV_ENABLE (0x01u) /**< Enable trigger invert */ +#define CY_TR_MUX_TR_INV_DISABLE (0x00u) /**< Disable trigger invert */ + +/** \cond */ + +#define CY_TR_ACTIVATE_ENABLE (0x01u) +#define CY_TR_GROUP_MASK (0x0F00u) +#define CY_TR_MASK (0x007Fu) +#define CY_TR_GROUP_SHIFT (0x08u) +#define CY_TR_OUT_CTL_MASK (0x1000u) +#define CY_TR_OUT_CTL_SHIFT (12u) + +/** \endcond */ + +/** \} group_trigmux_macro */ + + +/** +* \addtogroup group_trigmux_enums +* \{ +*/ + +/****************************************************************************** + * Enumerations + *****************************************************************************/ + +/** The TRIGMUX error codes. */ +typedef enum +{ + CY_TRIGMUX_SUCCESS = 0x00u, /**< Successful */ + CY_TRIGMUX_BAD_PARAM = CY_TRIGMUX_ID | CY_PDL_STATUS_ERROR | 0x01u, /**< One or more invalid parameters */ + CY_TRIGMUX_INVALID_STATE = CY_TRIGMUX_ID | CY_PDL_STATUS_ERROR | 0x02u /**< Operation not setup or is in an improper state */ +} cy_en_trigmux_status_t; + +/** \} group_trigmux_enums */ + +/** +* \addtogroup group_trigmux_functions +* \{ +*/ + +cy_en_trigmux_status_t Cy_TrigMux_Connect(uint32_t inTrig, uint32_t outTrig, uint32_t invert, en_trig_type_t trigType); +cy_en_trigmux_status_t Cy_TrigMux_SwTrigger(uint32_t trigLine, uint32_t cycles); + +/** \} group_trigmux_functions */ + +#if defined(__cplusplus) +} +#endif + +#endif /* CY_TRIGMUX_H */ + +/** \} group_lpcomp */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/wdt/cy_wdt.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/wdt/cy_wdt.c new file mode 100644 index 0000000000..6e4662419c --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/wdt/cy_wdt.c @@ -0,0 +1,303 @@ +/***************************************************************************//** +* \file cy_wdt.c +* \version 1.0 +* +* This file provides the source code to the API for the WDT driver. +* +******************************************************************************** +* \copyright +* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_wdt.h" +#include "syslib/cy_syslib.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +static bool Cy_WDT_Locked(void); + + +/******************************************************************************* +* Function Name: Cy_WDT_Init +****************************************************************************//** +* +* Initialize the Watchdog Timer to its default state. +* +* The default setting of WDT is given as following: +* Whole the Watchdog Timer register counter bits are checked against the match. +* WDT match value is equal - 4096. +* +*******************************************************************************/ +void Cy_WDT_Init(void) +{ + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + + /* Unlocking WDT by two writes */ + SRSS->WDT_CTL = ((SRSS->WDT_CTL & (uint32_t)(~SRSS_WDT_CTL_WDT_LOCK_Msk)) | CY_SRSS_WDT_LOCK_BIT0); + + SRSS->WDT_CTL |= CY_SRSS_WDT_LOCK_BIT1; + + /* Disabling WDT and setting default values */ + Cy_WDT_Disable(); + + Cy_WDT_SetMatch(CY_SRSS_WDT_DEFAULT_MATCH_VALUE); + + Cy_WDT_SetIgnoreBits(CY_SRSS_WDT_DEFAULT_IGNORE_BITS); + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_WDT_Enable +****************************************************************************//** +* +* Enables Watchdog Timer. +* +*******************************************************************************/ +void Cy_WDT_Enable(void) +{ + SRSS->WDT_CTL |= _VAL2FLD(SRSS_WDT_CTL_WDT_EN, 1u); +} + + +/******************************************************************************* +* Function Name: Cy_WDT_Disable +****************************************************************************//** +* +* Disables Watchdog Timer. Watchdog Timer should be unlocked before it is being +* disabled. Call Cy_WDT_Unlock() API to unlock WDT. +* +*******************************************************************************/ +void Cy_WDT_Disable(void) +{ + SRSS->WDT_CTL &= ((uint32_t) ~(_VAL2FLD(SRSS_WDT_CTL_WDT_EN, 1u))); +} + + +/******************************************************************************* +* Function Name: Cy_WDT_Lock +****************************************************************************//** +* +* Locks out configuration changes to the Watchdog Timer register. +* +* After this function is called, the WDT configuration cannot be changed until +* Cy_WDT_Unlock() is called. +* +*******************************************************************************/ +void Cy_WDT_Lock(void) +{ + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + + SRSS->WDT_CTL |= _VAL2FLD(SRSS_WDT_CTL_WDT_LOCK, CY_SRSS_WDT_LOCK_BITS); + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_WDT_Locked +****************************************************************************//** +* \internal +* Reports the WDT lock state. +* +* \return TRUE - if WDT is locked, and FALSE - if WDT is unlocked. +* \endinternal +*******************************************************************************/ +static bool Cy_WDT_Locked(void) +{ + /* Prohibits writing to WDT registers and LFCLK */ + return (0u != _FLD2VAL(SRSS_WDT_CTL_WDT_LOCK, SRSS->WDT_CTL)); +} + + +/******************************************************************************* +* Function Name: Cy_WDT_Unlock +****************************************************************************//** +* +* \brief Unlocks the Watchdog Timer configuration register. +* +*******************************************************************************/ +void Cy_WDT_Unlock(void) +{ + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + + /* Removing WDT lock requires to be done by two writes */ + SRSS->WDT_CTL = ((SRSS->WDT_CTL & (uint32_t)(~SRSS_WDT_CTL_WDT_LOCK_Msk)) | CY_SRSS_WDT_LOCK_BIT0); + + SRSS->WDT_CTL |= CY_SRSS_WDT_LOCK_BIT1; + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: WDT_SetMatch +****************************************************************************//** +* +* Configures the WDT counter match comparison value. Watchdog Timer +* should be unlocked before changing the match value. Call the Cy_WDT_Unlock() +* function to unlock WDT. +* +* \param match The valid valid range is [0-65535]. The value to be used to match +* against the counter. +* +*******************************************************************************/ +void Cy_WDT_SetMatch(uint32_t match) +{ + if (false == Cy_WDT_Locked()) + { + SRSS->WDT_MATCH = _CLR_SET_FLD32U((SRSS->WDT_MATCH), SRSS_WDT_MATCH_MATCH, match); + } +} + + +/******************************************************************************* +* Function Name: Cy_WDT_GetMatch +****************************************************************************//** +* +* Reads the WDT counter match comparison value. +* +* \return The counter match value. +* +*******************************************************************************/ +uint32_t Cy_WDT_GetMatch(void) +{ + return ((uint32_t) _FLD2VAL(SRSS_WDT_MATCH_MATCH, SRSS->WDT_MATCH)); +} + + +/******************************************************************************* +* Function Name: Cy_WDT_GetCount +****************************************************************************//** +* +* Reads the current WDT counter value. +* +* \return A live counter value. +* +*******************************************************************************/ +uint32_t Cy_WDT_GetCount(void) +{ + return ((uint32_t) _FLD2VAL(SRSS_WDT_CNT_COUNTER, SRSS->WDT_CNT)); +} + + +/******************************************************************************* +* Function Name: Cy_WDT_SetIgnoreBits +****************************************************************************//** +* +* Configures the number of the most significant bits of the Watchdog Timer that +* are not checked against the match. Watchdog Timer should be unlocked before +* ignore bits setting. Call the Cy_WDT_Unlock() API to unlock WDT. +* +* \param +* bitsNum The number of the most significant bits. Valid range is [0-15]. +* The bitsNum over 12 are considered as 12. +* +* \details The value of bitsNum controls the time-to-reset of the Watchdog Timer +* (which happens after 3 successive matches). +* +* \warning As this function change the WDT interrupt period, there are possible +* situations when device can go into infinite WDT resets loop. Such situations +* are caused by condition that WDT reset occurs faster that device start-up. +* +*******************************************************************************/ +void Cy_WDT_SetIgnoreBits(uint32_t bitsNum) +{ + if (false == Cy_WDT_Locked()) + { + SRSS->WDT_MATCH = _CLR_SET_FLD32U((SRSS->WDT_MATCH), SRSS_WDT_MATCH_IGNORE_BITS, bitsNum); + } +} + + +/******************************************************************************* +* Function Name: Cy_WDT_GetIgnoreBits +****************************************************************************//** +* +* Reads the number of the most significant bits of the Watchdog Timer that are +* not checked against the match. +* +* \return The number of the most significant bits. +* +*******************************************************************************/ +uint32_t Cy_WDT_GetIgnoreBits(void) +{ + return((uint32_t) _FLD2VAL(SRSS_WDT_MATCH_IGNORE_BITS ,SRSS->WDT_MATCH)); +} + + +/******************************************************************************* +* Function Name: Cy_WDT_ClearInterrupt +****************************************************************************//** +* +* Cleans the WDT match flag which is set every time the WDT counter reaches a +* WDT match value. Two unserviced interrupts lead to a system reset +* (i.e. at the third match). +* +*******************************************************************************/ +void Cy_WDT_ClearInterrupt(void) +{ + SRSS->SRSS_INTR |= _VAL2FLD(SRSS_SRSS_INTR_WDT_MATCH, 1u); + + /* Read SRSS register to ensure that the initial clearing write has been + * flushed out to the hardware. + */ + (void) SRSS->SRSS_INTR; +} + + +/******************************************************************************* +* Function Name: Cy_WDT_MaskInterrupt +****************************************************************************//** +* +* After masking interrupts from WDT, they are not passed to CPU. +* This function does not disable the WDT-reset generation. +* +*******************************************************************************/ +void Cy_WDT_MaskInterrupt(void) +{ + SRSS->SRSS_INTR_MASK &= (uint32_t)(~ _VAL2FLD(SRSS_SRSS_INTR_MASK_WDT_MATCH, 1u)); +} + + +/******************************************************************************* +* Function Name: Cy_WDT_UnmaskInterrupt +****************************************************************************//** +* +* After unmasking interrupts from WDT, they are passed to CPU. +* This function does not impact the reset generation. +* +*******************************************************************************/ +void Cy_WDT_UnmaskInterrupt(void) +{ + SRSS->SRSS_INTR_MASK |= _VAL2FLD(SRSS_SRSS_INTR_MASK_WDT_MATCH, 1u); +} + + +/******************************************************************************* +* Function Name: Cy_WDT_ClearWatchdog +****************************************************************************//** +* +* Clears ("feeds") the watchdog, do prevents a XRES device reset. +* +*******************************************************************************/ +void Cy_WDT_ClearWatchdog(void) +{ + Cy_WDT_ClearInterrupt(); +} + +#if defined(__cplusplus) +} +#endif + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/wdt/cy_wdt.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/wdt/cy_wdt.h new file mode 100644 index 0000000000..67783ebd6b --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/wdt/cy_wdt.h @@ -0,0 +1,261 @@ +/***************************************************************************//** +* \file cy_wdt.h +* \version 1.0 +* +* This file provides constants and parameter values for the WDT driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +* +*******************************************************************************/ + +/** +* \defgroup group_wdt Watchdog Timer (WDT) +* \{ +* +* The Watchdog Timer is a 16-bit free-running up-counter that can issue +* interrupts and device reset if its interrupts are not handled. +* Use the Watchdog Timer for two main purposes.
+* The First use case is recovering from a CPU or firmware failure. +* A timeout period is set up in the watchdog timer, and if a timeout occurs, the +* device is reset (WRES).
+* The Second use case is to generate periodic interrupts. +* +* A "reset cause" register exists, and the firmware should check this register +* at startup. An appropriate action can be taken if a WRES reset is detected. +* +* The user's firmware periodically resets the timeout period (clears or "feeds" +* the watchdog) before a timeout occurs. If the firmware fails to do so, that is +* considered to be a CPU crash or a firmware failure, and the reason for a +* device reset. +* The WDT can generate an interrupt instead of a device reset. The Interrupt +* Service Routine (ISR) can handle the interrupt either as a periodic interrupt, +* or as an early indication of a firmware failure and respond accordingly. +* +* Functional Description
+* The WDT generates an interrupt when the count value in the counter equals the +* configured match value. +* +* It is important that the counter is not reset on a match. When the counter +* reaches a match value, it generates an interrupt and then keeps counting up +* till it overflows and rolls back to zero and reaches the match value again, at +* which point another interrupt is generated. +* +* To use a WDT to generate a periodic interrupt, the match value should be +* incremented in the ISR. As a result, the next WDT interrupt is generated when +* the counter reaches a new match value. +* +* You can also reduce the entire WDT counter period by +* specifying the number of most significant bits that are cut-off in the WDT +* counter. For example, if the Cy_WDT_SetIgnoreBits() function is called with +* parameter 3, the WDT counter becomes a 13-bit free-running up-counter. +* +* Power Modes
+* WDT can operate in all possible low power modes. +* Operation during Hibernate mode is possible because the logic and +* high-voltage internal low oscillator (ILO) are supplied by the external +* high-voltage supply (Vddd). The WDT can be configured to wake the device from +* Hibernate mode. +* +* In Active or LPActive mode, an interrupt request from the WDT is sent to the +* CPU via IRQ 22. In Sleep, LPSleep or Deep Sleep power mode, the CPU subsystem +* is powered down, so the interrupt request from the WDT is sent directly to the +* WakeUp Interrupt Controller (WIC), which will then wake up the CPU. The +* CPU then acknowledges the interrupt request and executes the ISR. +* +* After waking from Deep Sleep, an internal timer value is set to zero until the +* ILO loads the register with the correct value. This can cause an increase in +* low-power mode current consumption. The work around is to wait for the first +* negative edge of the ILO clock before allowing the WDT_CNT register to be read +* by the Cy_WDT_GetCount() function. +* +* Clock Source
+* The WDT is clocked by the 32 kHz ILO. The WDT reset must be disabled +* before disabling the ILO. Otherwise, any register write to disable the ILO is +* ignored. Enabling the WDT reset automatically enables the ILO. +* According to the device datasheet, the ILO accuracy is +/-30% over voltage +* and temperature. This means that the timeout period may vary by 30% from the +* configured value. Appropriate margins should be added while configuring WDT +* intervals to make sure that unwanted device resets do not occur on some +* devices. +* +* Refer to the device datasheet for more information on the oscillator accuracy. +* +* Register Locking
+* You can prevent accidental corruption of the WDT configuration by calling +* the Cy_WDT_Lock() function. When the WDT is locked, any writing to the WDT_*, +* CLK_ILO_CONFIG, CLK_SELECT.LFCLK_SEL, and CLK_TRIM_ILO_CTL registers is +* ignored. +* Call the Cy_WDT_Unlock() function to allow WDT registers modification. +* +* Clearing WDT
+* The ILO clock is asynchronous to the SysClk. As a result it generally +* takes three ILO cycles for WDT register changes to come into effect. It is +* important to remember that a WDT should be cleared at least four cycles +* (3 + 1 for sure) before a timeout occurs, especially when small +* match values / low-toggle bit numbers are used. +* +* \warning There is a risk of situations when WDT reset can be generated +* faster than device start-up. Be aware of such situations by calculating the +* start-up time and WDT reset time. The WDT reset time should be always smaller +* than device start-up time. +* +* Reset Detection
+* Use the Cy_SysLib_GetResetReason() function to detect whether the WDT has +* triggered a device reset. +* +* Interrupt Configuration
+* The Global Signal Reference and Interrupt components can be used for ISR +* configuration. If the WDT is configured to generate an interrupt, the pending +* interrupts must be cleared within the ISR (otherwise, the interrupt will be +* generated continuously). +* A pending interrupt to the WDT block must be cleared by the call to the +* Cy_WDT_ClearInterrupt() function. The call to the function will clear the +* unhandled WDT interrupt counter. +* +* Use the WDT ISR as a timer to trigger certain actions +* and to change a next WDT match value. +* +* Ensure that the interrupts from the WDT are passed to the CPU to avoid +* unregistered interrupts. Unregistered WDT interrupts result in continuous +* device reset. To avoid a continuous device reset, call +* Cy_WDT_UnmaskInterrupt(). After that, call the WDT API functions for interrupt +* handling/clearing. +* +* \section group_wdt_configuration Configuration Considerations +* +* To start the WDT, make sure that ILO is enabled. +* After the ILO is enabled, ensure that the WDT is unlocked and disabled by calling +* the Cy_WDT_Unlock() and Cy_WDT_Disable() functions. Set the WDT match value by +* calling Cy_WDT_SetMatch() with the required match value. If needed, set the +* ignore bits for reducing the WDT counter period by calling Cy_WDT_SetIgnoreBits() +* function. After the WDT configuration is set, call Cy_WDT_Enable(). +* +* \note Enable a WDT if the power supply can produce +* sudden brownout events that may compromise the CPU functionality. This +* ensures that the system can recover after a brownout. +* +* When the WDT is used to protect against system crashes, the +* WDT interrupt should be cleared by a portion of the code that is not directly +* associated with the WDT interrupt. +* Otherwise, it is possible that the main firmware loop has crashed or is in an +* endless loop, but the WDT interrupt vector continues to operate and service +* the WDT. The user should: +* * Feed the watchdog by clearing the interrupt bit regularly in the main body +* of the firmware code. +* +* * Guarantee that the interrupt is cleared at least once every WDT period. +* +* * Use the WDT ISR only as a timer to trigger certain actions and to change the +* next match value. +* +* \section group_wdt_section_more_information More Information +* +* For more information on the WDT peripheral, refer to the technical reference +* manual (TRM). +* +* \section group_wdt_MISRA MISRA-C Compliance +* The WDT driver does not have any specific deviations. +* +* \section group_wdt_changelog Changelog +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.0Initial version
+* +* \defgroup group_wdt_macro Macro +* \defgroup group_wdt_functions Functions +* +*/ + +#if !defined(_WDT_H_) +#define _WDT_H_ + +#include +#include +#include "cy_device_headers.h" + + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Function Prototypes +*******************************************************************************/ + +/** +* \addtogroup group_wdt_functions +* @{ +*/ + /* WDT API */ + void Cy_WDT_Init(void); + void Cy_WDT_Enable(void); + void Cy_WDT_Disable(void); + void Cy_WDT_Lock(void); + void Cy_WDT_Unlock(void); + void Cy_WDT_SetMatch(uint32_t match); + uint32_t Cy_WDT_GetMatch(void); + uint32_t Cy_WDT_GetCount(void); + void Cy_WDT_SetIgnoreBits(uint32_t bitsNum); + uint32_t Cy_WDT_GetIgnoreBits(void); + void Cy_WDT_ClearInterrupt(void); + void Cy_WDT_MaskInterrupt(void); + void Cy_WDT_UnmaskInterrupt(void); + void Cy_WDT_ClearWatchdog(void); +/** \} group_wdt_functions */ + + +/******************************************************************************* +* Function Constants +*******************************************************************************/ + +/** +* \addtogroup group_wdt_macro +* \{ +*/ + +/** Driver major version */ +#define CY_WDT_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_WDT_DRV_VERSION_MINOR 0 + +/** Internal define for first iteration of WDT unlocking */ +#define CY_SRSS_WDT_LOCK_BIT0 ((uint32_t)0x01u << 30u) + +/** Internal define for second iteration of WDT unlocking */ +#define CY_SRSS_WDT_LOCK_BIT1 ((uint32_t)0x01u << 31u) + +/** WDT default match value */ +#define CY_SRSS_WDT_DEFAULT_MATCH_VALUE ((uint32_t) 4096u) + +/** Default match value of WDT ignore bits */ +#define CY_SRSS_WDT_DEFAULT_IGNORE_BITS (0u) + +/** Default match value of WDT ignore bits */ +#define CY_SRSS_WDT_LOCK_BITS (3u) + +/** WDT driver identifier */ +#define CY_WDT_ID CY_PDL_DRV_ID(0x34u) + +/** \} group_wdt_macro */ + +#if defined(__cplusplus) +} +#endif + +#endif /* _WDT_H_ */ + +/** \} group_wdt */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_backup.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_backup.h new file mode 100644 index 0000000000..0295b344ce --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_backup.h @@ -0,0 +1,221 @@ +/***************************************************************************//** +* \file cyip_backup.h +* +* \brief +* BACKUP IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_BACKUP_H_ +#define _CYIP_BACKUP_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ BACKUP ================ */ +/* =========================================================================================================================== */ + +#define BACKUP_SECTION_SIZE 0x00010000UL + +/** + * \brief SRSS Backup Domain (BACKUP) + */ +typedef struct { /*!< BACKUP Structure */ + __IOM uint32_t CTL; /*!< 0x00000000 Control */ + __IM uint32_t RESERVED; + __IOM uint32_t RTC_RW; /*!< 0x00000008 RTC Read Write register */ + __IOM uint32_t CAL_CTL; /*!< 0x0000000C Oscillator calibration for absolute frequency */ + __IM uint32_t STATUS; /*!< 0x00000010 Status */ + __IOM uint32_t RTC_TIME; /*!< 0x00000014 Calendar Seconds, Minutes, Hours, Day of Week */ + __IOM uint32_t RTC_DATE; /*!< 0x00000018 Calendar Day of Month, Month, Year */ + __IOM uint32_t ALM1_TIME; /*!< 0x0000001C Alarm 1 Seconds, Minute, Hours, Day of Week */ + __IOM uint32_t ALM1_DATE; /*!< 0x00000020 Alarm 1 Day of Month, Month */ + __IOM uint32_t ALM2_TIME; /*!< 0x00000024 Alarm 2 Seconds, Minute, Hours, Day of Week */ + __IOM uint32_t ALM2_DATE; /*!< 0x00000028 Alarm 2 Day of Month, Month */ + __IOM uint32_t INTR; /*!< 0x0000002C Interrupt request register */ + __IOM uint32_t INTR_SET; /*!< 0x00000030 Interrupt set request register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000034 Interrupt mask register */ + __IM uint32_t INTR_MASKED; /*!< 0x00000038 Interrupt masked request register */ + __IM uint32_t OSCCNT; /*!< 0x0000003C 32kHz oscillator counter */ + __IM uint32_t TICKS; /*!< 0x00000040 128Hz tick counter */ + __IOM uint32_t PMIC_CTL; /*!< 0x00000044 PMIC control register */ + __IM uint32_t RESERVED1[1006]; + __IOM uint32_t BREG[8]; /*!< 0x00001000 Backup register region */ + __IM uint32_t RESERVED2[15288]; + __IOM uint32_t TRIM; /*!< 0x0000FF00 Trim Register */ +} BACKUP_Type; /*!< Size = 65284 (0xFF04) */ + + +/* ====================================================== BACKUP.CTL ======================================================= */ +#define BACKUP_CTL_WCO_EN_Pos (3UL) /*!< BACKUP CTL: WCO_EN (Bit 3) */ +#define BACKUP_CTL_WCO_EN_Msk (0x8UL) /*!< BACKUP CTL: WCO_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_CTL_CLK_SEL_Pos (8UL) /*!< BACKUP CTL: CLK_SEL (Bit 8) */ +#define BACKUP_CTL_CLK_SEL_Msk (0x300UL) /*!< BACKUP CTL: CLK_SEL (Bitfield-Mask: 0x03) */ +#define BACKUP_CTL_PRESCALER_Pos (12UL) /*!< BACKUP CTL: PRESCALER (Bit 12) */ +#define BACKUP_CTL_PRESCALER_Msk (0x3000UL) /*!< BACKUP CTL: PRESCALER (Bitfield-Mask: 0x03) */ +#define BACKUP_CTL_WCO_BYPASS_Pos (16UL) /*!< BACKUP CTL: WCO_BYPASS (Bit 16) */ +#define BACKUP_CTL_WCO_BYPASS_Msk (0x10000UL) /*!< BACKUP CTL: WCO_BYPASS (Bitfield-Mask: 0x01) */ +#define BACKUP_CTL_VDDBAK_CTL_Pos (17UL) /*!< BACKUP CTL: VDDBAK_CTL (Bit 17) */ +#define BACKUP_CTL_VDDBAK_CTL_Msk (0x60000UL) /*!< BACKUP CTL: VDDBAK_CTL (Bitfield-Mask: 0x03) */ +#define BACKUP_CTL_VBACKUP_MEAS_Pos (19UL) /*!< BACKUP CTL: VBACKUP_MEAS (Bit 19) */ +#define BACKUP_CTL_VBACKUP_MEAS_Msk (0x80000UL) /*!< BACKUP CTL: VBACKUP_MEAS (Bitfield-Mask: 0x01) */ +#define BACKUP_CTL_EN_CHARGE_KEY_Pos (24UL) /*!< BACKUP CTL: EN_CHARGE_KEY (Bit 24) */ +#define BACKUP_CTL_EN_CHARGE_KEY_Msk (0xff000000UL) /*!< BACKUP CTL: EN_CHARGE_KEY (Bitfield-Mask: 0xff) */ +/* ===================================================== BACKUP.RTC_RW ===================================================== */ +#define BACKUP_RTC_RW_READ_Pos (0UL) /*!< BACKUP RTC_RW: READ (Bit 0) */ +#define BACKUP_RTC_RW_READ_Msk (0x1UL) /*!< BACKUP RTC_RW: READ (Bitfield-Mask: 0x01) */ +#define BACKUP_RTC_RW_WRITE_Pos (1UL) /*!< BACKUP RTC_RW: WRITE (Bit 1) */ +#define BACKUP_RTC_RW_WRITE_Msk (0x2UL) /*!< BACKUP RTC_RW: WRITE (Bitfield-Mask: 0x01) */ +/* ==================================================== BACKUP.CAL_CTL ===================================================== */ +#define BACKUP_CAL_CTL_CALIB_VAL_Pos (0UL) /*!< BACKUP CAL_CTL: CALIB_VAL (Bit 0) */ +#define BACKUP_CAL_CTL_CALIB_VAL_Msk (0x3fUL) /*!< BACKUP CAL_CTL: CALIB_VAL (Bitfield-Mask: 0x3f) */ +#define BACKUP_CAL_CTL_CALIB_SIGN_Pos (6UL) /*!< BACKUP CAL_CTL: CALIB_SIGN (Bit 6) */ +#define BACKUP_CAL_CTL_CALIB_SIGN_Msk (0x40UL) /*!< BACKUP CAL_CTL: CALIB_SIGN (Bitfield-Mask: 0x01) */ +#define BACKUP_CAL_CTL_CAL_OUT_Pos (31UL) /*!< BACKUP CAL_CTL: CAL_OUT (Bit 31) */ +#define BACKUP_CAL_CTL_CAL_OUT_Msk (0x80000000UL) /*!< BACKUP CAL_CTL: CAL_OUT (Bitfield-Mask: 0x01) */ +/* ===================================================== BACKUP.STATUS ===================================================== */ +#define BACKUP_STATUS_RTC_BUSY_Pos (0UL) /*!< BACKUP STATUS: RTC_BUSY (Bit 0) */ +#define BACKUP_STATUS_RTC_BUSY_Msk (0x1UL) /*!< BACKUP STATUS: RTC_BUSY (Bitfield-Mask: 0x01) */ +#define BACKUP_STATUS_WCO_OK_Pos (2UL) /*!< BACKUP STATUS: WCO_OK (Bit 2) */ +#define BACKUP_STATUS_WCO_OK_Msk (0x4UL) /*!< BACKUP STATUS: WCO_OK (Bitfield-Mask: 0x01) */ +/* ==================================================== BACKUP.RTC_TIME ==================================================== */ +#define BACKUP_RTC_TIME_RTC_SEC_Pos (0UL) /*!< BACKUP RTC_TIME: RTC_SEC (Bit 0) */ +#define BACKUP_RTC_TIME_RTC_SEC_Msk (0x7fUL) /*!< BACKUP RTC_TIME: RTC_SEC (Bitfield-Mask: 0x7f) */ +#define BACKUP_RTC_TIME_RTC_MIN_Pos (8UL) /*!< BACKUP RTC_TIME: RTC_MIN (Bit 8) */ +#define BACKUP_RTC_TIME_RTC_MIN_Msk (0x7f00UL) /*!< BACKUP RTC_TIME: RTC_MIN (Bitfield-Mask: 0x7f) */ +#define BACKUP_RTC_TIME_RTC_HOUR_Pos (16UL) /*!< BACKUP RTC_TIME: RTC_HOUR (Bit 16) */ +#define BACKUP_RTC_TIME_RTC_HOUR_Msk (0x3f0000UL) /*!< BACKUP RTC_TIME: RTC_HOUR (Bitfield-Mask: 0x3f) */ +#define BACKUP_RTC_TIME_CTRL_12HR_Pos (22UL) /*!< BACKUP RTC_TIME: CTRL_12HR (Bit 22) */ +#define BACKUP_RTC_TIME_CTRL_12HR_Msk (0x400000UL) /*!< BACKUP RTC_TIME: CTRL_12HR (Bitfield-Mask: 0x01) */ +#define BACKUP_RTC_TIME_RTC_DAY_Pos (24UL) /*!< BACKUP RTC_TIME: RTC_DAY (Bit 24) */ +#define BACKUP_RTC_TIME_RTC_DAY_Msk (0x7000000UL) /*!< BACKUP RTC_TIME: RTC_DAY (Bitfield-Mask: 0x07) */ +/* ==================================================== BACKUP.RTC_DATE ==================================================== */ +#define BACKUP_RTC_DATE_RTC_DATE_Pos (0UL) /*!< BACKUP RTC_DATE: RTC_DATE (Bit 0) */ +#define BACKUP_RTC_DATE_RTC_DATE_Msk (0x3fUL) /*!< BACKUP RTC_DATE: RTC_DATE (Bitfield-Mask: 0x3f) */ +#define BACKUP_RTC_DATE_RTC_MON_Pos (8UL) /*!< BACKUP RTC_DATE: RTC_MON (Bit 8) */ +#define BACKUP_RTC_DATE_RTC_MON_Msk (0x1f00UL) /*!< BACKUP RTC_DATE: RTC_MON (Bitfield-Mask: 0x1f) */ +#define BACKUP_RTC_DATE_RTC_YEAR_Pos (16UL) /*!< BACKUP RTC_DATE: RTC_YEAR (Bit 16) */ +#define BACKUP_RTC_DATE_RTC_YEAR_Msk (0xff0000UL) /*!< BACKUP RTC_DATE: RTC_YEAR (Bitfield-Mask: 0xff) */ +/* =================================================== BACKUP.ALM1_TIME ==================================================== */ +#define BACKUP_ALM1_TIME_ALM_SEC_Pos (0UL) /*!< BACKUP ALM1_TIME: ALM_SEC (Bit 0) */ +#define BACKUP_ALM1_TIME_ALM_SEC_Msk (0x7fUL) /*!< BACKUP ALM1_TIME: ALM_SEC (Bitfield-Mask: 0x7f) */ +#define BACKUP_ALM1_TIME_ALM_SEC_EN_Pos (7UL) /*!< BACKUP ALM1_TIME: ALM_SEC_EN (Bit 7) */ +#define BACKUP_ALM1_TIME_ALM_SEC_EN_Msk (0x80UL) /*!< BACKUP ALM1_TIME: ALM_SEC_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_ALM1_TIME_ALM_MIN_Pos (8UL) /*!< BACKUP ALM1_TIME: ALM_MIN (Bit 8) */ +#define BACKUP_ALM1_TIME_ALM_MIN_Msk (0x7f00UL) /*!< BACKUP ALM1_TIME: ALM_MIN (Bitfield-Mask: 0x7f) */ +#define BACKUP_ALM1_TIME_ALM_MIN_EN_Pos (15UL) /*!< BACKUP ALM1_TIME: ALM_MIN_EN (Bit 15) */ +#define BACKUP_ALM1_TIME_ALM_MIN_EN_Msk (0x8000UL) /*!< BACKUP ALM1_TIME: ALM_MIN_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_ALM1_TIME_ALM_HOUR_Pos (16UL) /*!< BACKUP ALM1_TIME: ALM_HOUR (Bit 16) */ +#define BACKUP_ALM1_TIME_ALM_HOUR_Msk (0x3f0000UL) /*!< BACKUP ALM1_TIME: ALM_HOUR (Bitfield-Mask: 0x3f) */ +#define BACKUP_ALM1_TIME_ALM_HOUR_EN_Pos (23UL) /*!< BACKUP ALM1_TIME: ALM_HOUR_EN (Bit 23) */ +#define BACKUP_ALM1_TIME_ALM_HOUR_EN_Msk (0x800000UL) /*!< BACKUP ALM1_TIME: ALM_HOUR_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_ALM1_TIME_ALM_DAY_Pos (24UL) /*!< BACKUP ALM1_TIME: ALM_DAY (Bit 24) */ +#define BACKUP_ALM1_TIME_ALM_DAY_Msk (0x7000000UL) /*!< BACKUP ALM1_TIME: ALM_DAY (Bitfield-Mask: 0x07) */ +#define BACKUP_ALM1_TIME_ALM_DAY_EN_Pos (31UL) /*!< BACKUP ALM1_TIME: ALM_DAY_EN (Bit 31) */ +#define BACKUP_ALM1_TIME_ALM_DAY_EN_Msk (0x80000000UL) /*!< BACKUP ALM1_TIME: ALM_DAY_EN (Bitfield-Mask: 0x01) */ +/* =================================================== BACKUP.ALM1_DATE ==================================================== */ +#define BACKUP_ALM1_DATE_ALM_DATE_Pos (0UL) /*!< BACKUP ALM1_DATE: ALM_DATE (Bit 0) */ +#define BACKUP_ALM1_DATE_ALM_DATE_Msk (0x3fUL) /*!< BACKUP ALM1_DATE: ALM_DATE (Bitfield-Mask: 0x3f) */ +#define BACKUP_ALM1_DATE_ALM_DATE_EN_Pos (7UL) /*!< BACKUP ALM1_DATE: ALM_DATE_EN (Bit 7) */ +#define BACKUP_ALM1_DATE_ALM_DATE_EN_Msk (0x80UL) /*!< BACKUP ALM1_DATE: ALM_DATE_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_ALM1_DATE_ALM_MON_Pos (8UL) /*!< BACKUP ALM1_DATE: ALM_MON (Bit 8) */ +#define BACKUP_ALM1_DATE_ALM_MON_Msk (0x1f00UL) /*!< BACKUP ALM1_DATE: ALM_MON (Bitfield-Mask: 0x1f) */ +#define BACKUP_ALM1_DATE_ALM_MON_EN_Pos (15UL) /*!< BACKUP ALM1_DATE: ALM_MON_EN (Bit 15) */ +#define BACKUP_ALM1_DATE_ALM_MON_EN_Msk (0x8000UL) /*!< BACKUP ALM1_DATE: ALM_MON_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_ALM1_DATE_ALM_EN_Pos (31UL) /*!< BACKUP ALM1_DATE: ALM_EN (Bit 31) */ +#define BACKUP_ALM1_DATE_ALM_EN_Msk (0x80000000UL) /*!< BACKUP ALM1_DATE: ALM_EN (Bitfield-Mask: 0x01) */ +/* =================================================== BACKUP.ALM2_TIME ==================================================== */ +#define BACKUP_ALM2_TIME_ALM_SEC_Pos (0UL) /*!< BACKUP ALM2_TIME: ALM_SEC (Bit 0) */ +#define BACKUP_ALM2_TIME_ALM_SEC_Msk (0x7fUL) /*!< BACKUP ALM2_TIME: ALM_SEC (Bitfield-Mask: 0x7f) */ +#define BACKUP_ALM2_TIME_ALM_SEC_EN_Pos (7UL) /*!< BACKUP ALM2_TIME: ALM_SEC_EN (Bit 7) */ +#define BACKUP_ALM2_TIME_ALM_SEC_EN_Msk (0x80UL) /*!< BACKUP ALM2_TIME: ALM_SEC_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_ALM2_TIME_ALM_MIN_Pos (8UL) /*!< BACKUP ALM2_TIME: ALM_MIN (Bit 8) */ +#define BACKUP_ALM2_TIME_ALM_MIN_Msk (0x7f00UL) /*!< BACKUP ALM2_TIME: ALM_MIN (Bitfield-Mask: 0x7f) */ +#define BACKUP_ALM2_TIME_ALM_MIN_EN_Pos (15UL) /*!< BACKUP ALM2_TIME: ALM_MIN_EN (Bit 15) */ +#define BACKUP_ALM2_TIME_ALM_MIN_EN_Msk (0x8000UL) /*!< BACKUP ALM2_TIME: ALM_MIN_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_ALM2_TIME_ALM_HOUR_Pos (16UL) /*!< BACKUP ALM2_TIME: ALM_HOUR (Bit 16) */ +#define BACKUP_ALM2_TIME_ALM_HOUR_Msk (0x3f0000UL) /*!< BACKUP ALM2_TIME: ALM_HOUR (Bitfield-Mask: 0x3f) */ +#define BACKUP_ALM2_TIME_ALM_HOUR_EN_Pos (23UL) /*!< BACKUP ALM2_TIME: ALM_HOUR_EN (Bit 23) */ +#define BACKUP_ALM2_TIME_ALM_HOUR_EN_Msk (0x800000UL) /*!< BACKUP ALM2_TIME: ALM_HOUR_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_ALM2_TIME_ALM_DAY_Pos (24UL) /*!< BACKUP ALM2_TIME: ALM_DAY (Bit 24) */ +#define BACKUP_ALM2_TIME_ALM_DAY_Msk (0x7000000UL) /*!< BACKUP ALM2_TIME: ALM_DAY (Bitfield-Mask: 0x07) */ +#define BACKUP_ALM2_TIME_ALM_DAY_EN_Pos (31UL) /*!< BACKUP ALM2_TIME: ALM_DAY_EN (Bit 31) */ +#define BACKUP_ALM2_TIME_ALM_DAY_EN_Msk (0x80000000UL) /*!< BACKUP ALM2_TIME: ALM_DAY_EN (Bitfield-Mask: 0x01) */ +/* =================================================== BACKUP.ALM2_DATE ==================================================== */ +#define BACKUP_ALM2_DATE_ALM_DATE_Pos (0UL) /*!< BACKUP ALM2_DATE: ALM_DATE (Bit 0) */ +#define BACKUP_ALM2_DATE_ALM_DATE_Msk (0x3fUL) /*!< BACKUP ALM2_DATE: ALM_DATE (Bitfield-Mask: 0x3f) */ +#define BACKUP_ALM2_DATE_ALM_DATE_EN_Pos (7UL) /*!< BACKUP ALM2_DATE: ALM_DATE_EN (Bit 7) */ +#define BACKUP_ALM2_DATE_ALM_DATE_EN_Msk (0x80UL) /*!< BACKUP ALM2_DATE: ALM_DATE_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_ALM2_DATE_ALM_MON_Pos (8UL) /*!< BACKUP ALM2_DATE: ALM_MON (Bit 8) */ +#define BACKUP_ALM2_DATE_ALM_MON_Msk (0x1f00UL) /*!< BACKUP ALM2_DATE: ALM_MON (Bitfield-Mask: 0x1f) */ +#define BACKUP_ALM2_DATE_ALM_MON_EN_Pos (15UL) /*!< BACKUP ALM2_DATE: ALM_MON_EN (Bit 15) */ +#define BACKUP_ALM2_DATE_ALM_MON_EN_Msk (0x8000UL) /*!< BACKUP ALM2_DATE: ALM_MON_EN (Bitfield-Mask: 0x01) */ +#define BACKUP_ALM2_DATE_ALM_EN_Pos (31UL) /*!< BACKUP ALM2_DATE: ALM_EN (Bit 31) */ +#define BACKUP_ALM2_DATE_ALM_EN_Msk (0x80000000UL) /*!< BACKUP ALM2_DATE: ALM_EN (Bitfield-Mask: 0x01) */ +/* ====================================================== BACKUP.INTR ====================================================== */ +#define BACKUP_INTR_ALARM1_Pos (0UL) /*!< BACKUP INTR: ALARM1 (Bit 0) */ +#define BACKUP_INTR_ALARM1_Msk (0x1UL) /*!< BACKUP INTR: ALARM1 (Bitfield-Mask: 0x01) */ +#define BACKUP_INTR_ALARM2_Pos (1UL) /*!< BACKUP INTR: ALARM2 (Bit 1) */ +#define BACKUP_INTR_ALARM2_Msk (0x2UL) /*!< BACKUP INTR: ALARM2 (Bitfield-Mask: 0x01) */ +#define BACKUP_INTR_CENTURY_Pos (2UL) /*!< BACKUP INTR: CENTURY (Bit 2) */ +#define BACKUP_INTR_CENTURY_Msk (0x4UL) /*!< BACKUP INTR: CENTURY (Bitfield-Mask: 0x01) */ +/* ==================================================== BACKUP.INTR_SET ==================================================== */ +#define BACKUP_INTR_SET_ALARM1_Pos (0UL) /*!< BACKUP INTR_SET: ALARM1 (Bit 0) */ +#define BACKUP_INTR_SET_ALARM1_Msk (0x1UL) /*!< BACKUP INTR_SET: ALARM1 (Bitfield-Mask: 0x01) */ +#define BACKUP_INTR_SET_ALARM2_Pos (1UL) /*!< BACKUP INTR_SET: ALARM2 (Bit 1) */ +#define BACKUP_INTR_SET_ALARM2_Msk (0x2UL) /*!< BACKUP INTR_SET: ALARM2 (Bitfield-Mask: 0x01) */ +#define BACKUP_INTR_SET_CENTURY_Pos (2UL) /*!< BACKUP INTR_SET: CENTURY (Bit 2) */ +#define BACKUP_INTR_SET_CENTURY_Msk (0x4UL) /*!< BACKUP INTR_SET: CENTURY (Bitfield-Mask: 0x01) */ +/* =================================================== BACKUP.INTR_MASK ==================================================== */ +#define BACKUP_INTR_MASK_ALARM1_Pos (0UL) /*!< BACKUP INTR_MASK: ALARM1 (Bit 0) */ +#define BACKUP_INTR_MASK_ALARM1_Msk (0x1UL) /*!< BACKUP INTR_MASK: ALARM1 (Bitfield-Mask: 0x01) */ +#define BACKUP_INTR_MASK_ALARM2_Pos (1UL) /*!< BACKUP INTR_MASK: ALARM2 (Bit 1) */ +#define BACKUP_INTR_MASK_ALARM2_Msk (0x2UL) /*!< BACKUP INTR_MASK: ALARM2 (Bitfield-Mask: 0x01) */ +#define BACKUP_INTR_MASK_CENTURY_Pos (2UL) /*!< BACKUP INTR_MASK: CENTURY (Bit 2) */ +#define BACKUP_INTR_MASK_CENTURY_Msk (0x4UL) /*!< BACKUP INTR_MASK: CENTURY (Bitfield-Mask: 0x01) */ +/* ================================================== BACKUP.INTR_MASKED =================================================== */ +#define BACKUP_INTR_MASKED_ALARM1_Pos (0UL) /*!< BACKUP INTR_MASKED: ALARM1 (Bit 0) */ +#define BACKUP_INTR_MASKED_ALARM1_Msk (0x1UL) /*!< BACKUP INTR_MASKED: ALARM1 (Bitfield-Mask: 0x01) */ +#define BACKUP_INTR_MASKED_ALARM2_Pos (1UL) /*!< BACKUP INTR_MASKED: ALARM2 (Bit 1) */ +#define BACKUP_INTR_MASKED_ALARM2_Msk (0x2UL) /*!< BACKUP INTR_MASKED: ALARM2 (Bitfield-Mask: 0x01) */ +#define BACKUP_INTR_MASKED_CENTURY_Pos (2UL) /*!< BACKUP INTR_MASKED: CENTURY (Bit 2) */ +#define BACKUP_INTR_MASKED_CENTURY_Msk (0x4UL) /*!< BACKUP INTR_MASKED: CENTURY (Bitfield-Mask: 0x01) */ +/* ===================================================== BACKUP.OSCCNT ===================================================== */ +#define BACKUP_OSCCNT_CNT32KHZ_Pos (0UL) /*!< BACKUP OSCCNT: CNT32KHZ (Bit 0) */ +#define BACKUP_OSCCNT_CNT32KHZ_Msk (0xffUL) /*!< BACKUP OSCCNT: CNT32KHZ (Bitfield-Mask: 0xff) */ +/* ===================================================== BACKUP.TICKS ====================================================== */ +#define BACKUP_TICKS_CNT128HZ_Pos (0UL) /*!< BACKUP TICKS: CNT128HZ (Bit 0) */ +#define BACKUP_TICKS_CNT128HZ_Msk (0x3fUL) /*!< BACKUP TICKS: CNT128HZ (Bitfield-Mask: 0x3f) */ +/* ==================================================== BACKUP.PMIC_CTL ==================================================== */ +#define BACKUP_PMIC_CTL_UNLOCK_Pos (8UL) /*!< BACKUP PMIC_CTL: UNLOCK (Bit 8) */ +#define BACKUP_PMIC_CTL_UNLOCK_Msk (0xff00UL) /*!< BACKUP PMIC_CTL: UNLOCK (Bitfield-Mask: 0xff) */ +#define BACKUP_PMIC_CTL_POLARITY_Pos (16UL) /*!< BACKUP PMIC_CTL: POLARITY (Bit 16) */ +#define BACKUP_PMIC_CTL_POLARITY_Msk (0x10000UL) /*!< BACKUP PMIC_CTL: POLARITY (Bitfield-Mask: 0x01) */ +#define BACKUP_PMIC_CTL_PMIC_EN_OUTEN_Pos (29UL) /*!< BACKUP PMIC_CTL: PMIC_EN_OUTEN (Bit 29) */ +#define BACKUP_PMIC_CTL_PMIC_EN_OUTEN_Msk (0x20000000UL) /*!< BACKUP PMIC_CTL: PMIC_EN_OUTEN (Bitfield-Mask: 0x01) */ +#define BACKUP_PMIC_CTL_PMIC_ALWAYSEN_Pos (30UL) /*!< BACKUP PMIC_CTL: PMIC_ALWAYSEN (Bit 30) */ +#define BACKUP_PMIC_CTL_PMIC_ALWAYSEN_Msk (0x40000000UL) /*!< BACKUP PMIC_CTL: PMIC_ALWAYSEN (Bitfield-Mask: 0x01) */ +#define BACKUP_PMIC_CTL_PMIC_EN_Pos (31UL) /*!< BACKUP PMIC_CTL: PMIC_EN (Bit 31) */ +#define BACKUP_PMIC_CTL_PMIC_EN_Msk (0x80000000UL) /*!< BACKUP PMIC_CTL: PMIC_EN (Bitfield-Mask: 0x01) */ +/* ====================================================== BACKUP.BREG ====================================================== */ +#define BACKUP_BREG_BREG_Pos (0UL) /*!< BACKUP BREG: BREG (Bit 0) */ +#define BACKUP_BREG_BREG_Msk (0xffffffffUL) /*!< BACKUP BREG: BREG (Bitfield-Mask: 0xffffffff) */ +/* ====================================================== BACKUP.TRIM ====================================================== */ +#define BACKUP_TRIM_TRIM_Pos (0UL) /*!< BACKUP TRIM: TRIM (Bit 0) */ +#define BACKUP_TRIM_TRIM_Msk (0x3fUL) /*!< BACKUP TRIM: TRIM (Bitfield-Mask: 0x3f) */ + + +#endif /* _CYIP_BACKUP_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ble.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ble.h new file mode 100644 index 0000000000..05a14b8d7d --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ble.h @@ -0,0 +1,2219 @@ +/***************************************************************************//** +* \file cyip_ble.h +* +* \brief +* BLE IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_BLE_H_ +#define _CYIP_BLE_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ BLE ================ */ +/* =========================================================================================================================== */ + +#define BLE_RCB_RCBLL_SECTION_SIZE 0x00000100UL +#define BLE_RCB_SECTION_SIZE 0x00000200UL +#define BLE_BLELL_SECTION_SIZE 0x0001E000UL +#define BLE_BLESS_SECTION_SIZE 0x00001000UL +#define BLE_SECTION_SIZE 0x00020000UL + +/** + * \brief Radio Control Bus (RCB) & Link Layer controller (BLE_RCB_RCBLL) + */ +typedef struct { + __IOM uint32_t CTRL; /*!< 0x00000000 RCB LL control register. */ + __IM uint32_t RESERVED[3]; + __IOM uint32_t INTR; /*!< 0x00000010 Master interrupt request register. */ + __IOM uint32_t INTR_SET; /*!< 0x00000014 Master interrupt set request register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000018 Master interrupt mask register. */ + __IM uint32_t INTR_MASKED; /*!< 0x0000001C Master interrupt masked request register */ + __IOM uint32_t RADIO_REG1_ADDR; /*!< 0x00000020 Address of Register#1 in Radio (MDON) */ + __IOM uint32_t RADIO_REG2_ADDR; /*!< 0x00000024 Address of Register#2 in Radio (RSSI) */ + __IOM uint32_t RADIO_REG3_ADDR; /*!< 0x00000028 Address of Register#3 in Radio (ACCL) */ + __IOM uint32_t RADIO_REG4_ADDR; /*!< 0x0000002C Address of Register#4 in Radio (ACCH) */ + __IOM uint32_t RADIO_REG5_ADDR; /*!< 0x00000030 Address of Register#5 in Radio (RSSI ENERGY) */ + __IM uint32_t RESERVED1[3]; + __IOM uint32_t CPU_WRITE_REG; /*!< 0x00000040 N/A */ + __IOM uint32_t CPU_READ_REG; /*!< 0x00000044 N/A */ + __IM uint32_t RESERVED2[46]; +} BLE_RCB_RCBLL_Type; /*!< Size = 72 (0x48) */ + +/** + * \brief Radio Control Bus (RCB) controller (BLE_RCB) + */ +typedef struct { + __IOM uint32_t CTRL; /*!< 0x00000000 RCB control register. */ + __IM uint32_t STATUS; /*!< 0x00000004 RCB status register. */ + __IM uint32_t RESERVED[2]; + __IOM uint32_t TX_CTRL; /*!< 0x00000010 Transmitter control register. */ + __IOM uint32_t TX_FIFO_CTRL; /*!< 0x00000014 Transmitter FIFO control register. */ + __IM uint32_t TX_FIFO_STATUS; /*!< 0x00000018 Transmitter FIFO status register. */ + __OM uint32_t TX_FIFO_WR; /*!< 0x0000001C Transmitter FIFO write register. */ + __IOM uint32_t RX_CTRL; /*!< 0x00000020 Receiver control register. */ + __IOM uint32_t RX_FIFO_CTRL; /*!< 0x00000024 Receiver FIFO control register. */ + __IM uint32_t RX_FIFO_STATUS; /*!< 0x00000028 Receiver FIFO status register. */ + __IM uint32_t RX_FIFO_RD; /*!< 0x0000002C Receiver FIFO read register. */ + __IM uint32_t RX_FIFO_RD_SILENT; /*!< 0x00000030 Receiver FIFO read register. */ + __IM uint32_t RESERVED1[3]; + __IOM uint32_t INTR; /*!< 0x00000040 Master interrupt request register. */ + __IOM uint32_t INTR_SET; /*!< 0x00000044 Master interrupt set request register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000048 Master interrupt mask register. */ + __IM uint32_t INTR_MASKED; /*!< 0x0000004C Master interrupt masked request register */ + __IM uint32_t RESERVED2[44]; + BLE_RCB_RCBLL_Type RCBLL; /*!< 0x00000100 Radio Control Bus (RCB) & Link Layer controller */ +} BLE_RCB_Type; /*!< Size = 512 (0x200) */ + +/** + * \brief Bluetooth Low Energy Link Layer (BLE_BLELL) + */ +typedef struct { + __OM uint32_t COMMAND_REGISTER; /*!< 0x00000000 Instruction Register */ + __IM uint32_t RESERVED; + __IOM uint32_t EVENT_INTR; /*!< 0x00000008 Event(Interrupt) status and Clear register */ + __IM uint32_t RESERVED1; + __IOM uint32_t EVENT_ENABLE; /*!< 0x00000010 Event indications enable. */ + __IM uint32_t RESERVED2; + __IOM uint32_t ADV_PARAMS; /*!< 0x00000018 Advertising parameters register. */ + __IOM uint32_t ADV_INTERVAL_TIMEOUT; /*!< 0x0000001C Advertising interval register. */ + __IOM uint32_t ADV_INTR; /*!< 0x00000020 Advertising interrupt status and Clear register */ + __IM uint32_t ADV_NEXT_INSTANT; /*!< 0x00000024 Advertising next instant. */ + __IOM uint32_t SCAN_INTERVAL; /*!< 0x00000028 Scan Interval Register */ + __IOM uint32_t SCAN_WINDOW; /*!< 0x0000002C Scan window Register */ + __IOM uint32_t SCAN_PARAM; /*!< 0x00000030 Scanning parameters register */ + __IM uint32_t RESERVED3; + __IOM uint32_t SCAN_INTR; /*!< 0x00000038 Scan interrupt status and Clear register */ + __IM uint32_t SCAN_NEXT_INSTANT; /*!< 0x0000003C Advertising next instant. */ + __IOM uint32_t INIT_INTERVAL; /*!< 0x00000040 Initiator Interval Register */ + __IOM uint32_t INIT_WINDOW; /*!< 0x00000044 Initiator window Register */ + __IOM uint32_t INIT_PARAM; /*!< 0x00000048 Initiator parameters register */ + __IM uint32_t RESERVED4; + __IOM uint32_t INIT_INTR; /*!< 0x00000050 Scan interrupt status and Clear register */ + __IM uint32_t INIT_NEXT_INSTANT; /*!< 0x00000054 Initiator next instant. */ + __IOM uint32_t DEVICE_RAND_ADDR_L; /*!< 0x00000058 Lower 16 bit random address of the device. */ + __IOM uint32_t DEVICE_RAND_ADDR_M; /*!< 0x0000005C Middle 16 bit random address of the device. */ + __IOM uint32_t DEVICE_RAND_ADDR_H; /*!< 0x00000060 Higher 16 bit random address of the device. */ + __IM uint32_t RESERVED5; + __IOM uint32_t PEER_ADDR_L; /*!< 0x00000068 Lower 16 bit address of the peer device. */ + __IOM uint32_t PEER_ADDR_M; /*!< 0x0000006C Middle 16 bit address of the peer device. */ + __IOM uint32_t PEER_ADDR_H; /*!< 0x00000070 Higher 16 bit address of the peer device. */ + __IM uint32_t RESERVED6; + __IOM uint32_t WL_ADDR_TYPE; /*!< 0x00000078 whitelist address type */ + __IOM uint32_t WL_ENABLE; /*!< 0x0000007C whitelist valid entry bit */ + __IOM uint32_t TRANSMIT_WINDOW_OFFSET; /*!< 0x00000080 Transmit window offset */ + __IOM uint32_t TRANSMIT_WINDOW_SIZE; /*!< 0x00000084 Transmit window size */ + __IOM uint32_t DATA_CHANNELS_L0; /*!< 0x00000088 Data channel map 0 (lower word) */ + __IOM uint32_t DATA_CHANNELS_M0; /*!< 0x0000008C Data channel map 0 (middle word) */ + __IOM uint32_t DATA_CHANNELS_H0; /*!< 0x00000090 Data channel map 0 (upper word) */ + __IM uint32_t RESERVED7; + __IOM uint32_t DATA_CHANNELS_L1; /*!< 0x00000098 Data channel map 1 (lower word) */ + __IOM uint32_t DATA_CHANNELS_M1; /*!< 0x0000009C Data channel map 1 (middle word) */ + __IOM uint32_t DATA_CHANNELS_H1; /*!< 0x000000A0 Data channel map 1 (upper word) */ + __IM uint32_t RESERVED8; + __IOM uint32_t CONN_INTR; /*!< 0x000000A8 Connection interrupt status and Clear register */ + __IM uint32_t CONN_STATUS; /*!< 0x000000AC Connection channel status */ + __IOM uint32_t CONN_INDEX; /*!< 0x000000B0 Connection Index register */ + __IM uint32_t RESERVED9; + __IOM uint32_t WAKEUP_CONFIG; /*!< 0x000000B8 Wakeup configuration */ + __IM uint32_t RESERVED10; + __IOM uint32_t WAKEUP_CONTROL; /*!< 0x000000C0 Wakeup control */ + __IOM uint32_t CLOCK_CONFIG; /*!< 0x000000C4 Clock control */ + __IM uint32_t TIM_COUNTER_L; /*!< 0x000000C8 Reference Clock */ + __IOM uint32_t WAKEUP_CONFIG_EXTD; /*!< 0x000000CC Wakeup configuration extended */ + __IM uint32_t RESERVED11[2]; + __IOM uint32_t POC_REG__TIM_CONTROL; /*!< 0x000000D8 BLE Time Control */ + __IM uint32_t RESERVED12; + __IOM uint32_t ADV_TX_DATA_FIFO; /*!< 0x000000E0 Advertising data transmit FIFO. Access ADVCH_TX_FIFO. */ + __IM uint32_t RESERVED13; + __IOM uint32_t ADV_SCN_RSP_TX_FIFO; /*!< 0x000000E8 Advertising scan response data transmit FIFO. Access + ADVCH_TX_FIFO. */ + __IM uint32_t RESERVED14[3]; + __IM uint32_t INIT_SCN_ADV_RX_FIFO; /*!< 0x000000F8 advertising scan response data receive data FIFO. Access + ADVRX_FIFO. */ + __IM uint32_t RESERVED15; + __IOM uint32_t CONN_INTERVAL; /*!< 0x00000100 Connection Interval */ + __IOM uint32_t SUP_TIMEOUT; /*!< 0x00000104 Supervision timeout */ + __IOM uint32_t SLAVE_LATENCY; /*!< 0x00000108 Slave Latency */ + __IOM uint32_t CE_LENGTH; /*!< 0x0000010C Connection event length */ + __IOM uint32_t PDU_ACCESS_ADDR_L_REGISTER; /*!< 0x00000110 Access address (lower) */ + __IOM uint32_t PDU_ACCESS_ADDR_H_REGISTER; /*!< 0x00000114 Access address (upper) */ + __IOM uint32_t CONN_CE_INSTANT; /*!< 0x00000118 Connection event instant */ + __IOM uint32_t CE_CNFG_STS_REGISTER; /*!< 0x0000011C connection configuration & status register */ + __IM uint32_t NEXT_CE_INSTANT; /*!< 0x00000120 Next connection event instant */ + __IM uint32_t CONN_CE_COUNTER; /*!< 0x00000124 connection event counter */ + __IOM uint32_t DATA_LIST_SENT_UPDATE__STATUS; /*!< 0x00000128 data list sent update and status */ + __IOM uint32_t DATA_LIST_ACK_UPDATE__STATUS; /*!< 0x0000012C data list ack update and status */ + __IOM uint32_t CE_CNFG_STS_REGISTER_EXT; /*!< 0x00000130 connection configuration & status register */ + __IOM uint32_t CONN_EXT_INTR; /*!< 0x00000134 Connection extended interrupt status and Clear register */ + __IOM uint32_t CONN_EXT_INTR_MASK; /*!< 0x00000138 Connection Extended Interrupt mask */ + __IM uint32_t RESERVED16; + __IOM uint32_t DATA_MEM_DESCRIPTOR[5]; /*!< 0x00000140 Data buffer descriptor 0 to 4 */ + __IM uint32_t RESERVED17[3]; + __IOM uint32_t WINDOW_WIDEN_INTVL; /*!< 0x00000160 Window widen for interval */ + __IOM uint32_t WINDOW_WIDEN_WINOFF; /*!< 0x00000164 Window widen for offset */ + __IM uint32_t RESERVED18[2]; + __IOM uint32_t LE_RF_TEST_MODE; /*!< 0x00000170 Direct Test Mode control */ + __IM uint32_t DTM_RX_PKT_COUNT; /*!< 0x00000174 Direct Test Mode receive packet count */ + __IOM uint32_t LE_RF_TEST_MODE_EXT; /*!< 0x00000178 Direct Test Mode control */ + __IM uint32_t RESERVED19[3]; + __IM uint32_t TXRX_HOP; /*!< 0x00000188 Channel Address register */ + __IM uint32_t RESERVED20; + __IOM uint32_t TX_RX_ON_DELAY; /*!< 0x00000190 Transmit/Receive data delay */ + __IM uint32_t RESERVED21[5]; + __IOM uint32_t ADV_ACCADDR_L; /*!< 0x000001A8 ADV packet access code low word */ + __IOM uint32_t ADV_ACCADDR_H; /*!< 0x000001AC ADV packet access code high word */ + __IOM uint32_t ADV_CH_TX_POWER_LVL_LS; /*!< 0x000001B0 Advertising channel transmit power setting */ + __IOM uint32_t ADV_CH_TX_POWER_LVL_MS; /*!< 0x000001B4 Advertising channel transmit power setting extension */ + __IOM uint32_t CONN_CH_TX_POWER_LVL_LS; /*!< 0x000001B8 Connection channel transmit power setting */ + __IOM uint32_t CONN_CH_TX_POWER_LVL_MS; /*!< 0x000001BC Connection channel transmit power setting extension */ + __IOM uint32_t DEV_PUB_ADDR_L; /*!< 0x000001C0 Device public address lower register */ + __IOM uint32_t DEV_PUB_ADDR_M; /*!< 0x000001C4 Device public address middle register */ + __IOM uint32_t DEV_PUB_ADDR_H; /*!< 0x000001C8 Device public address higher register */ + __IM uint32_t RESERVED22; + __IOM uint32_t OFFSET_TO_FIRST_INSTANT; /*!< 0x000001D0 Offset to first instant */ + __IOM uint32_t ADV_CONFIG; /*!< 0x000001D4 Advertiser configuration register */ + __IOM uint32_t SCAN_CONFIG; /*!< 0x000001D8 Scan configuration register */ + __IOM uint32_t INIT_CONFIG; /*!< 0x000001DC Initiator configuration register */ + __IOM uint32_t CONN_CONFIG; /*!< 0x000001E0 Connection configuration register */ + __IM uint32_t RESERVED23; + __IOM uint32_t CONN_PARAM1; /*!< 0x000001E8 Connection parameter 1 */ + __IOM uint32_t CONN_PARAM2; /*!< 0x000001EC Connection parameter 2 */ + __IOM uint32_t CONN_INTR_MASK; /*!< 0x000001F0 Connection Interrupt mask */ + __IOM uint32_t SLAVE_TIMING_CONTROL; /*!< 0x000001F4 slave timing control */ + __IOM uint32_t RECEIVE_TRIG_CTRL; /*!< 0x000001F8 Receive trigger control */ + __IM uint32_t RESERVED24; + __IM uint32_t LL_DBG_1; /*!< 0x00000200 LL debug register 1 */ + __IM uint32_t LL_DBG_2; /*!< 0x00000204 LL debug register 2 */ + __IM uint32_t LL_DBG_3; /*!< 0x00000208 LL debug register 3 */ + __IM uint32_t LL_DBG_4; /*!< 0x0000020C LL debug register 4 */ + __IM uint32_t LL_DBG_5; /*!< 0x00000210 LL debug register 5 */ + __IM uint32_t LL_DBG_6; /*!< 0x00000214 LL debug register 6 */ + __IM uint32_t LL_DBG_7; /*!< 0x00000218 LL debug register 7 */ + __IM uint32_t LL_DBG_8; /*!< 0x0000021C LL debug register 8 */ + __IM uint32_t LL_DBG_9; /*!< 0x00000220 LL debug register 9 */ + __IM uint32_t LL_DBG_10; /*!< 0x00000224 LL debug register 10 */ + __IM uint32_t RESERVED25[2]; + __IOM uint32_t PEER_ADDR_INIT_L; /*!< 0x00000230 Lower 16 bit address of the peer device for INIT. */ + __IOM uint32_t PEER_ADDR_INIT_M; /*!< 0x00000234 Middle 16 bit address of the peer device for INIT. */ + __IOM uint32_t PEER_ADDR_INIT_H; /*!< 0x00000238 Higher 16 bit address of the peer device for INIT. */ + __IM uint32_t RESERVED26[3]; + __IOM uint32_t INIT_WINDOW_TIMER_CTRL; /*!< 0x00000248 Initiator Window NI timer control */ + __IOM uint32_t CONN_CONFIG_EXT; /*!< 0x0000024C Connection extended configuration register */ + __IM uint32_t RESERVED27[2]; + __IOM uint32_t DPLL_CONFIG; /*!< 0x00000258 DPLL & CY Correlator configuration register */ + __IM uint32_t RESERVED28; + __IOM uint32_t INIT_NI_VAL; /*!< 0x00000260 Initiator Window NI instant */ + __IM uint32_t INIT_WINDOW_OFFSET; /*!< 0x00000264 Initiator Window offset captured at conn request */ + __IM uint32_t INIT_WINDOW_NI_ANCHOR_PT; /*!< 0x00000268 Initiator Window NI anchor point captured at conn request */ + __IM uint32_t RESERVED29[78]; + __IOM uint32_t CONN_UPDATE_NEW_INTERVAL; /*!< 0x000003A4 Connection update new interval */ + __IOM uint32_t CONN_UPDATE_NEW_LATENCY; /*!< 0x000003A8 Connection update new latency */ + __IOM uint32_t CONN_UPDATE_NEW_SUP_TO; /*!< 0x000003AC Connection update new supervision timeout */ + __IOM uint32_t CONN_UPDATE_NEW_SL_INTERVAL; /*!< 0x000003B0 Connection update new Slave Latency X Conn interval Value */ + __IM uint32_t RESERVED30[3]; + __IOM uint32_t CONN_REQ_WORD0; /*!< 0x000003C0 Connection request address word 0 */ + __IOM uint32_t CONN_REQ_WORD1; /*!< 0x000003C4 Connection request address word 1 */ + __IOM uint32_t CONN_REQ_WORD2; /*!< 0x000003C8 Connection request address word 2 */ + __IOM uint32_t CONN_REQ_WORD3; /*!< 0x000003CC Connection request address word 3 */ + __IOM uint32_t CONN_REQ_WORD4; /*!< 0x000003D0 Connection request address word 4 */ + __IOM uint32_t CONN_REQ_WORD5; /*!< 0x000003D4 Connection request address word 5 */ + __IOM uint32_t CONN_REQ_WORD6; /*!< 0x000003D8 Connection request address word 6 */ + __IOM uint32_t CONN_REQ_WORD7; /*!< 0x000003DC Connection request address word 7 */ + __IOM uint32_t CONN_REQ_WORD8; /*!< 0x000003E0 Connection request address word 8 */ + __IOM uint32_t CONN_REQ_WORD9; /*!< 0x000003E4 Connection request address word 9 */ + __IOM uint32_t CONN_REQ_WORD10; /*!< 0x000003E8 Connection request address word 10 */ + __IOM uint32_t CONN_REQ_WORD11; /*!< 0x000003EC Connection request address word 11 */ + __IM uint32_t RESERVED31[389]; + __IOM uint32_t PDU_RESP_TIMER; /*!< 0x00000A04 PDU response timer/Generic Timer (MMMS mode) */ + __IM uint32_t NEXT_RESP_TIMER_EXP; /*!< 0x00000A08 Next response timeout instant */ + __IM uint32_t NEXT_SUP_TO; /*!< 0x00000A0C Next supervision timeout instant */ + __IOM uint32_t LLH_FEATURE_CONFIG; /*!< 0x00000A10 Feature enable */ + __IOM uint32_t WIN_MIN_STEP_SIZE; /*!< 0x00000A14 Window minimum step size */ + __IOM uint32_t SLV_WIN_ADJ; /*!< 0x00000A18 Slave window adjustment */ + __IOM uint32_t SL_CONN_INTERVAL; /*!< 0x00000A1C Slave Latency X Conn Interval Value */ + __IOM uint32_t LE_PING_TIMER_ADDR; /*!< 0x00000A20 LE Ping connection timer address */ + __IOM uint32_t LE_PING_TIMER_OFFSET; /*!< 0x00000A24 LE Ping connection timer offset */ + __IM uint32_t LE_PING_TIMER_NEXT_EXP; /*!< 0x00000A28 LE Ping timer next expiry instant */ + __IM uint32_t LE_PING_TIMER_WRAP_COUNT; /*!< 0x00000A2C LE Ping Timer wrap count */ + __IM uint32_t RESERVED32[244]; + __IOM uint32_t TX_EN_EXT_DELAY; /*!< 0x00000E00 Transmit enable extension delay */ + __IOM uint32_t TX_RX_SYNTH_DELAY; /*!< 0x00000E04 Transmit/Receive enable delay */ + __IOM uint32_t EXT_PA_LNA_DLY_CNFG; /*!< 0x00000E08 External TX PA and RX LNA delay configuration */ + __IM uint32_t RESERVED33; + __IOM uint32_t LL_CONFIG; /*!< 0x00000E10 Link Layer additional configuration */ + __IM uint32_t RESERVED34[59]; + __IOM uint32_t LL_CONTROL; /*!< 0x00000F00 LL Backward compatibility */ + __IOM uint32_t DEV_PA_ADDR_L; /*!< 0x00000F04 Device Resolvable/Non-Resolvable Private address lower register*/ + __IOM uint32_t DEV_PA_ADDR_M; /*!< 0x00000F08 Device Resolvable/Non-Resolvable Private address middle + register */ + __IOM uint32_t DEV_PA_ADDR_H; /*!< 0x00000F0C Device Resolvable/Non-Resolvable Private address higher + register */ + __IOM uint32_t RSLV_LIST_ENABLE[16]; /*!< 0x00000F10 Resolving list entry control bit */ + __IM uint32_t RESERVED35[20]; + __IOM uint32_t WL_CONNECTION_STATUS; /*!< 0x00000FA0 whitelist valid entry bit */ + __IM uint32_t RESERVED36[535]; + __IOM uint32_t CONN_RXMEM_BASE_ADDR_DLE; /*!< 0x00001800 DLE Connection RX memory base address */ + __IM uint32_t RESERVED37[1023]; + __IOM uint32_t CONN_TXMEM_BASE_ADDR_DLE; /*!< 0x00002800 DLE Connection TX memory base address */ + __IM uint32_t RESERVED38[16383]; + __IOM uint32_t CONN_1_PARAM_MEM_BASE_ADDR; /*!< 0x00012800 Connection Parameter memory base address for connection 1 */ + __IM uint32_t RESERVED39[31]; + __IOM uint32_t CONN_2_PARAM_MEM_BASE_ADDR; /*!< 0x00012880 Connection Parameter memory base address for connection 2 */ + __IM uint32_t RESERVED40[31]; + __IOM uint32_t CONN_3_PARAM_MEM_BASE_ADDR; /*!< 0x00012900 Connection Parameter memory base address for connection 3 */ + __IM uint32_t RESERVED41[31]; + __IOM uint32_t CONN_4_PARAM_MEM_BASE_ADDR; /*!< 0x00012980 Connection Parameter memory base address for connection 4 */ + __IM uint32_t RESERVED42[1439]; + __IOM uint32_t NI_TIMER; /*!< 0x00014000 Next Instant Timer */ + __IOM uint32_t US_OFFSET; /*!< 0x00014004 Micro-second Offset */ + __IOM uint32_t NEXT_CONN; /*!< 0x00014008 Next Connection */ + __IOM uint32_t NI_ABORT; /*!< 0x0001400C Abort next scheduled connection */ + __IM uint32_t RESERVED43[4]; + __IM uint32_t CONN_NI_STATUS; /*!< 0x00014020 Connection NI Status */ + __IM uint32_t NEXT_SUP_TO_STATUS; /*!< 0x00014024 Next Supervision timeout Status */ + __IM uint32_t MMMS_CONN_STATUS; /*!< 0x00014028 Connection Status */ + __IM uint32_t BT_SLOT_CAPT_STATUS; /*!< 0x0001402C BT Slot Captured Status */ + __IM uint32_t US_CAPT_STATUS; /*!< 0x00014030 Micro-second Capture Status */ + __IM uint32_t US_OFFSET_STATUS; /*!< 0x00014034 Micro-second Offset Status */ + __IM uint32_t ACCU_WINDOW_WIDEN_STATUS; /*!< 0x00014038 Accumulated Window Widen Status */ + __IM uint32_t EARLY_INTR_STATUS; /*!< 0x0001403C Status when early interrupt is raised */ + __IOM uint32_t MMMS_CONFIG; /*!< 0x00014040 Multi-Master Multi-Slave Config */ + __IM uint32_t US_COUNTER; /*!< 0x00014044 Running US of the current BT Slot */ + __IOM uint32_t US_CAPT_PREV; /*!< 0x00014048 Previous captured US of the BT Slot */ + __IM uint32_t EARLY_INTR_NI; /*!< 0x0001404C NI at early interrupt */ + __IM uint32_t RESERVED44[12]; + __IM uint32_t MMMS_MASTER_CREATE_BT_CAPT; /*!< 0x00014080 BT slot capture for master connection creation */ + __IM uint32_t MMMS_SLAVE_CREATE_BT_CAPT; /*!< 0x00014084 BT slot capture for slave connection creation */ + __IM uint32_t MMMS_SLAVE_CREATE_US_CAPT; /*!< 0x00014088 Micro second capture for slave connection creation */ + __IM uint32_t RESERVED45[29]; + __IOM uint32_t MMMS_DATA_MEM_DESCRIPTOR[16]; /*!< 0x00014100 Data buffer descriptor 0 to 15 */ + __IM uint32_t RESERVED46[48]; + __IOM uint32_t CONN_1_DATA_LIST_SENT; /*!< 0x00014200 data list sent update and status for connection 1 */ + __IOM uint32_t CONN_1_DATA_LIST_ACK; /*!< 0x00014204 data list ack update and status for connection 1 */ + __IOM uint32_t CONN_1_CE_DATA_LIST_CFG; /*!< 0x00014208 Connection specific pause resume for connection 1 */ + __IM uint32_t RESERVED47; + __IOM uint32_t CONN_2_DATA_LIST_SENT; /*!< 0x00014210 data list sent update and status for connection 2 */ + __IOM uint32_t CONN_2_DATA_LIST_ACK; /*!< 0x00014214 data list ack update and status for connection 2 */ + __IOM uint32_t CONN_2_CE_DATA_LIST_CFG; /*!< 0x00014218 Connection specific pause resume for connection 2 */ + __IM uint32_t RESERVED48; + __IOM uint32_t CONN_3_DATA_LIST_SENT; /*!< 0x00014220 data list sent update and status for connection 3 */ + __IOM uint32_t CONN_3_DATA_LIST_ACK; /*!< 0x00014224 data list ack update and status for connection 3 */ + __IOM uint32_t CONN_3_CE_DATA_LIST_CFG; /*!< 0x00014228 Connection specific pause resume for connection 3 */ + __IM uint32_t RESERVED49; + __IOM uint32_t CONN_4_DATA_LIST_SENT; /*!< 0x00014230 data list sent update and status for connection 4 */ + __IOM uint32_t CONN_4_DATA_LIST_ACK; /*!< 0x00014234 data list ack update and status for connection 4 */ + __IOM uint32_t CONN_4_CE_DATA_LIST_CFG; /*!< 0x00014238 Connection specific pause resume for connection 4 */ + __IM uint32_t RESERVED50[113]; + __IOM uint32_t MMMS_ADVCH_NI_ENABLE; /*!< 0x00014400 Enable bits for ADV_NI, SCAN_NI and INIT_NI */ + __IOM uint32_t MMMS_ADVCH_NI_VALID; /*!< 0x00014404 Next instant valid for ADV, SCAN, INIT */ + __IOM uint32_t MMMS_ADVCH_NI_ABORT; /*!< 0x00014408 Abort the next instant of ADV, SCAN, INIT */ + __IM uint32_t RESERVED51; + __IOM uint32_t CONN_PARAM_NEXT_SUP_TO; /*!< 0x00014410 Register to configure the supervision timeout for next + scheduled connection */ + __IOM uint32_t CONN_PARAM_ACC_WIN_WIDEN; /*!< 0x00014414 Register to configure Accumulated window widening for next + scheduled connection */ + __IM uint32_t RESERVED52[2]; + __IOM uint32_t HW_LOAD_OFFSET; /*!< 0x00014420 Register to configure offset from connection anchor point at + which connection parameter memory should be read */ + __IM uint32_t ADV_RAND; /*!< 0x00014424 Random number generated by Hardware for ADV NI calculation */ + __IM uint32_t MMMS_RX_PKT_CNTR; /*!< 0x00014428 Packet Counter of packets in RX FIFO in MMMS mode */ + __IM uint32_t RESERVED53; + __IM uint32_t CONN_RX_PKT_CNTR[8]; /*!< 0x00014430 Packet Counter for Individual connection index */ + __IM uint32_t RESERVED54[236]; + __IOM uint32_t WHITELIST_BASE_ADDR; /*!< 0x00014800 Whitelist base address */ + __IM uint32_t RESERVED55[47]; + __IOM uint32_t RSLV_LIST_PEER_IDNTT_BASE_ADDR; /*!< 0x000148C0 Resolving list base address for storing Peer Identity address */ + __IM uint32_t RESERVED56[47]; + __IOM uint32_t RSLV_LIST_PEER_RPA_BASE_ADDR; /*!< 0x00014980 Resolving list base address for storing resolved Peer RPA + address */ + __IM uint32_t RESERVED57[47]; + __IOM uint32_t RSLV_LIST_RCVD_INIT_RPA_BASE_ADDR; /*!< 0x00014A40 Resolving list base address for storing Resolved received + INITA RPA */ + __IM uint32_t RESERVED58[47]; + __IOM uint32_t RSLV_LIST_TX_INIT_RPA_BASE_ADDR; /*!< 0x00014B00 Resolving list base address for storing generated TX INITA + RPA */ + __IM uint32_t RESERVED59[9535]; +} BLE_BLELL_Type; /*!< Size = 84740 (0x14B04) */ + +/** + * \brief Bluetooth Low Energy Subsystem Miscellaneous (BLE_BLESS) + */ +typedef struct { + __IM uint32_t RESERVED[24]; + __IOM uint32_t DDFT_CONFIG; /*!< 0x00000060 BLESS DDFT configuration register */ + __IOM uint32_t XTAL_CLK_DIV_CONFIG; /*!< 0x00000064 Crystal clock divider configuration register */ + __IOM uint32_t INTR_STAT; /*!< 0x00000068 Link Layer interrupt status register */ + __IOM uint32_t INTR_MASK; /*!< 0x0000006C Link Layer interrupt mask register */ + __IOM uint32_t LL_CLK_EN; /*!< 0x00000070 Link Layer primary clock enable */ + __IOM uint32_t LF_CLK_CTRL; /*!< 0x00000074 BLESS LF clock control and BLESS revision ID indicator */ + __IOM uint32_t EXT_PA_LNA_CTRL; /*!< 0x00000078 External TX PA and RX LNA control */ + __IM uint32_t RESERVED1; + __IM uint32_t LL_PKT_RSSI_CH_ENERGY; /*!< 0x00000080 Link Layer Last Received packet RSSI/Channel energy and + channel number */ + __IM uint32_t RESERVED2[7]; + __IOM uint32_t MT_CFG; /*!< 0x000000A0 MT Configuration Register */ + __IOM uint32_t MT_DELAY_CFG; /*!< 0x000000A4 MT Delay configuration for state transitions */ + __IOM uint32_t MT_DELAY_CFG2; /*!< 0x000000A8 MT Delay configuration for state transitions */ + __IOM uint32_t MT_DELAY_CFG3; /*!< 0x000000AC MT Delay configuration for state transitions */ + __IOM uint32_t MT_VIO_CTRL; /*!< 0x000000B0 MT Configuration Register to control VIO switches */ + __IM uint32_t MT_STATUS; /*!< 0x000000B4 MT Status Register */ + __IM uint32_t PWR_CTRL_SM_ST; /*!< 0x000000B8 Link Layer Power Control FSM Status Register */ + __IM uint32_t RESERVED3; + __IOM uint32_t HVLDO_CTRL; /*!< 0x000000C0 HVLDO Configuration register */ + __IOM uint32_t MISC_EN_CTRL; /*!< 0x000000C4 Radio Buck and Active regulator enable control */ + __IM uint32_t RESERVED4[2]; + __IOM uint32_t EFUSE_CONFIG; /*!< 0x000000D0 EFUSE mode configuration register */ + __IOM uint32_t EFUSE_TIM_CTRL1; /*!< 0x000000D4 EFUSE timing control register (common for Program and Read + modes) */ + __IOM uint32_t EFUSE_TIM_CTRL2; /*!< 0x000000D8 EFUSE timing control Register (for Read) */ + __IOM uint32_t EFUSE_TIM_CTRL3; /*!< 0x000000DC EFUSE timing control Register (for Program) */ + __IM uint32_t EFUSE_RDATA_L; /*!< 0x000000E0 EFUSE Lower read data */ + __IM uint32_t EFUSE_RDATA_H; /*!< 0x000000E4 EFUSE higher read data */ + __IOM uint32_t EFUSE_WDATA_L; /*!< 0x000000E8 EFUSE lower write word */ + __IOM uint32_t EFUSE_WDATA_H; /*!< 0x000000EC EFUSE higher write word */ + __IOM uint32_t DIV_BY_625_CFG; /*!< 0x000000F0 Divide by 625 for FW Use */ + __IM uint32_t DIV_BY_625_STS; /*!< 0x000000F4 Output of divide by 625 divider */ + __IM uint32_t RESERVED5[2]; + __IOM uint32_t PACKET_COUNTER0; /*!< 0x00000100 Packet counter 0 */ + __IOM uint32_t PACKET_COUNTER2; /*!< 0x00000104 Packet counter 2 */ + __IOM uint32_t IV_MASTER0; /*!< 0x00000108 Master Initialization Vector 0 */ + __IOM uint32_t IV_SLAVE0; /*!< 0x0000010C Slave Initialization Vector 0 */ + __OM uint32_t ENC_KEY[4]; /*!< 0x00000110 Encryption Key register 0-3 */ + __IOM uint32_t MIC_IN0; /*!< 0x00000120 MIC input register */ + __IM uint32_t MIC_OUT0; /*!< 0x00000124 MIC output register */ + __IOM uint32_t ENC_PARAMS; /*!< 0x00000128 Encryption Parameter register */ + __IOM uint32_t ENC_CONFIG; /*!< 0x0000012C Encryption Configuration */ + __IOM uint32_t ENC_INTR_EN; /*!< 0x00000130 Encryption Interrupt enable */ + __IOM uint32_t ENC_INTR; /*!< 0x00000134 Encryption Interrupt status and clear register */ + __IM uint32_t RESERVED6[2]; + __IOM uint32_t B1_DATA_REG[4]; /*!< 0x00000140 Programmable B1 Data register (0-3) */ + __IOM uint32_t ENC_MEM_BASE_ADDR; /*!< 0x00000150 Encryption memory base address */ + __IM uint32_t RESERVED7[875]; + __IOM uint32_t TRIM_LDO_0; /*!< 0x00000F00 LDO Trim register 0 */ + __IOM uint32_t TRIM_LDO_1; /*!< 0x00000F04 LDO Trim register 1 */ + __IOM uint32_t TRIM_LDO_2; /*!< 0x00000F08 LDO Trim register 2 */ + __IOM uint32_t TRIM_LDO_3; /*!< 0x00000F0C LDO Trim register 3 */ + __IOM uint32_t TRIM_MXD[4]; /*!< 0x00000F10 MXD die Trim registers */ + __IM uint32_t RESERVED8[4]; + __IOM uint32_t TRIM_LDO_4; /*!< 0x00000F30 LDO Trim register 4 */ + __IOM uint32_t TRIM_LDO_5; /*!< 0x00000F34 LDO Trim register 5 */ + __IM uint32_t RESERVED9[50]; +} BLE_BLESS_Type; /*!< Size = 3896 (0xF38) */ + +/** + * \brief Bluetooth Low Energy Subsystem (BLE) + */ +typedef struct { /*!< BLE Structure */ + BLE_RCB_Type RCB; /*!< 0x00000000 Radio Control Bus (RCB) controller */ + __IM uint32_t RESERVED[896]; + BLE_BLELL_Type BLELL; /*!< 0x00001000 Bluetooth Low Energy Link Layer */ + BLE_BLESS_Type BLESS; /*!< 0x0001F000 Bluetooth Low Energy Subsystem Miscellaneous */ +} BLE_Type; /*!< Size = 131072 (0x20000) */ + + +/* ================================================== BLE_RCB_RCBLL.CTRL =================================================== */ +#define BLE_RCB_RCBLL_CTRL_RCBLL_CTRL_Pos (0UL) /*!< BLE_RCB_RCBLL CTRL: RCBLL_CTRL (Bit 0) */ +#define BLE_RCB_RCBLL_CTRL_RCBLL_CTRL_Msk (0x1UL) /*!< BLE_RCB_RCBLL CTRL: RCBLL_CTRL (Bitfield-Mask: 0x01) */ +#define BLE_RCB_RCBLL_CTRL_RCBLL_CPU_REQ_Pos (1UL) /*!< BLE_RCB_RCBLL CTRL: RCBLL_CPU_REQ (Bit 1) */ +#define BLE_RCB_RCBLL_CTRL_RCBLL_CPU_REQ_Msk (0x2UL) /*!< BLE_RCB_RCBLL CTRL: RCBLL_CPU_REQ (Bitfield-Mask: 0x01) */ +#define BLE_RCB_RCBLL_CTRL_CPU_SINGLE_WRITE_Pos (2UL) /*!< BLE_RCB_RCBLL CTRL: CPU_SINGLE_WRITE (Bit 2) */ +#define BLE_RCB_RCBLL_CTRL_CPU_SINGLE_WRITE_Msk (0x4UL) /*!< BLE_RCB_RCBLL CTRL: CPU_SINGLE_WRITE (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_RCBLL_CTRL_CPU_SINGLE_READ_Pos (3UL) /*!< BLE_RCB_RCBLL CTRL: CPU_SINGLE_READ (Bit 3) */ +#define BLE_RCB_RCBLL_CTRL_CPU_SINGLE_READ_Msk (0x8UL) /*!< BLE_RCB_RCBLL CTRL: CPU_SINGLE_READ (Bitfield-Mask: 0x01) */ +#define BLE_RCB_RCBLL_CTRL_ALLOW_CPU_ACCESS_TX_RX_Pos (4UL) /*!< BLE_RCB_RCBLL CTRL: ALLOW_CPU_ACCESS_TX_RX (Bit 4) */ +#define BLE_RCB_RCBLL_CTRL_ALLOW_CPU_ACCESS_TX_RX_Msk (0x10UL) /*!< BLE_RCB_RCBLL CTRL: ALLOW_CPU_ACCESS_TX_RX (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_RCBLL_CTRL_ENABLE_RADIO_BOD_Pos (5UL) /*!< BLE_RCB_RCBLL CTRL: ENABLE_RADIO_BOD (Bit 5) */ +#define BLE_RCB_RCBLL_CTRL_ENABLE_RADIO_BOD_Msk (0x20UL) /*!< BLE_RCB_RCBLL CTRL: ENABLE_RADIO_BOD (Bitfield-Mask: 0x01)*/ +/* ================================================== BLE_RCB_RCBLL.INTR =================================================== */ +#define BLE_RCB_RCBLL_INTR_RCB_LL_DONE_Pos (0UL) /*!< BLE_RCB_RCBLL INTR: RCB_LL_DONE (Bit 0) */ +#define BLE_RCB_RCBLL_INTR_RCB_LL_DONE_Msk (0x1UL) /*!< BLE_RCB_RCBLL INTR: RCB_LL_DONE (Bitfield-Mask: 0x01) */ +#define BLE_RCB_RCBLL_INTR_SINGLE_WRITE_DONE_Pos (2UL) /*!< BLE_RCB_RCBLL INTR: SINGLE_WRITE_DONE (Bit 2) */ +#define BLE_RCB_RCBLL_INTR_SINGLE_WRITE_DONE_Msk (0x4UL) /*!< BLE_RCB_RCBLL INTR: SINGLE_WRITE_DONE (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_RCBLL_INTR_SINGLE_READ_DONE_Pos (3UL) /*!< BLE_RCB_RCBLL INTR: SINGLE_READ_DONE (Bit 3) */ +#define BLE_RCB_RCBLL_INTR_SINGLE_READ_DONE_Msk (0x8UL) /*!< BLE_RCB_RCBLL INTR: SINGLE_READ_DONE (Bitfield-Mask: 0x01)*/ +/* ================================================ BLE_RCB_RCBLL.INTR_SET ================================================= */ +#define BLE_RCB_RCBLL_INTR_SET_RCB_LL_DONE_Pos (0UL) /*!< BLE_RCB_RCBLL INTR_SET: RCB_LL_DONE (Bit 0) */ +#define BLE_RCB_RCBLL_INTR_SET_RCB_LL_DONE_Msk (0x1UL) /*!< BLE_RCB_RCBLL INTR_SET: RCB_LL_DONE (Bitfield-Mask: 0x01) */ +#define BLE_RCB_RCBLL_INTR_SET_SINGLE_WRITE_DONE_Pos (2UL) /*!< BLE_RCB_RCBLL INTR_SET: SINGLE_WRITE_DONE (Bit 2) */ +#define BLE_RCB_RCBLL_INTR_SET_SINGLE_WRITE_DONE_Msk (0x4UL) /*!< BLE_RCB_RCBLL INTR_SET: SINGLE_WRITE_DONE (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_RCBLL_INTR_SET_SINGLE_READ_DONE_Pos (3UL) /*!< BLE_RCB_RCBLL INTR_SET: SINGLE_READ_DONE (Bit 3) */ +#define BLE_RCB_RCBLL_INTR_SET_SINGLE_READ_DONE_Msk (0x8UL) /*!< BLE_RCB_RCBLL INTR_SET: SINGLE_READ_DONE (Bitfield-Mask: 0x01)*/ +/* ================================================ BLE_RCB_RCBLL.INTR_MASK ================================================ */ +#define BLE_RCB_RCBLL_INTR_MASK_RCB_LL_DONE_Pos (0UL) /*!< BLE_RCB_RCBLL INTR_MASK: RCB_LL_DONE (Bit 0) */ +#define BLE_RCB_RCBLL_INTR_MASK_RCB_LL_DONE_Msk (0x1UL) /*!< BLE_RCB_RCBLL INTR_MASK: RCB_LL_DONE (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_RCBLL_INTR_MASK_SINGLE_WRITE_DONE_Pos (2UL) /*!< BLE_RCB_RCBLL INTR_MASK: SINGLE_WRITE_DONE (Bit 2) */ +#define BLE_RCB_RCBLL_INTR_MASK_SINGLE_WRITE_DONE_Msk (0x4UL) /*!< BLE_RCB_RCBLL INTR_MASK: SINGLE_WRITE_DONE (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_RCBLL_INTR_MASK_SINGLE_READ_DONE_Pos (3UL) /*!< BLE_RCB_RCBLL INTR_MASK: SINGLE_READ_DONE (Bit 3) */ +#define BLE_RCB_RCBLL_INTR_MASK_SINGLE_READ_DONE_Msk (0x8UL) /*!< BLE_RCB_RCBLL INTR_MASK: SINGLE_READ_DONE (Bitfield-Mask: 0x01)*/ +/* =============================================== BLE_RCB_RCBLL.INTR_MASKED =============================================== */ +#define BLE_RCB_RCBLL_INTR_MASKED_RCB_LL_DONE_Pos (0UL) /*!< BLE_RCB_RCBLL INTR_MASKED: RCB_LL_DONE (Bit 0) */ +#define BLE_RCB_RCBLL_INTR_MASKED_RCB_LL_DONE_Msk (0x1UL) /*!< BLE_RCB_RCBLL INTR_MASKED: RCB_LL_DONE (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_RCBLL_INTR_MASKED_SINGLE_WRITE_DONE_Pos (2UL) /*!< BLE_RCB_RCBLL INTR_MASKED: SINGLE_WRITE_DONE (Bit 2) */ +#define BLE_RCB_RCBLL_INTR_MASKED_SINGLE_WRITE_DONE_Msk (0x4UL) /*!< BLE_RCB_RCBLL INTR_MASKED: SINGLE_WRITE_DONE (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_RCBLL_INTR_MASKED_SINGLE_READ_DONE_Pos (3UL) /*!< BLE_RCB_RCBLL INTR_MASKED: SINGLE_READ_DONE (Bit 3) */ +#define BLE_RCB_RCBLL_INTR_MASKED_SINGLE_READ_DONE_Msk (0x8UL) /*!< BLE_RCB_RCBLL INTR_MASKED: SINGLE_READ_DONE (Bitfield-Mask: 0x01)*/ +/* ============================================= BLE_RCB_RCBLL.RADIO_REG1_ADDR ============================================= */ +#define BLE_RCB_RCBLL_RADIO_REG1_ADDR_REG_ADDR_Pos (0UL) /*!< BLE_RCB_RCBLL RADIO_REG1_ADDR: REG_ADDR (Bit 0) */ +#define BLE_RCB_RCBLL_RADIO_REG1_ADDR_REG_ADDR_Msk (0xffffUL) /*!< BLE_RCB_RCBLL RADIO_REG1_ADDR: REG_ADDR (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_RCB_RCBLL.RADIO_REG2_ADDR ============================================= */ +#define BLE_RCB_RCBLL_RADIO_REG2_ADDR_REG_ADDR_Pos (0UL) /*!< BLE_RCB_RCBLL RADIO_REG2_ADDR: REG_ADDR (Bit 0) */ +#define BLE_RCB_RCBLL_RADIO_REG2_ADDR_REG_ADDR_Msk (0xffffUL) /*!< BLE_RCB_RCBLL RADIO_REG2_ADDR: REG_ADDR (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_RCB_RCBLL.RADIO_REG3_ADDR ============================================= */ +#define BLE_RCB_RCBLL_RADIO_REG3_ADDR_REG_ADDR_Pos (0UL) /*!< BLE_RCB_RCBLL RADIO_REG3_ADDR: REG_ADDR (Bit 0) */ +#define BLE_RCB_RCBLL_RADIO_REG3_ADDR_REG_ADDR_Msk (0xffffUL) /*!< BLE_RCB_RCBLL RADIO_REG3_ADDR: REG_ADDR (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_RCB_RCBLL.RADIO_REG4_ADDR ============================================= */ +#define BLE_RCB_RCBLL_RADIO_REG4_ADDR_REG_ADDR_Pos (0UL) /*!< BLE_RCB_RCBLL RADIO_REG4_ADDR: REG_ADDR (Bit 0) */ +#define BLE_RCB_RCBLL_RADIO_REG4_ADDR_REG_ADDR_Msk (0xffffUL) /*!< BLE_RCB_RCBLL RADIO_REG4_ADDR: REG_ADDR (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_RCB_RCBLL.RADIO_REG5_ADDR ============================================= */ +#define BLE_RCB_RCBLL_RADIO_REG5_ADDR_REG_ADDR_Pos (0UL) /*!< BLE_RCB_RCBLL RADIO_REG5_ADDR: REG_ADDR (Bit 0) */ +#define BLE_RCB_RCBLL_RADIO_REG5_ADDR_REG_ADDR_Msk (0xffffUL) /*!< BLE_RCB_RCBLL RADIO_REG5_ADDR: REG_ADDR (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_RCB_RCBLL.CPU_WRITE_REG ============================================== */ +#define BLE_RCB_RCBLL_CPU_WRITE_REG_ADDR_Pos (0UL) /*!< BLE_RCB_RCBLL CPU_WRITE_REG: ADDR (Bit 0) */ +#define BLE_RCB_RCBLL_CPU_WRITE_REG_ADDR_Msk (0xffffUL) /*!< BLE_RCB_RCBLL CPU_WRITE_REG: ADDR (Bitfield-Mask: 0xffff) */ +#define BLE_RCB_RCBLL_CPU_WRITE_REG_WRITE_DATA_Pos (16UL) /*!< BLE_RCB_RCBLL CPU_WRITE_REG: WRITE_DATA (Bit 16) */ +#define BLE_RCB_RCBLL_CPU_WRITE_REG_WRITE_DATA_Msk (0xffff0000UL) /*!< BLE_RCB_RCBLL CPU_WRITE_REG: WRITE_DATA (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_RCB_RCBLL.CPU_READ_REG =============================================== */ +#define BLE_RCB_RCBLL_CPU_READ_REG_ADDR_Pos (0UL) /*!< BLE_RCB_RCBLL CPU_READ_REG: ADDR (Bit 0) */ +#define BLE_RCB_RCBLL_CPU_READ_REG_ADDR_Msk (0xffffUL) /*!< BLE_RCB_RCBLL CPU_READ_REG: ADDR (Bitfield-Mask: 0xffff) */ +#define BLE_RCB_RCBLL_CPU_READ_REG_READ_DATA_Pos (16UL) /*!< BLE_RCB_RCBLL CPU_READ_REG: READ_DATA (Bit 16) */ +#define BLE_RCB_RCBLL_CPU_READ_REG_READ_DATA_Msk (0xffff0000UL) /*!< BLE_RCB_RCBLL CPU_READ_REG: READ_DATA (Bitfield-Mask: 0xffff)*/ + + +/* ===================================================== BLE_RCB.CTRL ====================================================== */ +#define BLE_RCB_CTRL_TX_CLK_EDGE_Pos (1UL) /*!< BLE_RCB CTRL: TX_CLK_EDGE (Bit 1) */ +#define BLE_RCB_CTRL_TX_CLK_EDGE_Msk (0x2UL) /*!< BLE_RCB CTRL: TX_CLK_EDGE (Bitfield-Mask: 0x01) */ +#define BLE_RCB_CTRL_RX_CLK_EDGE_Pos (2UL) /*!< BLE_RCB CTRL: RX_CLK_EDGE (Bit 2) */ +#define BLE_RCB_CTRL_RX_CLK_EDGE_Msk (0x4UL) /*!< BLE_RCB CTRL: RX_CLK_EDGE (Bitfield-Mask: 0x01) */ +#define BLE_RCB_CTRL_RX_CLK_SRC_Pos (3UL) /*!< BLE_RCB CTRL: RX_CLK_SRC (Bit 3) */ +#define BLE_RCB_CTRL_RX_CLK_SRC_Msk (0x8UL) /*!< BLE_RCB CTRL: RX_CLK_SRC (Bitfield-Mask: 0x01) */ +#define BLE_RCB_CTRL_SCLK_CONTINUOUS_Pos (4UL) /*!< BLE_RCB CTRL: SCLK_CONTINUOUS (Bit 4) */ +#define BLE_RCB_CTRL_SCLK_CONTINUOUS_Msk (0x10UL) /*!< BLE_RCB CTRL: SCLK_CONTINUOUS (Bitfield-Mask: 0x01) */ +#define BLE_RCB_CTRL_SSEL_POLARITY_Pos (5UL) /*!< BLE_RCB CTRL: SSEL_POLARITY (Bit 5) */ +#define BLE_RCB_CTRL_SSEL_POLARITY_Msk (0x20UL) /*!< BLE_RCB CTRL: SSEL_POLARITY (Bitfield-Mask: 0x01) */ +#define BLE_RCB_CTRL_LEAD_Pos (8UL) /*!< BLE_RCB CTRL: LEAD (Bit 8) */ +#define BLE_RCB_CTRL_LEAD_Msk (0x300UL) /*!< BLE_RCB CTRL: LEAD (Bitfield-Mask: 0x03) */ +#define BLE_RCB_CTRL_LAG_Pos (10UL) /*!< BLE_RCB CTRL: LAG (Bit 10) */ +#define BLE_RCB_CTRL_LAG_Msk (0xc00UL) /*!< BLE_RCB CTRL: LAG (Bitfield-Mask: 0x03) */ +#define BLE_RCB_CTRL_DIV_ENABLED_Pos (12UL) /*!< BLE_RCB CTRL: DIV_ENABLED (Bit 12) */ +#define BLE_RCB_CTRL_DIV_ENABLED_Msk (0x1000UL) /*!< BLE_RCB CTRL: DIV_ENABLED (Bitfield-Mask: 0x01) */ +#define BLE_RCB_CTRL_DIV_Pos (13UL) /*!< BLE_RCB CTRL: DIV (Bit 13) */ +#define BLE_RCB_CTRL_DIV_Msk (0x7e000UL) /*!< BLE_RCB CTRL: DIV (Bitfield-Mask: 0x3f) */ +#define BLE_RCB_CTRL_ADDR_WIDTH_Pos (19UL) /*!< BLE_RCB CTRL: ADDR_WIDTH (Bit 19) */ +#define BLE_RCB_CTRL_ADDR_WIDTH_Msk (0x780000UL) /*!< BLE_RCB CTRL: ADDR_WIDTH (Bitfield-Mask: 0x0f) */ +#define BLE_RCB_CTRL_DATA_WIDTH_Pos (23UL) /*!< BLE_RCB CTRL: DATA_WIDTH (Bit 23) */ +#define BLE_RCB_CTRL_DATA_WIDTH_Msk (0x800000UL) /*!< BLE_RCB CTRL: DATA_WIDTH (Bitfield-Mask: 0x01) */ +#define BLE_RCB_CTRL_ENABLED_Pos (31UL) /*!< BLE_RCB CTRL: ENABLED (Bit 31) */ +#define BLE_RCB_CTRL_ENABLED_Msk (0x80000000UL) /*!< BLE_RCB CTRL: ENABLED (Bitfield-Mask: 0x01) */ +/* ==================================================== BLE_RCB.STATUS ===================================================== */ +#define BLE_RCB_STATUS_BUS_BUSY_Pos (0UL) /*!< BLE_RCB STATUS: BUS_BUSY (Bit 0) */ +#define BLE_RCB_STATUS_BUS_BUSY_Msk (0x1UL) /*!< BLE_RCB STATUS: BUS_BUSY (Bitfield-Mask: 0x01) */ +/* ==================================================== BLE_RCB.TX_CTRL ==================================================== */ +#define BLE_RCB_TX_CTRL_MSB_FIRST_Pos (0UL) /*!< BLE_RCB TX_CTRL: MSB_FIRST (Bit 0) */ +#define BLE_RCB_TX_CTRL_MSB_FIRST_Msk (0x1UL) /*!< BLE_RCB TX_CTRL: MSB_FIRST (Bitfield-Mask: 0x01) */ +#define BLE_RCB_TX_CTRL_FIFO_RECONFIG_Pos (1UL) /*!< BLE_RCB TX_CTRL: FIFO_RECONFIG (Bit 1) */ +#define BLE_RCB_TX_CTRL_FIFO_RECONFIG_Msk (0x2UL) /*!< BLE_RCB TX_CTRL: FIFO_RECONFIG (Bitfield-Mask: 0x01) */ +#define BLE_RCB_TX_CTRL_TX_ENTRIES_Pos (2UL) /*!< BLE_RCB TX_CTRL: TX_ENTRIES (Bit 2) */ +#define BLE_RCB_TX_CTRL_TX_ENTRIES_Msk (0x7cUL) /*!< BLE_RCB TX_CTRL: TX_ENTRIES (Bitfield-Mask: 0x1f) */ +/* ================================================= BLE_RCB.TX_FIFO_CTRL ================================================== */ +#define BLE_RCB_TX_FIFO_CTRL_TX_TRIGGER_LEVEL_Pos (0UL) /*!< BLE_RCB TX_FIFO_CTRL: TX_TRIGGER_LEVEL (Bit 0) */ +#define BLE_RCB_TX_FIFO_CTRL_TX_TRIGGER_LEVEL_Msk (0x1fUL) /*!< BLE_RCB TX_FIFO_CTRL: TX_TRIGGER_LEVEL (Bitfield-Mask: 0x1f)*/ +#define BLE_RCB_TX_FIFO_CTRL_CLEAR_Pos (16UL) /*!< BLE_RCB TX_FIFO_CTRL: CLEAR (Bit 16) */ +#define BLE_RCB_TX_FIFO_CTRL_CLEAR_Msk (0x10000UL) /*!< BLE_RCB TX_FIFO_CTRL: CLEAR (Bitfield-Mask: 0x01) */ +/* ================================================ BLE_RCB.TX_FIFO_STATUS ================================================= */ +#define BLE_RCB_TX_FIFO_STATUS_USED_Pos (0UL) /*!< BLE_RCB TX_FIFO_STATUS: USED (Bit 0) */ +#define BLE_RCB_TX_FIFO_STATUS_USED_Msk (0x1fUL) /*!< BLE_RCB TX_FIFO_STATUS: USED (Bitfield-Mask: 0x1f) */ +#define BLE_RCB_TX_FIFO_STATUS_SR_VALID_Pos (15UL) /*!< BLE_RCB TX_FIFO_STATUS: SR_VALID (Bit 15) */ +#define BLE_RCB_TX_FIFO_STATUS_SR_VALID_Msk (0x8000UL) /*!< BLE_RCB TX_FIFO_STATUS: SR_VALID (Bitfield-Mask: 0x01) */ +#define BLE_RCB_TX_FIFO_STATUS_RD_PTR_Pos (16UL) /*!< BLE_RCB TX_FIFO_STATUS: RD_PTR (Bit 16) */ +#define BLE_RCB_TX_FIFO_STATUS_RD_PTR_Msk (0xf0000UL) /*!< BLE_RCB TX_FIFO_STATUS: RD_PTR (Bitfield-Mask: 0x0f) */ +#define BLE_RCB_TX_FIFO_STATUS_WR_PTR_Pos (24UL) /*!< BLE_RCB TX_FIFO_STATUS: WR_PTR (Bit 24) */ +#define BLE_RCB_TX_FIFO_STATUS_WR_PTR_Msk (0xf000000UL) /*!< BLE_RCB TX_FIFO_STATUS: WR_PTR (Bitfield-Mask: 0x0f) */ +/* ================================================== BLE_RCB.TX_FIFO_WR =================================================== */ +#define BLE_RCB_TX_FIFO_WR_DATA_Pos (0UL) /*!< BLE_RCB TX_FIFO_WR: DATA (Bit 0) */ +#define BLE_RCB_TX_FIFO_WR_DATA_Msk (0xffffffffUL) /*!< BLE_RCB TX_FIFO_WR: DATA (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== BLE_RCB.RX_CTRL ==================================================== */ +#define BLE_RCB_RX_CTRL_MSB_FIRST_Pos (0UL) /*!< BLE_RCB RX_CTRL: MSB_FIRST (Bit 0) */ +#define BLE_RCB_RX_CTRL_MSB_FIRST_Msk (0x1UL) /*!< BLE_RCB RX_CTRL: MSB_FIRST (Bitfield-Mask: 0x01) */ +/* ================================================= BLE_RCB.RX_FIFO_CTRL ================================================== */ +#define BLE_RCB_RX_FIFO_CTRL_TRIGGER_LEVEL_Pos (0UL) /*!< BLE_RCB RX_FIFO_CTRL: TRIGGER_LEVEL (Bit 0) */ +#define BLE_RCB_RX_FIFO_CTRL_TRIGGER_LEVEL_Msk (0xfUL) /*!< BLE_RCB RX_FIFO_CTRL: TRIGGER_LEVEL (Bitfield-Mask: 0x0f) */ +#define BLE_RCB_RX_FIFO_CTRL_CLEAR_Pos (16UL) /*!< BLE_RCB RX_FIFO_CTRL: CLEAR (Bit 16) */ +#define BLE_RCB_RX_FIFO_CTRL_CLEAR_Msk (0x10000UL) /*!< BLE_RCB RX_FIFO_CTRL: CLEAR (Bitfield-Mask: 0x01) */ +/* ================================================ BLE_RCB.RX_FIFO_STATUS ================================================= */ +#define BLE_RCB_RX_FIFO_STATUS_USED_Pos (0UL) /*!< BLE_RCB RX_FIFO_STATUS: USED (Bit 0) */ +#define BLE_RCB_RX_FIFO_STATUS_USED_Msk (0x1fUL) /*!< BLE_RCB RX_FIFO_STATUS: USED (Bitfield-Mask: 0x1f) */ +#define BLE_RCB_RX_FIFO_STATUS_SR_VALID_Pos (15UL) /*!< BLE_RCB RX_FIFO_STATUS: SR_VALID (Bit 15) */ +#define BLE_RCB_RX_FIFO_STATUS_SR_VALID_Msk (0x8000UL) /*!< BLE_RCB RX_FIFO_STATUS: SR_VALID (Bitfield-Mask: 0x01) */ +#define BLE_RCB_RX_FIFO_STATUS_RD_PTR_Pos (16UL) /*!< BLE_RCB RX_FIFO_STATUS: RD_PTR (Bit 16) */ +#define BLE_RCB_RX_FIFO_STATUS_RD_PTR_Msk (0xf0000UL) /*!< BLE_RCB RX_FIFO_STATUS: RD_PTR (Bitfield-Mask: 0x0f) */ +#define BLE_RCB_RX_FIFO_STATUS_WR_PTR_Pos (24UL) /*!< BLE_RCB RX_FIFO_STATUS: WR_PTR (Bit 24) */ +#define BLE_RCB_RX_FIFO_STATUS_WR_PTR_Msk (0xf000000UL) /*!< BLE_RCB RX_FIFO_STATUS: WR_PTR (Bitfield-Mask: 0x0f) */ +/* ================================================== BLE_RCB.RX_FIFO_RD =================================================== */ +#define BLE_RCB_RX_FIFO_RD_DATA_Pos (0UL) /*!< BLE_RCB RX_FIFO_RD: DATA (Bit 0) */ +#define BLE_RCB_RX_FIFO_RD_DATA_Msk (0xffffffffUL) /*!< BLE_RCB RX_FIFO_RD: DATA (Bitfield-Mask: 0xffffffff) */ +/* =============================================== BLE_RCB.RX_FIFO_RD_SILENT =============================================== */ +#define BLE_RCB_RX_FIFO_RD_SILENT_DATA_Pos (0UL) /*!< BLE_RCB RX_FIFO_RD_SILENT: DATA (Bit 0) */ +#define BLE_RCB_RX_FIFO_RD_SILENT_DATA_Msk (0xffffffffUL) /*!< BLE_RCB RX_FIFO_RD_SILENT: DATA (Bitfield-Mask: 0xffffffff)*/ +/* ===================================================== BLE_RCB.INTR ====================================================== */ +#define BLE_RCB_INTR_RCB_DONE_Pos (0UL) /*!< BLE_RCB INTR: RCB_DONE (Bit 0) */ +#define BLE_RCB_INTR_RCB_DONE_Msk (0x1UL) /*!< BLE_RCB INTR: RCB_DONE (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_TX_FIFO_TRIGGER_Pos (8UL) /*!< BLE_RCB INTR: TX_FIFO_TRIGGER (Bit 8) */ +#define BLE_RCB_INTR_TX_FIFO_TRIGGER_Msk (0x100UL) /*!< BLE_RCB INTR: TX_FIFO_TRIGGER (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_TX_FIFO_NOT_FULL_Pos (9UL) /*!< BLE_RCB INTR: TX_FIFO_NOT_FULL (Bit 9) */ +#define BLE_RCB_INTR_TX_FIFO_NOT_FULL_Msk (0x200UL) /*!< BLE_RCB INTR: TX_FIFO_NOT_FULL (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_TX_FIFO_EMPTY_Pos (10UL) /*!< BLE_RCB INTR: TX_FIFO_EMPTY (Bit 10) */ +#define BLE_RCB_INTR_TX_FIFO_EMPTY_Msk (0x400UL) /*!< BLE_RCB INTR: TX_FIFO_EMPTY (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_TX_FIFO_OVERFLOW_Pos (11UL) /*!< BLE_RCB INTR: TX_FIFO_OVERFLOW (Bit 11) */ +#define BLE_RCB_INTR_TX_FIFO_OVERFLOW_Msk (0x800UL) /*!< BLE_RCB INTR: TX_FIFO_OVERFLOW (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_TX_FIFO_UNDERFLOW_Pos (12UL) /*!< BLE_RCB INTR: TX_FIFO_UNDERFLOW (Bit 12) */ +#define BLE_RCB_INTR_TX_FIFO_UNDERFLOW_Msk (0x1000UL) /*!< BLE_RCB INTR: TX_FIFO_UNDERFLOW (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_RX_FIFO_TRIGGER_Pos (16UL) /*!< BLE_RCB INTR: RX_FIFO_TRIGGER (Bit 16) */ +#define BLE_RCB_INTR_RX_FIFO_TRIGGER_Msk (0x10000UL) /*!< BLE_RCB INTR: RX_FIFO_TRIGGER (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_RX_FIFO_NOT_EMPTY_Pos (17UL) /*!< BLE_RCB INTR: RX_FIFO_NOT_EMPTY (Bit 17) */ +#define BLE_RCB_INTR_RX_FIFO_NOT_EMPTY_Msk (0x20000UL) /*!< BLE_RCB INTR: RX_FIFO_NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_RX_FIFO_FULL_Pos (18UL) /*!< BLE_RCB INTR: RX_FIFO_FULL (Bit 18) */ +#define BLE_RCB_INTR_RX_FIFO_FULL_Msk (0x40000UL) /*!< BLE_RCB INTR: RX_FIFO_FULL (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_RX_FIFO_OVERFLOW_Pos (19UL) /*!< BLE_RCB INTR: RX_FIFO_OVERFLOW (Bit 19) */ +#define BLE_RCB_INTR_RX_FIFO_OVERFLOW_Msk (0x80000UL) /*!< BLE_RCB INTR: RX_FIFO_OVERFLOW (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_RX_FIFO_UNDERFLOW_Pos (20UL) /*!< BLE_RCB INTR: RX_FIFO_UNDERFLOW (Bit 20) */ +#define BLE_RCB_INTR_RX_FIFO_UNDERFLOW_Msk (0x100000UL) /*!< BLE_RCB INTR: RX_FIFO_UNDERFLOW (Bitfield-Mask: 0x01) */ +/* =================================================== BLE_RCB.INTR_SET ==================================================== */ +#define BLE_RCB_INTR_SET_RCB_DONE_Pos (0UL) /*!< BLE_RCB INTR_SET: RCB_DONE (Bit 0) */ +#define BLE_RCB_INTR_SET_RCB_DONE_Msk (0x1UL) /*!< BLE_RCB INTR_SET: RCB_DONE (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_SET_TX_FIFO_TRIGGER_Pos (8UL) /*!< BLE_RCB INTR_SET: TX_FIFO_TRIGGER (Bit 8) */ +#define BLE_RCB_INTR_SET_TX_FIFO_TRIGGER_Msk (0x100UL) /*!< BLE_RCB INTR_SET: TX_FIFO_TRIGGER (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_SET_TX_FIFO_NOT_FULL_Pos (9UL) /*!< BLE_RCB INTR_SET: TX_FIFO_NOT_FULL (Bit 9) */ +#define BLE_RCB_INTR_SET_TX_FIFO_NOT_FULL_Msk (0x200UL) /*!< BLE_RCB INTR_SET: TX_FIFO_NOT_FULL (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_SET_TX_FIFO_EMPTY_Pos (10UL) /*!< BLE_RCB INTR_SET: TX_FIFO_EMPTY (Bit 10) */ +#define BLE_RCB_INTR_SET_TX_FIFO_EMPTY_Msk (0x400UL) /*!< BLE_RCB INTR_SET: TX_FIFO_EMPTY (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_SET_TX_FIFO_OVERFLOW_Pos (11UL) /*!< BLE_RCB INTR_SET: TX_FIFO_OVERFLOW (Bit 11) */ +#define BLE_RCB_INTR_SET_TX_FIFO_OVERFLOW_Msk (0x800UL) /*!< BLE_RCB INTR_SET: TX_FIFO_OVERFLOW (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_SET_TX_FIFO_UNDERFLOW_Pos (12UL) /*!< BLE_RCB INTR_SET: TX_FIFO_UNDERFLOW (Bit 12) */ +#define BLE_RCB_INTR_SET_TX_FIFO_UNDERFLOW_Msk (0x1000UL) /*!< BLE_RCB INTR_SET: TX_FIFO_UNDERFLOW (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_SET_RX_FIFO_TRIGGER_Pos (16UL) /*!< BLE_RCB INTR_SET: RX_FIFO_TRIGGER (Bit 16) */ +#define BLE_RCB_INTR_SET_RX_FIFO_TRIGGER_Msk (0x10000UL) /*!< BLE_RCB INTR_SET: RX_FIFO_TRIGGER (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_SET_RX_FIFO_NOT_EMPTY_Pos (17UL) /*!< BLE_RCB INTR_SET: RX_FIFO_NOT_EMPTY (Bit 17) */ +#define BLE_RCB_INTR_SET_RX_FIFO_NOT_EMPTY_Msk (0x20000UL) /*!< BLE_RCB INTR_SET: RX_FIFO_NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_SET_RX_FIFO_FULL_Pos (18UL) /*!< BLE_RCB INTR_SET: RX_FIFO_FULL (Bit 18) */ +#define BLE_RCB_INTR_SET_RX_FIFO_FULL_Msk (0x40000UL) /*!< BLE_RCB INTR_SET: RX_FIFO_FULL (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_SET_RX_FIFO_OVERFLOW_Pos (19UL) /*!< BLE_RCB INTR_SET: RX_FIFO_OVERFLOW (Bit 19) */ +#define BLE_RCB_INTR_SET_RX_FIFO_OVERFLOW_Msk (0x80000UL) /*!< BLE_RCB INTR_SET: RX_FIFO_OVERFLOW (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_SET_RX_FIFO_UNDERFLOW_Pos (20UL) /*!< BLE_RCB INTR_SET: RX_FIFO_UNDERFLOW (Bit 20) */ +#define BLE_RCB_INTR_SET_RX_FIFO_UNDERFLOW_Msk (0x100000UL) /*!< BLE_RCB INTR_SET: RX_FIFO_UNDERFLOW (Bitfield-Mask: 0x01) */ +/* =================================================== BLE_RCB.INTR_MASK =================================================== */ +#define BLE_RCB_INTR_MASK_RCB_DONE_Pos (0UL) /*!< BLE_RCB INTR_MASK: RCB_DONE (Bit 0) */ +#define BLE_RCB_INTR_MASK_RCB_DONE_Msk (0x1UL) /*!< BLE_RCB INTR_MASK: RCB_DONE (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASK_TX_FIFO_TRIGGER_Pos (8UL) /*!< BLE_RCB INTR_MASK: TX_FIFO_TRIGGER (Bit 8) */ +#define BLE_RCB_INTR_MASK_TX_FIFO_TRIGGER_Msk (0x100UL) /*!< BLE_RCB INTR_MASK: TX_FIFO_TRIGGER (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASK_TX_FIFO_NOT_FULL_Pos (9UL) /*!< BLE_RCB INTR_MASK: TX_FIFO_NOT_FULL (Bit 9) */ +#define BLE_RCB_INTR_MASK_TX_FIFO_NOT_FULL_Msk (0x200UL) /*!< BLE_RCB INTR_MASK: TX_FIFO_NOT_FULL (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASK_TX_FIFO_EMPTY_Pos (10UL) /*!< BLE_RCB INTR_MASK: TX_FIFO_EMPTY (Bit 10) */ +#define BLE_RCB_INTR_MASK_TX_FIFO_EMPTY_Msk (0x400UL) /*!< BLE_RCB INTR_MASK: TX_FIFO_EMPTY (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASK_TX_FIFO_OVERFLOW_Pos (11UL) /*!< BLE_RCB INTR_MASK: TX_FIFO_OVERFLOW (Bit 11) */ +#define BLE_RCB_INTR_MASK_TX_FIFO_OVERFLOW_Msk (0x800UL) /*!< BLE_RCB INTR_MASK: TX_FIFO_OVERFLOW (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASK_TX_FIFO_UNDERFLOW_Pos (12UL) /*!< BLE_RCB INTR_MASK: TX_FIFO_UNDERFLOW (Bit 12) */ +#define BLE_RCB_INTR_MASK_TX_FIFO_UNDERFLOW_Msk (0x1000UL) /*!< BLE_RCB INTR_MASK: TX_FIFO_UNDERFLOW (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_INTR_MASK_RX_FIFO_TRIGGER_Pos (16UL) /*!< BLE_RCB INTR_MASK: RX_FIFO_TRIGGER (Bit 16) */ +#define BLE_RCB_INTR_MASK_RX_FIFO_TRIGGER_Msk (0x10000UL) /*!< BLE_RCB INTR_MASK: RX_FIFO_TRIGGER (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASK_RX_FIFO_NOT_EMPTY_Pos (17UL) /*!< BLE_RCB INTR_MASK: RX_FIFO_NOT_EMPTY (Bit 17) */ +#define BLE_RCB_INTR_MASK_RX_FIFO_NOT_EMPTY_Msk (0x20000UL) /*!< BLE_RCB INTR_MASK: RX_FIFO_NOT_EMPTY (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_INTR_MASK_RX_FIFO_FULL_Pos (18UL) /*!< BLE_RCB INTR_MASK: RX_FIFO_FULL (Bit 18) */ +#define BLE_RCB_INTR_MASK_RX_FIFO_FULL_Msk (0x40000UL) /*!< BLE_RCB INTR_MASK: RX_FIFO_FULL (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASK_RX_FIFO_OVERFLOW_Pos (19UL) /*!< BLE_RCB INTR_MASK: RX_FIFO_OVERFLOW (Bit 19) */ +#define BLE_RCB_INTR_MASK_RX_FIFO_OVERFLOW_Msk (0x80000UL) /*!< BLE_RCB INTR_MASK: RX_FIFO_OVERFLOW (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASK_RX_FIFO_UNDERFLOW_Pos (20UL) /*!< BLE_RCB INTR_MASK: RX_FIFO_UNDERFLOW (Bit 20) */ +#define BLE_RCB_INTR_MASK_RX_FIFO_UNDERFLOW_Msk (0x100000UL) /*!< BLE_RCB INTR_MASK: RX_FIFO_UNDERFLOW (Bitfield-Mask: 0x01)*/ +/* ================================================== BLE_RCB.INTR_MASKED ================================================== */ +#define BLE_RCB_INTR_MASKED_RCB_DONE_Pos (0UL) /*!< BLE_RCB INTR_MASKED: RCB_DONE (Bit 0) */ +#define BLE_RCB_INTR_MASKED_RCB_DONE_Msk (0x1UL) /*!< BLE_RCB INTR_MASKED: RCB_DONE (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASKED_TX_FIFO_TRIGGER_Pos (8UL) /*!< BLE_RCB INTR_MASKED: TX_FIFO_TRIGGER (Bit 8) */ +#define BLE_RCB_INTR_MASKED_TX_FIFO_TRIGGER_Msk (0x100UL) /*!< BLE_RCB INTR_MASKED: TX_FIFO_TRIGGER (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_INTR_MASKED_TX_FIFO_NOT_FULL_Pos (9UL) /*!< BLE_RCB INTR_MASKED: TX_FIFO_NOT_FULL (Bit 9) */ +#define BLE_RCB_INTR_MASKED_TX_FIFO_NOT_FULL_Msk (0x200UL) /*!< BLE_RCB INTR_MASKED: TX_FIFO_NOT_FULL (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_INTR_MASKED_TX_FIFO_EMPTY_Pos (10UL) /*!< BLE_RCB INTR_MASKED: TX_FIFO_EMPTY (Bit 10) */ +#define BLE_RCB_INTR_MASKED_TX_FIFO_EMPTY_Msk (0x400UL) /*!< BLE_RCB INTR_MASKED: TX_FIFO_EMPTY (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASKED_TX_FIFO_OVERFLOW_Pos (11UL) /*!< BLE_RCB INTR_MASKED: TX_FIFO_OVERFLOW (Bit 11) */ +#define BLE_RCB_INTR_MASKED_TX_FIFO_OVERFLOW_Msk (0x800UL) /*!< BLE_RCB INTR_MASKED: TX_FIFO_OVERFLOW (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_INTR_MASKED_TX_FIFO_UNDERFLOW_Pos (12UL) /*!< BLE_RCB INTR_MASKED: TX_FIFO_UNDERFLOW (Bit 12) */ +#define BLE_RCB_INTR_MASKED_TX_FIFO_UNDERFLOW_Msk (0x1000UL) /*!< BLE_RCB INTR_MASKED: TX_FIFO_UNDERFLOW (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_INTR_MASKED_RX_FIFO_TRIGGER_Pos (16UL) /*!< BLE_RCB INTR_MASKED: RX_FIFO_TRIGGER (Bit 16) */ +#define BLE_RCB_INTR_MASKED_RX_FIFO_TRIGGER_Msk (0x10000UL) /*!< BLE_RCB INTR_MASKED: RX_FIFO_TRIGGER (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_INTR_MASKED_RX_FIFO_NOT_EMPTY_Pos (17UL) /*!< BLE_RCB INTR_MASKED: RX_FIFO_NOT_EMPTY (Bit 17) */ +#define BLE_RCB_INTR_MASKED_RX_FIFO_NOT_EMPTY_Msk (0x20000UL) /*!< BLE_RCB INTR_MASKED: RX_FIFO_NOT_EMPTY (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_INTR_MASKED_RX_FIFO_FULL_Pos (18UL) /*!< BLE_RCB INTR_MASKED: RX_FIFO_FULL (Bit 18) */ +#define BLE_RCB_INTR_MASKED_RX_FIFO_FULL_Msk (0x40000UL) /*!< BLE_RCB INTR_MASKED: RX_FIFO_FULL (Bitfield-Mask: 0x01) */ +#define BLE_RCB_INTR_MASKED_RX_FIFO_OVERFLOW_Pos (19UL) /*!< BLE_RCB INTR_MASKED: RX_FIFO_OVERFLOW (Bit 19) */ +#define BLE_RCB_INTR_MASKED_RX_FIFO_OVERFLOW_Msk (0x80000UL) /*!< BLE_RCB INTR_MASKED: RX_FIFO_OVERFLOW (Bitfield-Mask: 0x01)*/ +#define BLE_RCB_INTR_MASKED_RX_FIFO_UNDERFLOW_Pos (20UL) /*!< BLE_RCB INTR_MASKED: RX_FIFO_UNDERFLOW (Bit 20) */ +#define BLE_RCB_INTR_MASKED_RX_FIFO_UNDERFLOW_Msk (0x100000UL) /*!< BLE_RCB INTR_MASKED: RX_FIFO_UNDERFLOW (Bitfield-Mask: 0x01)*/ + + +/* ============================================== BLE_BLELL.COMMAND_REGISTER =============================================== */ +#define BLE_BLELL_COMMAND_REGISTER_COMMAND_Pos (0UL) /*!< BLE_BLELL COMMAND_REGISTER: COMMAND (Bit 0) */ +#define BLE_BLELL_COMMAND_REGISTER_COMMAND_Msk (0xffUL) /*!< BLE_BLELL COMMAND_REGISTER: COMMAND (Bitfield-Mask: 0xff) */ +/* ================================================= BLE_BLELL.EVENT_INTR ================================================== */ +#define BLE_BLELL_EVENT_INTR_ADV_INTR_Pos (0UL) /*!< BLE_BLELL EVENT_INTR: ADV_INTR (Bit 0) */ +#define BLE_BLELL_EVENT_INTR_ADV_INTR_Msk (0x1UL) /*!< BLE_BLELL EVENT_INTR: ADV_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_INTR_SCAN_INTR_Pos (1UL) /*!< BLE_BLELL EVENT_INTR: SCAN_INTR (Bit 1) */ +#define BLE_BLELL_EVENT_INTR_SCAN_INTR_Msk (0x2UL) /*!< BLE_BLELL EVENT_INTR: SCAN_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_INTR_INIT_INTR_Pos (2UL) /*!< BLE_BLELL EVENT_INTR: INIT_INTR (Bit 2) */ +#define BLE_BLELL_EVENT_INTR_INIT_INTR_Msk (0x4UL) /*!< BLE_BLELL EVENT_INTR: INIT_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_INTR_CONN_INTR_Pos (3UL) /*!< BLE_BLELL EVENT_INTR: CONN_INTR (Bit 3) */ +#define BLE_BLELL_EVENT_INTR_CONN_INTR_Msk (0x8UL) /*!< BLE_BLELL EVENT_INTR: CONN_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_INTR_SM_INTR_Pos (4UL) /*!< BLE_BLELL EVENT_INTR: SM_INTR (Bit 4) */ +#define BLE_BLELL_EVENT_INTR_SM_INTR_Msk (0x10UL) /*!< BLE_BLELL EVENT_INTR: SM_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_INTR_DSM_INTR_Pos (5UL) /*!< BLE_BLELL EVENT_INTR: DSM_INTR (Bit 5) */ +#define BLE_BLELL_EVENT_INTR_DSM_INTR_Msk (0x20UL) /*!< BLE_BLELL EVENT_INTR: DSM_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_INTR_ENC_INTR_Pos (6UL) /*!< BLE_BLELL EVENT_INTR: ENC_INTR (Bit 6) */ +#define BLE_BLELL_EVENT_INTR_ENC_INTR_Msk (0x40UL) /*!< BLE_BLELL EVENT_INTR: ENC_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_INTR_RSSI_RX_DONE_INTR_Pos (7UL) /*!< BLE_BLELL EVENT_INTR: RSSI_RX_DONE_INTR (Bit 7) */ +#define BLE_BLELL_EVENT_INTR_RSSI_RX_DONE_INTR_Msk (0x80UL) /*!< BLE_BLELL EVENT_INTR: RSSI_RX_DONE_INTR (Bitfield-Mask: 0x01)*/ +/* ================================================ BLE_BLELL.EVENT_ENABLE ================================================= */ +#define BLE_BLELL_EVENT_ENABLE_ADV_INT_EN_Pos (0UL) /*!< BLE_BLELL EVENT_ENABLE: ADV_INT_EN (Bit 0) */ +#define BLE_BLELL_EVENT_ENABLE_ADV_INT_EN_Msk (0x1UL) /*!< BLE_BLELL EVENT_ENABLE: ADV_INT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_ENABLE_SCN_INT_EN_Pos (1UL) /*!< BLE_BLELL EVENT_ENABLE: SCN_INT_EN (Bit 1) */ +#define BLE_BLELL_EVENT_ENABLE_SCN_INT_EN_Msk (0x2UL) /*!< BLE_BLELL EVENT_ENABLE: SCN_INT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_ENABLE_INIT_INT_EN_Pos (2UL) /*!< BLE_BLELL EVENT_ENABLE: INIT_INT_EN (Bit 2) */ +#define BLE_BLELL_EVENT_ENABLE_INIT_INT_EN_Msk (0x4UL) /*!< BLE_BLELL EVENT_ENABLE: INIT_INT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_ENABLE_CONN_INT_EN_Pos (3UL) /*!< BLE_BLELL EVENT_ENABLE: CONN_INT_EN (Bit 3) */ +#define BLE_BLELL_EVENT_ENABLE_CONN_INT_EN_Msk (0x8UL) /*!< BLE_BLELL EVENT_ENABLE: CONN_INT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_ENABLE_SM_INT_EN_Pos (4UL) /*!< BLE_BLELL EVENT_ENABLE: SM_INT_EN (Bit 4) */ +#define BLE_BLELL_EVENT_ENABLE_SM_INT_EN_Msk (0x10UL) /*!< BLE_BLELL EVENT_ENABLE: SM_INT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_ENABLE_DSM_INT_EN_Pos (5UL) /*!< BLE_BLELL EVENT_ENABLE: DSM_INT_EN (Bit 5) */ +#define BLE_BLELL_EVENT_ENABLE_DSM_INT_EN_Msk (0x20UL) /*!< BLE_BLELL EVENT_ENABLE: DSM_INT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_ENABLE_ENC_INT_EN_Pos (6UL) /*!< BLE_BLELL EVENT_ENABLE: ENC_INT_EN (Bit 6) */ +#define BLE_BLELL_EVENT_ENABLE_ENC_INT_EN_Msk (0x40UL) /*!< BLE_BLELL EVENT_ENABLE: ENC_INT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_EVENT_ENABLE_RSSI_RX_DONE_INT_EN_Pos (7UL) /*!< BLE_BLELL EVENT_ENABLE: RSSI_RX_DONE_INT_EN (Bit 7) */ +#define BLE_BLELL_EVENT_ENABLE_RSSI_RX_DONE_INT_EN_Msk (0x80UL) /*!< BLE_BLELL EVENT_ENABLE: RSSI_RX_DONE_INT_EN (Bitfield-Mask: 0x01)*/ +/* ================================================= BLE_BLELL.ADV_PARAMS ================================================== */ +#define BLE_BLELL_ADV_PARAMS_TX_ADDR_Pos (0UL) /*!< BLE_BLELL ADV_PARAMS: TX_ADDR (Bit 0) */ +#define BLE_BLELL_ADV_PARAMS_TX_ADDR_Msk (0x1UL) /*!< BLE_BLELL ADV_PARAMS: TX_ADDR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_PARAMS_ADV_TYPE_Pos (1UL) /*!< BLE_BLELL ADV_PARAMS: ADV_TYPE (Bit 1) */ +#define BLE_BLELL_ADV_PARAMS_ADV_TYPE_Msk (0x6UL) /*!< BLE_BLELL ADV_PARAMS: ADV_TYPE (Bitfield-Mask: 0x03) */ +#define BLE_BLELL_ADV_PARAMS_ADV_FILT_POLICY_Pos (3UL) /*!< BLE_BLELL ADV_PARAMS: ADV_FILT_POLICY (Bit 3) */ +#define BLE_BLELL_ADV_PARAMS_ADV_FILT_POLICY_Msk (0x18UL) /*!< BLE_BLELL ADV_PARAMS: ADV_FILT_POLICY (Bitfield-Mask: 0x03)*/ +#define BLE_BLELL_ADV_PARAMS_ADV_CHANNEL_MAP_Pos (5UL) /*!< BLE_BLELL ADV_PARAMS: ADV_CHANNEL_MAP (Bit 5) */ +#define BLE_BLELL_ADV_PARAMS_ADV_CHANNEL_MAP_Msk (0xe0UL) /*!< BLE_BLELL ADV_PARAMS: ADV_CHANNEL_MAP (Bitfield-Mask: 0x07)*/ +#define BLE_BLELL_ADV_PARAMS_RX_ADDR_Pos (8UL) /*!< BLE_BLELL ADV_PARAMS: RX_ADDR (Bit 8) */ +#define BLE_BLELL_ADV_PARAMS_RX_ADDR_Msk (0x100UL) /*!< BLE_BLELL ADV_PARAMS: RX_ADDR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_PARAMS_ADV_LOW_DUTY_CYCLE_Pos (10UL) /*!< BLE_BLELL ADV_PARAMS: ADV_LOW_DUTY_CYCLE (Bit 10) */ +#define BLE_BLELL_ADV_PARAMS_ADV_LOW_DUTY_CYCLE_Msk (0x400UL) /*!< BLE_BLELL ADV_PARAMS: ADV_LOW_DUTY_CYCLE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_PARAMS_INITA_RPA_CHECK_Pos (11UL) /*!< BLE_BLELL ADV_PARAMS: INITA_RPA_CHECK (Bit 11) */ +#define BLE_BLELL_ADV_PARAMS_INITA_RPA_CHECK_Msk (0x800UL) /*!< BLE_BLELL ADV_PARAMS: INITA_RPA_CHECK (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_PARAMS_TX_ADDR_PRIV_Pos (12UL) /*!< BLE_BLELL ADV_PARAMS: TX_ADDR_PRIV (Bit 12) */ +#define BLE_BLELL_ADV_PARAMS_TX_ADDR_PRIV_Msk (0x1000UL) /*!< BLE_BLELL ADV_PARAMS: TX_ADDR_PRIV (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_PARAMS_ADV_RCV_IA_IN_PRIV_Pos (13UL) /*!< BLE_BLELL ADV_PARAMS: ADV_RCV_IA_IN_PRIV (Bit 13) */ +#define BLE_BLELL_ADV_PARAMS_ADV_RCV_IA_IN_PRIV_Msk (0x2000UL) /*!< BLE_BLELL ADV_PARAMS: ADV_RCV_IA_IN_PRIV (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_PARAMS_ADV_RPT_PEER_NRPA_ADDR_IN_PRIV_Pos (14UL) /*!< BLE_BLELL ADV_PARAMS: ADV_RPT_PEER_NRPA_ADDR_IN_PRIV (Bit 14)*/ +#define BLE_BLELL_ADV_PARAMS_ADV_RPT_PEER_NRPA_ADDR_IN_PRIV_Msk (0x4000UL) /*!< BLE_BLELL ADV_PARAMS: ADV_RPT_PEER_NRPA_ADDR_IN_PRIV (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_PARAMS_RCV_TX_ADDR_Pos (15UL) /*!< BLE_BLELL ADV_PARAMS: RCV_TX_ADDR (Bit 15) */ +#define BLE_BLELL_ADV_PARAMS_RCV_TX_ADDR_Msk (0x8000UL) /*!< BLE_BLELL ADV_PARAMS: RCV_TX_ADDR (Bitfield-Mask: 0x01) */ +/* ============================================ BLE_BLELL.ADV_INTERVAL_TIMEOUT ============================================= */ +#define BLE_BLELL_ADV_INTERVAL_TIMEOUT_ADV_INTERVAL_Pos (0UL) /*!< BLE_BLELL ADV_INTERVAL_TIMEOUT: ADV_INTERVAL (Bit 0) */ +#define BLE_BLELL_ADV_INTERVAL_TIMEOUT_ADV_INTERVAL_Msk (0x7fffUL) /*!< BLE_BLELL ADV_INTERVAL_TIMEOUT: ADV_INTERVAL (Bitfield-Mask: 0x7fff)*/ +/* ================================================== BLE_BLELL.ADV_INTR =================================================== */ +#define BLE_BLELL_ADV_INTR_ADV_STRT_INTR_Pos (0UL) /*!< BLE_BLELL ADV_INTR: ADV_STRT_INTR (Bit 0) */ +#define BLE_BLELL_ADV_INTR_ADV_STRT_INTR_Msk (0x1UL) /*!< BLE_BLELL ADV_INTR: ADV_STRT_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_INTR_ADV_CLOSE_INTR_Pos (1UL) /*!< BLE_BLELL ADV_INTR: ADV_CLOSE_INTR (Bit 1) */ +#define BLE_BLELL_ADV_INTR_ADV_CLOSE_INTR_Msk (0x2UL) /*!< BLE_BLELL ADV_INTR: ADV_CLOSE_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_INTR_ADV_TX_INTR_Pos (2UL) /*!< BLE_BLELL ADV_INTR: ADV_TX_INTR (Bit 2) */ +#define BLE_BLELL_ADV_INTR_ADV_TX_INTR_Msk (0x4UL) /*!< BLE_BLELL ADV_INTR: ADV_TX_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_INTR_SCAN_RSP_TX_INTR_Pos (3UL) /*!< BLE_BLELL ADV_INTR: SCAN_RSP_TX_INTR (Bit 3) */ +#define BLE_BLELL_ADV_INTR_SCAN_RSP_TX_INTR_Msk (0x8UL) /*!< BLE_BLELL ADV_INTR: SCAN_RSP_TX_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_INTR_SCAN_REQ_RX_INTR_Pos (4UL) /*!< BLE_BLELL ADV_INTR: SCAN_REQ_RX_INTR (Bit 4) */ +#define BLE_BLELL_ADV_INTR_SCAN_REQ_RX_INTR_Msk (0x10UL) /*!< BLE_BLELL ADV_INTR: SCAN_REQ_RX_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_INTR_CONN_REQ_RX_INTR_Pos (5UL) /*!< BLE_BLELL ADV_INTR: CONN_REQ_RX_INTR (Bit 5) */ +#define BLE_BLELL_ADV_INTR_CONN_REQ_RX_INTR_Msk (0x20UL) /*!< BLE_BLELL ADV_INTR: CONN_REQ_RX_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_INTR_SLV_CONNECTED_Pos (6UL) /*!< BLE_BLELL ADV_INTR: SLV_CONNECTED (Bit 6) */ +#define BLE_BLELL_ADV_INTR_SLV_CONNECTED_Msk (0x40UL) /*!< BLE_BLELL ADV_INTR: SLV_CONNECTED (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_INTR_ADV_TIMEOUT_Pos (7UL) /*!< BLE_BLELL ADV_INTR: ADV_TIMEOUT (Bit 7) */ +#define BLE_BLELL_ADV_INTR_ADV_TIMEOUT_Msk (0x80UL) /*!< BLE_BLELL ADV_INTR: ADV_TIMEOUT (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_INTR_ADV_ON_Pos (8UL) /*!< BLE_BLELL ADV_INTR: ADV_ON (Bit 8) */ +#define BLE_BLELL_ADV_INTR_ADV_ON_Msk (0x100UL) /*!< BLE_BLELL ADV_INTR: ADV_ON (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_INTR_SLV_CONN_PEER_RPA_UNMCH_INTR_Pos (9UL) /*!< BLE_BLELL ADV_INTR: SLV_CONN_PEER_RPA_UNMCH_INTR (Bit 9)*/ +#define BLE_BLELL_ADV_INTR_SLV_CONN_PEER_RPA_UNMCH_INTR_Msk (0x200UL) /*!< BLE_BLELL ADV_INTR: SLV_CONN_PEER_RPA_UNMCH_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_INTR_SCAN_REQ_RX_PEER_RPA_UNMCH_INTR_Pos (10UL) /*!< BLE_BLELL ADV_INTR: SCAN_REQ_RX_PEER_RPA_UNMCH_INTR (Bit 10)*/ +#define BLE_BLELL_ADV_INTR_SCAN_REQ_RX_PEER_RPA_UNMCH_INTR_Msk (0x400UL) /*!< BLE_BLELL ADV_INTR: SCAN_REQ_RX_PEER_RPA_UNMCH_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_INTR_INIT_ADDR_MATCH_PRIV_MISMATCH_INTR_Pos (11UL) /*!< BLE_BLELL ADV_INTR: INIT_ADDR_MATCH_PRIV_MISMATCH_INTR (Bit 11)*/ +#define BLE_BLELL_ADV_INTR_INIT_ADDR_MATCH_PRIV_MISMATCH_INTR_Msk (0x800UL) /*!< BLE_BLELL ADV_INTR: INIT_ADDR_MATCH_PRIV_MISMATCH_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_INTR_SCAN_ADDR_MATCH_PRIV_MISMATCH_INTR_Pos (12UL) /*!< BLE_BLELL ADV_INTR: SCAN_ADDR_MATCH_PRIV_MISMATCH_INTR (Bit 12)*/ +#define BLE_BLELL_ADV_INTR_SCAN_ADDR_MATCH_PRIV_MISMATCH_INTR_Msk (0x1000UL) /*!< BLE_BLELL ADV_INTR: SCAN_ADDR_MATCH_PRIV_MISMATCH_INTR (Bitfield-Mask: 0x01)*/ +/* ============================================== BLE_BLELL.ADV_NEXT_INSTANT =============================================== */ +#define BLE_BLELL_ADV_NEXT_INSTANT_ADV_NEXT_INSTANT_Pos (0UL) /*!< BLE_BLELL ADV_NEXT_INSTANT: ADV_NEXT_INSTANT (Bit 0) */ +#define BLE_BLELL_ADV_NEXT_INSTANT_ADV_NEXT_INSTANT_Msk (0xffffUL) /*!< BLE_BLELL ADV_NEXT_INSTANT: ADV_NEXT_INSTANT (Bitfield-Mask: 0xffff)*/ +/* ================================================ BLE_BLELL.SCAN_INTERVAL ================================================ */ +#define BLE_BLELL_SCAN_INTERVAL_SCAN_INTERVAL_Pos (0UL) /*!< BLE_BLELL SCAN_INTERVAL: SCAN_INTERVAL (Bit 0) */ +#define BLE_BLELL_SCAN_INTERVAL_SCAN_INTERVAL_Msk (0xffffUL) /*!< BLE_BLELL SCAN_INTERVAL: SCAN_INTERVAL (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.SCAN_WINDOW ================================================= */ +#define BLE_BLELL_SCAN_WINDOW_SCAN_WINDOW_Pos (0UL) /*!< BLE_BLELL SCAN_WINDOW: SCAN_WINDOW (Bit 0) */ +#define BLE_BLELL_SCAN_WINDOW_SCAN_WINDOW_Msk (0xffffUL) /*!< BLE_BLELL SCAN_WINDOW: SCAN_WINDOW (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.SCAN_PARAM ================================================== */ +#define BLE_BLELL_SCAN_PARAM_TX_ADDR_Pos (0UL) /*!< BLE_BLELL SCAN_PARAM: TX_ADDR (Bit 0) */ +#define BLE_BLELL_SCAN_PARAM_TX_ADDR_Msk (0x1UL) /*!< BLE_BLELL SCAN_PARAM: TX_ADDR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_SCAN_PARAM_SCAN_TYPE_Pos (1UL) /*!< BLE_BLELL SCAN_PARAM: SCAN_TYPE (Bit 1) */ +#define BLE_BLELL_SCAN_PARAM_SCAN_TYPE_Msk (0x6UL) /*!< BLE_BLELL SCAN_PARAM: SCAN_TYPE (Bitfield-Mask: 0x03) */ +#define BLE_BLELL_SCAN_PARAM_SCAN_FILT_POLICY_Pos (3UL) /*!< BLE_BLELL SCAN_PARAM: SCAN_FILT_POLICY (Bit 3) */ +#define BLE_BLELL_SCAN_PARAM_SCAN_FILT_POLICY_Msk (0x18UL) /*!< BLE_BLELL SCAN_PARAM: SCAN_FILT_POLICY (Bitfield-Mask: 0x03)*/ +#define BLE_BLELL_SCAN_PARAM_DUP_FILT_EN_Pos (5UL) /*!< BLE_BLELL SCAN_PARAM: DUP_FILT_EN (Bit 5) */ +#define BLE_BLELL_SCAN_PARAM_DUP_FILT_EN_Msk (0x20UL) /*!< BLE_BLELL SCAN_PARAM: DUP_FILT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_SCAN_PARAM_DUP_FILT_CHK_ADV_DIR_Pos (6UL) /*!< BLE_BLELL SCAN_PARAM: DUP_FILT_CHK_ADV_DIR (Bit 6) */ +#define BLE_BLELL_SCAN_PARAM_DUP_FILT_CHK_ADV_DIR_Msk (0x40UL) /*!< BLE_BLELL SCAN_PARAM: DUP_FILT_CHK_ADV_DIR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_PARAM_SCAN_RSP_ADVA_CHECK_Pos (7UL) /*!< BLE_BLELL SCAN_PARAM: SCAN_RSP_ADVA_CHECK (Bit 7) */ +#define BLE_BLELL_SCAN_PARAM_SCAN_RSP_ADVA_CHECK_Msk (0x80UL) /*!< BLE_BLELL SCAN_PARAM: SCAN_RSP_ADVA_CHECK (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_PARAM_SCAN_RCV_IA_IN_PRIV_Pos (8UL) /*!< BLE_BLELL SCAN_PARAM: SCAN_RCV_IA_IN_PRIV (Bit 8) */ +#define BLE_BLELL_SCAN_PARAM_SCAN_RCV_IA_IN_PRIV_Msk (0x100UL) /*!< BLE_BLELL SCAN_PARAM: SCAN_RCV_IA_IN_PRIV (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_PARAM_SCAN_RPT_PEER_NRPA_ADDR_IN_PRIV_Pos (9UL) /*!< BLE_BLELL SCAN_PARAM: SCAN_RPT_PEER_NRPA_ADDR_IN_PRIV (Bit 9)*/ +#define BLE_BLELL_SCAN_PARAM_SCAN_RPT_PEER_NRPA_ADDR_IN_PRIV_Msk (0x200UL) /*!< BLE_BLELL SCAN_PARAM: SCAN_RPT_PEER_NRPA_ADDR_IN_PRIV (Bitfield-Mask: 0x01)*/ +/* ================================================== BLE_BLELL.SCAN_INTR ================================================== */ +#define BLE_BLELL_SCAN_INTR_SCAN_STRT_INTR_Pos (0UL) /*!< BLE_BLELL SCAN_INTR: SCAN_STRT_INTR (Bit 0) */ +#define BLE_BLELL_SCAN_INTR_SCAN_STRT_INTR_Msk (0x1UL) /*!< BLE_BLELL SCAN_INTR: SCAN_STRT_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_SCAN_INTR_SCAN_CLOSE_INTR_Pos (1UL) /*!< BLE_BLELL SCAN_INTR: SCAN_CLOSE_INTR (Bit 1) */ +#define BLE_BLELL_SCAN_INTR_SCAN_CLOSE_INTR_Msk (0x2UL) /*!< BLE_BLELL SCAN_INTR: SCAN_CLOSE_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_INTR_SCAN_TX_INTR_Pos (2UL) /*!< BLE_BLELL SCAN_INTR: SCAN_TX_INTR (Bit 2) */ +#define BLE_BLELL_SCAN_INTR_SCAN_TX_INTR_Msk (0x4UL) /*!< BLE_BLELL SCAN_INTR: SCAN_TX_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_SCAN_INTR_ADV_RX_INTR_Pos (3UL) /*!< BLE_BLELL SCAN_INTR: ADV_RX_INTR (Bit 3) */ +#define BLE_BLELL_SCAN_INTR_ADV_RX_INTR_Msk (0x8UL) /*!< BLE_BLELL SCAN_INTR: ADV_RX_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_SCAN_INTR_SCAN_RSP_RX_INTR_Pos (4UL) /*!< BLE_BLELL SCAN_INTR: SCAN_RSP_RX_INTR (Bit 4) */ +#define BLE_BLELL_SCAN_INTR_SCAN_RSP_RX_INTR_Msk (0x10UL) /*!< BLE_BLELL SCAN_INTR: SCAN_RSP_RX_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_INTR_ADV_RX_PEER_RPA_UNMCH_INTR_Pos (5UL) /*!< BLE_BLELL SCAN_INTR: ADV_RX_PEER_RPA_UNMCH_INTR (Bit 5) */ +#define BLE_BLELL_SCAN_INTR_ADV_RX_PEER_RPA_UNMCH_INTR_Msk (0x20UL) /*!< BLE_BLELL SCAN_INTR: ADV_RX_PEER_RPA_UNMCH_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_INTR_ADV_RX_SELF_RPA_UNMCH_INTR_Pos (6UL) /*!< BLE_BLELL SCAN_INTR: ADV_RX_SELF_RPA_UNMCH_INTR (Bit 6) */ +#define BLE_BLELL_SCAN_INTR_ADV_RX_SELF_RPA_UNMCH_INTR_Msk (0x40UL) /*!< BLE_BLELL SCAN_INTR: ADV_RX_SELF_RPA_UNMCH_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_INTR_SCANA_TX_ADDR_NOT_SET_INTR_Pos (7UL) /*!< BLE_BLELL SCAN_INTR: SCANA_TX_ADDR_NOT_SET_INTR (Bit 7) */ +#define BLE_BLELL_SCAN_INTR_SCANA_TX_ADDR_NOT_SET_INTR_Msk (0x80UL) /*!< BLE_BLELL SCAN_INTR: SCANA_TX_ADDR_NOT_SET_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_INTR_SCAN_ON_Pos (8UL) /*!< BLE_BLELL SCAN_INTR: SCAN_ON (Bit 8) */ +#define BLE_BLELL_SCAN_INTR_SCAN_ON_Msk (0x100UL) /*!< BLE_BLELL SCAN_INTR: SCAN_ON (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_SCAN_INTR_PEER_ADDR_MATCH_PRIV_MISMATCH_INTR_Pos (9UL) /*!< BLE_BLELL SCAN_INTR: PEER_ADDR_MATCH_PRIV_MISMATCH_INTR (Bit 9)*/ +#define BLE_BLELL_SCAN_INTR_PEER_ADDR_MATCH_PRIV_MISMATCH_INTR_Msk (0x200UL) /*!< BLE_BLELL SCAN_INTR: PEER_ADDR_MATCH_PRIV_MISMATCH_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_INTR_SELF_ADDR_MATCH_PRIV_MISMATCH_INTR_Pos (10UL) /*!< BLE_BLELL SCAN_INTR: SELF_ADDR_MATCH_PRIV_MISMATCH_INTR (Bit 10)*/ +#define BLE_BLELL_SCAN_INTR_SELF_ADDR_MATCH_PRIV_MISMATCH_INTR_Msk (0x400UL) /*!< BLE_BLELL SCAN_INTR: SELF_ADDR_MATCH_PRIV_MISMATCH_INTR (Bitfield-Mask: 0x01)*/ +/* ============================================== BLE_BLELL.SCAN_NEXT_INSTANT ============================================== */ +#define BLE_BLELL_SCAN_NEXT_INSTANT_NEXT_SCAN_INSTANT_Pos (0UL) /*!< BLE_BLELL SCAN_NEXT_INSTANT: NEXT_SCAN_INSTANT (Bit 0) */ +#define BLE_BLELL_SCAN_NEXT_INSTANT_NEXT_SCAN_INSTANT_Msk (0xffffUL) /*!< BLE_BLELL SCAN_NEXT_INSTANT: NEXT_SCAN_INSTANT (Bitfield-Mask: 0xffff)*/ +/* ================================================ BLE_BLELL.INIT_INTERVAL ================================================ */ +#define BLE_BLELL_INIT_INTERVAL_INIT_SCAN_INTERVAL_Pos (0UL) /*!< BLE_BLELL INIT_INTERVAL: INIT_SCAN_INTERVAL (Bit 0) */ +#define BLE_BLELL_INIT_INTERVAL_INIT_SCAN_INTERVAL_Msk (0xffffUL) /*!< BLE_BLELL INIT_INTERVAL: INIT_SCAN_INTERVAL (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.INIT_WINDOW ================================================= */ +#define BLE_BLELL_INIT_WINDOW_INIT_SCAN_WINDOW_Pos (0UL) /*!< BLE_BLELL INIT_WINDOW: INIT_SCAN_WINDOW (Bit 0) */ +#define BLE_BLELL_INIT_WINDOW_INIT_SCAN_WINDOW_Msk (0xffffUL) /*!< BLE_BLELL INIT_WINDOW: INIT_SCAN_WINDOW (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.INIT_PARAM ================================================== */ +#define BLE_BLELL_INIT_PARAM_TX_ADDR_Pos (0UL) /*!< BLE_BLELL INIT_PARAM: TX_ADDR (Bit 0) */ +#define BLE_BLELL_INIT_PARAM_TX_ADDR_Msk (0x1UL) /*!< BLE_BLELL INIT_PARAM: TX_ADDR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_INIT_PARAM_RX_ADDR__RX_TX_ADDR_Pos (1UL) /*!< BLE_BLELL INIT_PARAM: RX_ADDR__RX_TX_ADDR (Bit 1) */ +#define BLE_BLELL_INIT_PARAM_RX_ADDR__RX_TX_ADDR_Msk (0x2UL) /*!< BLE_BLELL INIT_PARAM: RX_ADDR__RX_TX_ADDR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_PARAM_INIT_FILT_POLICY_Pos (3UL) /*!< BLE_BLELL INIT_PARAM: INIT_FILT_POLICY (Bit 3) */ +#define BLE_BLELL_INIT_PARAM_INIT_FILT_POLICY_Msk (0x8UL) /*!< BLE_BLELL INIT_PARAM: INIT_FILT_POLICY (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_PARAM_INIT_RCV_IA_IN_PRIV_Pos (4UL) /*!< BLE_BLELL INIT_PARAM: INIT_RCV_IA_IN_PRIV (Bit 4) */ +#define BLE_BLELL_INIT_PARAM_INIT_RCV_IA_IN_PRIV_Msk (0x10UL) /*!< BLE_BLELL INIT_PARAM: INIT_RCV_IA_IN_PRIV (Bitfield-Mask: 0x01)*/ +/* ================================================== BLE_BLELL.INIT_INTR ================================================== */ +#define BLE_BLELL_INIT_INTR_INIT_INTERVAL_EXPIRE_INTR_Pos (0UL) /*!< BLE_BLELL INIT_INTR: INIT_INTERVAL_EXPIRE_INTR (Bit 0) */ +#define BLE_BLELL_INIT_INTR_INIT_INTERVAL_EXPIRE_INTR_Msk (0x1UL) /*!< BLE_BLELL INIT_INTR: INIT_INTERVAL_EXPIRE_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_INTR_INIT_CLOSE_WINDOW_INR_Pos (1UL) /*!< BLE_BLELL INIT_INTR: INIT_CLOSE_WINDOW_INR (Bit 1) */ +#define BLE_BLELL_INIT_INTR_INIT_CLOSE_WINDOW_INR_Msk (0x2UL) /*!< BLE_BLELL INIT_INTR: INIT_CLOSE_WINDOW_INR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_INTR_INIT_TX_START_INTR_Pos (2UL) /*!< BLE_BLELL INIT_INTR: INIT_TX_START_INTR (Bit 2) */ +#define BLE_BLELL_INIT_INTR_INIT_TX_START_INTR_Msk (0x4UL) /*!< BLE_BLELL INIT_INTR: INIT_TX_START_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_INTR_MASTER_CONN_CREATED_Pos (4UL) /*!< BLE_BLELL INIT_INTR: MASTER_CONN_CREATED (Bit 4) */ +#define BLE_BLELL_INIT_INTR_MASTER_CONN_CREATED_Msk (0x10UL) /*!< BLE_BLELL INIT_INTR: MASTER_CONN_CREATED (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_INTR_ADV_RX_SELF_ADDR_UNMCH_INTR_Pos (5UL) /*!< BLE_BLELL INIT_INTR: ADV_RX_SELF_ADDR_UNMCH_INTR (Bit 5)*/ +#define BLE_BLELL_INIT_INTR_ADV_RX_SELF_ADDR_UNMCH_INTR_Msk (0x20UL) /*!< BLE_BLELL INIT_INTR: ADV_RX_SELF_ADDR_UNMCH_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_INTR_ADV_RX_PEER_ADDR_UNMCH_INTR_Pos (6UL) /*!< BLE_BLELL INIT_INTR: ADV_RX_PEER_ADDR_UNMCH_INTR (Bit 6)*/ +#define BLE_BLELL_INIT_INTR_ADV_RX_PEER_ADDR_UNMCH_INTR_Msk (0x40UL) /*!< BLE_BLELL INIT_INTR: ADV_RX_PEER_ADDR_UNMCH_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_INTR_INITA_TX_ADDR_NOT_SET_INTR_Pos (7UL) /*!< BLE_BLELL INIT_INTR: INITA_TX_ADDR_NOT_SET_INTR (Bit 7) */ +#define BLE_BLELL_INIT_INTR_INITA_TX_ADDR_NOT_SET_INTR_Msk (0x80UL) /*!< BLE_BLELL INIT_INTR: INITA_TX_ADDR_NOT_SET_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_INTR_INI_PEER_ADDR_MATCH_PRIV_MISMATCH_INTR_Pos (8UL) /*!< BLE_BLELL INIT_INTR: INI_PEER_ADDR_MATCH_PRIV_MISMATCH_INTR (Bit 8)*/ +#define BLE_BLELL_INIT_INTR_INI_PEER_ADDR_MATCH_PRIV_MISMATCH_INTR_Msk (0x100UL) /*!< BLE_BLELL INIT_INTR: INI_PEER_ADDR_MATCH_PRIV_MISMATCH_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_INTR_INI_SELF_ADDR_MATCH_PRIV_MISMATCH_INTR_Pos (9UL) /*!< BLE_BLELL INIT_INTR: INI_SELF_ADDR_MATCH_PRIV_MISMATCH_INTR (Bit 9)*/ +#define BLE_BLELL_INIT_INTR_INI_SELF_ADDR_MATCH_PRIV_MISMATCH_INTR_Msk (0x200UL) /*!< BLE_BLELL INIT_INTR: INI_SELF_ADDR_MATCH_PRIV_MISMATCH_INTR (Bitfield-Mask: 0x01)*/ +/* ============================================== BLE_BLELL.INIT_NEXT_INSTANT ============================================== */ +#define BLE_BLELL_INIT_NEXT_INSTANT_INIT_NEXT_INSTANT_Pos (0UL) /*!< BLE_BLELL INIT_NEXT_INSTANT: INIT_NEXT_INSTANT (Bit 0) */ +#define BLE_BLELL_INIT_NEXT_INSTANT_INIT_NEXT_INSTANT_Msk (0xffffUL) /*!< BLE_BLELL INIT_NEXT_INSTANT: INIT_NEXT_INSTANT (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_BLELL.DEVICE_RAND_ADDR_L ============================================== */ +#define BLE_BLELL_DEVICE_RAND_ADDR_L_DEVICE_RAND_ADDR_L_Pos (0UL) /*!< BLE_BLELL DEVICE_RAND_ADDR_L: DEVICE_RAND_ADDR_L (Bit 0)*/ +#define BLE_BLELL_DEVICE_RAND_ADDR_L_DEVICE_RAND_ADDR_L_Msk (0xffffUL) /*!< BLE_BLELL DEVICE_RAND_ADDR_L: DEVICE_RAND_ADDR_L (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_BLELL.DEVICE_RAND_ADDR_M ============================================== */ +#define BLE_BLELL_DEVICE_RAND_ADDR_M_DEVICE_RAND_ADDR_M_Pos (0UL) /*!< BLE_BLELL DEVICE_RAND_ADDR_M: DEVICE_RAND_ADDR_M (Bit 0)*/ +#define BLE_BLELL_DEVICE_RAND_ADDR_M_DEVICE_RAND_ADDR_M_Msk (0xffffUL) /*!< BLE_BLELL DEVICE_RAND_ADDR_M: DEVICE_RAND_ADDR_M (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_BLELL.DEVICE_RAND_ADDR_H ============================================== */ +#define BLE_BLELL_DEVICE_RAND_ADDR_H_DEVICE_RAND_ADDR_H_Pos (0UL) /*!< BLE_BLELL DEVICE_RAND_ADDR_H: DEVICE_RAND_ADDR_H (Bit 0)*/ +#define BLE_BLELL_DEVICE_RAND_ADDR_H_DEVICE_RAND_ADDR_H_Msk (0xffffUL) /*!< BLE_BLELL DEVICE_RAND_ADDR_H: DEVICE_RAND_ADDR_H (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.PEER_ADDR_L ================================================= */ +#define BLE_BLELL_PEER_ADDR_L_PEER_ADDR_L_Pos (0UL) /*!< BLE_BLELL PEER_ADDR_L: PEER_ADDR_L (Bit 0) */ +#define BLE_BLELL_PEER_ADDR_L_PEER_ADDR_L_Msk (0xffffUL) /*!< BLE_BLELL PEER_ADDR_L: PEER_ADDR_L (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.PEER_ADDR_M ================================================= */ +#define BLE_BLELL_PEER_ADDR_M_PEER_ADDR_M_Pos (0UL) /*!< BLE_BLELL PEER_ADDR_M: PEER_ADDR_M (Bit 0) */ +#define BLE_BLELL_PEER_ADDR_M_PEER_ADDR_M_Msk (0xffffUL) /*!< BLE_BLELL PEER_ADDR_M: PEER_ADDR_M (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.PEER_ADDR_H ================================================= */ +#define BLE_BLELL_PEER_ADDR_H_PEER_ADDR_H_Pos (0UL) /*!< BLE_BLELL PEER_ADDR_H: PEER_ADDR_H (Bit 0) */ +#define BLE_BLELL_PEER_ADDR_H_PEER_ADDR_H_Msk (0xffffUL) /*!< BLE_BLELL PEER_ADDR_H: PEER_ADDR_H (Bitfield-Mask: 0xffff)*/ +/* ================================================ BLE_BLELL.WL_ADDR_TYPE ================================================= */ +#define BLE_BLELL_WL_ADDR_TYPE_WL_ADDR_TYPE_Pos (0UL) /*!< BLE_BLELL WL_ADDR_TYPE: WL_ADDR_TYPE (Bit 0) */ +#define BLE_BLELL_WL_ADDR_TYPE_WL_ADDR_TYPE_Msk (0xffffUL) /*!< BLE_BLELL WL_ADDR_TYPE: WL_ADDR_TYPE (Bitfield-Mask: 0xffff)*/ +/* ================================================== BLE_BLELL.WL_ENABLE ================================================== */ +#define BLE_BLELL_WL_ENABLE_WL_ENABLE_Pos (0UL) /*!< BLE_BLELL WL_ENABLE: WL_ENABLE (Bit 0) */ +#define BLE_BLELL_WL_ENABLE_WL_ENABLE_Msk (0xffffUL) /*!< BLE_BLELL WL_ENABLE: WL_ENABLE (Bitfield-Mask: 0xffff) */ +/* =========================================== BLE_BLELL.TRANSMIT_WINDOW_OFFSET ============================================ */ +#define BLE_BLELL_TRANSMIT_WINDOW_OFFSET_TX_WINDOW_OFFSET_Pos (0UL) /*!< BLE_BLELL TRANSMIT_WINDOW_OFFSET: TX_WINDOW_OFFSET (Bit 0)*/ +#define BLE_BLELL_TRANSMIT_WINDOW_OFFSET_TX_WINDOW_OFFSET_Msk (0xffffUL) /*!< BLE_BLELL TRANSMIT_WINDOW_OFFSET: TX_WINDOW_OFFSET (Bitfield-Mask: 0xffff)*/ +/* ============================================ BLE_BLELL.TRANSMIT_WINDOW_SIZE ============================================= */ +#define BLE_BLELL_TRANSMIT_WINDOW_SIZE_TX_WINDOW_SIZE_Pos (0UL) /*!< BLE_BLELL TRANSMIT_WINDOW_SIZE: TX_WINDOW_SIZE (Bit 0) */ +#define BLE_BLELL_TRANSMIT_WINDOW_SIZE_TX_WINDOW_SIZE_Msk (0xffUL) /*!< BLE_BLELL TRANSMIT_WINDOW_SIZE: TX_WINDOW_SIZE (Bitfield-Mask: 0xff)*/ +/* ============================================== BLE_BLELL.DATA_CHANNELS_L0 =============================================== */ +#define BLE_BLELL_DATA_CHANNELS_L0_DATA_CHANNELS_L0_Pos (0UL) /*!< BLE_BLELL DATA_CHANNELS_L0: DATA_CHANNELS_L0 (Bit 0) */ +#define BLE_BLELL_DATA_CHANNELS_L0_DATA_CHANNELS_L0_Msk (0xffffUL) /*!< BLE_BLELL DATA_CHANNELS_L0: DATA_CHANNELS_L0 (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_BLELL.DATA_CHANNELS_M0 =============================================== */ +#define BLE_BLELL_DATA_CHANNELS_M0_DATA_CHANNELS_M0_Pos (0UL) /*!< BLE_BLELL DATA_CHANNELS_M0: DATA_CHANNELS_M0 (Bit 0) */ +#define BLE_BLELL_DATA_CHANNELS_M0_DATA_CHANNELS_M0_Msk (0xffffUL) /*!< BLE_BLELL DATA_CHANNELS_M0: DATA_CHANNELS_M0 (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_BLELL.DATA_CHANNELS_H0 =============================================== */ +#define BLE_BLELL_DATA_CHANNELS_H0_DATA_CHANNELS_H0_Pos (0UL) /*!< BLE_BLELL DATA_CHANNELS_H0: DATA_CHANNELS_H0 (Bit 0) */ +#define BLE_BLELL_DATA_CHANNELS_H0_DATA_CHANNELS_H0_Msk (0x1fUL) /*!< BLE_BLELL DATA_CHANNELS_H0: DATA_CHANNELS_H0 (Bitfield-Mask: 0x1f)*/ +/* ============================================== BLE_BLELL.DATA_CHANNELS_L1 =============================================== */ +#define BLE_BLELL_DATA_CHANNELS_L1_DATA_CHANNELS_L1_Pos (0UL) /*!< BLE_BLELL DATA_CHANNELS_L1: DATA_CHANNELS_L1 (Bit 0) */ +#define BLE_BLELL_DATA_CHANNELS_L1_DATA_CHANNELS_L1_Msk (0xffffUL) /*!< BLE_BLELL DATA_CHANNELS_L1: DATA_CHANNELS_L1 (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_BLELL.DATA_CHANNELS_M1 =============================================== */ +#define BLE_BLELL_DATA_CHANNELS_M1_DATA_CHANNELS_M1_Pos (0UL) /*!< BLE_BLELL DATA_CHANNELS_M1: DATA_CHANNELS_M1 (Bit 0) */ +#define BLE_BLELL_DATA_CHANNELS_M1_DATA_CHANNELS_M1_Msk (0xffffUL) /*!< BLE_BLELL DATA_CHANNELS_M1: DATA_CHANNELS_M1 (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_BLELL.DATA_CHANNELS_H1 =============================================== */ +#define BLE_BLELL_DATA_CHANNELS_H1_DATA_CHANNELS_H1_Pos (0UL) /*!< BLE_BLELL DATA_CHANNELS_H1: DATA_CHANNELS_H1 (Bit 0) */ +#define BLE_BLELL_DATA_CHANNELS_H1_DATA_CHANNELS_H1_Msk (0x1fUL) /*!< BLE_BLELL DATA_CHANNELS_H1: DATA_CHANNELS_H1 (Bitfield-Mask: 0x1f)*/ +/* ================================================== BLE_BLELL.CONN_INTR ================================================== */ +#define BLE_BLELL_CONN_INTR_CONN_CLOSED_Pos (0UL) /*!< BLE_BLELL CONN_INTR: CONN_CLOSED (Bit 0) */ +#define BLE_BLELL_CONN_INTR_CONN_CLOSED_Msk (0x1UL) /*!< BLE_BLELL CONN_INTR: CONN_CLOSED (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CONN_INTR_CONN_ESTB_Pos (1UL) /*!< BLE_BLELL CONN_INTR: CONN_ESTB (Bit 1) */ +#define BLE_BLELL_CONN_INTR_CONN_ESTB_Msk (0x2UL) /*!< BLE_BLELL CONN_INTR: CONN_ESTB (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CONN_INTR_MAP_UPDT_DONE_Pos (2UL) /*!< BLE_BLELL CONN_INTR: MAP_UPDT_DONE (Bit 2) */ +#define BLE_BLELL_CONN_INTR_MAP_UPDT_DONE_Msk (0x4UL) /*!< BLE_BLELL CONN_INTR: MAP_UPDT_DONE (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CONN_INTR_START_CE_Pos (3UL) /*!< BLE_BLELL CONN_INTR: START_CE (Bit 3) */ +#define BLE_BLELL_CONN_INTR_START_CE_Msk (0x8UL) /*!< BLE_BLELL CONN_INTR: START_CE (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CONN_INTR_CLOSE_CE_Pos (4UL) /*!< BLE_BLELL CONN_INTR: CLOSE_CE (Bit 4) */ +#define BLE_BLELL_CONN_INTR_CLOSE_CE_Msk (0x10UL) /*!< BLE_BLELL CONN_INTR: CLOSE_CE (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CONN_INTR_CE_TX_ACK_Pos (5UL) /*!< BLE_BLELL CONN_INTR: CE_TX_ACK (Bit 5) */ +#define BLE_BLELL_CONN_INTR_CE_TX_ACK_Msk (0x20UL) /*!< BLE_BLELL CONN_INTR: CE_TX_ACK (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CONN_INTR_CE_RX_Pos (6UL) /*!< BLE_BLELL CONN_INTR: CE_RX (Bit 6) */ +#define BLE_BLELL_CONN_INTR_CE_RX_Msk (0x40UL) /*!< BLE_BLELL CONN_INTR: CE_RX (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CONN_INTR_CON_UPDT_DONE_Pos (7UL) /*!< BLE_BLELL CONN_INTR: CON_UPDT_DONE (Bit 7) */ +#define BLE_BLELL_CONN_INTR_CON_UPDT_DONE_Msk (0x80UL) /*!< BLE_BLELL CONN_INTR: CON_UPDT_DONE (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CONN_INTR_DISCON_STATUS_Pos (8UL) /*!< BLE_BLELL CONN_INTR: DISCON_STATUS (Bit 8) */ +#define BLE_BLELL_CONN_INTR_DISCON_STATUS_Msk (0x700UL) /*!< BLE_BLELL CONN_INTR: DISCON_STATUS (Bitfield-Mask: 0x07) */ +#define BLE_BLELL_CONN_INTR_RX_PDU_STATUS_Pos (11UL) /*!< BLE_BLELL CONN_INTR: RX_PDU_STATUS (Bit 11) */ +#define BLE_BLELL_CONN_INTR_RX_PDU_STATUS_Msk (0x3800UL) /*!< BLE_BLELL CONN_INTR: RX_PDU_STATUS (Bitfield-Mask: 0x07) */ +#define BLE_BLELL_CONN_INTR_PING_TIMER_EXPIRD_INTR_Pos (14UL) /*!< BLE_BLELL CONN_INTR: PING_TIMER_EXPIRD_INTR (Bit 14) */ +#define BLE_BLELL_CONN_INTR_PING_TIMER_EXPIRD_INTR_Msk (0x4000UL) /*!< BLE_BLELL CONN_INTR: PING_TIMER_EXPIRD_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_PING_NEARLY_EXPIRD_INTR_Pos (15UL) /*!< BLE_BLELL CONN_INTR: PING_NEARLY_EXPIRD_INTR (Bit 15) */ +#define BLE_BLELL_CONN_INTR_PING_NEARLY_EXPIRD_INTR_Msk (0x8000UL) /*!< BLE_BLELL CONN_INTR: PING_NEARLY_EXPIRD_INTR (Bitfield-Mask: 0x01)*/ +/* ================================================= BLE_BLELL.CONN_STATUS ================================================= */ +#define BLE_BLELL_CONN_STATUS_RECEIVE_PACKET_COUNT_Pos (12UL) /*!< BLE_BLELL CONN_STATUS: RECEIVE_PACKET_COUNT (Bit 12) */ +#define BLE_BLELL_CONN_STATUS_RECEIVE_PACKET_COUNT_Msk (0xf000UL) /*!< BLE_BLELL CONN_STATUS: RECEIVE_PACKET_COUNT (Bitfield-Mask: 0x0f)*/ +/* ================================================= BLE_BLELL.CONN_INDEX ================================================== */ +#define BLE_BLELL_CONN_INDEX_CONN_INDEX_Pos (0UL) /*!< BLE_BLELL CONN_INDEX: CONN_INDEX (Bit 0) */ +#define BLE_BLELL_CONN_INDEX_CONN_INDEX_Msk (0xffffUL) /*!< BLE_BLELL CONN_INDEX: CONN_INDEX (Bitfield-Mask: 0xffff) */ +/* ================================================ BLE_BLELL.WAKEUP_CONFIG ================================================ */ +#define BLE_BLELL_WAKEUP_CONFIG_OSC_STARTUP_DELAY_Pos (0UL) /*!< BLE_BLELL WAKEUP_CONFIG: OSC_STARTUP_DELAY (Bit 0) */ +#define BLE_BLELL_WAKEUP_CONFIG_OSC_STARTUP_DELAY_Msk (0xffUL) /*!< BLE_BLELL WAKEUP_CONFIG: OSC_STARTUP_DELAY (Bitfield-Mask: 0xff)*/ +#define BLE_BLELL_WAKEUP_CONFIG_DSM_OFFSET_TO_WAKEUP_INSTANT_Pos (10UL) /*!< BLE_BLELL WAKEUP_CONFIG: DSM_OFFSET_TO_WAKEUP_INSTANT (Bit 10)*/ +#define BLE_BLELL_WAKEUP_CONFIG_DSM_OFFSET_TO_WAKEUP_INSTANT_Msk (0xfc00UL) /*!< BLE_BLELL WAKEUP_CONFIG: DSM_OFFSET_TO_WAKEUP_INSTANT (Bitfield-Mask: 0x3f)*/ +/* =============================================== BLE_BLELL.WAKEUP_CONTROL ================================================ */ +#define BLE_BLELL_WAKEUP_CONTROL_WAKEUP_INSTANT_Pos (0UL) /*!< BLE_BLELL WAKEUP_CONTROL: WAKEUP_INSTANT (Bit 0) */ +#define BLE_BLELL_WAKEUP_CONTROL_WAKEUP_INSTANT_Msk (0xffffUL) /*!< BLE_BLELL WAKEUP_CONTROL: WAKEUP_INSTANT (Bitfield-Mask: 0xffff)*/ +/* ================================================ BLE_BLELL.CLOCK_CONFIG ================================================= */ +#define BLE_BLELL_CLOCK_CONFIG_ADV_CLK_GATE_EN_Pos (0UL) /*!< BLE_BLELL CLOCK_CONFIG: ADV_CLK_GATE_EN (Bit 0) */ +#define BLE_BLELL_CLOCK_CONFIG_ADV_CLK_GATE_EN_Msk (0x1UL) /*!< BLE_BLELL CLOCK_CONFIG: ADV_CLK_GATE_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_SCAN_CLK_GATE_EN_Pos (1UL) /*!< BLE_BLELL CLOCK_CONFIG: SCAN_CLK_GATE_EN (Bit 1) */ +#define BLE_BLELL_CLOCK_CONFIG_SCAN_CLK_GATE_EN_Msk (0x2UL) /*!< BLE_BLELL CLOCK_CONFIG: SCAN_CLK_GATE_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_INIT_CLK_GATE_EN_Pos (2UL) /*!< BLE_BLELL CLOCK_CONFIG: INIT_CLK_GATE_EN (Bit 2) */ +#define BLE_BLELL_CLOCK_CONFIG_INIT_CLK_GATE_EN_Msk (0x4UL) /*!< BLE_BLELL CLOCK_CONFIG: INIT_CLK_GATE_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_CONN_CLK_GATE_EN_Pos (3UL) /*!< BLE_BLELL CLOCK_CONFIG: CONN_CLK_GATE_EN (Bit 3) */ +#define BLE_BLELL_CLOCK_CONFIG_CONN_CLK_GATE_EN_Msk (0x8UL) /*!< BLE_BLELL CLOCK_CONFIG: CONN_CLK_GATE_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_CORECLK_GATE_EN_Pos (4UL) /*!< BLE_BLELL CLOCK_CONFIG: CORECLK_GATE_EN (Bit 4) */ +#define BLE_BLELL_CLOCK_CONFIG_CORECLK_GATE_EN_Msk (0x10UL) /*!< BLE_BLELL CLOCK_CONFIG: CORECLK_GATE_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_SYSCLK_GATE_EN_Pos (5UL) /*!< BLE_BLELL CLOCK_CONFIG: SYSCLK_GATE_EN (Bit 5) */ +#define BLE_BLELL_CLOCK_CONFIG_SYSCLK_GATE_EN_Msk (0x20UL) /*!< BLE_BLELL CLOCK_CONFIG: SYSCLK_GATE_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_PHY_CLK_GATE_EN_Pos (6UL) /*!< BLE_BLELL CLOCK_CONFIG: PHY_CLK_GATE_EN (Bit 6) */ +#define BLE_BLELL_CLOCK_CONFIG_PHY_CLK_GATE_EN_Msk (0x40UL) /*!< BLE_BLELL CLOCK_CONFIG: PHY_CLK_GATE_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_LLH_IDLE_Pos (7UL) /*!< BLE_BLELL CLOCK_CONFIG: LLH_IDLE (Bit 7) */ +#define BLE_BLELL_CLOCK_CONFIG_LLH_IDLE_Msk (0x80UL) /*!< BLE_BLELL CLOCK_CONFIG: LLH_IDLE (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CLOCK_CONFIG_LPO_CLK_FREQ_SEL_Pos (8UL) /*!< BLE_BLELL CLOCK_CONFIG: LPO_CLK_FREQ_SEL (Bit 8) */ +#define BLE_BLELL_CLOCK_CONFIG_LPO_CLK_FREQ_SEL_Msk (0x100UL) /*!< BLE_BLELL CLOCK_CONFIG: LPO_CLK_FREQ_SEL (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_LPO_SEL_EXTERNAL_Pos (9UL) /*!< BLE_BLELL CLOCK_CONFIG: LPO_SEL_EXTERNAL (Bit 9) */ +#define BLE_BLELL_CLOCK_CONFIG_LPO_SEL_EXTERNAL_Msk (0x200UL) /*!< BLE_BLELL CLOCK_CONFIG: LPO_SEL_EXTERNAL (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_SM_AUTO_WKUP_EN_Pos (10UL) /*!< BLE_BLELL CLOCK_CONFIG: SM_AUTO_WKUP_EN (Bit 10) */ +#define BLE_BLELL_CLOCK_CONFIG_SM_AUTO_WKUP_EN_Msk (0x400UL) /*!< BLE_BLELL CLOCK_CONFIG: SM_AUTO_WKUP_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_SM_INTR_EN_Pos (12UL) /*!< BLE_BLELL CLOCK_CONFIG: SM_INTR_EN (Bit 12) */ +#define BLE_BLELL_CLOCK_CONFIG_SM_INTR_EN_Msk (0x1000UL) /*!< BLE_BLELL CLOCK_CONFIG: SM_INTR_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CLOCK_CONFIG_DEEP_SLEEP_AUTO_WKUP_DISABLE_Pos (13UL) /*!< BLE_BLELL CLOCK_CONFIG: DEEP_SLEEP_AUTO_WKUP_DISABLE (Bit 13)*/ +#define BLE_BLELL_CLOCK_CONFIG_DEEP_SLEEP_AUTO_WKUP_DISABLE_Msk (0x2000UL) /*!< BLE_BLELL CLOCK_CONFIG: DEEP_SLEEP_AUTO_WKUP_DISABLE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_SLEEP_MODE_EN_Pos (14UL) /*!< BLE_BLELL CLOCK_CONFIG: SLEEP_MODE_EN (Bit 14) */ +#define BLE_BLELL_CLOCK_CONFIG_SLEEP_MODE_EN_Msk (0x4000UL) /*!< BLE_BLELL CLOCK_CONFIG: SLEEP_MODE_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CLOCK_CONFIG_DEEP_SLEEP_MODE_EN_Pos (15UL) /*!< BLE_BLELL CLOCK_CONFIG: DEEP_SLEEP_MODE_EN (Bit 15) */ +#define BLE_BLELL_CLOCK_CONFIG_DEEP_SLEEP_MODE_EN_Msk (0x8000UL) /*!< BLE_BLELL CLOCK_CONFIG: DEEP_SLEEP_MODE_EN (Bitfield-Mask: 0x01)*/ +/* ================================================ BLE_BLELL.TIM_COUNTER_L ================================================ */ +#define BLE_BLELL_TIM_COUNTER_L_TIM_REF_CLOCK_Pos (0UL) /*!< BLE_BLELL TIM_COUNTER_L: TIM_REF_CLOCK (Bit 0) */ +#define BLE_BLELL_TIM_COUNTER_L_TIM_REF_CLOCK_Msk (0xffffUL) /*!< BLE_BLELL TIM_COUNTER_L: TIM_REF_CLOCK (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_BLELL.WAKEUP_CONFIG_EXTD ============================================== */ +#define BLE_BLELL_WAKEUP_CONFIG_EXTD_DSM_LF_OFFSET_Pos (0UL) /*!< BLE_BLELL WAKEUP_CONFIG_EXTD: DSM_LF_OFFSET (Bit 0) */ +#define BLE_BLELL_WAKEUP_CONFIG_EXTD_DSM_LF_OFFSET_Msk (0x1fUL) /*!< BLE_BLELL WAKEUP_CONFIG_EXTD: DSM_LF_OFFSET (Bitfield-Mask: 0x1f)*/ +/* ============================================ BLE_BLELL.POC_REG__TIM_CONTROL ============================================= */ +#define BLE_BLELL_POC_REG__TIM_CONTROL_BB_CLK_FREQ_MINUS_1_Pos (3UL) /*!< BLE_BLELL POC_REG__TIM_CONTROL: BB_CLK_FREQ_MINUS_1 (Bit 3)*/ +#define BLE_BLELL_POC_REG__TIM_CONTROL_BB_CLK_FREQ_MINUS_1_Msk (0xf8UL) /*!< BLE_BLELL POC_REG__TIM_CONTROL: BB_CLK_FREQ_MINUS_1 (Bitfield-Mask: 0x1f)*/ +#define BLE_BLELL_POC_REG__TIM_CONTROL_START_SLOT_OFFSET_Pos (8UL) /*!< BLE_BLELL POC_REG__TIM_CONTROL: START_SLOT_OFFSET (Bit 8)*/ +#define BLE_BLELL_POC_REG__TIM_CONTROL_START_SLOT_OFFSET_Msk (0xf00UL) /*!< BLE_BLELL POC_REG__TIM_CONTROL: START_SLOT_OFFSET (Bitfield-Mask: 0x0f)*/ +/* ============================================== BLE_BLELL.ADV_TX_DATA_FIFO =============================================== */ +#define BLE_BLELL_ADV_TX_DATA_FIFO_ADV_TX_DATA_Pos (0UL) /*!< BLE_BLELL ADV_TX_DATA_FIFO: ADV_TX_DATA (Bit 0) */ +#define BLE_BLELL_ADV_TX_DATA_FIFO_ADV_TX_DATA_Msk (0xffffUL) /*!< BLE_BLELL ADV_TX_DATA_FIFO: ADV_TX_DATA (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_BLELL.ADV_SCN_RSP_TX_FIFO ============================================= */ +#define BLE_BLELL_ADV_SCN_RSP_TX_FIFO_SCAN_RSP_DATA_Pos (0UL) /*!< BLE_BLELL ADV_SCN_RSP_TX_FIFO: SCAN_RSP_DATA (Bit 0) */ +#define BLE_BLELL_ADV_SCN_RSP_TX_FIFO_SCAN_RSP_DATA_Msk (0xffffUL) /*!< BLE_BLELL ADV_SCN_RSP_TX_FIFO: SCAN_RSP_DATA (Bitfield-Mask: 0xffff)*/ +/* ============================================ BLE_BLELL.INIT_SCN_ADV_RX_FIFO ============================================= */ +#define BLE_BLELL_INIT_SCN_ADV_RX_FIFO_ADV_SCAN_RSP_RX_DATA_Pos (0UL) /*!< BLE_BLELL INIT_SCN_ADV_RX_FIFO: ADV_SCAN_RSP_RX_DATA (Bit 0)*/ +#define BLE_BLELL_INIT_SCN_ADV_RX_FIFO_ADV_SCAN_RSP_RX_DATA_Msk (0xffffUL) /*!< BLE_BLELL INIT_SCN_ADV_RX_FIFO: ADV_SCAN_RSP_RX_DATA (Bitfield-Mask: 0xffff)*/ +/* ================================================ BLE_BLELL.CONN_INTERVAL ================================================ */ +#define BLE_BLELL_CONN_INTERVAL_CONNECTION_INTERVAL_Pos (0UL) /*!< BLE_BLELL CONN_INTERVAL: CONNECTION_INTERVAL (Bit 0) */ +#define BLE_BLELL_CONN_INTERVAL_CONNECTION_INTERVAL_Msk (0xffffUL) /*!< BLE_BLELL CONN_INTERVAL: CONNECTION_INTERVAL (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.SUP_TIMEOUT ================================================= */ +#define BLE_BLELL_SUP_TIMEOUT_SUPERVISION_TIMEOUT_Pos (0UL) /*!< BLE_BLELL SUP_TIMEOUT: SUPERVISION_TIMEOUT (Bit 0) */ +#define BLE_BLELL_SUP_TIMEOUT_SUPERVISION_TIMEOUT_Msk (0xffffUL) /*!< BLE_BLELL SUP_TIMEOUT: SUPERVISION_TIMEOUT (Bitfield-Mask: 0xffff)*/ +/* ================================================ BLE_BLELL.SLAVE_LATENCY ================================================ */ +#define BLE_BLELL_SLAVE_LATENCY_SLAVE_LATENCY_Pos (0UL) /*!< BLE_BLELL SLAVE_LATENCY: SLAVE_LATENCY (Bit 0) */ +#define BLE_BLELL_SLAVE_LATENCY_SLAVE_LATENCY_Msk (0xffffUL) /*!< BLE_BLELL SLAVE_LATENCY: SLAVE_LATENCY (Bitfield-Mask: 0xffff)*/ +/* ================================================== BLE_BLELL.CE_LENGTH ================================================== */ +#define BLE_BLELL_CE_LENGTH_CONNECTION_EVENT_LENGTH_Pos (0UL) /*!< BLE_BLELL CE_LENGTH: CONNECTION_EVENT_LENGTH (Bit 0) */ +#define BLE_BLELL_CE_LENGTH_CONNECTION_EVENT_LENGTH_Msk (0xffffUL) /*!< BLE_BLELL CE_LENGTH: CONNECTION_EVENT_LENGTH (Bitfield-Mask: 0xffff)*/ +/* ========================================= BLE_BLELL.PDU_ACCESS_ADDR_L_REGISTER ========================================== */ +#define BLE_BLELL_PDU_ACCESS_ADDR_L_REGISTER_PDU_ACCESS_ADDRESS_LOWER_BITS_Pos (0UL) /*!< BLE_BLELL PDU_ACCESS_ADDR_L_REGISTER: PDU_ACCESS_ADDRESS_LOWER_BITS (Bit 0)*/ +#define BLE_BLELL_PDU_ACCESS_ADDR_L_REGISTER_PDU_ACCESS_ADDRESS_LOWER_BITS_Msk (0xffffUL) /*!< BLE_BLELL PDU_ACCESS_ADDR_L_REGISTER: PDU_ACCESS_ADDRESS_LOWER_BITS (Bitfield-Mask: 0xffff)*/ +/* ========================================= BLE_BLELL.PDU_ACCESS_ADDR_H_REGISTER ========================================== */ +#define BLE_BLELL_PDU_ACCESS_ADDR_H_REGISTER_PDU_ACCESS_ADDRESS_HIGHER_BITS_Pos (0UL) /*!< BLE_BLELL PDU_ACCESS_ADDR_H_REGISTER: PDU_ACCESS_ADDRESS_HIGHER_BITS (Bit 0)*/ +#define BLE_BLELL_PDU_ACCESS_ADDR_H_REGISTER_PDU_ACCESS_ADDRESS_HIGHER_BITS_Msk (0xffffUL) /*!< BLE_BLELL PDU_ACCESS_ADDR_H_REGISTER: PDU_ACCESS_ADDRESS_HIGHER_BITS (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_CE_INSTANT =============================================== */ +#define BLE_BLELL_CONN_CE_INSTANT_CE_INSTANT_Pos (0UL) /*!< BLE_BLELL CONN_CE_INSTANT: CE_INSTANT (Bit 0) */ +#define BLE_BLELL_CONN_CE_INSTANT_CE_INSTANT_Msk (0xffffUL) /*!< BLE_BLELL CONN_CE_INSTANT: CE_INSTANT (Bitfield-Mask: 0xffff)*/ +/* ============================================ BLE_BLELL.CE_CNFG_STS_REGISTER ============================================= */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_DATA_LIST_INDEX_LAST_ACK_INDEX_Pos (0UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: DATA_LIST_INDEX_LAST_ACK_INDEX (Bit 0)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_DATA_LIST_INDEX_LAST_ACK_INDEX_Msk (0xfUL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: DATA_LIST_INDEX_LAST_ACK_INDEX (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_DATA_LIST_HEAD_UP_Pos (4UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: DATA_LIST_HEAD_UP (Bit 4)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_DATA_LIST_HEAD_UP_Msk (0x10UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: DATA_LIST_HEAD_UP (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_SPARE_Pos (5UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: SPARE (Bit 5) */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_SPARE_Msk (0x20UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: SPARE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_MD_Pos (6UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: MD (Bit 6) */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_MD_Msk (0x40UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: MD (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_MAP_INDEX__CURR_INDEX_Pos (7UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: MAP_INDEX__CURR_INDEX (Bit 7)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_MAP_INDEX__CURR_INDEX_Msk (0x80UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: MAP_INDEX__CURR_INDEX (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_PAUSE_DATA_Pos (8UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: PAUSE_DATA (Bit 8) */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_PAUSE_DATA_Msk (0x100UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: PAUSE_DATA (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_CONN_ACTIVE_Pos (10UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: CONN_ACTIVE (Bit 10) */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_CONN_ACTIVE_Msk (0x400UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: CONN_ACTIVE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_CURRENT_PDU_INDEX_Pos (12UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: CURRENT_PDU_INDEX (Bit 12)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_CURRENT_PDU_INDEX_Msk (0xf000UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER: CURRENT_PDU_INDEX (Bitfield-Mask: 0x0f)*/ +/* =============================================== BLE_BLELL.NEXT_CE_INSTANT =============================================== */ +#define BLE_BLELL_NEXT_CE_INSTANT_NEXT_CE_INSTANT_Pos (0UL) /*!< BLE_BLELL NEXT_CE_INSTANT: NEXT_CE_INSTANT (Bit 0) */ +#define BLE_BLELL_NEXT_CE_INSTANT_NEXT_CE_INSTANT_Msk (0xffffUL) /*!< BLE_BLELL NEXT_CE_INSTANT: NEXT_CE_INSTANT (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_CE_COUNTER =============================================== */ +#define BLE_BLELL_CONN_CE_COUNTER_CONNECTION_EVENT_COUNTER_Pos (0UL) /*!< BLE_BLELL CONN_CE_COUNTER: CONNECTION_EVENT_COUNTER (Bit 0)*/ +#define BLE_BLELL_CONN_CE_COUNTER_CONNECTION_EVENT_COUNTER_Msk (0xffffUL) /*!< BLE_BLELL CONN_CE_COUNTER: CONNECTION_EVENT_COUNTER (Bitfield-Mask: 0xffff)*/ +/* ======================================== BLE_BLELL.DATA_LIST_SENT_UPDATE__STATUS ======================================== */ +#define BLE_BLELL_DATA_LIST_SENT_UPDATE__STATUS_LIST_INDEX__TX_SENT_3_0_Pos (0UL) /*!< BLE_BLELL DATA_LIST_SENT_UPDATE__STATUS: LIST_INDEX__TX_SENT_3_0 (Bit 0)*/ +#define BLE_BLELL_DATA_LIST_SENT_UPDATE__STATUS_LIST_INDEX__TX_SENT_3_0_Msk (0xfUL) /*!< BLE_BLELL DATA_LIST_SENT_UPDATE__STATUS: LIST_INDEX__TX_SENT_3_0 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_DATA_LIST_SENT_UPDATE__STATUS_SET_CLEAR_Pos (7UL) /*!< BLE_BLELL DATA_LIST_SENT_UPDATE__STATUS: SET_CLEAR (Bit 7)*/ +#define BLE_BLELL_DATA_LIST_SENT_UPDATE__STATUS_SET_CLEAR_Msk (0x80UL) /*!< BLE_BLELL DATA_LIST_SENT_UPDATE__STATUS: SET_CLEAR (Bitfield-Mask: 0x01)*/ +/* ======================================== BLE_BLELL.DATA_LIST_ACK_UPDATE__STATUS ========================================= */ +#define BLE_BLELL_DATA_LIST_ACK_UPDATE__STATUS_LIST_INDEX__TX_ACK_3_0_Pos (0UL) /*!< BLE_BLELL DATA_LIST_ACK_UPDATE__STATUS: LIST_INDEX__TX_ACK_3_0 (Bit 0)*/ +#define BLE_BLELL_DATA_LIST_ACK_UPDATE__STATUS_LIST_INDEX__TX_ACK_3_0_Msk (0xfUL) /*!< BLE_BLELL DATA_LIST_ACK_UPDATE__STATUS: LIST_INDEX__TX_ACK_3_0 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_DATA_LIST_ACK_UPDATE__STATUS_SET_CLEAR_Pos (7UL) /*!< BLE_BLELL DATA_LIST_ACK_UPDATE__STATUS: SET_CLEAR (Bit 7)*/ +#define BLE_BLELL_DATA_LIST_ACK_UPDATE__STATUS_SET_CLEAR_Msk (0x80UL) /*!< BLE_BLELL DATA_LIST_ACK_UPDATE__STATUS: SET_CLEAR (Bitfield-Mask: 0x01)*/ +/* ========================================== BLE_BLELL.CE_CNFG_STS_REGISTER_EXT =========================================== */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_EXT_TX_2M_Pos (0UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER_EXT: TX_2M (Bit 0) */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_EXT_TX_2M_Msk (0x1UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER_EXT: TX_2M (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_EXT_RX_2M_Pos (1UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER_EXT: RX_2M (Bit 1) */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_EXT_RX_2M_Msk (0x2UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER_EXT: RX_2M (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_EXT_SN_Pos (2UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER_EXT: SN (Bit 2) */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_EXT_SN_Msk (0x4UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER_EXT: SN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_EXT_NESN_Pos (3UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER_EXT: NESN (Bit 3) */ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_EXT_NESN_Msk (0x8UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER_EXT: NESN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_EXT_LAST_UNMAPPED_CHANNEL_Pos (8UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER_EXT: LAST_UNMAPPED_CHANNEL (Bit 8)*/ +#define BLE_BLELL_CE_CNFG_STS_REGISTER_EXT_LAST_UNMAPPED_CHANNEL_Msk (0x3f00UL) /*!< BLE_BLELL CE_CNFG_STS_REGISTER_EXT: LAST_UNMAPPED_CHANNEL (Bitfield-Mask: 0x3f)*/ +/* ================================================ BLE_BLELL.CONN_EXT_INTR ================================================ */ +#define BLE_BLELL_CONN_EXT_INTR_DATARATE_UPDATE_Pos (0UL) /*!< BLE_BLELL CONN_EXT_INTR: DATARATE_UPDATE (Bit 0) */ +#define BLE_BLELL_CONN_EXT_INTR_DATARATE_UPDATE_Msk (0x1UL) /*!< BLE_BLELL CONN_EXT_INTR: DATARATE_UPDATE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_EXT_INTR_EARLY_INTR_Pos (1UL) /*!< BLE_BLELL CONN_EXT_INTR: EARLY_INTR (Bit 1) */ +#define BLE_BLELL_CONN_EXT_INTR_EARLY_INTR_Msk (0x2UL) /*!< BLE_BLELL CONN_EXT_INTR: EARLY_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CONN_EXT_INTR_GEN_TIMER_INTR_Pos (2UL) /*!< BLE_BLELL CONN_EXT_INTR: GEN_TIMER_INTR (Bit 2) */ +#define BLE_BLELL_CONN_EXT_INTR_GEN_TIMER_INTR_Msk (0x4UL) /*!< BLE_BLELL CONN_EXT_INTR: GEN_TIMER_INTR (Bitfield-Mask: 0x01)*/ +/* ============================================= BLE_BLELL.CONN_EXT_INTR_MASK ============================================== */ +#define BLE_BLELL_CONN_EXT_INTR_MASK_DATARATE_UPDATE_Pos (0UL) /*!< BLE_BLELL CONN_EXT_INTR_MASK: DATARATE_UPDATE (Bit 0) */ +#define BLE_BLELL_CONN_EXT_INTR_MASK_DATARATE_UPDATE_Msk (0x1UL) /*!< BLE_BLELL CONN_EXT_INTR_MASK: DATARATE_UPDATE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_EXT_INTR_MASK_EARLY_INTR_Pos (1UL) /*!< BLE_BLELL CONN_EXT_INTR_MASK: EARLY_INTR (Bit 1) */ +#define BLE_BLELL_CONN_EXT_INTR_MASK_EARLY_INTR_Msk (0x2UL) /*!< BLE_BLELL CONN_EXT_INTR_MASK: EARLY_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_EXT_INTR_MASK_GEN_TIMER_INTR_Pos (2UL) /*!< BLE_BLELL CONN_EXT_INTR_MASK: GEN_TIMER_INTR (Bit 2) */ +#define BLE_BLELL_CONN_EXT_INTR_MASK_GEN_TIMER_INTR_Msk (0x4UL) /*!< BLE_BLELL CONN_EXT_INTR_MASK: GEN_TIMER_INTR (Bitfield-Mask: 0x01)*/ +/* ============================================= BLE_BLELL.DATA_MEM_DESCRIPTOR ============================================= */ +#define BLE_BLELL_DATA_MEM_DESCRIPTOR_LLID_Pos (0UL) /*!< BLE_BLELL DATA_MEM_DESCRIPTOR: LLID (Bit 0) */ +#define BLE_BLELL_DATA_MEM_DESCRIPTOR_LLID_Msk (0x3UL) /*!< BLE_BLELL DATA_MEM_DESCRIPTOR: LLID (Bitfield-Mask: 0x03) */ +#define BLE_BLELL_DATA_MEM_DESCRIPTOR_DATA_LENGTH_Pos (2UL) /*!< BLE_BLELL DATA_MEM_DESCRIPTOR: DATA_LENGTH (Bit 2) */ +#define BLE_BLELL_DATA_MEM_DESCRIPTOR_DATA_LENGTH_Msk (0x3fcUL) /*!< BLE_BLELL DATA_MEM_DESCRIPTOR: DATA_LENGTH (Bitfield-Mask: 0xff)*/ +/* ============================================= BLE_BLELL.WINDOW_WIDEN_INTVL ============================================== */ +#define BLE_BLELL_WINDOW_WIDEN_INTVL_WINDOW_WIDEN_INTVL_Pos (0UL) /*!< BLE_BLELL WINDOW_WIDEN_INTVL: WINDOW_WIDEN_INTVL (Bit 0)*/ +#define BLE_BLELL_WINDOW_WIDEN_INTVL_WINDOW_WIDEN_INTVL_Msk (0xfffUL) /*!< BLE_BLELL WINDOW_WIDEN_INTVL: WINDOW_WIDEN_INTVL (Bitfield-Mask: 0xfff)*/ +/* ============================================= BLE_BLELL.WINDOW_WIDEN_WINOFF ============================================= */ +#define BLE_BLELL_WINDOW_WIDEN_WINOFF_WINDOW_WIDEN_WINOFF_Pos (0UL) /*!< BLE_BLELL WINDOW_WIDEN_WINOFF: WINDOW_WIDEN_WINOFF (Bit 0)*/ +#define BLE_BLELL_WINDOW_WIDEN_WINOFF_WINDOW_WIDEN_WINOFF_Msk (0xfffUL) /*!< BLE_BLELL WINDOW_WIDEN_WINOFF: WINDOW_WIDEN_WINOFF (Bitfield-Mask: 0xfff)*/ +/* =============================================== BLE_BLELL.LE_RF_TEST_MODE =============================================== */ +#define BLE_BLELL_LE_RF_TEST_MODE_TEST_FREQUENCY_Pos (0UL) /*!< BLE_BLELL LE_RF_TEST_MODE: TEST_FREQUENCY (Bit 0) */ +#define BLE_BLELL_LE_RF_TEST_MODE_TEST_FREQUENCY_Msk (0x3fUL) /*!< BLE_BLELL LE_RF_TEST_MODE: TEST_FREQUENCY (Bitfield-Mask: 0x3f)*/ +#define BLE_BLELL_LE_RF_TEST_MODE_DTM_STATUS__DTM_CONT_RXEN_Pos (6UL) /*!< BLE_BLELL LE_RF_TEST_MODE: DTM_STATUS__DTM_CONT_RXEN (Bit 6)*/ +#define BLE_BLELL_LE_RF_TEST_MODE_DTM_STATUS__DTM_CONT_RXEN_Msk (0x40UL) /*!< BLE_BLELL LE_RF_TEST_MODE: DTM_STATUS__DTM_CONT_RXEN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LE_RF_TEST_MODE_PKT_PAYLOAD_Pos (7UL) /*!< BLE_BLELL LE_RF_TEST_MODE: PKT_PAYLOAD (Bit 7) */ +#define BLE_BLELL_LE_RF_TEST_MODE_PKT_PAYLOAD_Msk (0x380UL) /*!< BLE_BLELL LE_RF_TEST_MODE: PKT_PAYLOAD (Bitfield-Mask: 0x07)*/ +#define BLE_BLELL_LE_RF_TEST_MODE_DTM_CONT_TXEN_Pos (13UL) /*!< BLE_BLELL LE_RF_TEST_MODE: DTM_CONT_TXEN (Bit 13) */ +#define BLE_BLELL_LE_RF_TEST_MODE_DTM_CONT_TXEN_Msk (0x2000UL) /*!< BLE_BLELL LE_RF_TEST_MODE: DTM_CONT_TXEN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LE_RF_TEST_MODE_DTM_DATA_2MBPS_Pos (15UL) /*!< BLE_BLELL LE_RF_TEST_MODE: DTM_DATA_2MBPS (Bit 15) */ +#define BLE_BLELL_LE_RF_TEST_MODE_DTM_DATA_2MBPS_Msk (0x8000UL) /*!< BLE_BLELL LE_RF_TEST_MODE: DTM_DATA_2MBPS (Bitfield-Mask: 0x01)*/ +/* ============================================== BLE_BLELL.DTM_RX_PKT_COUNT =============================================== */ +#define BLE_BLELL_DTM_RX_PKT_COUNT_RX_PACKET_COUNT_Pos (0UL) /*!< BLE_BLELL DTM_RX_PKT_COUNT: RX_PACKET_COUNT (Bit 0) */ +#define BLE_BLELL_DTM_RX_PKT_COUNT_RX_PACKET_COUNT_Msk (0xffffUL) /*!< BLE_BLELL DTM_RX_PKT_COUNT: RX_PACKET_COUNT (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_BLELL.LE_RF_TEST_MODE_EXT ============================================= */ +#define BLE_BLELL_LE_RF_TEST_MODE_EXT_DTM_PACKET_LENGTH_Pos (0UL) /*!< BLE_BLELL LE_RF_TEST_MODE_EXT: DTM_PACKET_LENGTH (Bit 0)*/ +#define BLE_BLELL_LE_RF_TEST_MODE_EXT_DTM_PACKET_LENGTH_Msk (0xffUL) /*!< BLE_BLELL LE_RF_TEST_MODE_EXT: DTM_PACKET_LENGTH (Bitfield-Mask: 0xff)*/ +/* ================================================== BLE_BLELL.TXRX_HOP =================================================== */ +#define BLE_BLELL_TXRX_HOP_HOP_CH_TX_Pos (0UL) /*!< BLE_BLELL TXRX_HOP: HOP_CH_TX (Bit 0) */ +#define BLE_BLELL_TXRX_HOP_HOP_CH_TX_Msk (0x7fUL) /*!< BLE_BLELL TXRX_HOP: HOP_CH_TX (Bitfield-Mask: 0x7f) */ +#define BLE_BLELL_TXRX_HOP_HOP_CH_RX_Pos (8UL) /*!< BLE_BLELL TXRX_HOP: HOP_CH_RX (Bit 8) */ +#define BLE_BLELL_TXRX_HOP_HOP_CH_RX_Msk (0x7f00UL) /*!< BLE_BLELL TXRX_HOP: HOP_CH_RX (Bitfield-Mask: 0x7f) */ +/* =============================================== BLE_BLELL.TX_RX_ON_DELAY ================================================ */ +#define BLE_BLELL_TX_RX_ON_DELAY_RXON_DELAY_Pos (0UL) /*!< BLE_BLELL TX_RX_ON_DELAY: RXON_DELAY (Bit 0) */ +#define BLE_BLELL_TX_RX_ON_DELAY_RXON_DELAY_Msk (0xffUL) /*!< BLE_BLELL TX_RX_ON_DELAY: RXON_DELAY (Bitfield-Mask: 0xff)*/ +#define BLE_BLELL_TX_RX_ON_DELAY_TXON_DELAY_Pos (8UL) /*!< BLE_BLELL TX_RX_ON_DELAY: TXON_DELAY (Bit 8) */ +#define BLE_BLELL_TX_RX_ON_DELAY_TXON_DELAY_Msk (0xff00UL) /*!< BLE_BLELL TX_RX_ON_DELAY: TXON_DELAY (Bitfield-Mask: 0xff)*/ +/* ================================================ BLE_BLELL.ADV_ACCADDR_L ================================================ */ +#define BLE_BLELL_ADV_ACCADDR_L_ADV_ACCADDR_L_Pos (0UL) /*!< BLE_BLELL ADV_ACCADDR_L: ADV_ACCADDR_L (Bit 0) */ +#define BLE_BLELL_ADV_ACCADDR_L_ADV_ACCADDR_L_Msk (0xffffUL) /*!< BLE_BLELL ADV_ACCADDR_L: ADV_ACCADDR_L (Bitfield-Mask: 0xffff)*/ +/* ================================================ BLE_BLELL.ADV_ACCADDR_H ================================================ */ +#define BLE_BLELL_ADV_ACCADDR_H_ADV_ACCADDR_H_Pos (0UL) /*!< BLE_BLELL ADV_ACCADDR_H: ADV_ACCADDR_H (Bit 0) */ +#define BLE_BLELL_ADV_ACCADDR_H_ADV_ACCADDR_H_Msk (0xffffUL) /*!< BLE_BLELL ADV_ACCADDR_H: ADV_ACCADDR_H (Bitfield-Mask: 0xffff)*/ +/* =========================================== BLE_BLELL.ADV_CH_TX_POWER_LVL_LS ============================================ */ +#define BLE_BLELL_ADV_CH_TX_POWER_LVL_LS_ADV_TRANSMIT_POWER_LVL_LS_Pos (0UL) /*!< BLE_BLELL ADV_CH_TX_POWER_LVL_LS: ADV_TRANSMIT_POWER_LVL_LS (Bit 0)*/ +#define BLE_BLELL_ADV_CH_TX_POWER_LVL_LS_ADV_TRANSMIT_POWER_LVL_LS_Msk (0xffffUL) /*!< BLE_BLELL ADV_CH_TX_POWER_LVL_LS: ADV_TRANSMIT_POWER_LVL_LS (Bitfield-Mask: 0xffff)*/ +/* =========================================== BLE_BLELL.ADV_CH_TX_POWER_LVL_MS ============================================ */ +#define BLE_BLELL_ADV_CH_TX_POWER_LVL_MS_ADV_TRANSMIT_POWER_LVL_MS_Pos (0UL) /*!< BLE_BLELL ADV_CH_TX_POWER_LVL_MS: ADV_TRANSMIT_POWER_LVL_MS (Bit 0)*/ +#define BLE_BLELL_ADV_CH_TX_POWER_LVL_MS_ADV_TRANSMIT_POWER_LVL_MS_Msk (0x3UL) /*!< BLE_BLELL ADV_CH_TX_POWER_LVL_MS: ADV_TRANSMIT_POWER_LVL_MS (Bitfield-Mask: 0x03)*/ +/* =========================================== BLE_BLELL.CONN_CH_TX_POWER_LVL_LS =========================================== */ +#define BLE_BLELL_CONN_CH_TX_POWER_LVL_LS_CONNCH_TRANSMIT_POWER_LVL_LS_Pos (0UL) /*!< BLE_BLELL CONN_CH_TX_POWER_LVL_LS: CONNCH_TRANSMIT_POWER_LVL_LS (Bit 0)*/ +#define BLE_BLELL_CONN_CH_TX_POWER_LVL_LS_CONNCH_TRANSMIT_POWER_LVL_LS_Msk (0xffffUL) /*!< BLE_BLELL CONN_CH_TX_POWER_LVL_LS: CONNCH_TRANSMIT_POWER_LVL_LS (Bitfield-Mask: 0xffff)*/ +/* =========================================== BLE_BLELL.CONN_CH_TX_POWER_LVL_MS =========================================== */ +#define BLE_BLELL_CONN_CH_TX_POWER_LVL_MS_CONNCH_TRANSMIT_POWER_LVL_MS_Pos (0UL) /*!< BLE_BLELL CONN_CH_TX_POWER_LVL_MS: CONNCH_TRANSMIT_POWER_LVL_MS (Bit 0)*/ +#define BLE_BLELL_CONN_CH_TX_POWER_LVL_MS_CONNCH_TRANSMIT_POWER_LVL_MS_Msk (0x3UL) /*!< BLE_BLELL CONN_CH_TX_POWER_LVL_MS: CONNCH_TRANSMIT_POWER_LVL_MS (Bitfield-Mask: 0x03)*/ +/* =============================================== BLE_BLELL.DEV_PUB_ADDR_L ================================================ */ +#define BLE_BLELL_DEV_PUB_ADDR_L_DEV_PUB_ADDR_L_Pos (0UL) /*!< BLE_BLELL DEV_PUB_ADDR_L: DEV_PUB_ADDR_L (Bit 0) */ +#define BLE_BLELL_DEV_PUB_ADDR_L_DEV_PUB_ADDR_L_Msk (0xffffUL) /*!< BLE_BLELL DEV_PUB_ADDR_L: DEV_PUB_ADDR_L (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.DEV_PUB_ADDR_M ================================================ */ +#define BLE_BLELL_DEV_PUB_ADDR_M_DEV_PUB_ADDR_M_Pos (0UL) /*!< BLE_BLELL DEV_PUB_ADDR_M: DEV_PUB_ADDR_M (Bit 0) */ +#define BLE_BLELL_DEV_PUB_ADDR_M_DEV_PUB_ADDR_M_Msk (0xffffUL) /*!< BLE_BLELL DEV_PUB_ADDR_M: DEV_PUB_ADDR_M (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.DEV_PUB_ADDR_H ================================================ */ +#define BLE_BLELL_DEV_PUB_ADDR_H_DEV_PUB_ADDR_H_Pos (0UL) /*!< BLE_BLELL DEV_PUB_ADDR_H: DEV_PUB_ADDR_H (Bit 0) */ +#define BLE_BLELL_DEV_PUB_ADDR_H_DEV_PUB_ADDR_H_Msk (0xffffUL) /*!< BLE_BLELL DEV_PUB_ADDR_H: DEV_PUB_ADDR_H (Bitfield-Mask: 0xffff)*/ +/* =========================================== BLE_BLELL.OFFSET_TO_FIRST_INSTANT =========================================== */ +#define BLE_BLELL_OFFSET_TO_FIRST_INSTANT_OFFSET_TO_FIRST_EVENT_Pos (0UL) /*!< BLE_BLELL OFFSET_TO_FIRST_INSTANT: OFFSET_TO_FIRST_EVENT (Bit 0)*/ +#define BLE_BLELL_OFFSET_TO_FIRST_INSTANT_OFFSET_TO_FIRST_EVENT_Msk (0xffffUL) /*!< BLE_BLELL OFFSET_TO_FIRST_INSTANT: OFFSET_TO_FIRST_EVENT (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.ADV_CONFIG ================================================== */ +#define BLE_BLELL_ADV_CONFIG_ADV_STRT_EN_Pos (0UL) /*!< BLE_BLELL ADV_CONFIG: ADV_STRT_EN (Bit 0) */ +#define BLE_BLELL_ADV_CONFIG_ADV_STRT_EN_Msk (0x1UL) /*!< BLE_BLELL ADV_CONFIG: ADV_STRT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_CONFIG_ADV_CLS_EN_Pos (1UL) /*!< BLE_BLELL ADV_CONFIG: ADV_CLS_EN (Bit 1) */ +#define BLE_BLELL_ADV_CONFIG_ADV_CLS_EN_Msk (0x2UL) /*!< BLE_BLELL ADV_CONFIG: ADV_CLS_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_CONFIG_ADV_TX_EN_Pos (2UL) /*!< BLE_BLELL ADV_CONFIG: ADV_TX_EN (Bit 2) */ +#define BLE_BLELL_ADV_CONFIG_ADV_TX_EN_Msk (0x4UL) /*!< BLE_BLELL ADV_CONFIG: ADV_TX_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_CONFIG_SCN_RSP_TX_EN_Pos (3UL) /*!< BLE_BLELL ADV_CONFIG: SCN_RSP_TX_EN (Bit 3) */ +#define BLE_BLELL_ADV_CONFIG_SCN_RSP_TX_EN_Msk (0x8UL) /*!< BLE_BLELL ADV_CONFIG: SCN_RSP_TX_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_ADV_CONFIG_ADV_SCN_REQ_RX_EN_Pos (4UL) /*!< BLE_BLELL ADV_CONFIG: ADV_SCN_REQ_RX_EN (Bit 4) */ +#define BLE_BLELL_ADV_CONFIG_ADV_SCN_REQ_RX_EN_Msk (0x10UL) /*!< BLE_BLELL ADV_CONFIG: ADV_SCN_REQ_RX_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_CONFIG_ADV_CONN_REQ_RX_EN_Pos (5UL) /*!< BLE_BLELL ADV_CONFIG: ADV_CONN_REQ_RX_EN (Bit 5) */ +#define BLE_BLELL_ADV_CONFIG_ADV_CONN_REQ_RX_EN_Msk (0x20UL) /*!< BLE_BLELL ADV_CONFIG: ADV_CONN_REQ_RX_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_CONFIG_SLV_CONNECTED_EN_Pos (6UL) /*!< BLE_BLELL ADV_CONFIG: SLV_CONNECTED_EN (Bit 6) */ +#define BLE_BLELL_ADV_CONFIG_SLV_CONNECTED_EN_Msk (0x40UL) /*!< BLE_BLELL ADV_CONFIG: SLV_CONNECTED_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_CONFIG_ADV_TIMEOUT_EN_Pos (7UL) /*!< BLE_BLELL ADV_CONFIG: ADV_TIMEOUT_EN (Bit 7) */ +#define BLE_BLELL_ADV_CONFIG_ADV_TIMEOUT_EN_Msk (0x80UL) /*!< BLE_BLELL ADV_CONFIG: ADV_TIMEOUT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_CONFIG_ADV_RAND_DISABLE_Pos (8UL) /*!< BLE_BLELL ADV_CONFIG: ADV_RAND_DISABLE (Bit 8) */ +#define BLE_BLELL_ADV_CONFIG_ADV_RAND_DISABLE_Msk (0x100UL) /*!< BLE_BLELL ADV_CONFIG: ADV_RAND_DISABLE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_CONFIG_ADV_SCN_PEER_RPA_UNMCH_EN_Pos (9UL) /*!< BLE_BLELL ADV_CONFIG: ADV_SCN_PEER_RPA_UNMCH_EN (Bit 9) */ +#define BLE_BLELL_ADV_CONFIG_ADV_SCN_PEER_RPA_UNMCH_EN_Msk (0x200UL) /*!< BLE_BLELL ADV_CONFIG: ADV_SCN_PEER_RPA_UNMCH_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_CONFIG_ADV_CONN_PEER_RPA_UNMCH_EN_Pos (10UL) /*!< BLE_BLELL ADV_CONFIG: ADV_CONN_PEER_RPA_UNMCH_EN (Bit 10)*/ +#define BLE_BLELL_ADV_CONFIG_ADV_CONN_PEER_RPA_UNMCH_EN_Msk (0x400UL) /*!< BLE_BLELL ADV_CONFIG: ADV_CONN_PEER_RPA_UNMCH_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_ADV_CONFIG_ADV_PKT_INTERVAL_Pos (11UL) /*!< BLE_BLELL ADV_CONFIG: ADV_PKT_INTERVAL (Bit 11) */ +#define BLE_BLELL_ADV_CONFIG_ADV_PKT_INTERVAL_Msk (0xf800UL) /*!< BLE_BLELL ADV_CONFIG: ADV_PKT_INTERVAL (Bitfield-Mask: 0x1f)*/ +/* ================================================= BLE_BLELL.SCAN_CONFIG ================================================= */ +#define BLE_BLELL_SCAN_CONFIG_SCN_STRT_EN_Pos (0UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_STRT_EN (Bit 0) */ +#define BLE_BLELL_SCAN_CONFIG_SCN_STRT_EN_Msk (0x1UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_STRT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_SCAN_CONFIG_SCN_CLOSE_EN_Pos (1UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_CLOSE_EN (Bit 1) */ +#define BLE_BLELL_SCAN_CONFIG_SCN_CLOSE_EN_Msk (0x2UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_CLOSE_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_SCAN_CONFIG_SCN_TX_EN_Pos (2UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_TX_EN (Bit 2) */ +#define BLE_BLELL_SCAN_CONFIG_SCN_TX_EN_Msk (0x4UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_TX_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_SCAN_CONFIG_ADV_RX_EN_Pos (3UL) /*!< BLE_BLELL SCAN_CONFIG: ADV_RX_EN (Bit 3) */ +#define BLE_BLELL_SCAN_CONFIG_ADV_RX_EN_Msk (0x8UL) /*!< BLE_BLELL SCAN_CONFIG: ADV_RX_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_SCAN_CONFIG_SCN_RSP_RX_EN_Pos (4UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_RSP_RX_EN (Bit 4) */ +#define BLE_BLELL_SCAN_CONFIG_SCN_RSP_RX_EN_Msk (0x10UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_RSP_RX_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_CONFIG_SCN_ADV_RX_INTR_PEER_RPA_UNMCH_EN_Pos (5UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_ADV_RX_INTR_PEER_RPA_UNMCH_EN (Bit 5)*/ +#define BLE_BLELL_SCAN_CONFIG_SCN_ADV_RX_INTR_PEER_RPA_UNMCH_EN_Msk (0x20UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_ADV_RX_INTR_PEER_RPA_UNMCH_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_CONFIG_SCN_ADV_RX_INTR_SELF_RPA_UNMCH_EN_Pos (6UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_ADV_RX_INTR_SELF_RPA_UNMCH_EN (Bit 6)*/ +#define BLE_BLELL_SCAN_CONFIG_SCN_ADV_RX_INTR_SELF_RPA_UNMCH_EN_Msk (0x40UL) /*!< BLE_BLELL SCAN_CONFIG: SCN_ADV_RX_INTR_SELF_RPA_UNMCH_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_CONFIG_SCANA_TX_ADDR_NOT_SET_INTR_EN_Pos (7UL) /*!< BLE_BLELL SCAN_CONFIG: SCANA_TX_ADDR_NOT_SET_INTR_EN (Bit 7)*/ +#define BLE_BLELL_SCAN_CONFIG_SCANA_TX_ADDR_NOT_SET_INTR_EN_Msk (0x80UL) /*!< BLE_BLELL SCAN_CONFIG: SCANA_TX_ADDR_NOT_SET_INTR_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_CONFIG_RPT_SELF_ADDR_MATCH_PRIV_MISMATCH_SCN_Pos (8UL) /*!< BLE_BLELL SCAN_CONFIG: RPT_SELF_ADDR_MATCH_PRIV_MISMATCH_SCN (Bit 8)*/ +#define BLE_BLELL_SCAN_CONFIG_RPT_SELF_ADDR_MATCH_PRIV_MISMATCH_SCN_Msk (0x100UL) /*!< BLE_BLELL SCAN_CONFIG: RPT_SELF_ADDR_MATCH_PRIV_MISMATCH_SCN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_CONFIG_BACKOFF_ENABLE_Pos (11UL) /*!< BLE_BLELL SCAN_CONFIG: BACKOFF_ENABLE (Bit 11) */ +#define BLE_BLELL_SCAN_CONFIG_BACKOFF_ENABLE_Msk (0x800UL) /*!< BLE_BLELL SCAN_CONFIG: BACKOFF_ENABLE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_SCAN_CONFIG_SCAN_CHANNEL_MAP_Pos (13UL) /*!< BLE_BLELL SCAN_CONFIG: SCAN_CHANNEL_MAP (Bit 13) */ +#define BLE_BLELL_SCAN_CONFIG_SCAN_CHANNEL_MAP_Msk (0xe000UL) /*!< BLE_BLELL SCAN_CONFIG: SCAN_CHANNEL_MAP (Bitfield-Mask: 0x07)*/ +/* ================================================= BLE_BLELL.INIT_CONFIG ================================================= */ +#define BLE_BLELL_INIT_CONFIG_INIT_STRT_EN_Pos (0UL) /*!< BLE_BLELL INIT_CONFIG: INIT_STRT_EN (Bit 0) */ +#define BLE_BLELL_INIT_CONFIG_INIT_STRT_EN_Msk (0x1UL) /*!< BLE_BLELL INIT_CONFIG: INIT_STRT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_INIT_CONFIG_INIT_CLOSE_EN_Pos (1UL) /*!< BLE_BLELL INIT_CONFIG: INIT_CLOSE_EN (Bit 1) */ +#define BLE_BLELL_INIT_CONFIG_INIT_CLOSE_EN_Msk (0x2UL) /*!< BLE_BLELL INIT_CONFIG: INIT_CLOSE_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_CONFIG_CONN_REQ_TX_EN_Pos (2UL) /*!< BLE_BLELL INIT_CONFIG: CONN_REQ_TX_EN (Bit 2) */ +#define BLE_BLELL_INIT_CONFIG_CONN_REQ_TX_EN_Msk (0x4UL) /*!< BLE_BLELL INIT_CONFIG: CONN_REQ_TX_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_CONFIG_CONN_CREATED_Pos (4UL) /*!< BLE_BLELL INIT_CONFIG: CONN_CREATED (Bit 4) */ +#define BLE_BLELL_INIT_CONFIG_CONN_CREATED_Msk (0x10UL) /*!< BLE_BLELL INIT_CONFIG: CONN_CREATED (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_INIT_CONFIG_INIT_ADV_RX_INTR_SELF_RPA_UNRES_EN_Pos (5UL) /*!< BLE_BLELL INIT_CONFIG: INIT_ADV_RX_INTR_SELF_RPA_UNRES_EN (Bit 5)*/ +#define BLE_BLELL_INIT_CONFIG_INIT_ADV_RX_INTR_SELF_RPA_UNRES_EN_Msk (0x20UL) /*!< BLE_BLELL INIT_CONFIG: INIT_ADV_RX_INTR_SELF_RPA_UNRES_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_CONFIG_INIT_ADV_RX_INTR_PEER_RPA_UNRES_EN_Pos (6UL) /*!< BLE_BLELL INIT_CONFIG: INIT_ADV_RX_INTR_PEER_RPA_UNRES_EN (Bit 6)*/ +#define BLE_BLELL_INIT_CONFIG_INIT_ADV_RX_INTR_PEER_RPA_UNRES_EN_Msk (0x40UL) /*!< BLE_BLELL INIT_CONFIG: INIT_ADV_RX_INTR_PEER_RPA_UNRES_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_CONFIG_INITA_TX_ADDR_NOT_SET_INTR_EN_Pos (7UL) /*!< BLE_BLELL INIT_CONFIG: INITA_TX_ADDR_NOT_SET_INTR_EN (Bit 7)*/ +#define BLE_BLELL_INIT_CONFIG_INITA_TX_ADDR_NOT_SET_INTR_EN_Msk (0x80UL) /*!< BLE_BLELL INIT_CONFIG: INITA_TX_ADDR_NOT_SET_INTR_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_INIT_CONFIG_INIT_CHANNEL_MAP_Pos (13UL) /*!< BLE_BLELL INIT_CONFIG: INIT_CHANNEL_MAP (Bit 13) */ +#define BLE_BLELL_INIT_CONFIG_INIT_CHANNEL_MAP_Msk (0xe000UL) /*!< BLE_BLELL INIT_CONFIG: INIT_CHANNEL_MAP (Bitfield-Mask: 0x07)*/ +/* ================================================= BLE_BLELL.CONN_CONFIG ================================================= */ +#define BLE_BLELL_CONN_CONFIG_RX_PKT_LIMIT_Pos (0UL) /*!< BLE_BLELL CONN_CONFIG: RX_PKT_LIMIT (Bit 0) */ +#define BLE_BLELL_CONN_CONFIG_RX_PKT_LIMIT_Msk (0xfUL) /*!< BLE_BLELL CONN_CONFIG: RX_PKT_LIMIT (Bitfield-Mask: 0x0f) */ +#define BLE_BLELL_CONN_CONFIG_RX_INTR_THRESHOLD_Pos (4UL) /*!< BLE_BLELL CONN_CONFIG: RX_INTR_THRESHOLD (Bit 4) */ +#define BLE_BLELL_CONN_CONFIG_RX_INTR_THRESHOLD_Msk (0xf0UL) /*!< BLE_BLELL CONN_CONFIG: RX_INTR_THRESHOLD (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_CONFIG_MD_BIT_CLEAR_Pos (8UL) /*!< BLE_BLELL CONN_CONFIG: MD_BIT_CLEAR (Bit 8) */ +#define BLE_BLELL_CONN_CONFIG_MD_BIT_CLEAR_Msk (0x100UL) /*!< BLE_BLELL CONN_CONFIG: MD_BIT_CLEAR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_CONN_CONFIG_DSM_SLOT_VARIANCE_Pos (11UL) /*!< BLE_BLELL CONN_CONFIG: DSM_SLOT_VARIANCE (Bit 11) */ +#define BLE_BLELL_CONN_CONFIG_DSM_SLOT_VARIANCE_Msk (0x800UL) /*!< BLE_BLELL CONN_CONFIG: DSM_SLOT_VARIANCE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_CONFIG_SLV_MD_CONFIG_Pos (12UL) /*!< BLE_BLELL CONN_CONFIG: SLV_MD_CONFIG (Bit 12) */ +#define BLE_BLELL_CONN_CONFIG_SLV_MD_CONFIG_Msk (0x1000UL) /*!< BLE_BLELL CONN_CONFIG: SLV_MD_CONFIG (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_CONFIG_EXTEND_CU_TX_WIN_Pos (13UL) /*!< BLE_BLELL CONN_CONFIG: EXTEND_CU_TX_WIN (Bit 13) */ +#define BLE_BLELL_CONN_CONFIG_EXTEND_CU_TX_WIN_Msk (0x2000UL) /*!< BLE_BLELL CONN_CONFIG: EXTEND_CU_TX_WIN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_CONFIG_MASK_SUTO_AT_UPDT_Pos (14UL) /*!< BLE_BLELL CONN_CONFIG: MASK_SUTO_AT_UPDT (Bit 14) */ +#define BLE_BLELL_CONN_CONFIG_MASK_SUTO_AT_UPDT_Msk (0x4000UL) /*!< BLE_BLELL CONN_CONFIG: MASK_SUTO_AT_UPDT (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_CONFIG_CONN_REQ_1SLOT_EARLY_Pos (15UL) /*!< BLE_BLELL CONN_CONFIG: CONN_REQ_1SLOT_EARLY (Bit 15) */ +#define BLE_BLELL_CONN_CONFIG_CONN_REQ_1SLOT_EARLY_Msk (0x8000UL) /*!< BLE_BLELL CONN_CONFIG: CONN_REQ_1SLOT_EARLY (Bitfield-Mask: 0x01)*/ +/* ================================================= BLE_BLELL.CONN_PARAM1 ================================================= */ +#define BLE_BLELL_CONN_PARAM1_SCA_PARAM_Pos (0UL) /*!< BLE_BLELL CONN_PARAM1: SCA_PARAM (Bit 0) */ +#define BLE_BLELL_CONN_PARAM1_SCA_PARAM_Msk (0x7UL) /*!< BLE_BLELL CONN_PARAM1: SCA_PARAM (Bitfield-Mask: 0x07) */ +#define BLE_BLELL_CONN_PARAM1_HOP_INCREMENT_PARAM_Pos (3UL) /*!< BLE_BLELL CONN_PARAM1: HOP_INCREMENT_PARAM (Bit 3) */ +#define BLE_BLELL_CONN_PARAM1_HOP_INCREMENT_PARAM_Msk (0xf8UL) /*!< BLE_BLELL CONN_PARAM1: HOP_INCREMENT_PARAM (Bitfield-Mask: 0x1f)*/ +#define BLE_BLELL_CONN_PARAM1_CRC_INIT_L_Pos (8UL) /*!< BLE_BLELL CONN_PARAM1: CRC_INIT_L (Bit 8) */ +#define BLE_BLELL_CONN_PARAM1_CRC_INIT_L_Msk (0xff00UL) /*!< BLE_BLELL CONN_PARAM1: CRC_INIT_L (Bitfield-Mask: 0xff) */ +/* ================================================= BLE_BLELL.CONN_PARAM2 ================================================= */ +#define BLE_BLELL_CONN_PARAM2_CRC_INIT_H_Pos (0UL) /*!< BLE_BLELL CONN_PARAM2: CRC_INIT_H (Bit 0) */ +#define BLE_BLELL_CONN_PARAM2_CRC_INIT_H_Msk (0xffffUL) /*!< BLE_BLELL CONN_PARAM2: CRC_INIT_H (Bitfield-Mask: 0xffff) */ +/* =============================================== BLE_BLELL.CONN_INTR_MASK ================================================ */ +#define BLE_BLELL_CONN_INTR_MASK_CONN_CL_INT_EN_Pos (0UL) /*!< BLE_BLELL CONN_INTR_MASK: CONN_CL_INT_EN (Bit 0) */ +#define BLE_BLELL_CONN_INTR_MASK_CONN_CL_INT_EN_Msk (0x1UL) /*!< BLE_BLELL CONN_INTR_MASK: CONN_CL_INT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_CONN_ESTB_INT_EN_Pos (1UL) /*!< BLE_BLELL CONN_INTR_MASK: CONN_ESTB_INT_EN (Bit 1) */ +#define BLE_BLELL_CONN_INTR_MASK_CONN_ESTB_INT_EN_Msk (0x2UL) /*!< BLE_BLELL CONN_INTR_MASK: CONN_ESTB_INT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_MAP_UPDT_INT_EN_Pos (2UL) /*!< BLE_BLELL CONN_INTR_MASK: MAP_UPDT_INT_EN (Bit 2) */ +#define BLE_BLELL_CONN_INTR_MASK_MAP_UPDT_INT_EN_Msk (0x4UL) /*!< BLE_BLELL CONN_INTR_MASK: MAP_UPDT_INT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_START_CE_INT_EN_Pos (3UL) /*!< BLE_BLELL CONN_INTR_MASK: START_CE_INT_EN (Bit 3) */ +#define BLE_BLELL_CONN_INTR_MASK_START_CE_INT_EN_Msk (0x8UL) /*!< BLE_BLELL CONN_INTR_MASK: START_CE_INT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_CLOSE_CE_INT_EN_Pos (4UL) /*!< BLE_BLELL CONN_INTR_MASK: CLOSE_CE_INT_EN (Bit 4) */ +#define BLE_BLELL_CONN_INTR_MASK_CLOSE_CE_INT_EN_Msk (0x10UL) /*!< BLE_BLELL CONN_INTR_MASK: CLOSE_CE_INT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_CE_TX_ACK_INT_EN_Pos (5UL) /*!< BLE_BLELL CONN_INTR_MASK: CE_TX_ACK_INT_EN (Bit 5) */ +#define BLE_BLELL_CONN_INTR_MASK_CE_TX_ACK_INT_EN_Msk (0x20UL) /*!< BLE_BLELL CONN_INTR_MASK: CE_TX_ACK_INT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_CE_RX_INT_EN_Pos (6UL) /*!< BLE_BLELL CONN_INTR_MASK: CE_RX_INT_EN (Bit 6) */ +#define BLE_BLELL_CONN_INTR_MASK_CE_RX_INT_EN_Msk (0x40UL) /*!< BLE_BLELL CONN_INTR_MASK: CE_RX_INT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_CONN_UPDATE_INTR_EN_Pos (7UL) /*!< BLE_BLELL CONN_INTR_MASK: CONN_UPDATE_INTR_EN (Bit 7) */ +#define BLE_BLELL_CONN_INTR_MASK_CONN_UPDATE_INTR_EN_Msk (0x80UL) /*!< BLE_BLELL CONN_INTR_MASK: CONN_UPDATE_INTR_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_RX_GOOD_PDU_INT_EN_Pos (8UL) /*!< BLE_BLELL CONN_INTR_MASK: RX_GOOD_PDU_INT_EN (Bit 8) */ +#define BLE_BLELL_CONN_INTR_MASK_RX_GOOD_PDU_INT_EN_Msk (0x100UL) /*!< BLE_BLELL CONN_INTR_MASK: RX_GOOD_PDU_INT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_RX_BAD_PDU_INT_EN_Pos (9UL) /*!< BLE_BLELL CONN_INTR_MASK: RX_BAD_PDU_INT_EN (Bit 9) */ +#define BLE_BLELL_CONN_INTR_MASK_RX_BAD_PDU_INT_EN_Msk (0x200UL) /*!< BLE_BLELL CONN_INTR_MASK: RX_BAD_PDU_INT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_PING_TIMER_EXPIRD_INTR_Pos (14UL) /*!< BLE_BLELL CONN_INTR_MASK: PING_TIMER_EXPIRD_INTR (Bit 14)*/ +#define BLE_BLELL_CONN_INTR_MASK_PING_TIMER_EXPIRD_INTR_Msk (0x4000UL) /*!< BLE_BLELL CONN_INTR_MASK: PING_TIMER_EXPIRD_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_INTR_MASK_PING_NEARLY_EXPIRD_INTR_Pos (15UL) /*!< BLE_BLELL CONN_INTR_MASK: PING_NEARLY_EXPIRD_INTR (Bit 15)*/ +#define BLE_BLELL_CONN_INTR_MASK_PING_NEARLY_EXPIRD_INTR_Msk (0x8000UL) /*!< BLE_BLELL CONN_INTR_MASK: PING_NEARLY_EXPIRD_INTR (Bitfield-Mask: 0x01)*/ +/* ============================================ BLE_BLELL.SLAVE_TIMING_CONTROL ============================================= */ +#define BLE_BLELL_SLAVE_TIMING_CONTROL_SLAVE_TIME_SET_VAL_Pos (0UL) /*!< BLE_BLELL SLAVE_TIMING_CONTROL: SLAVE_TIME_SET_VAL (Bit 0)*/ +#define BLE_BLELL_SLAVE_TIMING_CONTROL_SLAVE_TIME_SET_VAL_Msk (0xffUL) /*!< BLE_BLELL SLAVE_TIMING_CONTROL: SLAVE_TIME_SET_VAL (Bitfield-Mask: 0xff)*/ +#define BLE_BLELL_SLAVE_TIMING_CONTROL_SLAVE_TIME_ADJ_VAL_Pos (8UL) /*!< BLE_BLELL SLAVE_TIMING_CONTROL: SLAVE_TIME_ADJ_VAL (Bit 8)*/ +#define BLE_BLELL_SLAVE_TIMING_CONTROL_SLAVE_TIME_ADJ_VAL_Msk (0xff00UL) /*!< BLE_BLELL SLAVE_TIMING_CONTROL: SLAVE_TIME_ADJ_VAL (Bitfield-Mask: 0xff)*/ +/* ============================================== BLE_BLELL.RECEIVE_TRIG_CTRL ============================================== */ +#define BLE_BLELL_RECEIVE_TRIG_CTRL_ACC_TRIGGER_THRESHOLD_Pos (0UL) /*!< BLE_BLELL RECEIVE_TRIG_CTRL: ACC_TRIGGER_THRESHOLD (Bit 0)*/ +#define BLE_BLELL_RECEIVE_TRIG_CTRL_ACC_TRIGGER_THRESHOLD_Msk (0x3fUL) /*!< BLE_BLELL RECEIVE_TRIG_CTRL: ACC_TRIGGER_THRESHOLD (Bitfield-Mask: 0x3f)*/ +#define BLE_BLELL_RECEIVE_TRIG_CTRL_ACC_TRIGGER_TIMEOUT_Pos (8UL) /*!< BLE_BLELL RECEIVE_TRIG_CTRL: ACC_TRIGGER_TIMEOUT (Bit 8)*/ +#define BLE_BLELL_RECEIVE_TRIG_CTRL_ACC_TRIGGER_TIMEOUT_Msk (0xff00UL) /*!< BLE_BLELL RECEIVE_TRIG_CTRL: ACC_TRIGGER_TIMEOUT (Bitfield-Mask: 0xff)*/ +/* ================================================== BLE_BLELL.LL_DBG_1 =================================================== */ +#define BLE_BLELL_LL_DBG_1_CONN_RX_WR_PTR_Pos (0UL) /*!< BLE_BLELL LL_DBG_1: CONN_RX_WR_PTR (Bit 0) */ +#define BLE_BLELL_LL_DBG_1_CONN_RX_WR_PTR_Msk (0x3ffUL) /*!< BLE_BLELL LL_DBG_1: CONN_RX_WR_PTR (Bitfield-Mask: 0x3ff) */ +/* ================================================== BLE_BLELL.LL_DBG_2 =================================================== */ +#define BLE_BLELL_LL_DBG_2_CONN_RX_RD_PTR_Pos (0UL) /*!< BLE_BLELL LL_DBG_2: CONN_RX_RD_PTR (Bit 0) */ +#define BLE_BLELL_LL_DBG_2_CONN_RX_RD_PTR_Msk (0x3ffUL) /*!< BLE_BLELL LL_DBG_2: CONN_RX_RD_PTR (Bitfield-Mask: 0x3ff) */ +/* ================================================== BLE_BLELL.LL_DBG_3 =================================================== */ +#define BLE_BLELL_LL_DBG_3_CONN_RX_WR_PTR_STORE_Pos (0UL) /*!< BLE_BLELL LL_DBG_3: CONN_RX_WR_PTR_STORE (Bit 0) */ +#define BLE_BLELL_LL_DBG_3_CONN_RX_WR_PTR_STORE_Msk (0x3ffUL) /*!< BLE_BLELL LL_DBG_3: CONN_RX_WR_PTR_STORE (Bitfield-Mask: 0x3ff)*/ +/* ================================================== BLE_BLELL.LL_DBG_4 =================================================== */ +#define BLE_BLELL_LL_DBG_4_CONNECTION_FSM_STATE_Pos (0UL) /*!< BLE_BLELL LL_DBG_4: CONNECTION_FSM_STATE (Bit 0) */ +#define BLE_BLELL_LL_DBG_4_CONNECTION_FSM_STATE_Msk (0xfUL) /*!< BLE_BLELL LL_DBG_4: CONNECTION_FSM_STATE (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_LL_DBG_4_SLAVE_LATENCY_FSM_STATE_Pos (4UL) /*!< BLE_BLELL LL_DBG_4: SLAVE_LATENCY_FSM_STATE (Bit 4) */ +#define BLE_BLELL_LL_DBG_4_SLAVE_LATENCY_FSM_STATE_Msk (0x30UL) /*!< BLE_BLELL LL_DBG_4: SLAVE_LATENCY_FSM_STATE (Bitfield-Mask: 0x03)*/ +#define BLE_BLELL_LL_DBG_4_ADVERTISER_FSM_STATE_Pos (6UL) /*!< BLE_BLELL LL_DBG_4: ADVERTISER_FSM_STATE (Bit 6) */ +#define BLE_BLELL_LL_DBG_4_ADVERTISER_FSM_STATE_Msk (0x7c0UL) /*!< BLE_BLELL LL_DBG_4: ADVERTISER_FSM_STATE (Bitfield-Mask: 0x1f)*/ +/* ================================================== BLE_BLELL.LL_DBG_5 =================================================== */ +#define BLE_BLELL_LL_DBG_5_INIT_FSM_STATE_Pos (0UL) /*!< BLE_BLELL LL_DBG_5: INIT_FSM_STATE (Bit 0) */ +#define BLE_BLELL_LL_DBG_5_INIT_FSM_STATE_Msk (0x1fUL) /*!< BLE_BLELL LL_DBG_5: INIT_FSM_STATE (Bitfield-Mask: 0x1f) */ +#define BLE_BLELL_LL_DBG_5_SCAN_FSM_STATE_Pos (5UL) /*!< BLE_BLELL LL_DBG_5: SCAN_FSM_STATE (Bit 5) */ +#define BLE_BLELL_LL_DBG_5_SCAN_FSM_STATE_Msk (0x3e0UL) /*!< BLE_BLELL LL_DBG_5: SCAN_FSM_STATE (Bitfield-Mask: 0x1f) */ +/* ================================================== BLE_BLELL.LL_DBG_6 =================================================== */ +#define BLE_BLELL_LL_DBG_6_ADV_TX_WR_PTR_Pos (0UL) /*!< BLE_BLELL LL_DBG_6: ADV_TX_WR_PTR (Bit 0) */ +#define BLE_BLELL_LL_DBG_6_ADV_TX_WR_PTR_Msk (0xfUL) /*!< BLE_BLELL LL_DBG_6: ADV_TX_WR_PTR (Bitfield-Mask: 0x0f) */ +#define BLE_BLELL_LL_DBG_6_SCAN_RSP_TX_WR_PTR_Pos (4UL) /*!< BLE_BLELL LL_DBG_6: SCAN_RSP_TX_WR_PTR (Bit 4) */ +#define BLE_BLELL_LL_DBG_6_SCAN_RSP_TX_WR_PTR_Msk (0xf0UL) /*!< BLE_BLELL LL_DBG_6: SCAN_RSP_TX_WR_PTR (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_LL_DBG_6_ADV_TX_RD_PTR_Pos (8UL) /*!< BLE_BLELL LL_DBG_6: ADV_TX_RD_PTR (Bit 8) */ +#define BLE_BLELL_LL_DBG_6_ADV_TX_RD_PTR_Msk (0x3f00UL) /*!< BLE_BLELL LL_DBG_6: ADV_TX_RD_PTR (Bitfield-Mask: 0x3f) */ +/* ================================================== BLE_BLELL.LL_DBG_7 =================================================== */ +#define BLE_BLELL_LL_DBG_7_ADV_RX_WR_PTR_Pos (0UL) /*!< BLE_BLELL LL_DBG_7: ADV_RX_WR_PTR (Bit 0) */ +#define BLE_BLELL_LL_DBG_7_ADV_RX_WR_PTR_Msk (0x7fUL) /*!< BLE_BLELL LL_DBG_7: ADV_RX_WR_PTR (Bitfield-Mask: 0x7f) */ +#define BLE_BLELL_LL_DBG_7_ADV_RX_RD_PTR_Pos (7UL) /*!< BLE_BLELL LL_DBG_7: ADV_RX_RD_PTR (Bit 7) */ +#define BLE_BLELL_LL_DBG_7_ADV_RX_RD_PTR_Msk (0x3f80UL) /*!< BLE_BLELL LL_DBG_7: ADV_RX_RD_PTR (Bitfield-Mask: 0x7f) */ +/* ================================================== BLE_BLELL.LL_DBG_8 =================================================== */ +#define BLE_BLELL_LL_DBG_8_ADV_RX_WR_PTR_STORE_Pos (0UL) /*!< BLE_BLELL LL_DBG_8: ADV_RX_WR_PTR_STORE (Bit 0) */ +#define BLE_BLELL_LL_DBG_8_ADV_RX_WR_PTR_STORE_Msk (0x7fUL) /*!< BLE_BLELL LL_DBG_8: ADV_RX_WR_PTR_STORE (Bitfield-Mask: 0x7f)*/ +#define BLE_BLELL_LL_DBG_8_WLF_PTR_Pos (7UL) /*!< BLE_BLELL LL_DBG_8: WLF_PTR (Bit 7) */ +#define BLE_BLELL_LL_DBG_8_WLF_PTR_Msk (0x3f80UL) /*!< BLE_BLELL LL_DBG_8: WLF_PTR (Bitfield-Mask: 0x7f) */ +/* ================================================== BLE_BLELL.LL_DBG_9 =================================================== */ +#define BLE_BLELL_LL_DBG_9_WINDOW_WIDEN_Pos (0UL) /*!< BLE_BLELL LL_DBG_9: WINDOW_WIDEN (Bit 0) */ +#define BLE_BLELL_LL_DBG_9_WINDOW_WIDEN_Msk (0xffffUL) /*!< BLE_BLELL LL_DBG_9: WINDOW_WIDEN (Bitfield-Mask: 0xffff) */ +/* ================================================== BLE_BLELL.LL_DBG_10 ================================================== */ +#define BLE_BLELL_LL_DBG_10_RF_CHANNEL_NUM_Pos (0UL) /*!< BLE_BLELL LL_DBG_10: RF_CHANNEL_NUM (Bit 0) */ +#define BLE_BLELL_LL_DBG_10_RF_CHANNEL_NUM_Msk (0x3fUL) /*!< BLE_BLELL LL_DBG_10: RF_CHANNEL_NUM (Bitfield-Mask: 0x3f) */ +/* ============================================== BLE_BLELL.PEER_ADDR_INIT_L =============================================== */ +#define BLE_BLELL_PEER_ADDR_INIT_L_PEER_ADDR_L_Pos (0UL) /*!< BLE_BLELL PEER_ADDR_INIT_L: PEER_ADDR_L (Bit 0) */ +#define BLE_BLELL_PEER_ADDR_INIT_L_PEER_ADDR_L_Msk (0xffffUL) /*!< BLE_BLELL PEER_ADDR_INIT_L: PEER_ADDR_L (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_BLELL.PEER_ADDR_INIT_M =============================================== */ +#define BLE_BLELL_PEER_ADDR_INIT_M_PEER_ADDR_M_Pos (0UL) /*!< BLE_BLELL PEER_ADDR_INIT_M: PEER_ADDR_M (Bit 0) */ +#define BLE_BLELL_PEER_ADDR_INIT_M_PEER_ADDR_M_Msk (0xffffUL) /*!< BLE_BLELL PEER_ADDR_INIT_M: PEER_ADDR_M (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_BLELL.PEER_ADDR_INIT_H =============================================== */ +#define BLE_BLELL_PEER_ADDR_INIT_H_PEER_ADDR_H_Pos (0UL) /*!< BLE_BLELL PEER_ADDR_INIT_H: PEER_ADDR_H (Bit 0) */ +#define BLE_BLELL_PEER_ADDR_INIT_H_PEER_ADDR_H_Msk (0xffffUL) /*!< BLE_BLELL PEER_ADDR_INIT_H: PEER_ADDR_H (Bitfield-Mask: 0xffff)*/ +/* =========================================== BLE_BLELL.INIT_WINDOW_TIMER_CTRL ============================================ */ +#define BLE_BLELL_INIT_WINDOW_TIMER_CTRL_INIT_WINDOW_OFFSET_SEL_Pos (0UL) /*!< BLE_BLELL INIT_WINDOW_TIMER_CTRL: INIT_WINDOW_OFFSET_SEL (Bit 0)*/ +#define BLE_BLELL_INIT_WINDOW_TIMER_CTRL_INIT_WINDOW_OFFSET_SEL_Msk (0x1UL) /*!< BLE_BLELL INIT_WINDOW_TIMER_CTRL: INIT_WINDOW_OFFSET_SEL (Bitfield-Mask: 0x01)*/ +/* =============================================== BLE_BLELL.CONN_CONFIG_EXT =============================================== */ +#define BLE_BLELL_CONN_CONFIG_EXT_CONN_REQ_2SLOT_EARLY_Pos (0UL) /*!< BLE_BLELL CONN_CONFIG_EXT: CONN_REQ_2SLOT_EARLY (Bit 0) */ +#define BLE_BLELL_CONN_CONFIG_EXT_CONN_REQ_2SLOT_EARLY_Msk (0x1UL) /*!< BLE_BLELL CONN_CONFIG_EXT: CONN_REQ_2SLOT_EARLY (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_CONFIG_EXT_CONN_REQ_3SLOT_EARLY_Pos (1UL) /*!< BLE_BLELL CONN_CONFIG_EXT: CONN_REQ_3SLOT_EARLY (Bit 1) */ +#define BLE_BLELL_CONN_CONFIG_EXT_CONN_REQ_3SLOT_EARLY_Msk (0x2UL) /*!< BLE_BLELL CONN_CONFIG_EXT: CONN_REQ_3SLOT_EARLY (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_CONFIG_EXT_FW_PKT_RCV_CONN_INDEX_Pos (2UL) /*!< BLE_BLELL CONN_CONFIG_EXT: FW_PKT_RCV_CONN_INDEX (Bit 2)*/ +#define BLE_BLELL_CONN_CONFIG_EXT_FW_PKT_RCV_CONN_INDEX_Msk (0x7cUL) /*!< BLE_BLELL CONN_CONFIG_EXT: FW_PKT_RCV_CONN_INDEX (Bitfield-Mask: 0x1f)*/ +#define BLE_BLELL_CONN_CONFIG_EXT_MMMS_RX_PKT_LIMIT_Pos (8UL) /*!< BLE_BLELL CONN_CONFIG_EXT: MMMS_RX_PKT_LIMIT (Bit 8) */ +#define BLE_BLELL_CONN_CONFIG_EXT_MMMS_RX_PKT_LIMIT_Msk (0x3f00UL) /*!< BLE_BLELL CONN_CONFIG_EXT: MMMS_RX_PKT_LIMIT (Bitfield-Mask: 0x3f)*/ +#define BLE_BLELL_CONN_CONFIG_EXT_DEBUG_CE_EXPIRE_Pos (14UL) /*!< BLE_BLELL CONN_CONFIG_EXT: DEBUG_CE_EXPIRE (Bit 14) */ +#define BLE_BLELL_CONN_CONFIG_EXT_DEBUG_CE_EXPIRE_Msk (0x4000UL) /*!< BLE_BLELL CONN_CONFIG_EXT: DEBUG_CE_EXPIRE (Bitfield-Mask: 0x01)*/ +/* ================================================= BLE_BLELL.DPLL_CONFIG ================================================= */ +#define BLE_BLELL_DPLL_CONFIG_DPLL_CORREL_CONFIG_Pos (0UL) /*!< BLE_BLELL DPLL_CONFIG: DPLL_CORREL_CONFIG (Bit 0) */ +#define BLE_BLELL_DPLL_CONFIG_DPLL_CORREL_CONFIG_Msk (0xffffUL) /*!< BLE_BLELL DPLL_CONFIG: DPLL_CORREL_CONFIG (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.INIT_NI_VAL ================================================= */ +#define BLE_BLELL_INIT_NI_VAL_INIT_NI_VAL_Pos (0UL) /*!< BLE_BLELL INIT_NI_VAL: INIT_NI_VAL (Bit 0) */ +#define BLE_BLELL_INIT_NI_VAL_INIT_NI_VAL_Msk (0xffffUL) /*!< BLE_BLELL INIT_NI_VAL: INIT_NI_VAL (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_BLELL.INIT_WINDOW_OFFSET ============================================== */ +#define BLE_BLELL_INIT_WINDOW_OFFSET_INIT_WINDOW_NI_Pos (0UL) /*!< BLE_BLELL INIT_WINDOW_OFFSET: INIT_WINDOW_NI (Bit 0) */ +#define BLE_BLELL_INIT_WINDOW_OFFSET_INIT_WINDOW_NI_Msk (0xffffUL) /*!< BLE_BLELL INIT_WINDOW_OFFSET: INIT_WINDOW_NI (Bitfield-Mask: 0xffff)*/ +/* ========================================== BLE_BLELL.INIT_WINDOW_NI_ANCHOR_PT =========================================== */ +#define BLE_BLELL_INIT_WINDOW_NI_ANCHOR_PT_INIT_INT_OFF_CAPT_Pos (0UL) /*!< BLE_BLELL INIT_WINDOW_NI_ANCHOR_PT: INIT_INT_OFF_CAPT (Bit 0)*/ +#define BLE_BLELL_INIT_WINDOW_NI_ANCHOR_PT_INIT_INT_OFF_CAPT_Msk (0xffffUL) /*!< BLE_BLELL INIT_WINDOW_NI_ANCHOR_PT: INIT_INT_OFF_CAPT (Bitfield-Mask: 0xffff)*/ +/* ========================================== BLE_BLELL.CONN_UPDATE_NEW_INTERVAL =========================================== */ +#define BLE_BLELL_CONN_UPDATE_NEW_INTERVAL_CONN_UPDT_INTERVAL_Pos (0UL) /*!< BLE_BLELL CONN_UPDATE_NEW_INTERVAL: CONN_UPDT_INTERVAL (Bit 0)*/ +#define BLE_BLELL_CONN_UPDATE_NEW_INTERVAL_CONN_UPDT_INTERVAL_Msk (0xffffUL) /*!< BLE_BLELL CONN_UPDATE_NEW_INTERVAL: CONN_UPDT_INTERVAL (Bitfield-Mask: 0xffff)*/ +/* =========================================== BLE_BLELL.CONN_UPDATE_NEW_LATENCY =========================================== */ +#define BLE_BLELL_CONN_UPDATE_NEW_LATENCY_CONN_UPDT_SLV_LATENCY_Pos (0UL) /*!< BLE_BLELL CONN_UPDATE_NEW_LATENCY: CONN_UPDT_SLV_LATENCY (Bit 0)*/ +#define BLE_BLELL_CONN_UPDATE_NEW_LATENCY_CONN_UPDT_SLV_LATENCY_Msk (0xffffUL) /*!< BLE_BLELL CONN_UPDATE_NEW_LATENCY: CONN_UPDT_SLV_LATENCY (Bitfield-Mask: 0xffff)*/ +/* =========================================== BLE_BLELL.CONN_UPDATE_NEW_SUP_TO ============================================ */ +#define BLE_BLELL_CONN_UPDATE_NEW_SUP_TO_CONN_UPDT_SUP_TO_Pos (0UL) /*!< BLE_BLELL CONN_UPDATE_NEW_SUP_TO: CONN_UPDT_SUP_TO (Bit 0)*/ +#define BLE_BLELL_CONN_UPDATE_NEW_SUP_TO_CONN_UPDT_SUP_TO_Msk (0xffffUL) /*!< BLE_BLELL CONN_UPDATE_NEW_SUP_TO: CONN_UPDT_SUP_TO (Bitfield-Mask: 0xffff)*/ +/* ========================================= BLE_BLELL.CONN_UPDATE_NEW_SL_INTERVAL ========================================= */ +#define BLE_BLELL_CONN_UPDATE_NEW_SL_INTERVAL_SL_CONN_INTERVAL_VAL_Pos (0UL) /*!< BLE_BLELL CONN_UPDATE_NEW_SL_INTERVAL: SL_CONN_INTERVAL_VAL (Bit 0)*/ +#define BLE_BLELL_CONN_UPDATE_NEW_SL_INTERVAL_SL_CONN_INTERVAL_VAL_Msk (0xffffUL) /*!< BLE_BLELL CONN_UPDATE_NEW_SL_INTERVAL: SL_CONN_INTERVAL_VAL (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD0 ================================================ */ +#define BLE_BLELL_CONN_REQ_WORD0_ACCESS_ADDR_LOWER_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD0: ACCESS_ADDR_LOWER (Bit 0) */ +#define BLE_BLELL_CONN_REQ_WORD0_ACCESS_ADDR_LOWER_Msk (0xffffUL) /*!< BLE_BLELL CONN_REQ_WORD0: ACCESS_ADDR_LOWER (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD1 ================================================ */ +#define BLE_BLELL_CONN_REQ_WORD1_ACCESS_ADDR_UPPER_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD1: ACCESS_ADDR_UPPER (Bit 0) */ +#define BLE_BLELL_CONN_REQ_WORD1_ACCESS_ADDR_UPPER_Msk (0xffffUL) /*!< BLE_BLELL CONN_REQ_WORD1: ACCESS_ADDR_UPPER (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD2 ================================================ */ +#define BLE_BLELL_CONN_REQ_WORD2_TX_WINDOW_SIZE_VAL_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD2: TX_WINDOW_SIZE_VAL (Bit 0) */ +#define BLE_BLELL_CONN_REQ_WORD2_TX_WINDOW_SIZE_VAL_Msk (0xffUL) /*!< BLE_BLELL CONN_REQ_WORD2: TX_WINDOW_SIZE_VAL (Bitfield-Mask: 0xff)*/ +#define BLE_BLELL_CONN_REQ_WORD2_CRC_INIT_LOWER_Pos (8UL) /*!< BLE_BLELL CONN_REQ_WORD2: CRC_INIT_LOWER (Bit 8) */ +#define BLE_BLELL_CONN_REQ_WORD2_CRC_INIT_LOWER_Msk (0xff00UL) /*!< BLE_BLELL CONN_REQ_WORD2: CRC_INIT_LOWER (Bitfield-Mask: 0xff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD3 ================================================ */ +#define BLE_BLELL_CONN_REQ_WORD3_CRC_INIT_UPPER_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD3: CRC_INIT_UPPER (Bit 0) */ +#define BLE_BLELL_CONN_REQ_WORD3_CRC_INIT_UPPER_Msk (0xffffUL) /*!< BLE_BLELL CONN_REQ_WORD3: CRC_INIT_UPPER (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD4 ================================================ */ +#define BLE_BLELL_CONN_REQ_WORD4_TX_WINDOW_OFFSET_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD4: TX_WINDOW_OFFSET (Bit 0) */ +#define BLE_BLELL_CONN_REQ_WORD4_TX_WINDOW_OFFSET_Msk (0xffffUL) /*!< BLE_BLELL CONN_REQ_WORD4: TX_WINDOW_OFFSET (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD5 ================================================ */ +#define BLE_BLELL_CONN_REQ_WORD5_CONNECTION_INTERVAL_VAL_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD5: CONNECTION_INTERVAL_VAL (Bit 0)*/ +#define BLE_BLELL_CONN_REQ_WORD5_CONNECTION_INTERVAL_VAL_Msk (0xffffUL) /*!< BLE_BLELL CONN_REQ_WORD5: CONNECTION_INTERVAL_VAL (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD6 ================================================ */ +#define BLE_BLELL_CONN_REQ_WORD6_SLAVE_LATENCY_VAL_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD6: SLAVE_LATENCY_VAL (Bit 0) */ +#define BLE_BLELL_CONN_REQ_WORD6_SLAVE_LATENCY_VAL_Msk (0xffffUL) /*!< BLE_BLELL CONN_REQ_WORD6: SLAVE_LATENCY_VAL (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD7 ================================================ */ +#define BLE_BLELL_CONN_REQ_WORD7_SUPERVISION_TIMEOUT_VAL_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD7: SUPERVISION_TIMEOUT_VAL (Bit 0)*/ +#define BLE_BLELL_CONN_REQ_WORD7_SUPERVISION_TIMEOUT_VAL_Msk (0xffffUL) /*!< BLE_BLELL CONN_REQ_WORD7: SUPERVISION_TIMEOUT_VAL (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD8 ================================================ */ +#define BLE_BLELL_CONN_REQ_WORD8_DATA_CHANNELS_LOWER_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD8: DATA_CHANNELS_LOWER (Bit 0) */ +#define BLE_BLELL_CONN_REQ_WORD8_DATA_CHANNELS_LOWER_Msk (0xffffUL) /*!< BLE_BLELL CONN_REQ_WORD8: DATA_CHANNELS_LOWER (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD9 ================================================ */ +#define BLE_BLELL_CONN_REQ_WORD9_DATA_CHANNELS_MID_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD9: DATA_CHANNELS_MID (Bit 0) */ +#define BLE_BLELL_CONN_REQ_WORD9_DATA_CHANNELS_MID_Msk (0xffffUL) /*!< BLE_BLELL CONN_REQ_WORD9: DATA_CHANNELS_MID (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD10 =============================================== */ +#define BLE_BLELL_CONN_REQ_WORD10_DATA_CHANNELS_UPPER_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD10: DATA_CHANNELS_UPPER (Bit 0) */ +#define BLE_BLELL_CONN_REQ_WORD10_DATA_CHANNELS_UPPER_Msk (0x1fUL) /*!< BLE_BLELL CONN_REQ_WORD10: DATA_CHANNELS_UPPER (Bitfield-Mask: 0x1f)*/ +/* =============================================== BLE_BLELL.CONN_REQ_WORD11 =============================================== */ +#define BLE_BLELL_CONN_REQ_WORD11_HOP_INCREMENT_2_Pos (0UL) /*!< BLE_BLELL CONN_REQ_WORD11: HOP_INCREMENT_2 (Bit 0) */ +#define BLE_BLELL_CONN_REQ_WORD11_HOP_INCREMENT_2_Msk (0x1fUL) /*!< BLE_BLELL CONN_REQ_WORD11: HOP_INCREMENT_2 (Bitfield-Mask: 0x1f)*/ +#define BLE_BLELL_CONN_REQ_WORD11_SCA_2_Pos (5UL) /*!< BLE_BLELL CONN_REQ_WORD11: SCA_2 (Bit 5) */ +#define BLE_BLELL_CONN_REQ_WORD11_SCA_2_Msk (0xe0UL) /*!< BLE_BLELL CONN_REQ_WORD11: SCA_2 (Bitfield-Mask: 0x07) */ +/* =============================================== BLE_BLELL.PDU_RESP_TIMER ================================================ */ +#define BLE_BLELL_PDU_RESP_TIMER_PDU_RESP_TIME_VAL_Pos (0UL) /*!< BLE_BLELL PDU_RESP_TIMER: PDU_RESP_TIME_VAL (Bit 0) */ +#define BLE_BLELL_PDU_RESP_TIMER_PDU_RESP_TIME_VAL_Msk (0xffffUL) /*!< BLE_BLELL PDU_RESP_TIMER: PDU_RESP_TIME_VAL (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_BLELL.NEXT_RESP_TIMER_EXP ============================================= */ +#define BLE_BLELL_NEXT_RESP_TIMER_EXP_NEXT_RESPONSE_INSTANT_Pos (0UL) /*!< BLE_BLELL NEXT_RESP_TIMER_EXP: NEXT_RESPONSE_INSTANT (Bit 0)*/ +#define BLE_BLELL_NEXT_RESP_TIMER_EXP_NEXT_RESPONSE_INSTANT_Msk (0xffffUL) /*!< BLE_BLELL NEXT_RESP_TIMER_EXP: NEXT_RESPONSE_INSTANT (Bitfield-Mask: 0xffff)*/ +/* ================================================= BLE_BLELL.NEXT_SUP_TO ================================================= */ +#define BLE_BLELL_NEXT_SUP_TO_NEXT_TIMEOUT_INSTANT_Pos (0UL) /*!< BLE_BLELL NEXT_SUP_TO: NEXT_TIMEOUT_INSTANT (Bit 0) */ +#define BLE_BLELL_NEXT_SUP_TO_NEXT_TIMEOUT_INSTANT_Msk (0xffffUL) /*!< BLE_BLELL NEXT_SUP_TO: NEXT_TIMEOUT_INSTANT (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_BLELL.LLH_FEATURE_CONFIG ============================================== */ +#define BLE_BLELL_LLH_FEATURE_CONFIG_QUICK_TRANSMIT_Pos (0UL) /*!< BLE_BLELL LLH_FEATURE_CONFIG: QUICK_TRANSMIT (Bit 0) */ +#define BLE_BLELL_LLH_FEATURE_CONFIG_QUICK_TRANSMIT_Msk (0x1UL) /*!< BLE_BLELL LLH_FEATURE_CONFIG: QUICK_TRANSMIT (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LLH_FEATURE_CONFIG_SL_DSM_EN_Pos (1UL) /*!< BLE_BLELL LLH_FEATURE_CONFIG: SL_DSM_EN (Bit 1) */ +#define BLE_BLELL_LLH_FEATURE_CONFIG_SL_DSM_EN_Msk (0x2UL) /*!< BLE_BLELL LLH_FEATURE_CONFIG: SL_DSM_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LLH_FEATURE_CONFIG_US_COUNTER_OFFSET_ADJ_Pos (2UL) /*!< BLE_BLELL LLH_FEATURE_CONFIG: US_COUNTER_OFFSET_ADJ (Bit 2)*/ +#define BLE_BLELL_LLH_FEATURE_CONFIG_US_COUNTER_OFFSET_ADJ_Msk (0x4UL) /*!< BLE_BLELL LLH_FEATURE_CONFIG: US_COUNTER_OFFSET_ADJ (Bitfield-Mask: 0x01)*/ +/* ============================================== BLE_BLELL.WIN_MIN_STEP_SIZE ============================================== */ +#define BLE_BLELL_WIN_MIN_STEP_SIZE_STEPDN_Pos (0UL) /*!< BLE_BLELL WIN_MIN_STEP_SIZE: STEPDN (Bit 0) */ +#define BLE_BLELL_WIN_MIN_STEP_SIZE_STEPDN_Msk (0xfUL) /*!< BLE_BLELL WIN_MIN_STEP_SIZE: STEPDN (Bitfield-Mask: 0x0f) */ +#define BLE_BLELL_WIN_MIN_STEP_SIZE_STEPUP_Pos (4UL) /*!< BLE_BLELL WIN_MIN_STEP_SIZE: STEPUP (Bit 4) */ +#define BLE_BLELL_WIN_MIN_STEP_SIZE_STEPUP_Msk (0xf0UL) /*!< BLE_BLELL WIN_MIN_STEP_SIZE: STEPUP (Bitfield-Mask: 0x0f) */ +#define BLE_BLELL_WIN_MIN_STEP_SIZE_WINDOW_MIN_FW_Pos (8UL) /*!< BLE_BLELL WIN_MIN_STEP_SIZE: WINDOW_MIN_FW (Bit 8) */ +#define BLE_BLELL_WIN_MIN_STEP_SIZE_WINDOW_MIN_FW_Msk (0xff00UL) /*!< BLE_BLELL WIN_MIN_STEP_SIZE: WINDOW_MIN_FW (Bitfield-Mask: 0xff)*/ +/* ================================================= BLE_BLELL.SLV_WIN_ADJ ================================================= */ +#define BLE_BLELL_SLV_WIN_ADJ_SLV_WIN_ADJ_Pos (0UL) /*!< BLE_BLELL SLV_WIN_ADJ: SLV_WIN_ADJ (Bit 0) */ +#define BLE_BLELL_SLV_WIN_ADJ_SLV_WIN_ADJ_Msk (0x7ffUL) /*!< BLE_BLELL SLV_WIN_ADJ: SLV_WIN_ADJ (Bitfield-Mask: 0x7ff) */ +/* ============================================== BLE_BLELL.SL_CONN_INTERVAL =============================================== */ +#define BLE_BLELL_SL_CONN_INTERVAL_SL_CONN_INTERVAL_VAL_Pos (0UL) /*!< BLE_BLELL SL_CONN_INTERVAL: SL_CONN_INTERVAL_VAL (Bit 0)*/ +#define BLE_BLELL_SL_CONN_INTERVAL_SL_CONN_INTERVAL_VAL_Msk (0xffffUL) /*!< BLE_BLELL SL_CONN_INTERVAL: SL_CONN_INTERVAL_VAL (Bitfield-Mask: 0xffff)*/ +/* ============================================= BLE_BLELL.LE_PING_TIMER_ADDR ============================================== */ +#define BLE_BLELL_LE_PING_TIMER_ADDR_CONN_PING_TIMER_ADDR_Pos (0UL) /*!< BLE_BLELL LE_PING_TIMER_ADDR: CONN_PING_TIMER_ADDR (Bit 0)*/ +#define BLE_BLELL_LE_PING_TIMER_ADDR_CONN_PING_TIMER_ADDR_Msk (0xffffUL) /*!< BLE_BLELL LE_PING_TIMER_ADDR: CONN_PING_TIMER_ADDR (Bitfield-Mask: 0xffff)*/ +/* ============================================ BLE_BLELL.LE_PING_TIMER_OFFSET ============================================= */ +#define BLE_BLELL_LE_PING_TIMER_OFFSET_CONN_PING_TIMER_OFFSET_Pos (0UL) /*!< BLE_BLELL LE_PING_TIMER_OFFSET: CONN_PING_TIMER_OFFSET (Bit 0)*/ +#define BLE_BLELL_LE_PING_TIMER_OFFSET_CONN_PING_TIMER_OFFSET_Msk (0xffffUL) /*!< BLE_BLELL LE_PING_TIMER_OFFSET: CONN_PING_TIMER_OFFSET (Bitfield-Mask: 0xffff)*/ +/* =========================================== BLE_BLELL.LE_PING_TIMER_NEXT_EXP ============================================ */ +#define BLE_BLELL_LE_PING_TIMER_NEXT_EXP_CONN_PING_TIMER_NEXT_EXP_Pos (0UL) /*!< BLE_BLELL LE_PING_TIMER_NEXT_EXP: CONN_PING_TIMER_NEXT_EXP (Bit 0)*/ +#define BLE_BLELL_LE_PING_TIMER_NEXT_EXP_CONN_PING_TIMER_NEXT_EXP_Msk (0xffffUL) /*!< BLE_BLELL LE_PING_TIMER_NEXT_EXP: CONN_PING_TIMER_NEXT_EXP (Bitfield-Mask: 0xffff)*/ +/* ========================================== BLE_BLELL.LE_PING_TIMER_WRAP_COUNT =========================================== */ +#define BLE_BLELL_LE_PING_TIMER_WRAP_COUNT_CONN_SEC_CURRENT_WRAP_Pos (0UL) /*!< BLE_BLELL LE_PING_TIMER_WRAP_COUNT: CONN_SEC_CURRENT_WRAP (Bit 0)*/ +#define BLE_BLELL_LE_PING_TIMER_WRAP_COUNT_CONN_SEC_CURRENT_WRAP_Msk (0xffffUL) /*!< BLE_BLELL LE_PING_TIMER_WRAP_COUNT: CONN_SEC_CURRENT_WRAP (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.TX_EN_EXT_DELAY =============================================== */ +#define BLE_BLELL_TX_EN_EXT_DELAY_TXEN_EXT_DELAY_Pos (0UL) /*!< BLE_BLELL TX_EN_EXT_DELAY: TXEN_EXT_DELAY (Bit 0) */ +#define BLE_BLELL_TX_EN_EXT_DELAY_TXEN_EXT_DELAY_Msk (0xfUL) /*!< BLE_BLELL TX_EN_EXT_DELAY: TXEN_EXT_DELAY (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_TX_EN_EXT_DELAY_RXEN_EXT_DELAY_Pos (4UL) /*!< BLE_BLELL TX_EN_EXT_DELAY: RXEN_EXT_DELAY (Bit 4) */ +#define BLE_BLELL_TX_EN_EXT_DELAY_RXEN_EXT_DELAY_Msk (0xf0UL) /*!< BLE_BLELL TX_EN_EXT_DELAY: RXEN_EXT_DELAY (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_TX_EN_EXT_DELAY_DEMOD_2M_COMP_DLY_Pos (8UL) /*!< BLE_BLELL TX_EN_EXT_DELAY: DEMOD_2M_COMP_DLY (Bit 8) */ +#define BLE_BLELL_TX_EN_EXT_DELAY_DEMOD_2M_COMP_DLY_Msk (0xf00UL) /*!< BLE_BLELL TX_EN_EXT_DELAY: DEMOD_2M_COMP_DLY (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_TX_EN_EXT_DELAY_MOD_2M_COMP_DLY_Pos (12UL) /*!< BLE_BLELL TX_EN_EXT_DELAY: MOD_2M_COMP_DLY (Bit 12) */ +#define BLE_BLELL_TX_EN_EXT_DELAY_MOD_2M_COMP_DLY_Msk (0xf000UL) /*!< BLE_BLELL TX_EN_EXT_DELAY: MOD_2M_COMP_DLY (Bitfield-Mask: 0x0f)*/ +/* ============================================== BLE_BLELL.TX_RX_SYNTH_DELAY ============================================== */ +#define BLE_BLELL_TX_RX_SYNTH_DELAY_RX_EN_DELAY_Pos (0UL) /*!< BLE_BLELL TX_RX_SYNTH_DELAY: RX_EN_DELAY (Bit 0) */ +#define BLE_BLELL_TX_RX_SYNTH_DELAY_RX_EN_DELAY_Msk (0xffUL) /*!< BLE_BLELL TX_RX_SYNTH_DELAY: RX_EN_DELAY (Bitfield-Mask: 0xff)*/ +#define BLE_BLELL_TX_RX_SYNTH_DELAY_TX_EN_DELAY_Pos (8UL) /*!< BLE_BLELL TX_RX_SYNTH_DELAY: TX_EN_DELAY (Bit 8) */ +#define BLE_BLELL_TX_RX_SYNTH_DELAY_TX_EN_DELAY_Msk (0xff00UL) /*!< BLE_BLELL TX_RX_SYNTH_DELAY: TX_EN_DELAY (Bitfield-Mask: 0xff)*/ +/* ============================================= BLE_BLELL.EXT_PA_LNA_DLY_CNFG ============================================= */ +#define BLE_BLELL_EXT_PA_LNA_DLY_CNFG_LNA_CTL_DELAY_Pos (0UL) /*!< BLE_BLELL EXT_PA_LNA_DLY_CNFG: LNA_CTL_DELAY (Bit 0) */ +#define BLE_BLELL_EXT_PA_LNA_DLY_CNFG_LNA_CTL_DELAY_Msk (0xffUL) /*!< BLE_BLELL EXT_PA_LNA_DLY_CNFG: LNA_CTL_DELAY (Bitfield-Mask: 0xff)*/ +#define BLE_BLELL_EXT_PA_LNA_DLY_CNFG_PA_CTL_DELAY_Pos (8UL) /*!< BLE_BLELL EXT_PA_LNA_DLY_CNFG: PA_CTL_DELAY (Bit 8) */ +#define BLE_BLELL_EXT_PA_LNA_DLY_CNFG_PA_CTL_DELAY_Msk (0xff00UL) /*!< BLE_BLELL EXT_PA_LNA_DLY_CNFG: PA_CTL_DELAY (Bitfield-Mask: 0xff)*/ +/* ================================================== BLE_BLELL.LL_CONFIG ================================================== */ +#define BLE_BLELL_LL_CONFIG_RSSI_SEL_Pos (0UL) /*!< BLE_BLELL LL_CONFIG: RSSI_SEL (Bit 0) */ +#define BLE_BLELL_LL_CONFIG_RSSI_SEL_Msk (0x1UL) /*!< BLE_BLELL LL_CONFIG: RSSI_SEL (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONFIG_TX_RX_CTRL_SEL_Pos (1UL) /*!< BLE_BLELL LL_CONFIG: TX_RX_CTRL_SEL (Bit 1) */ +#define BLE_BLELL_LL_CONFIG_TX_RX_CTRL_SEL_Msk (0x2UL) /*!< BLE_BLELL LL_CONFIG: TX_RX_CTRL_SEL (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONFIG_TIFS_ENABLE_Pos (2UL) /*!< BLE_BLELL LL_CONFIG: TIFS_ENABLE (Bit 2) */ +#define BLE_BLELL_LL_CONFIG_TIFS_ENABLE_Msk (0x4UL) /*!< BLE_BLELL LL_CONFIG: TIFS_ENABLE (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONFIG_TIMER_LF_SLOT_ENABLE_Pos (3UL) /*!< BLE_BLELL LL_CONFIG: TIMER_LF_SLOT_ENABLE (Bit 3) */ +#define BLE_BLELL_LL_CONFIG_TIMER_LF_SLOT_ENABLE_Msk (0x8UL) /*!< BLE_BLELL LL_CONFIG: TIMER_LF_SLOT_ENABLE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONFIG_RSSI_INTR_SEL_Pos (5UL) /*!< BLE_BLELL LL_CONFIG: RSSI_INTR_SEL (Bit 5) */ +#define BLE_BLELL_LL_CONFIG_RSSI_INTR_SEL_Msk (0x20UL) /*!< BLE_BLELL LL_CONFIG: RSSI_INTR_SEL (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONFIG_RSSI_EARLY_CNFG_Pos (6UL) /*!< BLE_BLELL LL_CONFIG: RSSI_EARLY_CNFG (Bit 6) */ +#define BLE_BLELL_LL_CONFIG_RSSI_EARLY_CNFG_Msk (0x40UL) /*!< BLE_BLELL LL_CONFIG: RSSI_EARLY_CNFG (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONFIG_TX_RX_PIN_DLY_Pos (7UL) /*!< BLE_BLELL LL_CONFIG: TX_RX_PIN_DLY (Bit 7) */ +#define BLE_BLELL_LL_CONFIG_TX_RX_PIN_DLY_Msk (0x80UL) /*!< BLE_BLELL LL_CONFIG: TX_RX_PIN_DLY (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONFIG_TX_PA_PWR_LVL_TYPE_Pos (8UL) /*!< BLE_BLELL LL_CONFIG: TX_PA_PWR_LVL_TYPE (Bit 8) */ +#define BLE_BLELL_LL_CONFIG_TX_PA_PWR_LVL_TYPE_Msk (0x100UL) /*!< BLE_BLELL LL_CONFIG: TX_PA_PWR_LVL_TYPE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONFIG_RSSI_ENERGY_RD_Pos (9UL) /*!< BLE_BLELL LL_CONFIG: RSSI_ENERGY_RD (Bit 9) */ +#define BLE_BLELL_LL_CONFIG_RSSI_ENERGY_RD_Msk (0x200UL) /*!< BLE_BLELL LL_CONFIG: RSSI_ENERGY_RD (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONFIG_RSSI_EACH_PKT_Pos (10UL) /*!< BLE_BLELL LL_CONFIG: RSSI_EACH_PKT (Bit 10) */ +#define BLE_BLELL_LL_CONFIG_RSSI_EACH_PKT_Msk (0x400UL) /*!< BLE_BLELL LL_CONFIG: RSSI_EACH_PKT (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONFIG_FORCE_TRIG_RCB_UPDATE_Pos (11UL) /*!< BLE_BLELL LL_CONFIG: FORCE_TRIG_RCB_UPDATE (Bit 11) */ +#define BLE_BLELL_LL_CONFIG_FORCE_TRIG_RCB_UPDATE_Msk (0x800UL) /*!< BLE_BLELL LL_CONFIG: FORCE_TRIG_RCB_UPDATE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONFIG_CHECK_DUP_CONN_Pos (12UL) /*!< BLE_BLELL LL_CONFIG: CHECK_DUP_CONN (Bit 12) */ +#define BLE_BLELL_LL_CONFIG_CHECK_DUP_CONN_Msk (0x1000UL) /*!< BLE_BLELL LL_CONFIG: CHECK_DUP_CONN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONFIG_MULTI_ENGINE_LPM_Pos (13UL) /*!< BLE_BLELL LL_CONFIG: MULTI_ENGINE_LPM (Bit 13) */ +#define BLE_BLELL_LL_CONFIG_MULTI_ENGINE_LPM_Msk (0x2000UL) /*!< BLE_BLELL LL_CONFIG: MULTI_ENGINE_LPM (Bitfield-Mask: 0x01)*/ +/* ================================================= BLE_BLELL.LL_CONTROL ================================================== */ +#define BLE_BLELL_LL_CONTROL_PRIV_1_2_Pos (0UL) /*!< BLE_BLELL LL_CONTROL: PRIV_1_2 (Bit 0) */ +#define BLE_BLELL_LL_CONTROL_PRIV_1_2_Msk (0x1UL) /*!< BLE_BLELL LL_CONTROL: PRIV_1_2 (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONTROL_DLE_Pos (1UL) /*!< BLE_BLELL LL_CONTROL: DLE (Bit 1) */ +#define BLE_BLELL_LL_CONTROL_DLE_Msk (0x2UL) /*!< BLE_BLELL LL_CONTROL: DLE (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONTROL_WL_READ_AS_MEM_Pos (2UL) /*!< BLE_BLELL LL_CONTROL: WL_READ_AS_MEM (Bit 2) */ +#define BLE_BLELL_LL_CONTROL_WL_READ_AS_MEM_Msk (0x4UL) /*!< BLE_BLELL LL_CONTROL: WL_READ_AS_MEM (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONTROL_ADVCH_FIFO_PRIV_1_2_FLUSH_CTRL_Pos (3UL) /*!< BLE_BLELL LL_CONTROL: ADVCH_FIFO_PRIV_1_2_FLUSH_CTRL (Bit 3)*/ +#define BLE_BLELL_LL_CONTROL_ADVCH_FIFO_PRIV_1_2_FLUSH_CTRL_Msk (0x8UL) /*!< BLE_BLELL LL_CONTROL: ADVCH_FIFO_PRIV_1_2_FLUSH_CTRL (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONTROL_HW_RSLV_LIST_FULL_Pos (4UL) /*!< BLE_BLELL LL_CONTROL: HW_RSLV_LIST_FULL (Bit 4) */ +#define BLE_BLELL_LL_CONTROL_HW_RSLV_LIST_FULL_Msk (0x10UL) /*!< BLE_BLELL LL_CONTROL: HW_RSLV_LIST_FULL (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONTROL_RPT_INIT_ADDR_MATCH_PRIV_MISMATCH_ADV_Pos (5UL) /*!< BLE_BLELL LL_CONTROL: RPT_INIT_ADDR_MATCH_PRIV_MISMATCH_ADV (Bit 5)*/ +#define BLE_BLELL_LL_CONTROL_RPT_INIT_ADDR_MATCH_PRIV_MISMATCH_ADV_Msk (0x20UL) /*!< BLE_BLELL LL_CONTROL: RPT_INIT_ADDR_MATCH_PRIV_MISMATCH_ADV (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONTROL_RPT_SCAN_ADDR_MATCH_PRIV_MISMATCH_ADV_Pos (6UL) /*!< BLE_BLELL LL_CONTROL: RPT_SCAN_ADDR_MATCH_PRIV_MISMATCH_ADV (Bit 6)*/ +#define BLE_BLELL_LL_CONTROL_RPT_SCAN_ADDR_MATCH_PRIV_MISMATCH_ADV_Msk (0x40UL) /*!< BLE_BLELL LL_CONTROL: RPT_SCAN_ADDR_MATCH_PRIV_MISMATCH_ADV (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONTROL_RPT_PEER_ADDR_MATCH_PRIV_MISMATCH_SCN_Pos (7UL) /*!< BLE_BLELL LL_CONTROL: RPT_PEER_ADDR_MATCH_PRIV_MISMATCH_SCN (Bit 7)*/ +#define BLE_BLELL_LL_CONTROL_RPT_PEER_ADDR_MATCH_PRIV_MISMATCH_SCN_Msk (0x80UL) /*!< BLE_BLELL LL_CONTROL: RPT_PEER_ADDR_MATCH_PRIV_MISMATCH_SCN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONTROL_RPT_PEER_ADDR_MATCH_PRIV_MISMATCH_INI_Pos (8UL) /*!< BLE_BLELL LL_CONTROL: RPT_PEER_ADDR_MATCH_PRIV_MISMATCH_INI (Bit 8)*/ +#define BLE_BLELL_LL_CONTROL_RPT_PEER_ADDR_MATCH_PRIV_MISMATCH_INI_Msk (0x100UL) /*!< BLE_BLELL LL_CONTROL: RPT_PEER_ADDR_MATCH_PRIV_MISMATCH_INI (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONTROL_RPT_SELF_ADDR_MATCH_PRIV_MISMATCH_INI_Pos (9UL) /*!< BLE_BLELL LL_CONTROL: RPT_SELF_ADDR_MATCH_PRIV_MISMATCH_INI (Bit 9)*/ +#define BLE_BLELL_LL_CONTROL_RPT_SELF_ADDR_MATCH_PRIV_MISMATCH_INI_Msk (0x200UL) /*!< BLE_BLELL LL_CONTROL: RPT_SELF_ADDR_MATCH_PRIV_MISMATCH_INI (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONTROL_PRIV_1_2_ADV_Pos (10UL) /*!< BLE_BLELL LL_CONTROL: PRIV_1_2_ADV (Bit 10) */ +#define BLE_BLELL_LL_CONTROL_PRIV_1_2_ADV_Msk (0x400UL) /*!< BLE_BLELL LL_CONTROL: PRIV_1_2_ADV (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONTROL_PRIV_1_2_SCAN_Pos (11UL) /*!< BLE_BLELL LL_CONTROL: PRIV_1_2_SCAN (Bit 11) */ +#define BLE_BLELL_LL_CONTROL_PRIV_1_2_SCAN_Msk (0x800UL) /*!< BLE_BLELL LL_CONTROL: PRIV_1_2_SCAN (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONTROL_PRIV_1_2_INIT_Pos (12UL) /*!< BLE_BLELL LL_CONTROL: PRIV_1_2_INIT (Bit 12) */ +#define BLE_BLELL_LL_CONTROL_PRIV_1_2_INIT_Msk (0x1000UL) /*!< BLE_BLELL LL_CONTROL: PRIV_1_2_INIT (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_LL_CONTROL_EN_CONN_RX_EN_MOD_Pos (13UL) /*!< BLE_BLELL LL_CONTROL: EN_CONN_RX_EN_MOD (Bit 13) */ +#define BLE_BLELL_LL_CONTROL_EN_CONN_RX_EN_MOD_Msk (0x2000UL) /*!< BLE_BLELL LL_CONTROL: EN_CONN_RX_EN_MOD (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONTROL_SLV_CONN_PEER_RPA_NOT_RSLVD_Pos (14UL) /*!< BLE_BLELL LL_CONTROL: SLV_CONN_PEER_RPA_NOT_RSLVD (Bit 14)*/ +#define BLE_BLELL_LL_CONTROL_SLV_CONN_PEER_RPA_NOT_RSLVD_Msk (0x4000UL) /*!< BLE_BLELL LL_CONTROL: SLV_CONN_PEER_RPA_NOT_RSLVD (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_LL_CONTROL_ADVCH_FIFO_FLUSH_Pos (15UL) /*!< BLE_BLELL LL_CONTROL: ADVCH_FIFO_FLUSH (Bit 15) */ +#define BLE_BLELL_LL_CONTROL_ADVCH_FIFO_FLUSH_Msk (0x8000UL) /*!< BLE_BLELL LL_CONTROL: ADVCH_FIFO_FLUSH (Bitfield-Mask: 0x01)*/ +/* ================================================ BLE_BLELL.DEV_PA_ADDR_L ================================================ */ +#define BLE_BLELL_DEV_PA_ADDR_L_DEV_PA_ADDR_L_Pos (0UL) /*!< BLE_BLELL DEV_PA_ADDR_L: DEV_PA_ADDR_L (Bit 0) */ +#define BLE_BLELL_DEV_PA_ADDR_L_DEV_PA_ADDR_L_Msk (0xffffUL) /*!< BLE_BLELL DEV_PA_ADDR_L: DEV_PA_ADDR_L (Bitfield-Mask: 0xffff)*/ +/* ================================================ BLE_BLELL.DEV_PA_ADDR_M ================================================ */ +#define BLE_BLELL_DEV_PA_ADDR_M_DEV_PA_ADDR_M_Pos (0UL) /*!< BLE_BLELL DEV_PA_ADDR_M: DEV_PA_ADDR_M (Bit 0) */ +#define BLE_BLELL_DEV_PA_ADDR_M_DEV_PA_ADDR_M_Msk (0xffffUL) /*!< BLE_BLELL DEV_PA_ADDR_M: DEV_PA_ADDR_M (Bitfield-Mask: 0xffff)*/ +/* ================================================ BLE_BLELL.DEV_PA_ADDR_H ================================================ */ +#define BLE_BLELL_DEV_PA_ADDR_H_DEV_PA_ADDR_H_Pos (0UL) /*!< BLE_BLELL DEV_PA_ADDR_H: DEV_PA_ADDR_H (Bit 0) */ +#define BLE_BLELL_DEV_PA_ADDR_H_DEV_PA_ADDR_H_Msk (0xffffUL) /*!< BLE_BLELL DEV_PA_ADDR_H: DEV_PA_ADDR_H (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_BLELL.RSLV_LIST_ENABLE =============================================== */ +#define BLE_BLELL_RSLV_LIST_ENABLE_VALID_ENTRY_Pos (0UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: VALID_ENTRY (Bit 0) */ +#define BLE_BLELL_RSLV_LIST_ENABLE_VALID_ENTRY_Msk (0x1UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: VALID_ENTRY (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_PEER_ADDR_IRK_SET_Pos (1UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: PEER_ADDR_IRK_SET (Bit 1) */ +#define BLE_BLELL_RSLV_LIST_ENABLE_PEER_ADDR_IRK_SET_Msk (0x2UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: PEER_ADDR_IRK_SET (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_SELF_ADDR_IRK_SET_RX_Pos (2UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: SELF_ADDR_IRK_SET_RX (Bit 2)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_SELF_ADDR_IRK_SET_RX_Msk (0x4UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: SELF_ADDR_IRK_SET_RX (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_WHITELISTED_PEER_Pos (3UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: WHITELISTED_PEER (Bit 3) */ +#define BLE_BLELL_RSLV_LIST_ENABLE_WHITELISTED_PEER_Msk (0x8UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: WHITELISTED_PEER (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_PEER_ADDR_TYPE_Pos (4UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: PEER_ADDR_TYPE (Bit 4) */ +#define BLE_BLELL_RSLV_LIST_ENABLE_PEER_ADDR_TYPE_Msk (0x10UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: PEER_ADDR_TYPE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_PEER_ADDR_RPA_VAL_Pos (5UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: PEER_ADDR_RPA_VAL (Bit 5) */ +#define BLE_BLELL_RSLV_LIST_ENABLE_PEER_ADDR_RPA_VAL_Msk (0x20UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: PEER_ADDR_RPA_VAL (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_SELF_ADDR_RXD_RPA_VAL_Pos (6UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: SELF_ADDR_RXD_RPA_VAL (Bit 6)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_SELF_ADDR_RXD_RPA_VAL_Msk (0x40UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: SELF_ADDR_RXD_RPA_VAL (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_SELF_ADDR_TX_RPA_VAL_Pos (7UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: SELF_ADDR_TX_RPA_VAL (Bit 7)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_SELF_ADDR_TX_RPA_VAL_Msk (0x80UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: SELF_ADDR_TX_RPA_VAL (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_SELF_ADDR_INIT_RPA_SEL_Pos (8UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: SELF_ADDR_INIT_RPA_SEL (Bit 8)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_SELF_ADDR_INIT_RPA_SEL_Msk (0x100UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: SELF_ADDR_INIT_RPA_SEL (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_SELF_ADDR_TYPE_TX_Pos (9UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: SELF_ADDR_TYPE_TX (Bit 9) */ +#define BLE_BLELL_RSLV_LIST_ENABLE_SELF_ADDR_TYPE_TX_Msk (0x200UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: SELF_ADDR_TYPE_TX (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_RSLV_LIST_ENABLE_ENTRY_CONNECTED_Pos (10UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: ENTRY_CONNECTED (Bit 10) */ +#define BLE_BLELL_RSLV_LIST_ENABLE_ENTRY_CONNECTED_Msk (0x400UL) /*!< BLE_BLELL RSLV_LIST_ENABLE: ENTRY_CONNECTED (Bitfield-Mask: 0x01)*/ +/* ============================================ BLE_BLELL.WL_CONNECTION_STATUS ============================================= */ +#define BLE_BLELL_WL_CONNECTION_STATUS_WL_ENTRY_CONNECTED_Pos (0UL) /*!< BLE_BLELL WL_CONNECTION_STATUS: WL_ENTRY_CONNECTED (Bit 0)*/ +#define BLE_BLELL_WL_CONNECTION_STATUS_WL_ENTRY_CONNECTED_Msk (0xffffUL) /*!< BLE_BLELL WL_CONNECTION_STATUS: WL_ENTRY_CONNECTED (Bitfield-Mask: 0xffff)*/ +/* ========================================== BLE_BLELL.CONN_RXMEM_BASE_ADDR_DLE =========================================== */ +#define BLE_BLELL_CONN_RXMEM_BASE_ADDR_DLE_CONN_RX_MEM_BASE_ADDR_DLE_Pos (0UL) /*!< BLE_BLELL CONN_RXMEM_BASE_ADDR_DLE: CONN_RX_MEM_BASE_ADDR_DLE (Bit 0)*/ +#define BLE_BLELL_CONN_RXMEM_BASE_ADDR_DLE_CONN_RX_MEM_BASE_ADDR_DLE_Msk (0xffffffffUL) /*!< BLE_BLELL CONN_RXMEM_BASE_ADDR_DLE: CONN_RX_MEM_BASE_ADDR_DLE (Bitfield-Mask: 0xffffffff)*/ +/* ========================================== BLE_BLELL.CONN_TXMEM_BASE_ADDR_DLE =========================================== */ +#define BLE_BLELL_CONN_TXMEM_BASE_ADDR_DLE_CONN_TX_MEM_BASE_ADDR_DLE_Pos (0UL) /*!< BLE_BLELL CONN_TXMEM_BASE_ADDR_DLE: CONN_TX_MEM_BASE_ADDR_DLE (Bit 0)*/ +#define BLE_BLELL_CONN_TXMEM_BASE_ADDR_DLE_CONN_TX_MEM_BASE_ADDR_DLE_Msk (0xffffffffUL) /*!< BLE_BLELL CONN_TXMEM_BASE_ADDR_DLE: CONN_TX_MEM_BASE_ADDR_DLE (Bitfield-Mask: 0xffffffff)*/ +/* ========================================= BLE_BLELL.CONN_1_PARAM_MEM_BASE_ADDR ========================================== */ +#define BLE_BLELL_CONN_1_PARAM_MEM_BASE_ADDR_CONN_1_PARAM_Pos (0UL) /*!< BLE_BLELL CONN_1_PARAM_MEM_BASE_ADDR: CONN_1_PARAM (Bit 0)*/ +#define BLE_BLELL_CONN_1_PARAM_MEM_BASE_ADDR_CONN_1_PARAM_Msk (0xffffUL) /*!< BLE_BLELL CONN_1_PARAM_MEM_BASE_ADDR: CONN_1_PARAM (Bitfield-Mask: 0xffff)*/ +/* ========================================= BLE_BLELL.CONN_2_PARAM_MEM_BASE_ADDR ========================================== */ +#define BLE_BLELL_CONN_2_PARAM_MEM_BASE_ADDR_CONN_2_PARAM_Pos (0UL) /*!< BLE_BLELL CONN_2_PARAM_MEM_BASE_ADDR: CONN_2_PARAM (Bit 0)*/ +#define BLE_BLELL_CONN_2_PARAM_MEM_BASE_ADDR_CONN_2_PARAM_Msk (0xffffUL) /*!< BLE_BLELL CONN_2_PARAM_MEM_BASE_ADDR: CONN_2_PARAM (Bitfield-Mask: 0xffff)*/ +/* ========================================= BLE_BLELL.CONN_3_PARAM_MEM_BASE_ADDR ========================================== */ +#define BLE_BLELL_CONN_3_PARAM_MEM_BASE_ADDR_CONN_3_PARAM_Pos (0UL) /*!< BLE_BLELL CONN_3_PARAM_MEM_BASE_ADDR: CONN_3_PARAM (Bit 0)*/ +#define BLE_BLELL_CONN_3_PARAM_MEM_BASE_ADDR_CONN_3_PARAM_Msk (0xffffUL) /*!< BLE_BLELL CONN_3_PARAM_MEM_BASE_ADDR: CONN_3_PARAM (Bitfield-Mask: 0xffff)*/ +/* ========================================= BLE_BLELL.CONN_4_PARAM_MEM_BASE_ADDR ========================================== */ +#define BLE_BLELL_CONN_4_PARAM_MEM_BASE_ADDR_CONN_4_PARAM_Pos (0UL) /*!< BLE_BLELL CONN_4_PARAM_MEM_BASE_ADDR: CONN_4_PARAM (Bit 0)*/ +#define BLE_BLELL_CONN_4_PARAM_MEM_BASE_ADDR_CONN_4_PARAM_Msk (0xffffUL) /*!< BLE_BLELL CONN_4_PARAM_MEM_BASE_ADDR: CONN_4_PARAM (Bitfield-Mask: 0xffff)*/ +/* ================================================== BLE_BLELL.NI_TIMER =================================================== */ +#define BLE_BLELL_NI_TIMER_NI_TIMER_Pos (0UL) /*!< BLE_BLELL NI_TIMER: NI_TIMER (Bit 0) */ +#define BLE_BLELL_NI_TIMER_NI_TIMER_Msk (0xffffUL) /*!< BLE_BLELL NI_TIMER: NI_TIMER (Bitfield-Mask: 0xffff) */ +/* ================================================== BLE_BLELL.US_OFFSET ================================================== */ +#define BLE_BLELL_US_OFFSET_US_OFFSET_SLOT_BOUNDARY_Pos (0UL) /*!< BLE_BLELL US_OFFSET: US_OFFSET_SLOT_BOUNDARY (Bit 0) */ +#define BLE_BLELL_US_OFFSET_US_OFFSET_SLOT_BOUNDARY_Msk (0x3ffUL) /*!< BLE_BLELL US_OFFSET: US_OFFSET_SLOT_BOUNDARY (Bitfield-Mask: 0x3ff)*/ +/* ================================================== BLE_BLELL.NEXT_CONN ================================================== */ +#define BLE_BLELL_NEXT_CONN_NEXT_CONN_INDEX_Pos (0UL) /*!< BLE_BLELL NEXT_CONN: NEXT_CONN_INDEX (Bit 0) */ +#define BLE_BLELL_NEXT_CONN_NEXT_CONN_INDEX_Msk (0x1fUL) /*!< BLE_BLELL NEXT_CONN: NEXT_CONN_INDEX (Bitfield-Mask: 0x1f)*/ +#define BLE_BLELL_NEXT_CONN_NEXT_CONN_TYPE_Pos (5UL) /*!< BLE_BLELL NEXT_CONN: NEXT_CONN_TYPE (Bit 5) */ +#define BLE_BLELL_NEXT_CONN_NEXT_CONN_TYPE_Msk (0x20UL) /*!< BLE_BLELL NEXT_CONN: NEXT_CONN_TYPE (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_NEXT_CONN_NI_VALID_Pos (6UL) /*!< BLE_BLELL NEXT_CONN: NI_VALID (Bit 6) */ +#define BLE_BLELL_NEXT_CONN_NI_VALID_Msk (0x40UL) /*!< BLE_BLELL NEXT_CONN: NI_VALID (Bitfield-Mask: 0x01) */ +/* ================================================== BLE_BLELL.NI_ABORT =================================================== */ +#define BLE_BLELL_NI_ABORT_NI_ABORT_Pos (0UL) /*!< BLE_BLELL NI_ABORT: NI_ABORT (Bit 0) */ +#define BLE_BLELL_NI_ABORT_NI_ABORT_Msk (0x1UL) /*!< BLE_BLELL NI_ABORT: NI_ABORT (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_NI_ABORT_ABORT_ACK_Pos (1UL) /*!< BLE_BLELL NI_ABORT: ABORT_ACK (Bit 1) */ +#define BLE_BLELL_NI_ABORT_ABORT_ACK_Msk (0x2UL) /*!< BLE_BLELL NI_ABORT: ABORT_ACK (Bitfield-Mask: 0x01) */ +/* =============================================== BLE_BLELL.CONN_NI_STATUS ================================================ */ +#define BLE_BLELL_CONN_NI_STATUS_CONN_NI_Pos (0UL) /*!< BLE_BLELL CONN_NI_STATUS: CONN_NI (Bit 0) */ +#define BLE_BLELL_CONN_NI_STATUS_CONN_NI_Msk (0xffffUL) /*!< BLE_BLELL CONN_NI_STATUS: CONN_NI (Bitfield-Mask: 0xffff) */ +/* ============================================= BLE_BLELL.NEXT_SUP_TO_STATUS ============================================== */ +#define BLE_BLELL_NEXT_SUP_TO_STATUS_NEXT_SUP_TO_Pos (0UL) /*!< BLE_BLELL NEXT_SUP_TO_STATUS: NEXT_SUP_TO (Bit 0) */ +#define BLE_BLELL_NEXT_SUP_TO_STATUS_NEXT_SUP_TO_Msk (0xffffUL) /*!< BLE_BLELL NEXT_SUP_TO_STATUS: NEXT_SUP_TO (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_BLELL.MMMS_CONN_STATUS =============================================== */ +#define BLE_BLELL_MMMS_CONN_STATUS_CURR_CONN_INDEX_Pos (0UL) /*!< BLE_BLELL MMMS_CONN_STATUS: CURR_CONN_INDEX (Bit 0) */ +#define BLE_BLELL_MMMS_CONN_STATUS_CURR_CONN_INDEX_Msk (0x1fUL) /*!< BLE_BLELL MMMS_CONN_STATUS: CURR_CONN_INDEX (Bitfield-Mask: 0x1f)*/ +#define BLE_BLELL_MMMS_CONN_STATUS_CURR_CONN_TYPE_Pos (5UL) /*!< BLE_BLELL MMMS_CONN_STATUS: CURR_CONN_TYPE (Bit 5) */ +#define BLE_BLELL_MMMS_CONN_STATUS_CURR_CONN_TYPE_Msk (0x20UL) /*!< BLE_BLELL MMMS_CONN_STATUS: CURR_CONN_TYPE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_CONN_STATUS_SN_CURR_Pos (6UL) /*!< BLE_BLELL MMMS_CONN_STATUS: SN_CURR (Bit 6) */ +#define BLE_BLELL_MMMS_CONN_STATUS_SN_CURR_Msk (0x40UL) /*!< BLE_BLELL MMMS_CONN_STATUS: SN_CURR (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_MMMS_CONN_STATUS_NESN_CURR_Pos (7UL) /*!< BLE_BLELL MMMS_CONN_STATUS: NESN_CURR (Bit 7) */ +#define BLE_BLELL_MMMS_CONN_STATUS_NESN_CURR_Msk (0x80UL) /*!< BLE_BLELL MMMS_CONN_STATUS: NESN_CURR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_CONN_STATUS_LAST_UNMAPPED_CHANNEL_Pos (8UL) /*!< BLE_BLELL MMMS_CONN_STATUS: LAST_UNMAPPED_CHANNEL (Bit 8)*/ +#define BLE_BLELL_MMMS_CONN_STATUS_LAST_UNMAPPED_CHANNEL_Msk (0x3f00UL) /*!< BLE_BLELL MMMS_CONN_STATUS: LAST_UNMAPPED_CHANNEL (Bitfield-Mask: 0x3f)*/ +#define BLE_BLELL_MMMS_CONN_STATUS_PKT_MISS_Pos (14UL) /*!< BLE_BLELL MMMS_CONN_STATUS: PKT_MISS (Bit 14) */ +#define BLE_BLELL_MMMS_CONN_STATUS_PKT_MISS_Msk (0x4000UL) /*!< BLE_BLELL MMMS_CONN_STATUS: PKT_MISS (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_CONN_STATUS_ANCHOR_PT_STATE_Pos (15UL) /*!< BLE_BLELL MMMS_CONN_STATUS: ANCHOR_PT_STATE (Bit 15) */ +#define BLE_BLELL_MMMS_CONN_STATUS_ANCHOR_PT_STATE_Msk (0x8000UL) /*!< BLE_BLELL MMMS_CONN_STATUS: ANCHOR_PT_STATE (Bitfield-Mask: 0x01)*/ +/* ============================================= BLE_BLELL.BT_SLOT_CAPT_STATUS ============================================= */ +#define BLE_BLELL_BT_SLOT_CAPT_STATUS_BT_SLOT_Pos (0UL) /*!< BLE_BLELL BT_SLOT_CAPT_STATUS: BT_SLOT (Bit 0) */ +#define BLE_BLELL_BT_SLOT_CAPT_STATUS_BT_SLOT_Msk (0xffffUL) /*!< BLE_BLELL BT_SLOT_CAPT_STATUS: BT_SLOT (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLELL.US_CAPT_STATUS ================================================ */ +#define BLE_BLELL_US_CAPT_STATUS_US_CAPT_Pos (0UL) /*!< BLE_BLELL US_CAPT_STATUS: US_CAPT (Bit 0) */ +#define BLE_BLELL_US_CAPT_STATUS_US_CAPT_Msk (0x3ffUL) /*!< BLE_BLELL US_CAPT_STATUS: US_CAPT (Bitfield-Mask: 0x3ff) */ +/* ============================================== BLE_BLELL.US_OFFSET_STATUS =============================================== */ +#define BLE_BLELL_US_OFFSET_STATUS_US_OFFSET_Pos (0UL) /*!< BLE_BLELL US_OFFSET_STATUS: US_OFFSET (Bit 0) */ +#define BLE_BLELL_US_OFFSET_STATUS_US_OFFSET_Msk (0xffffUL) /*!< BLE_BLELL US_OFFSET_STATUS: US_OFFSET (Bitfield-Mask: 0xffff)*/ +/* ========================================== BLE_BLELL.ACCU_WINDOW_WIDEN_STATUS =========================================== */ +#define BLE_BLELL_ACCU_WINDOW_WIDEN_STATUS_ACCU_WINDOW_WIDEN_Pos (0UL) /*!< BLE_BLELL ACCU_WINDOW_WIDEN_STATUS: ACCU_WINDOW_WIDEN (Bit 0)*/ +#define BLE_BLELL_ACCU_WINDOW_WIDEN_STATUS_ACCU_WINDOW_WIDEN_Msk (0xffffUL) /*!< BLE_BLELL ACCU_WINDOW_WIDEN_STATUS: ACCU_WINDOW_WIDEN (Bitfield-Mask: 0xffff)*/ +/* ============================================== BLE_BLELL.EARLY_INTR_STATUS ============================================== */ +#define BLE_BLELL_EARLY_INTR_STATUS_CONN_INDEX_FOR_EARLY_INTR_Pos (0UL) /*!< BLE_BLELL EARLY_INTR_STATUS: CONN_INDEX_FOR_EARLY_INTR (Bit 0)*/ +#define BLE_BLELL_EARLY_INTR_STATUS_CONN_INDEX_FOR_EARLY_INTR_Msk (0x1fUL) /*!< BLE_BLELL EARLY_INTR_STATUS: CONN_INDEX_FOR_EARLY_INTR (Bitfield-Mask: 0x1f)*/ +#define BLE_BLELL_EARLY_INTR_STATUS_CONN_TYPE_FOR_EARLY_INTR_Pos (5UL) /*!< BLE_BLELL EARLY_INTR_STATUS: CONN_TYPE_FOR_EARLY_INTR (Bit 5)*/ +#define BLE_BLELL_EARLY_INTR_STATUS_CONN_TYPE_FOR_EARLY_INTR_Msk (0x20UL) /*!< BLE_BLELL EARLY_INTR_STATUS: CONN_TYPE_FOR_EARLY_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_EARLY_INTR_STATUS_US_FOR_EARLY_INTR_Pos (6UL) /*!< BLE_BLELL EARLY_INTR_STATUS: US_FOR_EARLY_INTR (Bit 6) */ +#define BLE_BLELL_EARLY_INTR_STATUS_US_FOR_EARLY_INTR_Msk (0xffc0UL) /*!< BLE_BLELL EARLY_INTR_STATUS: US_FOR_EARLY_INTR (Bitfield-Mask: 0x3ff)*/ +/* ================================================= BLE_BLELL.MMMS_CONFIG ================================================= */ +#define BLE_BLELL_MMMS_CONFIG_MMMS_ENABLE_Pos (0UL) /*!< BLE_BLELL MMMS_CONFIG: MMMS_ENABLE (Bit 0) */ +#define BLE_BLELL_MMMS_CONFIG_MMMS_ENABLE_Msk (0x1UL) /*!< BLE_BLELL MMMS_CONFIG: MMMS_ENABLE (Bitfield-Mask: 0x01) */ +#define BLE_BLELL_MMMS_CONFIG_DISABLE_CONN_REQ_PARAM_IN_MEM_Pos (1UL) /*!< BLE_BLELL MMMS_CONFIG: DISABLE_CONN_REQ_PARAM_IN_MEM (Bit 1)*/ +#define BLE_BLELL_MMMS_CONFIG_DISABLE_CONN_REQ_PARAM_IN_MEM_Msk (0x2UL) /*!< BLE_BLELL MMMS_CONFIG: DISABLE_CONN_REQ_PARAM_IN_MEM (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_CONFIG_DISABLE_CONN_PARAM_MEM_WR_Pos (2UL) /*!< BLE_BLELL MMMS_CONFIG: DISABLE_CONN_PARAM_MEM_WR (Bit 2)*/ +#define BLE_BLELL_MMMS_CONFIG_DISABLE_CONN_PARAM_MEM_WR_Msk (0x4UL) /*!< BLE_BLELL MMMS_CONFIG: DISABLE_CONN_PARAM_MEM_WR (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_CONFIG_CONN_PARAM_FROM_REG_Pos (3UL) /*!< BLE_BLELL MMMS_CONFIG: CONN_PARAM_FROM_REG (Bit 3) */ +#define BLE_BLELL_MMMS_CONFIG_CONN_PARAM_FROM_REG_Msk (0x8UL) /*!< BLE_BLELL MMMS_CONFIG: CONN_PARAM_FROM_REG (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_CONFIG_ADV_CONN_INDEX_Pos (4UL) /*!< BLE_BLELL MMMS_CONFIG: ADV_CONN_INDEX (Bit 4) */ +#define BLE_BLELL_MMMS_CONFIG_ADV_CONN_INDEX_Msk (0x1f0UL) /*!< BLE_BLELL MMMS_CONFIG: ADV_CONN_INDEX (Bitfield-Mask: 0x1f)*/ +#define BLE_BLELL_MMMS_CONFIG_CE_LEN_IMMEDIATE_EXPIRE_Pos (9UL) /*!< BLE_BLELL MMMS_CONFIG: CE_LEN_IMMEDIATE_EXPIRE (Bit 9) */ +#define BLE_BLELL_MMMS_CONFIG_CE_LEN_IMMEDIATE_EXPIRE_Msk (0x200UL) /*!< BLE_BLELL MMMS_CONFIG: CE_LEN_IMMEDIATE_EXPIRE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_CONFIG_RESET_RX_FIFO_PTR_Pos (10UL) /*!< BLE_BLELL MMMS_CONFIG: RESET_RX_FIFO_PTR (Bit 10) */ +#define BLE_BLELL_MMMS_CONFIG_RESET_RX_FIFO_PTR_Msk (0x400UL) /*!< BLE_BLELL MMMS_CONFIG: RESET_RX_FIFO_PTR (Bitfield-Mask: 0x01)*/ +/* ================================================= BLE_BLELL.US_COUNTER ================================================== */ +#define BLE_BLELL_US_COUNTER_US_COUNTER_Pos (0UL) /*!< BLE_BLELL US_COUNTER: US_COUNTER (Bit 0) */ +#define BLE_BLELL_US_COUNTER_US_COUNTER_Msk (0x3ffUL) /*!< BLE_BLELL US_COUNTER: US_COUNTER (Bitfield-Mask: 0x3ff) */ +/* ================================================ BLE_BLELL.US_CAPT_PREV ================================================= */ +#define BLE_BLELL_US_CAPT_PREV_US_CAPT_LOAD_Pos (0UL) /*!< BLE_BLELL US_CAPT_PREV: US_CAPT_LOAD (Bit 0) */ +#define BLE_BLELL_US_CAPT_PREV_US_CAPT_LOAD_Msk (0x3ffUL) /*!< BLE_BLELL US_CAPT_PREV: US_CAPT_LOAD (Bitfield-Mask: 0x3ff)*/ +/* ================================================ BLE_BLELL.EARLY_INTR_NI ================================================ */ +#define BLE_BLELL_EARLY_INTR_NI_EARLY_INTR_NI_Pos (0UL) /*!< BLE_BLELL EARLY_INTR_NI: EARLY_INTR_NI (Bit 0) */ +#define BLE_BLELL_EARLY_INTR_NI_EARLY_INTR_NI_Msk (0xffffUL) /*!< BLE_BLELL EARLY_INTR_NI: EARLY_INTR_NI (Bitfield-Mask: 0xffff)*/ +/* ========================================= BLE_BLELL.MMMS_MASTER_CREATE_BT_CAPT ========================================== */ +#define BLE_BLELL_MMMS_MASTER_CREATE_BT_CAPT_BT_SLOT_Pos (0UL) /*!< BLE_BLELL MMMS_MASTER_CREATE_BT_CAPT: BT_SLOT (Bit 0) */ +#define BLE_BLELL_MMMS_MASTER_CREATE_BT_CAPT_BT_SLOT_Msk (0xffffUL) /*!< BLE_BLELL MMMS_MASTER_CREATE_BT_CAPT: BT_SLOT (Bitfield-Mask: 0xffff)*/ +/* ========================================== BLE_BLELL.MMMS_SLAVE_CREATE_BT_CAPT ========================================== */ +#define BLE_BLELL_MMMS_SLAVE_CREATE_BT_CAPT_US_CAPT_Pos (0UL) /*!< BLE_BLELL MMMS_SLAVE_CREATE_BT_CAPT: US_CAPT (Bit 0) */ +#define BLE_BLELL_MMMS_SLAVE_CREATE_BT_CAPT_US_CAPT_Msk (0x3ffUL) /*!< BLE_BLELL MMMS_SLAVE_CREATE_BT_CAPT: US_CAPT (Bitfield-Mask: 0x3ff)*/ +/* ========================================== BLE_BLELL.MMMS_SLAVE_CREATE_US_CAPT ========================================== */ +#define BLE_BLELL_MMMS_SLAVE_CREATE_US_CAPT_US_OFFSET_SLAVE_CREATED_Pos (0UL) /*!< BLE_BLELL MMMS_SLAVE_CREATE_US_CAPT: US_OFFSET_SLAVE_CREATED (Bit 0)*/ +#define BLE_BLELL_MMMS_SLAVE_CREATE_US_CAPT_US_OFFSET_SLAVE_CREATED_Msk (0xffffUL) /*!< BLE_BLELL MMMS_SLAVE_CREATE_US_CAPT: US_OFFSET_SLAVE_CREATED (Bitfield-Mask: 0xffff)*/ +/* ========================================== BLE_BLELL.MMMS_DATA_MEM_DESCRIPTOR =========================================== */ +#define BLE_BLELL_MMMS_DATA_MEM_DESCRIPTOR_LLID_C1_Pos (0UL) /*!< BLE_BLELL MMMS_DATA_MEM_DESCRIPTOR: LLID_C1 (Bit 0) */ +#define BLE_BLELL_MMMS_DATA_MEM_DESCRIPTOR_LLID_C1_Msk (0x3UL) /*!< BLE_BLELL MMMS_DATA_MEM_DESCRIPTOR: LLID_C1 (Bitfield-Mask: 0x03)*/ +#define BLE_BLELL_MMMS_DATA_MEM_DESCRIPTOR_DATA_LENGTH_C1_Pos (2UL) /*!< BLE_BLELL MMMS_DATA_MEM_DESCRIPTOR: DATA_LENGTH_C1 (Bit 2)*/ +#define BLE_BLELL_MMMS_DATA_MEM_DESCRIPTOR_DATA_LENGTH_C1_Msk (0x3fcUL) /*!< BLE_BLELL MMMS_DATA_MEM_DESCRIPTOR: DATA_LENGTH_C1 (Bitfield-Mask: 0xff)*/ +/* ============================================ BLE_BLELL.CONN_1_DATA_LIST_SENT ============================================ */ +#define BLE_BLELL_CONN_1_DATA_LIST_SENT_LIST_INDEX__TX_SENT_3_0_C1_Pos (0UL) /*!< BLE_BLELL CONN_1_DATA_LIST_SENT: LIST_INDEX__TX_SENT_3_0_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_1_DATA_LIST_SENT_LIST_INDEX__TX_SENT_3_0_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_1_DATA_LIST_SENT: LIST_INDEX__TX_SENT_3_0_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_1_DATA_LIST_SENT_SET_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_1_DATA_LIST_SENT: SET_CLEAR_C1 (Bit 7) */ +#define BLE_BLELL_CONN_1_DATA_LIST_SENT_SET_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_1_DATA_LIST_SENT: SET_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_1_DATA_LIST_SENT_BUFFER_NUM_TX_SENT_3_0_C1_Pos (8UL) /*!< BLE_BLELL CONN_1_DATA_LIST_SENT: BUFFER_NUM_TX_SENT_3_0_C1 (Bit 8)*/ +#define BLE_BLELL_CONN_1_DATA_LIST_SENT_BUFFER_NUM_TX_SENT_3_0_C1_Msk (0xf00UL) /*!< BLE_BLELL CONN_1_DATA_LIST_SENT: BUFFER_NUM_TX_SENT_3_0_C1 (Bitfield-Mask: 0x0f)*/ +/* ============================================ BLE_BLELL.CONN_1_DATA_LIST_ACK ============================================= */ +#define BLE_BLELL_CONN_1_DATA_LIST_ACK_LIST_INDEX__TX_ACK_3_0_C1_Pos (0UL) /*!< BLE_BLELL CONN_1_DATA_LIST_ACK: LIST_INDEX__TX_ACK_3_0_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_1_DATA_LIST_ACK_LIST_INDEX__TX_ACK_3_0_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_1_DATA_LIST_ACK: LIST_INDEX__TX_ACK_3_0_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_1_DATA_LIST_ACK_SET_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_1_DATA_LIST_ACK: SET_CLEAR_C1 (Bit 7) */ +#define BLE_BLELL_CONN_1_DATA_LIST_ACK_SET_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_1_DATA_LIST_ACK: SET_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +/* =========================================== BLE_BLELL.CONN_1_CE_DATA_LIST_CFG =========================================== */ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_DATA_LIST_INDEX_LAST_ACK_INDEX_C1_Pos (0UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: DATA_LIST_INDEX_LAST_ACK_INDEX_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_DATA_LIST_INDEX_LAST_ACK_INDEX_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: DATA_LIST_INDEX_LAST_ACK_INDEX_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_DATA_LIST_HEAD_UP_C1_Pos (4UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: DATA_LIST_HEAD_UP_C1 (Bit 4)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_DATA_LIST_HEAD_UP_C1_Msk (0x10UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: DATA_LIST_HEAD_UP_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_SLV_MD_CONFIG_C1_Pos (5UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: SLV_MD_CONFIG_C1 (Bit 5)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_SLV_MD_CONFIG_C1_Msk (0x20UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: SLV_MD_CONFIG_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_MD_C1_Pos (6UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: MD_C1 (Bit 6) */ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_MD_C1_Msk (0x40UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: MD_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_MD_BIT_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: MD_BIT_CLEAR_C1 (Bit 7)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_MD_BIT_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: MD_BIT_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_PAUSE_DATA_C1_Pos (8UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: PAUSE_DATA_C1 (Bit 8)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_PAUSE_DATA_C1_Msk (0x100UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: PAUSE_DATA_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_KILL_CONN_Pos (9UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: KILL_CONN (Bit 9) */ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_KILL_CONN_Msk (0x200UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: KILL_CONN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_KILL_CONN_AFTER_TX_Pos (10UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: KILL_CONN_AFTER_TX (Bit 10)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_KILL_CONN_AFTER_TX_Msk (0x400UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: KILL_CONN_AFTER_TX (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_EMPTYPDU_SENT_Pos (11UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: EMPTYPDU_SENT (Bit 11)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_EMPTYPDU_SENT_Msk (0x800UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: EMPTYPDU_SENT (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_CURRENT_PDU_INDEX_C1_Pos (12UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: CURRENT_PDU_INDEX_C1 (Bit 12)*/ +#define BLE_BLELL_CONN_1_CE_DATA_LIST_CFG_CURRENT_PDU_INDEX_C1_Msk (0xf000UL) /*!< BLE_BLELL CONN_1_CE_DATA_LIST_CFG: CURRENT_PDU_INDEX_C1 (Bitfield-Mask: 0x0f)*/ +/* ============================================ BLE_BLELL.CONN_2_DATA_LIST_SENT ============================================ */ +#define BLE_BLELL_CONN_2_DATA_LIST_SENT_LIST_INDEX__TX_SENT_3_0_C1_Pos (0UL) /*!< BLE_BLELL CONN_2_DATA_LIST_SENT: LIST_INDEX__TX_SENT_3_0_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_2_DATA_LIST_SENT_LIST_INDEX__TX_SENT_3_0_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_2_DATA_LIST_SENT: LIST_INDEX__TX_SENT_3_0_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_2_DATA_LIST_SENT_SET_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_2_DATA_LIST_SENT: SET_CLEAR_C1 (Bit 7) */ +#define BLE_BLELL_CONN_2_DATA_LIST_SENT_SET_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_2_DATA_LIST_SENT: SET_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_2_DATA_LIST_SENT_BUFFER_NUM_TX_SENT_3_0_C1_Pos (8UL) /*!< BLE_BLELL CONN_2_DATA_LIST_SENT: BUFFER_NUM_TX_SENT_3_0_C1 (Bit 8)*/ +#define BLE_BLELL_CONN_2_DATA_LIST_SENT_BUFFER_NUM_TX_SENT_3_0_C1_Msk (0xf00UL) /*!< BLE_BLELL CONN_2_DATA_LIST_SENT: BUFFER_NUM_TX_SENT_3_0_C1 (Bitfield-Mask: 0x0f)*/ +/* ============================================ BLE_BLELL.CONN_2_DATA_LIST_ACK ============================================= */ +#define BLE_BLELL_CONN_2_DATA_LIST_ACK_LIST_INDEX__TX_ACK_3_0_C1_Pos (0UL) /*!< BLE_BLELL CONN_2_DATA_LIST_ACK: LIST_INDEX__TX_ACK_3_0_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_2_DATA_LIST_ACK_LIST_INDEX__TX_ACK_3_0_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_2_DATA_LIST_ACK: LIST_INDEX__TX_ACK_3_0_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_2_DATA_LIST_ACK_SET_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_2_DATA_LIST_ACK: SET_CLEAR_C1 (Bit 7) */ +#define BLE_BLELL_CONN_2_DATA_LIST_ACK_SET_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_2_DATA_LIST_ACK: SET_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +/* =========================================== BLE_BLELL.CONN_2_CE_DATA_LIST_CFG =========================================== */ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_DATA_LIST_INDEX_LAST_ACK_INDEX_C1_Pos (0UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: DATA_LIST_INDEX_LAST_ACK_INDEX_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_DATA_LIST_INDEX_LAST_ACK_INDEX_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: DATA_LIST_INDEX_LAST_ACK_INDEX_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_DATA_LIST_HEAD_UP_C1_Pos (4UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: DATA_LIST_HEAD_UP_C1 (Bit 4)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_DATA_LIST_HEAD_UP_C1_Msk (0x10UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: DATA_LIST_HEAD_UP_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_SLV_MD_CONFIG_C1_Pos (5UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: SLV_MD_CONFIG_C1 (Bit 5)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_SLV_MD_CONFIG_C1_Msk (0x20UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: SLV_MD_CONFIG_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_MD_C1_Pos (6UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: MD_C1 (Bit 6) */ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_MD_C1_Msk (0x40UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: MD_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_MD_BIT_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: MD_BIT_CLEAR_C1 (Bit 7)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_MD_BIT_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: MD_BIT_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_PAUSE_DATA_C1_Pos (8UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: PAUSE_DATA_C1 (Bit 8)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_PAUSE_DATA_C1_Msk (0x100UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: PAUSE_DATA_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_KILL_CONN_Pos (9UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: KILL_CONN (Bit 9) */ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_KILL_CONN_Msk (0x200UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: KILL_CONN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_KILL_CONN_AFTER_TX_Pos (10UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: KILL_CONN_AFTER_TX (Bit 10)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_KILL_CONN_AFTER_TX_Msk (0x400UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: KILL_CONN_AFTER_TX (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_EMPTYPDU_SENT_Pos (11UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: EMPTYPDU_SENT (Bit 11)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_EMPTYPDU_SENT_Msk (0x800UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: EMPTYPDU_SENT (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_CURRENT_PDU_INDEX_C1_Pos (12UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: CURRENT_PDU_INDEX_C1 (Bit 12)*/ +#define BLE_BLELL_CONN_2_CE_DATA_LIST_CFG_CURRENT_PDU_INDEX_C1_Msk (0xf000UL) /*!< BLE_BLELL CONN_2_CE_DATA_LIST_CFG: CURRENT_PDU_INDEX_C1 (Bitfield-Mask: 0x0f)*/ +/* ============================================ BLE_BLELL.CONN_3_DATA_LIST_SENT ============================================ */ +#define BLE_BLELL_CONN_3_DATA_LIST_SENT_LIST_INDEX__TX_SENT_3_0_C1_Pos (0UL) /*!< BLE_BLELL CONN_3_DATA_LIST_SENT: LIST_INDEX__TX_SENT_3_0_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_3_DATA_LIST_SENT_LIST_INDEX__TX_SENT_3_0_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_3_DATA_LIST_SENT: LIST_INDEX__TX_SENT_3_0_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_3_DATA_LIST_SENT_SET_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_3_DATA_LIST_SENT: SET_CLEAR_C1 (Bit 7) */ +#define BLE_BLELL_CONN_3_DATA_LIST_SENT_SET_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_3_DATA_LIST_SENT: SET_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_3_DATA_LIST_SENT_BUFFER_NUM_TX_SENT_3_0_C1_Pos (8UL) /*!< BLE_BLELL CONN_3_DATA_LIST_SENT: BUFFER_NUM_TX_SENT_3_0_C1 (Bit 8)*/ +#define BLE_BLELL_CONN_3_DATA_LIST_SENT_BUFFER_NUM_TX_SENT_3_0_C1_Msk (0xf00UL) /*!< BLE_BLELL CONN_3_DATA_LIST_SENT: BUFFER_NUM_TX_SENT_3_0_C1 (Bitfield-Mask: 0x0f)*/ +/* ============================================ BLE_BLELL.CONN_3_DATA_LIST_ACK ============================================= */ +#define BLE_BLELL_CONN_3_DATA_LIST_ACK_LIST_INDEX__TX_ACK_3_0_C1_Pos (0UL) /*!< BLE_BLELL CONN_3_DATA_LIST_ACK: LIST_INDEX__TX_ACK_3_0_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_3_DATA_LIST_ACK_LIST_INDEX__TX_ACK_3_0_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_3_DATA_LIST_ACK: LIST_INDEX__TX_ACK_3_0_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_3_DATA_LIST_ACK_SET_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_3_DATA_LIST_ACK: SET_CLEAR_C1 (Bit 7) */ +#define BLE_BLELL_CONN_3_DATA_LIST_ACK_SET_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_3_DATA_LIST_ACK: SET_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +/* =========================================== BLE_BLELL.CONN_3_CE_DATA_LIST_CFG =========================================== */ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_DATA_LIST_INDEX_LAST_ACK_INDEX_C1_Pos (0UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: DATA_LIST_INDEX_LAST_ACK_INDEX_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_DATA_LIST_INDEX_LAST_ACK_INDEX_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: DATA_LIST_INDEX_LAST_ACK_INDEX_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_DATA_LIST_HEAD_UP_C1_Pos (4UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: DATA_LIST_HEAD_UP_C1 (Bit 4)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_DATA_LIST_HEAD_UP_C1_Msk (0x10UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: DATA_LIST_HEAD_UP_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_SLV_MD_CONFIG_C1_Pos (5UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: SLV_MD_CONFIG_C1 (Bit 5)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_SLV_MD_CONFIG_C1_Msk (0x20UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: SLV_MD_CONFIG_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_MD_C1_Pos (6UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: MD_C1 (Bit 6) */ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_MD_C1_Msk (0x40UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: MD_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_MD_BIT_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: MD_BIT_CLEAR_C1 (Bit 7)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_MD_BIT_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: MD_BIT_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_PAUSE_DATA_C1_Pos (8UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: PAUSE_DATA_C1 (Bit 8)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_PAUSE_DATA_C1_Msk (0x100UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: PAUSE_DATA_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_KILL_CONN_Pos (9UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: KILL_CONN (Bit 9) */ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_KILL_CONN_Msk (0x200UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: KILL_CONN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_KILL_CONN_AFTER_TX_Pos (10UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: KILL_CONN_AFTER_TX (Bit 10)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_KILL_CONN_AFTER_TX_Msk (0x400UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: KILL_CONN_AFTER_TX (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_EMPTYPDU_SENT_Pos (11UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: EMPTYPDU_SENT (Bit 11)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_EMPTYPDU_SENT_Msk (0x800UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: EMPTYPDU_SENT (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_CURRENT_PDU_INDEX_C1_Pos (12UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: CURRENT_PDU_INDEX_C1 (Bit 12)*/ +#define BLE_BLELL_CONN_3_CE_DATA_LIST_CFG_CURRENT_PDU_INDEX_C1_Msk (0xf000UL) /*!< BLE_BLELL CONN_3_CE_DATA_LIST_CFG: CURRENT_PDU_INDEX_C1 (Bitfield-Mask: 0x0f)*/ +/* ============================================ BLE_BLELL.CONN_4_DATA_LIST_SENT ============================================ */ +#define BLE_BLELL_CONN_4_DATA_LIST_SENT_LIST_INDEX__TX_SENT_3_0_C1_Pos (0UL) /*!< BLE_BLELL CONN_4_DATA_LIST_SENT: LIST_INDEX__TX_SENT_3_0_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_4_DATA_LIST_SENT_LIST_INDEX__TX_SENT_3_0_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_4_DATA_LIST_SENT: LIST_INDEX__TX_SENT_3_0_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_4_DATA_LIST_SENT_SET_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_4_DATA_LIST_SENT: SET_CLEAR_C1 (Bit 7) */ +#define BLE_BLELL_CONN_4_DATA_LIST_SENT_SET_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_4_DATA_LIST_SENT: SET_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_4_DATA_LIST_SENT_BUFFER_NUM_TX_SENT_3_0_C1_Pos (8UL) /*!< BLE_BLELL CONN_4_DATA_LIST_SENT: BUFFER_NUM_TX_SENT_3_0_C1 (Bit 8)*/ +#define BLE_BLELL_CONN_4_DATA_LIST_SENT_BUFFER_NUM_TX_SENT_3_0_C1_Msk (0xf00UL) /*!< BLE_BLELL CONN_4_DATA_LIST_SENT: BUFFER_NUM_TX_SENT_3_0_C1 (Bitfield-Mask: 0x0f)*/ +/* ============================================ BLE_BLELL.CONN_4_DATA_LIST_ACK ============================================= */ +#define BLE_BLELL_CONN_4_DATA_LIST_ACK_LIST_INDEX__TX_ACK_3_0_C1_Pos (0UL) /*!< BLE_BLELL CONN_4_DATA_LIST_ACK: LIST_INDEX__TX_ACK_3_0_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_4_DATA_LIST_ACK_LIST_INDEX__TX_ACK_3_0_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_4_DATA_LIST_ACK: LIST_INDEX__TX_ACK_3_0_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_4_DATA_LIST_ACK_SET_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_4_DATA_LIST_ACK: SET_CLEAR_C1 (Bit 7) */ +#define BLE_BLELL_CONN_4_DATA_LIST_ACK_SET_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_4_DATA_LIST_ACK: SET_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +/* =========================================== BLE_BLELL.CONN_4_CE_DATA_LIST_CFG =========================================== */ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_DATA_LIST_INDEX_LAST_ACK_INDEX_C1_Pos (0UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: DATA_LIST_INDEX_LAST_ACK_INDEX_C1 (Bit 0)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_DATA_LIST_INDEX_LAST_ACK_INDEX_C1_Msk (0xfUL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: DATA_LIST_INDEX_LAST_ACK_INDEX_C1 (Bitfield-Mask: 0x0f)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_DATA_LIST_HEAD_UP_C1_Pos (4UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: DATA_LIST_HEAD_UP_C1 (Bit 4)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_DATA_LIST_HEAD_UP_C1_Msk (0x10UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: DATA_LIST_HEAD_UP_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_SLV_MD_CONFIG_C1_Pos (5UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: SLV_MD_CONFIG_C1 (Bit 5)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_SLV_MD_CONFIG_C1_Msk (0x20UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: SLV_MD_CONFIG_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_MD_C1_Pos (6UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: MD_C1 (Bit 6) */ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_MD_C1_Msk (0x40UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: MD_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_MD_BIT_CLEAR_C1_Pos (7UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: MD_BIT_CLEAR_C1 (Bit 7)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_MD_BIT_CLEAR_C1_Msk (0x80UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: MD_BIT_CLEAR_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_PAUSE_DATA_C1_Pos (8UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: PAUSE_DATA_C1 (Bit 8)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_PAUSE_DATA_C1_Msk (0x100UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: PAUSE_DATA_C1 (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_KILL_CONN_Pos (9UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: KILL_CONN (Bit 9) */ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_KILL_CONN_Msk (0x200UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: KILL_CONN (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_KILL_CONN_AFTER_TX_Pos (10UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: KILL_CONN_AFTER_TX (Bit 10)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_KILL_CONN_AFTER_TX_Msk (0x400UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: KILL_CONN_AFTER_TX (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_EMPTYPDU_SENT_Pos (11UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: EMPTYPDU_SENT (Bit 11)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_EMPTYPDU_SENT_Msk (0x800UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: EMPTYPDU_SENT (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_CURRENT_PDU_INDEX_C1_Pos (12UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: CURRENT_PDU_INDEX_C1 (Bit 12)*/ +#define BLE_BLELL_CONN_4_CE_DATA_LIST_CFG_CURRENT_PDU_INDEX_C1_Msk (0xf000UL) /*!< BLE_BLELL CONN_4_CE_DATA_LIST_CFG: CURRENT_PDU_INDEX_C1 (Bitfield-Mask: 0x0f)*/ +/* ============================================ BLE_BLELL.MMMS_ADVCH_NI_ENABLE ============================================= */ +#define BLE_BLELL_MMMS_ADVCH_NI_ENABLE_ADV_NI_ENABLE_Pos (0UL) /*!< BLE_BLELL MMMS_ADVCH_NI_ENABLE: ADV_NI_ENABLE (Bit 0) */ +#define BLE_BLELL_MMMS_ADVCH_NI_ENABLE_ADV_NI_ENABLE_Msk (0x1UL) /*!< BLE_BLELL MMMS_ADVCH_NI_ENABLE: ADV_NI_ENABLE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_ADVCH_NI_ENABLE_SCAN_NI_ENABLE_Pos (1UL) /*!< BLE_BLELL MMMS_ADVCH_NI_ENABLE: SCAN_NI_ENABLE (Bit 1) */ +#define BLE_BLELL_MMMS_ADVCH_NI_ENABLE_SCAN_NI_ENABLE_Msk (0x2UL) /*!< BLE_BLELL MMMS_ADVCH_NI_ENABLE: SCAN_NI_ENABLE (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_ADVCH_NI_ENABLE_INIT_NI_ENABLE_Pos (2UL) /*!< BLE_BLELL MMMS_ADVCH_NI_ENABLE: INIT_NI_ENABLE (Bit 2) */ +#define BLE_BLELL_MMMS_ADVCH_NI_ENABLE_INIT_NI_ENABLE_Msk (0x4UL) /*!< BLE_BLELL MMMS_ADVCH_NI_ENABLE: INIT_NI_ENABLE (Bitfield-Mask: 0x01)*/ +/* ============================================= BLE_BLELL.MMMS_ADVCH_NI_VALID ============================================= */ +#define BLE_BLELL_MMMS_ADVCH_NI_VALID_ADV_NI_VALID_Pos (0UL) /*!< BLE_BLELL MMMS_ADVCH_NI_VALID: ADV_NI_VALID (Bit 0) */ +#define BLE_BLELL_MMMS_ADVCH_NI_VALID_ADV_NI_VALID_Msk (0x1UL) /*!< BLE_BLELL MMMS_ADVCH_NI_VALID: ADV_NI_VALID (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_ADVCH_NI_VALID_SCAN_NI_VALID_Pos (1UL) /*!< BLE_BLELL MMMS_ADVCH_NI_VALID: SCAN_NI_VALID (Bit 1) */ +#define BLE_BLELL_MMMS_ADVCH_NI_VALID_SCAN_NI_VALID_Msk (0x2UL) /*!< BLE_BLELL MMMS_ADVCH_NI_VALID: SCAN_NI_VALID (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_ADVCH_NI_VALID_INIT_NI_VALID_Pos (2UL) /*!< BLE_BLELL MMMS_ADVCH_NI_VALID: INIT_NI_VALID (Bit 2) */ +#define BLE_BLELL_MMMS_ADVCH_NI_VALID_INIT_NI_VALID_Msk (0x4UL) /*!< BLE_BLELL MMMS_ADVCH_NI_VALID: INIT_NI_VALID (Bitfield-Mask: 0x01)*/ +/* ============================================= BLE_BLELL.MMMS_ADVCH_NI_ABORT ============================================= */ +#define BLE_BLELL_MMMS_ADVCH_NI_ABORT_ADVCH_NI_ABORT_Pos (0UL) /*!< BLE_BLELL MMMS_ADVCH_NI_ABORT: ADVCH_NI_ABORT (Bit 0) */ +#define BLE_BLELL_MMMS_ADVCH_NI_ABORT_ADVCH_NI_ABORT_Msk (0x1UL) /*!< BLE_BLELL MMMS_ADVCH_NI_ABORT: ADVCH_NI_ABORT (Bitfield-Mask: 0x01)*/ +#define BLE_BLELL_MMMS_ADVCH_NI_ABORT_ADVCH_ABORT_STATUS_Pos (1UL) /*!< BLE_BLELL MMMS_ADVCH_NI_ABORT: ADVCH_ABORT_STATUS (Bit 1)*/ +#define BLE_BLELL_MMMS_ADVCH_NI_ABORT_ADVCH_ABORT_STATUS_Msk (0x2UL) /*!< BLE_BLELL MMMS_ADVCH_NI_ABORT: ADVCH_ABORT_STATUS (Bitfield-Mask: 0x01)*/ +/* =========================================== BLE_BLELL.CONN_PARAM_NEXT_SUP_TO ============================================ */ +#define BLE_BLELL_CONN_PARAM_NEXT_SUP_TO_NEXT_SUP_TO_LOAD_Pos (0UL) /*!< BLE_BLELL CONN_PARAM_NEXT_SUP_TO: NEXT_SUP_TO_LOAD (Bit 0)*/ +#define BLE_BLELL_CONN_PARAM_NEXT_SUP_TO_NEXT_SUP_TO_LOAD_Msk (0xffffUL) /*!< BLE_BLELL CONN_PARAM_NEXT_SUP_TO: NEXT_SUP_TO_LOAD (Bitfield-Mask: 0xffff)*/ +/* ========================================== BLE_BLELL.CONN_PARAM_ACC_WIN_WIDEN =========================================== */ +#define BLE_BLELL_CONN_PARAM_ACC_WIN_WIDEN_ACC_WINDOW_WIDEN_Pos (0UL) /*!< BLE_BLELL CONN_PARAM_ACC_WIN_WIDEN: ACC_WINDOW_WIDEN (Bit 0)*/ +#define BLE_BLELL_CONN_PARAM_ACC_WIN_WIDEN_ACC_WINDOW_WIDEN_Msk (0x3ffUL) /*!< BLE_BLELL CONN_PARAM_ACC_WIN_WIDEN: ACC_WINDOW_WIDEN (Bitfield-Mask: 0x3ff)*/ +/* =============================================== BLE_BLELL.HW_LOAD_OFFSET ================================================ */ +#define BLE_BLELL_HW_LOAD_OFFSET_LOAD_OFFSET_Pos (0UL) /*!< BLE_BLELL HW_LOAD_OFFSET: LOAD_OFFSET (Bit 0) */ +#define BLE_BLELL_HW_LOAD_OFFSET_LOAD_OFFSET_Msk (0x1fUL) /*!< BLE_BLELL HW_LOAD_OFFSET: LOAD_OFFSET (Bitfield-Mask: 0x1f)*/ +/* ================================================== BLE_BLELL.ADV_RAND =================================================== */ +#define BLE_BLELL_ADV_RAND_ADV_RAND_Pos (0UL) /*!< BLE_BLELL ADV_RAND: ADV_RAND (Bit 0) */ +#define BLE_BLELL_ADV_RAND_ADV_RAND_Msk (0xfUL) /*!< BLE_BLELL ADV_RAND: ADV_RAND (Bitfield-Mask: 0x0f) */ +/* ============================================== BLE_BLELL.MMMS_RX_PKT_CNTR =============================================== */ +#define BLE_BLELL_MMMS_RX_PKT_CNTR_MMMS_RX_PKT_CNT_Pos (0UL) /*!< BLE_BLELL MMMS_RX_PKT_CNTR: MMMS_RX_PKT_CNT (Bit 0) */ +#define BLE_BLELL_MMMS_RX_PKT_CNTR_MMMS_RX_PKT_CNT_Msk (0x3fUL) /*!< BLE_BLELL MMMS_RX_PKT_CNTR: MMMS_RX_PKT_CNT (Bitfield-Mask: 0x3f)*/ +/* ============================================== BLE_BLELL.CONN_RX_PKT_CNTR =============================================== */ +#define BLE_BLELL_CONN_RX_PKT_CNTR_RX_PKT_CNT_Pos (0UL) /*!< BLE_BLELL CONN_RX_PKT_CNTR: RX_PKT_CNT (Bit 0) */ +#define BLE_BLELL_CONN_RX_PKT_CNTR_RX_PKT_CNT_Msk (0x3fUL) /*!< BLE_BLELL CONN_RX_PKT_CNTR: RX_PKT_CNT (Bitfield-Mask: 0x3f)*/ +/* ============================================= BLE_BLELL.WHITELIST_BASE_ADDR ============================================= */ +#define BLE_BLELL_WHITELIST_BASE_ADDR_WL_BASE_ADDR_Pos (0UL) /*!< BLE_BLELL WHITELIST_BASE_ADDR: WL_BASE_ADDR (Bit 0) */ +#define BLE_BLELL_WHITELIST_BASE_ADDR_WL_BASE_ADDR_Msk (0xffffUL) /*!< BLE_BLELL WHITELIST_BASE_ADDR: WL_BASE_ADDR (Bitfield-Mask: 0xffff)*/ +/* ======================================= BLE_BLELL.RSLV_LIST_PEER_IDNTT_BASE_ADDR ======================================== */ +#define BLE_BLELL_RSLV_LIST_PEER_IDNTT_BASE_ADDR_RSLV_LIST_PEER_IDNTT_BASE_ADDR_Pos (0UL) /*!< BLE_BLELL RSLV_LIST_PEER_IDNTT_BASE_ADDR: RSLV_LIST_PEER_IDNTT_BASE_ADDR (Bit 0)*/ +#define BLE_BLELL_RSLV_LIST_PEER_IDNTT_BASE_ADDR_RSLV_LIST_PEER_IDNTT_BASE_ADDR_Msk (0xffffUL) /*!< BLE_BLELL RSLV_LIST_PEER_IDNTT_BASE_ADDR: RSLV_LIST_PEER_IDNTT_BASE_ADDR (Bitfield-Mask: 0xffff)*/ +/* ======================================== BLE_BLELL.RSLV_LIST_PEER_RPA_BASE_ADDR ========================================= */ +#define BLE_BLELL_RSLV_LIST_PEER_RPA_BASE_ADDR_RSLV_LIST_PEER_RPA_BASE_ADDR_Pos (0UL) /*!< BLE_BLELL RSLV_LIST_PEER_RPA_BASE_ADDR: RSLV_LIST_PEER_RPA_BASE_ADDR (Bit 0)*/ +#define BLE_BLELL_RSLV_LIST_PEER_RPA_BASE_ADDR_RSLV_LIST_PEER_RPA_BASE_ADDR_Msk (0xffffUL) /*!< BLE_BLELL RSLV_LIST_PEER_RPA_BASE_ADDR: RSLV_LIST_PEER_RPA_BASE_ADDR (Bitfield-Mask: 0xffff)*/ +/* ====================================== BLE_BLELL.RSLV_LIST_RCVD_INIT_RPA_BASE_ADDR ====================================== */ +#define BLE_BLELL_RSLV_LIST_RCVD_INIT_RPA_BASE_ADDR_RSLV_LIST_RCVD_INIT_RPA_BASE_ADDR_Pos (0UL) /*!< BLE_BLELL RSLV_LIST_RCVD_INIT_RPA_BASE_ADDR: RSLV_LIST_RCVD_INIT_RPA_BASE_ADDR (Bit 0)*/ +#define BLE_BLELL_RSLV_LIST_RCVD_INIT_RPA_BASE_ADDR_RSLV_LIST_RCVD_INIT_RPA_BASE_ADDR_Msk (0xffffUL) /*!< BLE_BLELL RSLV_LIST_RCVD_INIT_RPA_BASE_ADDR: RSLV_LIST_RCVD_INIT_RPA_BASE_ADDR (Bitfield-Mask: 0xffff)*/ +/* ======================================= BLE_BLELL.RSLV_LIST_TX_INIT_RPA_BASE_ADDR ======================================= */ +#define BLE_BLELL_RSLV_LIST_TX_INIT_RPA_BASE_ADDR_RSLV_LIST_TX_INIT_RPA_BASE_ADDR_Pos (0UL) /*!< BLE_BLELL RSLV_LIST_TX_INIT_RPA_BASE_ADDR: RSLV_LIST_TX_INIT_RPA_BASE_ADDR (Bit 0)*/ +#define BLE_BLELL_RSLV_LIST_TX_INIT_RPA_BASE_ADDR_RSLV_LIST_TX_INIT_RPA_BASE_ADDR_Msk (0xffffUL) /*!< BLE_BLELL RSLV_LIST_TX_INIT_RPA_BASE_ADDR: RSLV_LIST_TX_INIT_RPA_BASE_ADDR (Bitfield-Mask: 0xffff)*/ + + +/* ================================================= BLE_BLESS.DDFT_CONFIG ================================================= */ +#define BLE_BLESS_DDFT_CONFIG_DDFT_ENABLE_Pos (0UL) /*!< BLE_BLESS DDFT_CONFIG: DDFT_ENABLE (Bit 0) */ +#define BLE_BLESS_DDFT_CONFIG_DDFT_ENABLE_Msk (0x1UL) /*!< BLE_BLESS DDFT_CONFIG: DDFT_ENABLE (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_DDFT_CONFIG_BLERD_DDFT_EN_Pos (1UL) /*!< BLE_BLESS DDFT_CONFIG: BLERD_DDFT_EN (Bit 1) */ +#define BLE_BLESS_DDFT_CONFIG_BLERD_DDFT_EN_Msk (0x2UL) /*!< BLE_BLESS DDFT_CONFIG: BLERD_DDFT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_DDFT_CONFIG_DDFT_MUX_CFG1_Pos (8UL) /*!< BLE_BLESS DDFT_CONFIG: DDFT_MUX_CFG1 (Bit 8) */ +#define BLE_BLESS_DDFT_CONFIG_DDFT_MUX_CFG1_Msk (0x1f00UL) /*!< BLE_BLESS DDFT_CONFIG: DDFT_MUX_CFG1 (Bitfield-Mask: 0x1f)*/ +#define BLE_BLESS_DDFT_CONFIG_DDFT_MUX_CFG2_Pos (16UL) /*!< BLE_BLESS DDFT_CONFIG: DDFT_MUX_CFG2 (Bit 16) */ +#define BLE_BLESS_DDFT_CONFIG_DDFT_MUX_CFG2_Msk (0x1f0000UL) /*!< BLE_BLESS DDFT_CONFIG: DDFT_MUX_CFG2 (Bitfield-Mask: 0x1f)*/ +/* ============================================= BLE_BLESS.XTAL_CLK_DIV_CONFIG ============================================= */ +#define BLE_BLESS_XTAL_CLK_DIV_CONFIG_SYSCLK_DIV_Pos (0UL) /*!< BLE_BLESS XTAL_CLK_DIV_CONFIG: SYSCLK_DIV (Bit 0) */ +#define BLE_BLESS_XTAL_CLK_DIV_CONFIG_SYSCLK_DIV_Msk (0x3UL) /*!< BLE_BLESS XTAL_CLK_DIV_CONFIG: SYSCLK_DIV (Bitfield-Mask: 0x03)*/ +#define BLE_BLESS_XTAL_CLK_DIV_CONFIG_LLCLK_DIV_Pos (2UL) /*!< BLE_BLESS XTAL_CLK_DIV_CONFIG: LLCLK_DIV (Bit 2) */ +#define BLE_BLESS_XTAL_CLK_DIV_CONFIG_LLCLK_DIV_Msk (0xcUL) /*!< BLE_BLESS XTAL_CLK_DIV_CONFIG: LLCLK_DIV (Bitfield-Mask: 0x03)*/ +/* ================================================== BLE_BLESS.INTR_STAT ================================================== */ +#define BLE_BLESS_INTR_STAT_DSM_ENTERED_INTR_Pos (0UL) /*!< BLE_BLESS INTR_STAT: DSM_ENTERED_INTR (Bit 0) */ +#define BLE_BLESS_INTR_STAT_DSM_ENTERED_INTR_Msk (0x1UL) /*!< BLE_BLESS INTR_STAT: DSM_ENTERED_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_STAT_DSM_EXITED_INTR_Pos (1UL) /*!< BLE_BLESS INTR_STAT: DSM_EXITED_INTR (Bit 1) */ +#define BLE_BLESS_INTR_STAT_DSM_EXITED_INTR_Msk (0x2UL) /*!< BLE_BLESS INTR_STAT: DSM_EXITED_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_STAT_RCBLL_DONE_INTR_Pos (2UL) /*!< BLE_BLESS INTR_STAT: RCBLL_DONE_INTR (Bit 2) */ +#define BLE_BLESS_INTR_STAT_RCBLL_DONE_INTR_Msk (0x4UL) /*!< BLE_BLESS INTR_STAT: RCBLL_DONE_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_STAT_BLERD_ACTIVE_INTR_Pos (3UL) /*!< BLE_BLESS INTR_STAT: BLERD_ACTIVE_INTR (Bit 3) */ +#define BLE_BLESS_INTR_STAT_BLERD_ACTIVE_INTR_Msk (0x8UL) /*!< BLE_BLESS INTR_STAT: BLERD_ACTIVE_INTR (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_STAT_RCB_INTR_Pos (4UL) /*!< BLE_BLESS INTR_STAT: RCB_INTR (Bit 4) */ +#define BLE_BLESS_INTR_STAT_RCB_INTR_Msk (0x10UL) /*!< BLE_BLESS INTR_STAT: RCB_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_STAT_LL_INTR_Pos (5UL) /*!< BLE_BLESS INTR_STAT: LL_INTR (Bit 5) */ +#define BLE_BLESS_INTR_STAT_LL_INTR_Msk (0x20UL) /*!< BLE_BLESS INTR_STAT: LL_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_STAT_GPIO_INTR_Pos (6UL) /*!< BLE_BLESS INTR_STAT: GPIO_INTR (Bit 6) */ +#define BLE_BLESS_INTR_STAT_GPIO_INTR_Msk (0x40UL) /*!< BLE_BLESS INTR_STAT: GPIO_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_STAT_EFUSE_INTR_Pos (7UL) /*!< BLE_BLESS INTR_STAT: EFUSE_INTR (Bit 7) */ +#define BLE_BLESS_INTR_STAT_EFUSE_INTR_Msk (0x80UL) /*!< BLE_BLESS INTR_STAT: EFUSE_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_STAT_XTAL_ON_INTR_Pos (8UL) /*!< BLE_BLESS INTR_STAT: XTAL_ON_INTR (Bit 8) */ +#define BLE_BLESS_INTR_STAT_XTAL_ON_INTR_Msk (0x100UL) /*!< BLE_BLESS INTR_STAT: XTAL_ON_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_STAT_ENC_INTR_Pos (9UL) /*!< BLE_BLESS INTR_STAT: ENC_INTR (Bit 9) */ +#define BLE_BLESS_INTR_STAT_ENC_INTR_Msk (0x200UL) /*!< BLE_BLESS INTR_STAT: ENC_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_STAT_HVLDO_LV_DETECT_POS_Pos (10UL) /*!< BLE_BLESS INTR_STAT: HVLDO_LV_DETECT_POS (Bit 10) */ +#define BLE_BLESS_INTR_STAT_HVLDO_LV_DETECT_POS_Msk (0x400UL) /*!< BLE_BLESS INTR_STAT: HVLDO_LV_DETECT_POS (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_STAT_HVLDO_LV_DETECT_NEG_Pos (11UL) /*!< BLE_BLESS INTR_STAT: HVLDO_LV_DETECT_NEG (Bit 11) */ +#define BLE_BLESS_INTR_STAT_HVLDO_LV_DETECT_NEG_Msk (0x800UL) /*!< BLE_BLESS INTR_STAT: HVLDO_LV_DETECT_NEG (Bitfield-Mask: 0x01)*/ +/* ================================================== BLE_BLESS.INTR_MASK ================================================== */ +#define BLE_BLESS_INTR_MASK_DSM_EXIT_Pos (0UL) /*!< BLE_BLESS INTR_MASK: DSM_EXIT (Bit 0) */ +#define BLE_BLESS_INTR_MASK_DSM_EXIT_Msk (0x1UL) /*!< BLE_BLESS INTR_MASK: DSM_EXIT (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_MASK_DSM_ENTERED_INTR_MASK_Pos (1UL) /*!< BLE_BLESS INTR_MASK: DSM_ENTERED_INTR_MASK (Bit 1) */ +#define BLE_BLESS_INTR_MASK_DSM_ENTERED_INTR_MASK_Msk (0x2UL) /*!< BLE_BLESS INTR_MASK: DSM_ENTERED_INTR_MASK (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_MASK_DSM_EXITED_INTR_MASK_Pos (2UL) /*!< BLE_BLESS INTR_MASK: DSM_EXITED_INTR_MASK (Bit 2) */ +#define BLE_BLESS_INTR_MASK_DSM_EXITED_INTR_MASK_Msk (0x4UL) /*!< BLE_BLESS INTR_MASK: DSM_EXITED_INTR_MASK (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_MASK_XTAL_ON_INTR_MASK_Pos (3UL) /*!< BLE_BLESS INTR_MASK: XTAL_ON_INTR_MASK (Bit 3) */ +#define BLE_BLESS_INTR_MASK_XTAL_ON_INTR_MASK_Msk (0x8UL) /*!< BLE_BLESS INTR_MASK: XTAL_ON_INTR_MASK (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_MASK_RCBLL_INTR_MASK_Pos (4UL) /*!< BLE_BLESS INTR_MASK: RCBLL_INTR_MASK (Bit 4) */ +#define BLE_BLESS_INTR_MASK_RCBLL_INTR_MASK_Msk (0x10UL) /*!< BLE_BLESS INTR_MASK: RCBLL_INTR_MASK (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_MASK_BLERD_ACTIVE_INTR_MASK_Pos (5UL) /*!< BLE_BLESS INTR_MASK: BLERD_ACTIVE_INTR_MASK (Bit 5) */ +#define BLE_BLESS_INTR_MASK_BLERD_ACTIVE_INTR_MASK_Msk (0x20UL) /*!< BLE_BLESS INTR_MASK: BLERD_ACTIVE_INTR_MASK (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_MASK_RCB_INTR_MASK_Pos (6UL) /*!< BLE_BLESS INTR_MASK: RCB_INTR_MASK (Bit 6) */ +#define BLE_BLESS_INTR_MASK_RCB_INTR_MASK_Msk (0x40UL) /*!< BLE_BLESS INTR_MASK: RCB_INTR_MASK (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_MASK_LL_INTR_MASK_Pos (7UL) /*!< BLE_BLESS INTR_MASK: LL_INTR_MASK (Bit 7) */ +#define BLE_BLESS_INTR_MASK_LL_INTR_MASK_Msk (0x80UL) /*!< BLE_BLESS INTR_MASK: LL_INTR_MASK (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_MASK_GPIO_INTR_MASK_Pos (8UL) /*!< BLE_BLESS INTR_MASK: GPIO_INTR_MASK (Bit 8) */ +#define BLE_BLESS_INTR_MASK_GPIO_INTR_MASK_Msk (0x100UL) /*!< BLE_BLESS INTR_MASK: GPIO_INTR_MASK (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_MASK_EFUSE_INTR_MASK_Pos (9UL) /*!< BLE_BLESS INTR_MASK: EFUSE_INTR_MASK (Bit 9) */ +#define BLE_BLESS_INTR_MASK_EFUSE_INTR_MASK_Msk (0x200UL) /*!< BLE_BLESS INTR_MASK: EFUSE_INTR_MASK (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_MASK_ENC_INTR_MASK_Pos (10UL) /*!< BLE_BLESS INTR_MASK: ENC_INTR_MASK (Bit 10) */ +#define BLE_BLESS_INTR_MASK_ENC_INTR_MASK_Msk (0x400UL) /*!< BLE_BLESS INTR_MASK: ENC_INTR_MASK (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_INTR_MASK_HVLDO_LV_DETECT_POS_MASK_Pos (11UL) /*!< BLE_BLESS INTR_MASK: HVLDO_LV_DETECT_POS_MASK (Bit 11) */ +#define BLE_BLESS_INTR_MASK_HVLDO_LV_DETECT_POS_MASK_Msk (0x800UL) /*!< BLE_BLESS INTR_MASK: HVLDO_LV_DETECT_POS_MASK (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_INTR_MASK_HVLDO_LV_DETECT_NEG_MASK_Pos (12UL) /*!< BLE_BLESS INTR_MASK: HVLDO_LV_DETECT_NEG_MASK (Bit 12) */ +#define BLE_BLESS_INTR_MASK_HVLDO_LV_DETECT_NEG_MASK_Msk (0x1000UL) /*!< BLE_BLESS INTR_MASK: HVLDO_LV_DETECT_NEG_MASK (Bitfield-Mask: 0x01)*/ +/* ================================================== BLE_BLESS.LL_CLK_EN ================================================== */ +#define BLE_BLESS_LL_CLK_EN_CLK_EN_Pos (0UL) /*!< BLE_BLESS LL_CLK_EN: CLK_EN (Bit 0) */ +#define BLE_BLESS_LL_CLK_EN_CLK_EN_Msk (0x1UL) /*!< BLE_BLESS LL_CLK_EN: CLK_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_LL_CLK_EN_CY_CORREL_EN_Pos (1UL) /*!< BLE_BLESS LL_CLK_EN: CY_CORREL_EN (Bit 1) */ +#define BLE_BLESS_LL_CLK_EN_CY_CORREL_EN_Msk (0x2UL) /*!< BLE_BLESS LL_CLK_EN: CY_CORREL_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_LL_CLK_EN_MXD_IF_OPTION_Pos (2UL) /*!< BLE_BLESS LL_CLK_EN: MXD_IF_OPTION (Bit 2) */ +#define BLE_BLESS_LL_CLK_EN_MXD_IF_OPTION_Msk (0x4UL) /*!< BLE_BLESS LL_CLK_EN: MXD_IF_OPTION (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_LL_CLK_EN_SEL_RCB_CLK_Pos (3UL) /*!< BLE_BLESS LL_CLK_EN: SEL_RCB_CLK (Bit 3) */ +#define BLE_BLESS_LL_CLK_EN_SEL_RCB_CLK_Msk (0x8UL) /*!< BLE_BLESS LL_CLK_EN: SEL_RCB_CLK (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_LL_CLK_EN_BLESS_RESET_Pos (4UL) /*!< BLE_BLESS LL_CLK_EN: BLESS_RESET (Bit 4) */ +#define BLE_BLESS_LL_CLK_EN_BLESS_RESET_Msk (0x10UL) /*!< BLE_BLESS LL_CLK_EN: BLESS_RESET (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_LL_CLK_EN_DPSLP_HWRCB_EN_Pos (5UL) /*!< BLE_BLESS LL_CLK_EN: DPSLP_HWRCB_EN (Bit 5) */ +#define BLE_BLESS_LL_CLK_EN_DPSLP_HWRCB_EN_Msk (0x20UL) /*!< BLE_BLESS LL_CLK_EN: DPSLP_HWRCB_EN (Bitfield-Mask: 0x01) */ +/* ================================================= BLE_BLESS.LF_CLK_CTRL ================================================= */ +#define BLE_BLESS_LF_CLK_CTRL_DISABLE_LF_CLK_Pos (0UL) /*!< BLE_BLESS LF_CLK_CTRL: DISABLE_LF_CLK (Bit 0) */ +#define BLE_BLESS_LF_CLK_CTRL_DISABLE_LF_CLK_Msk (0x1UL) /*!< BLE_BLESS LF_CLK_CTRL: DISABLE_LF_CLK (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_LF_CLK_CTRL_ENABLE_ENC_CLK_Pos (1UL) /*!< BLE_BLESS LF_CLK_CTRL: ENABLE_ENC_CLK (Bit 1) */ +#define BLE_BLESS_LF_CLK_CTRL_ENABLE_ENC_CLK_Msk (0x2UL) /*!< BLE_BLESS LF_CLK_CTRL: ENABLE_ENC_CLK (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_LF_CLK_CTRL_M0S8BLESS_REV_ID_Pos (29UL) /*!< BLE_BLESS LF_CLK_CTRL: M0S8BLESS_REV_ID (Bit 29) */ +#define BLE_BLESS_LF_CLK_CTRL_M0S8BLESS_REV_ID_Msk (0xe0000000UL) /*!< BLE_BLESS LF_CLK_CTRL: M0S8BLESS_REV_ID (Bitfield-Mask: 0x07)*/ +/* =============================================== BLE_BLESS.EXT_PA_LNA_CTRL =============================================== */ +#define BLE_BLESS_EXT_PA_LNA_CTRL_ENABLE_EXT_PA_LNA_Pos (1UL) /*!< BLE_BLESS EXT_PA_LNA_CTRL: ENABLE_EXT_PA_LNA (Bit 1) */ +#define BLE_BLESS_EXT_PA_LNA_CTRL_ENABLE_EXT_PA_LNA_Msk (0x2UL) /*!< BLE_BLESS EXT_PA_LNA_CTRL: ENABLE_EXT_PA_LNA (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_EXT_PA_LNA_CTRL_CHIP_EN_POL_Pos (2UL) /*!< BLE_BLESS EXT_PA_LNA_CTRL: CHIP_EN_POL (Bit 2) */ +#define BLE_BLESS_EXT_PA_LNA_CTRL_CHIP_EN_POL_Msk (0x4UL) /*!< BLE_BLESS EXT_PA_LNA_CTRL: CHIP_EN_POL (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_EXT_PA_LNA_CTRL_PA_CTRL_POL_Pos (3UL) /*!< BLE_BLESS EXT_PA_LNA_CTRL: PA_CTRL_POL (Bit 3) */ +#define BLE_BLESS_EXT_PA_LNA_CTRL_PA_CTRL_POL_Msk (0x8UL) /*!< BLE_BLESS EXT_PA_LNA_CTRL: PA_CTRL_POL (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_EXT_PA_LNA_CTRL_LNA_CTRL_POL_Pos (4UL) /*!< BLE_BLESS EXT_PA_LNA_CTRL: LNA_CTRL_POL (Bit 4) */ +#define BLE_BLESS_EXT_PA_LNA_CTRL_LNA_CTRL_POL_Msk (0x10UL) /*!< BLE_BLESS EXT_PA_LNA_CTRL: LNA_CTRL_POL (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_EXT_PA_LNA_CTRL_OUT_EN_DRIVE_VAL_Pos (5UL) /*!< BLE_BLESS EXT_PA_LNA_CTRL: OUT_EN_DRIVE_VAL (Bit 5) */ +#define BLE_BLESS_EXT_PA_LNA_CTRL_OUT_EN_DRIVE_VAL_Msk (0x20UL) /*!< BLE_BLESS EXT_PA_LNA_CTRL: OUT_EN_DRIVE_VAL (Bitfield-Mask: 0x01)*/ +/* ============================================ BLE_BLESS.LL_PKT_RSSI_CH_ENERGY ============================================ */ +#define BLE_BLESS_LL_PKT_RSSI_CH_ENERGY_RSSI_Pos (0UL) /*!< BLE_BLESS LL_PKT_RSSI_CH_ENERGY: RSSI (Bit 0) */ +#define BLE_BLESS_LL_PKT_RSSI_CH_ENERGY_RSSI_Msk (0xffffUL) /*!< BLE_BLESS LL_PKT_RSSI_CH_ENERGY: RSSI (Bitfield-Mask: 0xffff)*/ +#define BLE_BLESS_LL_PKT_RSSI_CH_ENERGY_RX_CHANNEL_Pos (16UL) /*!< BLE_BLESS LL_PKT_RSSI_CH_ENERGY: RX_CHANNEL (Bit 16) */ +#define BLE_BLESS_LL_PKT_RSSI_CH_ENERGY_RX_CHANNEL_Msk (0x3f0000UL) /*!< BLE_BLESS LL_PKT_RSSI_CH_ENERGY: RX_CHANNEL (Bitfield-Mask: 0x3f)*/ +#define BLE_BLESS_LL_PKT_RSSI_CH_ENERGY_PKT_RSSI_OR_CH_ENERGY_Pos (22UL) /*!< BLE_BLESS LL_PKT_RSSI_CH_ENERGY: PKT_RSSI_OR_CH_ENERGY (Bit 22)*/ +#define BLE_BLESS_LL_PKT_RSSI_CH_ENERGY_PKT_RSSI_OR_CH_ENERGY_Msk (0x400000UL) /*!< BLE_BLESS LL_PKT_RSSI_CH_ENERGY: PKT_RSSI_OR_CH_ENERGY (Bitfield-Mask: 0x01)*/ +/* =================================================== BLE_BLESS.MT_CFG ==================================================== */ +#define BLE_BLESS_MT_CFG_ENABLE_BLERD_Pos (0UL) /*!< BLE_BLESS MT_CFG: ENABLE_BLERD (Bit 0) */ +#define BLE_BLESS_MT_CFG_ENABLE_BLERD_Msk (0x1UL) /*!< BLE_BLESS MT_CFG: ENABLE_BLERD (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_DEEPSLEEP_EXIT_CFG_Pos (1UL) /*!< BLE_BLESS MT_CFG: DEEPSLEEP_EXIT_CFG (Bit 1) */ +#define BLE_BLESS_MT_CFG_DEEPSLEEP_EXIT_CFG_Msk (0x2UL) /*!< BLE_BLESS MT_CFG: DEEPSLEEP_EXIT_CFG (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MT_CFG_DEEPSLEEP_EXITED_Pos (2UL) /*!< BLE_BLESS MT_CFG: DEEPSLEEP_EXITED (Bit 2) */ +#define BLE_BLESS_MT_CFG_DEEPSLEEP_EXITED_Msk (0x4UL) /*!< BLE_BLESS MT_CFG: DEEPSLEEP_EXITED (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_ACT_LDO_NOT_BUCK_Pos (3UL) /*!< BLE_BLESS MT_CFG: ACT_LDO_NOT_BUCK (Bit 3) */ +#define BLE_BLESS_MT_CFG_ACT_LDO_NOT_BUCK_Msk (0x8UL) /*!< BLE_BLESS MT_CFG: ACT_LDO_NOT_BUCK (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_BYPASS_Pos (4UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_HVLDO_BYPASS (Bit 4) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_BYPASS_Msk (0x10UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_HVLDO_BYPASS (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MT_CFG_HVLDO_BYPASS_Pos (5UL) /*!< BLE_BLESS MT_CFG: HVLDO_BYPASS (Bit 5) */ +#define BLE_BLESS_MT_CFG_HVLDO_BYPASS_Msk (0x20UL) /*!< BLE_BLESS MT_CFG: HVLDO_BYPASS (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_ACT_REGULATOR_Pos (6UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_ACT_REGULATOR (Bit 6) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_ACT_REGULATOR_Msk (0x40UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_ACT_REGULATOR (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MT_CFG_ACT_REGULATOR_EN_Pos (7UL) /*!< BLE_BLESS MT_CFG: ACT_REGULATOR_EN (Bit 7) */ +#define BLE_BLESS_MT_CFG_ACT_REGULATOR_EN_Msk (0x80UL) /*!< BLE_BLESS MT_CFG: ACT_REGULATOR_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_DIG_REGULATOR_Pos (8UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_DIG_REGULATOR (Bit 8) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_DIG_REGULATOR_Msk (0x100UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_DIG_REGULATOR (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MT_CFG_DIG_REGULATOR_EN_Pos (9UL) /*!< BLE_BLESS MT_CFG: DIG_REGULATOR_EN (Bit 9) */ +#define BLE_BLESS_MT_CFG_DIG_REGULATOR_EN_Msk (0x200UL) /*!< BLE_BLESS MT_CFG: DIG_REGULATOR_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_RET_SWITCH_Pos (10UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_RET_SWITCH (Bit 10) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_RET_SWITCH_Msk (0x400UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_RET_SWITCH (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MT_CFG_RET_SWITCH_Pos (11UL) /*!< BLE_BLESS MT_CFG: RET_SWITCH (Bit 11) */ +#define BLE_BLESS_MT_CFG_RET_SWITCH_Msk (0x800UL) /*!< BLE_BLESS MT_CFG: RET_SWITCH (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_ISOLATE_Pos (12UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_ISOLATE (Bit 12) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_ISOLATE_Msk (0x1000UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_ISOLATE (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_ISOLATE_N_Pos (13UL) /*!< BLE_BLESS MT_CFG: ISOLATE_N (Bit 13) */ +#define BLE_BLESS_MT_CFG_ISOLATE_N_Msk (0x2000UL) /*!< BLE_BLESS MT_CFG: ISOLATE_N (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_LL_CLK_EN_Pos (14UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_LL_CLK_EN (Bit 14) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_LL_CLK_EN_Msk (0x4000UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_LL_CLK_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MT_CFG_LL_CLK_EN_Pos (15UL) /*!< BLE_BLESS MT_CFG: LL_CLK_EN (Bit 15) */ +#define BLE_BLESS_MT_CFG_LL_CLK_EN_Msk (0x8000UL) /*!< BLE_BLESS MT_CFG: LL_CLK_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_EN_Pos (16UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_HVLDO_EN (Bit 16) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_EN_Msk (0x10000UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_HVLDO_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_HVLDO_EN_Pos (17UL) /*!< BLE_BLESS MT_CFG: HVLDO_EN (Bit 17) */ +#define BLE_BLESS_MT_CFG_HVLDO_EN_Msk (0x20000UL) /*!< BLE_BLESS MT_CFG: HVLDO_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_DPSLP_ECO_ON_Pos (18UL) /*!< BLE_BLESS MT_CFG: DPSLP_ECO_ON (Bit 18) */ +#define BLE_BLESS_MT_CFG_DPSLP_ECO_ON_Msk (0x40000UL) /*!< BLE_BLESS MT_CFG: DPSLP_ECO_ON (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_RESET_N_Pos (19UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_RESET_N (Bit 19) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_RESET_N_Msk (0x80000UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_RESET_N (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_RESET_N_Pos (20UL) /*!< BLE_BLESS MT_CFG: RESET_N (Bit 20) */ +#define BLE_BLESS_MT_CFG_RESET_N_Msk (0x100000UL) /*!< BLE_BLESS MT_CFG: RESET_N (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_XTAL_EN_Pos (21UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_XTAL_EN (Bit 21) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_XTAL_EN_Msk (0x200000UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_XTAL_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_XTAL_EN_Pos (22UL) /*!< BLE_BLESS MT_CFG: XTAL_EN (Bit 22) */ +#define BLE_BLESS_MT_CFG_XTAL_EN_Msk (0x400000UL) /*!< BLE_BLESS MT_CFG: XTAL_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_CLK_EN_Pos (23UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_CLK_EN (Bit 23) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_CLK_EN_Msk (0x800000UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_CLK_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_BLERD_CLK_EN_Pos (24UL) /*!< BLE_BLESS MT_CFG: BLERD_CLK_EN (Bit 24) */ +#define BLE_BLESS_MT_CFG_BLERD_CLK_EN_Msk (0x1000000UL) /*!< BLE_BLESS MT_CFG: BLERD_CLK_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_RET_LDO_OL_Pos (25UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_RET_LDO_OL (Bit 25) */ +#define BLE_BLESS_MT_CFG_OVERRIDE_RET_LDO_OL_Msk (0x2000000UL) /*!< BLE_BLESS MT_CFG: OVERRIDE_RET_LDO_OL (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MT_CFG_RET_LDO_OL_Pos (26UL) /*!< BLE_BLESS MT_CFG: RET_LDO_OL (Bit 26) */ +#define BLE_BLESS_MT_CFG_RET_LDO_OL_Msk (0x4000000UL) /*!< BLE_BLESS MT_CFG: RET_LDO_OL (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_CFG_HVLDO_POR_HV_Pos (27UL) /*!< BLE_BLESS MT_CFG: HVLDO_POR_HV (Bit 27) */ +#define BLE_BLESS_MT_CFG_HVLDO_POR_HV_Msk (0x8000000UL) /*!< BLE_BLESS MT_CFG: HVLDO_POR_HV (Bitfield-Mask: 0x01) */ +/* ================================================ BLE_BLESS.MT_DELAY_CFG ================================================= */ +#define BLE_BLESS_MT_DELAY_CFG_HVLDO_STARTUP_DELAY_Pos (0UL) /*!< BLE_BLESS MT_DELAY_CFG: HVLDO_STARTUP_DELAY (Bit 0) */ +#define BLE_BLESS_MT_DELAY_CFG_HVLDO_STARTUP_DELAY_Msk (0xffUL) /*!< BLE_BLESS MT_DELAY_CFG: HVLDO_STARTUP_DELAY (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_MT_DELAY_CFG_ISOLATE_DEASSERT_DELAY_Pos (8UL) /*!< BLE_BLESS MT_DELAY_CFG: ISOLATE_DEASSERT_DELAY (Bit 8) */ +#define BLE_BLESS_MT_DELAY_CFG_ISOLATE_DEASSERT_DELAY_Msk (0xff00UL) /*!< BLE_BLESS MT_DELAY_CFG: ISOLATE_DEASSERT_DELAY (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_MT_DELAY_CFG_ACT_TO_SWITCH_DELAY_Pos (16UL) /*!< BLE_BLESS MT_DELAY_CFG: ACT_TO_SWITCH_DELAY (Bit 16) */ +#define BLE_BLESS_MT_DELAY_CFG_ACT_TO_SWITCH_DELAY_Msk (0xff0000UL) /*!< BLE_BLESS MT_DELAY_CFG: ACT_TO_SWITCH_DELAY (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_MT_DELAY_CFG_HVLDO_DISABLE_DELAY_Pos (24UL) /*!< BLE_BLESS MT_DELAY_CFG: HVLDO_DISABLE_DELAY (Bit 24) */ +#define BLE_BLESS_MT_DELAY_CFG_HVLDO_DISABLE_DELAY_Msk (0xff000000UL) /*!< BLE_BLESS MT_DELAY_CFG: HVLDO_DISABLE_DELAY (Bitfield-Mask: 0xff)*/ +/* ================================================ BLE_BLESS.MT_DELAY_CFG2 ================================================ */ +#define BLE_BLESS_MT_DELAY_CFG2_OSC_STARTUP_DELAY_LF_Pos (0UL) /*!< BLE_BLESS MT_DELAY_CFG2: OSC_STARTUP_DELAY_LF (Bit 0) */ +#define BLE_BLESS_MT_DELAY_CFG2_OSC_STARTUP_DELAY_LF_Msk (0xffUL) /*!< BLE_BLESS MT_DELAY_CFG2: OSC_STARTUP_DELAY_LF (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_MT_DELAY_CFG2_DSM_OFFSET_TO_WAKEUP_INSTANT_LF_Pos (8UL) /*!< BLE_BLESS MT_DELAY_CFG2: DSM_OFFSET_TO_WAKEUP_INSTANT_LF (Bit 8)*/ +#define BLE_BLESS_MT_DELAY_CFG2_DSM_OFFSET_TO_WAKEUP_INSTANT_LF_Msk (0xff00UL) /*!< BLE_BLESS MT_DELAY_CFG2: DSM_OFFSET_TO_WAKEUP_INSTANT_LF (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_MT_DELAY_CFG2_ACT_STARTUP_DELAY_Pos (16UL) /*!< BLE_BLESS MT_DELAY_CFG2: ACT_STARTUP_DELAY (Bit 16) */ +#define BLE_BLESS_MT_DELAY_CFG2_ACT_STARTUP_DELAY_Msk (0xff0000UL) /*!< BLE_BLESS MT_DELAY_CFG2: ACT_STARTUP_DELAY (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_MT_DELAY_CFG2_DIG_LDO_STARTUP_DELAY_Pos (24UL) /*!< BLE_BLESS MT_DELAY_CFG2: DIG_LDO_STARTUP_DELAY (Bit 24) */ +#define BLE_BLESS_MT_DELAY_CFG2_DIG_LDO_STARTUP_DELAY_Msk (0xff000000UL) /*!< BLE_BLESS MT_DELAY_CFG2: DIG_LDO_STARTUP_DELAY (Bitfield-Mask: 0xff)*/ +/* ================================================ BLE_BLESS.MT_DELAY_CFG3 ================================================ */ +#define BLE_BLESS_MT_DELAY_CFG3_XTAL_DISABLE_DELAY_Pos (0UL) /*!< BLE_BLESS MT_DELAY_CFG3: XTAL_DISABLE_DELAY (Bit 0) */ +#define BLE_BLESS_MT_DELAY_CFG3_XTAL_DISABLE_DELAY_Msk (0xffUL) /*!< BLE_BLESS MT_DELAY_CFG3: XTAL_DISABLE_DELAY (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_MT_DELAY_CFG3_DIG_LDO_DISABLE_DELAY_Pos (8UL) /*!< BLE_BLESS MT_DELAY_CFG3: DIG_LDO_DISABLE_DELAY (Bit 8) */ +#define BLE_BLESS_MT_DELAY_CFG3_DIG_LDO_DISABLE_DELAY_Msk (0xff00UL) /*!< BLE_BLESS MT_DELAY_CFG3: DIG_LDO_DISABLE_DELAY (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_MT_DELAY_CFG3_VDDR_STABLE_DELAY_Pos (16UL) /*!< BLE_BLESS MT_DELAY_CFG3: VDDR_STABLE_DELAY (Bit 16) */ +#define BLE_BLESS_MT_DELAY_CFG3_VDDR_STABLE_DELAY_Msk (0xff0000UL) /*!< BLE_BLESS MT_DELAY_CFG3: VDDR_STABLE_DELAY (Bitfield-Mask: 0xff)*/ +/* ================================================= BLE_BLESS.MT_VIO_CTRL ================================================= */ +#define BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_Pos (0UL) /*!< BLE_BLESS MT_VIO_CTRL: SRSS_SWITCH_EN (Bit 0) */ +#define BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_Msk (0x1UL) /*!< BLE_BLESS MT_VIO_CTRL: SRSS_SWITCH_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_DLY_Pos (1UL) /*!< BLE_BLESS MT_VIO_CTRL: SRSS_SWITCH_EN_DLY (Bit 1) */ +#define BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_DLY_Msk (0x2UL) /*!< BLE_BLESS MT_VIO_CTRL: SRSS_SWITCH_EN_DLY (Bitfield-Mask: 0x01)*/ +/* ================================================== BLE_BLESS.MT_STATUS ================================================== */ +#define BLE_BLESS_MT_STATUS_BLESS_STATE_Pos (0UL) /*!< BLE_BLESS MT_STATUS: BLESS_STATE (Bit 0) */ +#define BLE_BLESS_MT_STATUS_BLESS_STATE_Msk (0x1UL) /*!< BLE_BLESS MT_STATUS: BLESS_STATE (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_MT_STATUS_MT_CURR_STATE_Pos (1UL) /*!< BLE_BLESS MT_STATUS: MT_CURR_STATE (Bit 1) */ +#define BLE_BLESS_MT_STATUS_MT_CURR_STATE_Msk (0x1eUL) /*!< BLE_BLESS MT_STATUS: MT_CURR_STATE (Bitfield-Mask: 0x0f) */ +#define BLE_BLESS_MT_STATUS_HVLDO_STARTUP_CURR_STATE_Pos (5UL) /*!< BLE_BLESS MT_STATUS: HVLDO_STARTUP_CURR_STATE (Bit 5) */ +#define BLE_BLESS_MT_STATUS_HVLDO_STARTUP_CURR_STATE_Msk (0xe0UL) /*!< BLE_BLESS MT_STATUS: HVLDO_STARTUP_CURR_STATE (Bitfield-Mask: 0x07)*/ +/* =============================================== BLE_BLESS.PWR_CTRL_SM_ST ================================================ */ +#define BLE_BLESS_PWR_CTRL_SM_ST_PWR_CTRL_SM_CURR_STATE_Pos (0UL) /*!< BLE_BLESS PWR_CTRL_SM_ST: PWR_CTRL_SM_CURR_STATE (Bit 0)*/ +#define BLE_BLESS_PWR_CTRL_SM_ST_PWR_CTRL_SM_CURR_STATE_Msk (0xfUL) /*!< BLE_BLESS PWR_CTRL_SM_ST: PWR_CTRL_SM_CURR_STATE (Bitfield-Mask: 0x0f)*/ +/* ================================================= BLE_BLESS.HVLDO_CTRL ================================================== */ +#define BLE_BLESS_HVLDO_CTRL_ADFT_EN_Pos (0UL) /*!< BLE_BLESS HVLDO_CTRL: ADFT_EN (Bit 0) */ +#define BLE_BLESS_HVLDO_CTRL_ADFT_EN_Msk (0x1UL) /*!< BLE_BLESS HVLDO_CTRL: ADFT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_HVLDO_CTRL_ADFT_CTRL_Pos (1UL) /*!< BLE_BLESS HVLDO_CTRL: ADFT_CTRL (Bit 1) */ +#define BLE_BLESS_HVLDO_CTRL_ADFT_CTRL_Msk (0x1eUL) /*!< BLE_BLESS HVLDO_CTRL: ADFT_CTRL (Bitfield-Mask: 0x0f) */ +#define BLE_BLESS_HVLDO_CTRL_VREF_EXT_EN_Pos (6UL) /*!< BLE_BLESS HVLDO_CTRL: VREF_EXT_EN (Bit 6) */ +#define BLE_BLESS_HVLDO_CTRL_VREF_EXT_EN_Msk (0x40UL) /*!< BLE_BLESS HVLDO_CTRL: VREF_EXT_EN (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_HVLDO_CTRL_STATUS_Pos (31UL) /*!< BLE_BLESS HVLDO_CTRL: STATUS (Bit 31) */ +#define BLE_BLESS_HVLDO_CTRL_STATUS_Msk (0x80000000UL) /*!< BLE_BLESS HVLDO_CTRL: STATUS (Bitfield-Mask: 0x01) */ +/* ================================================ BLE_BLESS.MISC_EN_CTRL ================================================= */ +#define BLE_BLESS_MISC_EN_CTRL_BUCK_EN_CTRL_Pos (0UL) /*!< BLE_BLESS MISC_EN_CTRL: BUCK_EN_CTRL (Bit 0) */ +#define BLE_BLESS_MISC_EN_CTRL_BUCK_EN_CTRL_Msk (0x1UL) /*!< BLE_BLESS MISC_EN_CTRL: BUCK_EN_CTRL (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MISC_EN_CTRL_ACT_REG_EN_CTRL_Pos (1UL) /*!< BLE_BLESS MISC_EN_CTRL: ACT_REG_EN_CTRL (Bit 1) */ +#define BLE_BLESS_MISC_EN_CTRL_ACT_REG_EN_CTRL_Msk (0x2UL) /*!< BLE_BLESS MISC_EN_CTRL: ACT_REG_EN_CTRL (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MISC_EN_CTRL_LPM_DRIFT_EN_Pos (2UL) /*!< BLE_BLESS MISC_EN_CTRL: LPM_DRIFT_EN (Bit 2) */ +#define BLE_BLESS_MISC_EN_CTRL_LPM_DRIFT_EN_Msk (0x4UL) /*!< BLE_BLESS MISC_EN_CTRL: LPM_DRIFT_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MISC_EN_CTRL_LPM_DRIFT_MULTI_Pos (3UL) /*!< BLE_BLESS MISC_EN_CTRL: LPM_DRIFT_MULTI (Bit 3) */ +#define BLE_BLESS_MISC_EN_CTRL_LPM_DRIFT_MULTI_Msk (0x8UL) /*!< BLE_BLESS MISC_EN_CTRL: LPM_DRIFT_MULTI (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_MISC_EN_CTRL_LPM_ENTRY_CTRL_MODE_Pos (4UL) /*!< BLE_BLESS MISC_EN_CTRL: LPM_ENTRY_CTRL_MODE (Bit 4) */ +#define BLE_BLESS_MISC_EN_CTRL_LPM_ENTRY_CTRL_MODE_Msk (0x10UL) /*!< BLE_BLESS MISC_EN_CTRL: LPM_ENTRY_CTRL_MODE (Bitfield-Mask: 0x01)*/ +/* ================================================ BLE_BLESS.EFUSE_CONFIG ================================================= */ +#define BLE_BLESS_EFUSE_CONFIG_EFUSE_MODE_Pos (0UL) /*!< BLE_BLESS EFUSE_CONFIG: EFUSE_MODE (Bit 0) */ +#define BLE_BLESS_EFUSE_CONFIG_EFUSE_MODE_Msk (0x1UL) /*!< BLE_BLESS EFUSE_CONFIG: EFUSE_MODE (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_EFUSE_CONFIG_EFUSE_READ_Pos (1UL) /*!< BLE_BLESS EFUSE_CONFIG: EFUSE_READ (Bit 1) */ +#define BLE_BLESS_EFUSE_CONFIG_EFUSE_READ_Msk (0x2UL) /*!< BLE_BLESS EFUSE_CONFIG: EFUSE_READ (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_EFUSE_CONFIG_EFUSE_WRITE_Pos (2UL) /*!< BLE_BLESS EFUSE_CONFIG: EFUSE_WRITE (Bit 2) */ +#define BLE_BLESS_EFUSE_CONFIG_EFUSE_WRITE_Msk (0x4UL) /*!< BLE_BLESS EFUSE_CONFIG: EFUSE_WRITE (Bitfield-Mask: 0x01) */ +/* =============================================== BLE_BLESS.EFUSE_TIM_CTRL1 =============================================== */ +#define BLE_BLESS_EFUSE_TIM_CTRL1_SCLK_HIGH_Pos (0UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: SCLK_HIGH (Bit 0) */ +#define BLE_BLESS_EFUSE_TIM_CTRL1_SCLK_HIGH_Msk (0xffUL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: SCLK_HIGH (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_EFUSE_TIM_CTRL1_SCLK_LOW_Pos (8UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: SCLK_LOW (Bit 8) */ +#define BLE_BLESS_EFUSE_TIM_CTRL1_SCLK_LOW_Msk (0xff00UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: SCLK_LOW (Bitfield-Mask: 0xff) */ +#define BLE_BLESS_EFUSE_TIM_CTRL1_CS_SCLK_SETUP_TIME_Pos (16UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: CS_SCLK_SETUP_TIME (Bit 16) */ +#define BLE_BLESS_EFUSE_TIM_CTRL1_CS_SCLK_SETUP_TIME_Msk (0xf0000UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: CS_SCLK_SETUP_TIME (Bitfield-Mask: 0x0f)*/ +#define BLE_BLESS_EFUSE_TIM_CTRL1_CS_SCLK_HOLD_TIME_Pos (20UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: CS_SCLK_HOLD_TIME (Bit 20) */ +#define BLE_BLESS_EFUSE_TIM_CTRL1_CS_SCLK_HOLD_TIME_Msk (0xf00000UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: CS_SCLK_HOLD_TIME (Bitfield-Mask: 0x0f)*/ +#define BLE_BLESS_EFUSE_TIM_CTRL1_RW_CS_SETUP_TIME_Pos (24UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: RW_CS_SETUP_TIME (Bit 24) */ +#define BLE_BLESS_EFUSE_TIM_CTRL1_RW_CS_SETUP_TIME_Msk (0xf000000UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: RW_CS_SETUP_TIME (Bitfield-Mask: 0x0f)*/ +#define BLE_BLESS_EFUSE_TIM_CTRL1_RW_CS_HOLD_TIME_Pos (28UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: RW_CS_HOLD_TIME (Bit 28) */ +#define BLE_BLESS_EFUSE_TIM_CTRL1_RW_CS_HOLD_TIME_Msk (0xf0000000UL) /*!< BLE_BLESS EFUSE_TIM_CTRL1: RW_CS_HOLD_TIME (Bitfield-Mask: 0x0f)*/ +/* =============================================== BLE_BLESS.EFUSE_TIM_CTRL2 =============================================== */ +#define BLE_BLESS_EFUSE_TIM_CTRL2_DATA_SAMPLE_TIME_Pos (0UL) /*!< BLE_BLESS EFUSE_TIM_CTRL2: DATA_SAMPLE_TIME (Bit 0) */ +#define BLE_BLESS_EFUSE_TIM_CTRL2_DATA_SAMPLE_TIME_Msk (0xffUL) /*!< BLE_BLESS EFUSE_TIM_CTRL2: DATA_SAMPLE_TIME (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_EFUSE_TIM_CTRL2_DOUT_CS_HOLD_TIME_Pos (8UL) /*!< BLE_BLESS EFUSE_TIM_CTRL2: DOUT_CS_HOLD_TIME (Bit 8) */ +#define BLE_BLESS_EFUSE_TIM_CTRL2_DOUT_CS_HOLD_TIME_Msk (0xf00UL) /*!< BLE_BLESS EFUSE_TIM_CTRL2: DOUT_CS_HOLD_TIME (Bitfield-Mask: 0x0f)*/ +/* =============================================== BLE_BLESS.EFUSE_TIM_CTRL3 =============================================== */ +#define BLE_BLESS_EFUSE_TIM_CTRL3_PGM_SCLK_SETUP_TIME_Pos (0UL) /*!< BLE_BLESS EFUSE_TIM_CTRL3: PGM_SCLK_SETUP_TIME (Bit 0) */ +#define BLE_BLESS_EFUSE_TIM_CTRL3_PGM_SCLK_SETUP_TIME_Msk (0xfUL) /*!< BLE_BLESS EFUSE_TIM_CTRL3: PGM_SCLK_SETUP_TIME (Bitfield-Mask: 0x0f)*/ +#define BLE_BLESS_EFUSE_TIM_CTRL3_PGM_SCLK_HOLD_TIME_Pos (4UL) /*!< BLE_BLESS EFUSE_TIM_CTRL3: PGM_SCLK_HOLD_TIME (Bit 4) */ +#define BLE_BLESS_EFUSE_TIM_CTRL3_PGM_SCLK_HOLD_TIME_Msk (0xf0UL) /*!< BLE_BLESS EFUSE_TIM_CTRL3: PGM_SCLK_HOLD_TIME (Bitfield-Mask: 0x0f)*/ +#define BLE_BLESS_EFUSE_TIM_CTRL3_AVDD_CS_SETUP_TIME_Pos (8UL) /*!< BLE_BLESS EFUSE_TIM_CTRL3: AVDD_CS_SETUP_TIME (Bit 8) */ +#define BLE_BLESS_EFUSE_TIM_CTRL3_AVDD_CS_SETUP_TIME_Msk (0xff00UL) /*!< BLE_BLESS EFUSE_TIM_CTRL3: AVDD_CS_SETUP_TIME (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_EFUSE_TIM_CTRL3_AVDD_CS_HOLD_TIME_Pos (16UL) /*!< BLE_BLESS EFUSE_TIM_CTRL3: AVDD_CS_HOLD_TIME (Bit 16) */ +#define BLE_BLESS_EFUSE_TIM_CTRL3_AVDD_CS_HOLD_TIME_Msk (0xff0000UL) /*!< BLE_BLESS EFUSE_TIM_CTRL3: AVDD_CS_HOLD_TIME (Bitfield-Mask: 0xff)*/ +/* ================================================ BLE_BLESS.EFUSE_RDATA_L ================================================ */ +#define BLE_BLESS_EFUSE_RDATA_L_DATA_Pos (0UL) /*!< BLE_BLESS EFUSE_RDATA_L: DATA (Bit 0) */ +#define BLE_BLESS_EFUSE_RDATA_L_DATA_Msk (0xffffffffUL) /*!< BLE_BLESS EFUSE_RDATA_L: DATA (Bitfield-Mask: 0xffffffff) */ +/* ================================================ BLE_BLESS.EFUSE_RDATA_H ================================================ */ +#define BLE_BLESS_EFUSE_RDATA_H_DATA_Pos (0UL) /*!< BLE_BLESS EFUSE_RDATA_H: DATA (Bit 0) */ +#define BLE_BLESS_EFUSE_RDATA_H_DATA_Msk (0xffffffffUL) /*!< BLE_BLESS EFUSE_RDATA_H: DATA (Bitfield-Mask: 0xffffffff) */ +/* ================================================ BLE_BLESS.EFUSE_WDATA_L ================================================ */ +#define BLE_BLESS_EFUSE_WDATA_L_DATA_Pos (0UL) /*!< BLE_BLESS EFUSE_WDATA_L: DATA (Bit 0) */ +#define BLE_BLESS_EFUSE_WDATA_L_DATA_Msk (0xffffffffUL) /*!< BLE_BLESS EFUSE_WDATA_L: DATA (Bitfield-Mask: 0xffffffff) */ +/* ================================================ BLE_BLESS.EFUSE_WDATA_H ================================================ */ +#define BLE_BLESS_EFUSE_WDATA_H_DATA_Pos (0UL) /*!< BLE_BLESS EFUSE_WDATA_H: DATA (Bit 0) */ +#define BLE_BLESS_EFUSE_WDATA_H_DATA_Msk (0xffffffffUL) /*!< BLE_BLESS EFUSE_WDATA_H: DATA (Bitfield-Mask: 0xffffffff) */ +/* =============================================== BLE_BLESS.DIV_BY_625_CFG ================================================ */ +#define BLE_BLESS_DIV_BY_625_CFG_ENABLE_Pos (1UL) /*!< BLE_BLESS DIV_BY_625_CFG: ENABLE (Bit 1) */ +#define BLE_BLESS_DIV_BY_625_CFG_ENABLE_Msk (0x2UL) /*!< BLE_BLESS DIV_BY_625_CFG: ENABLE (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_DIV_BY_625_CFG_DIVIDEND_Pos (8UL) /*!< BLE_BLESS DIV_BY_625_CFG: DIVIDEND (Bit 8) */ +#define BLE_BLESS_DIV_BY_625_CFG_DIVIDEND_Msk (0xffff00UL) /*!< BLE_BLESS DIV_BY_625_CFG: DIVIDEND (Bitfield-Mask: 0xffff)*/ +/* =============================================== BLE_BLESS.DIV_BY_625_STS ================================================ */ +#define BLE_BLESS_DIV_BY_625_STS_QUOTIENT_Pos (0UL) /*!< BLE_BLESS DIV_BY_625_STS: QUOTIENT (Bit 0) */ +#define BLE_BLESS_DIV_BY_625_STS_QUOTIENT_Msk (0x3fUL) /*!< BLE_BLESS DIV_BY_625_STS: QUOTIENT (Bitfield-Mask: 0x3f) */ +#define BLE_BLESS_DIV_BY_625_STS_REMAINDER_Pos (8UL) /*!< BLE_BLESS DIV_BY_625_STS: REMAINDER (Bit 8) */ +#define BLE_BLESS_DIV_BY_625_STS_REMAINDER_Msk (0x3ff00UL) /*!< BLE_BLESS DIV_BY_625_STS: REMAINDER (Bitfield-Mask: 0x3ff)*/ +/* =============================================== BLE_BLESS.PACKET_COUNTER0 =============================================== */ +#define BLE_BLESS_PACKET_COUNTER0_PACKET_COUNTER_LOWER_Pos (0UL) /*!< BLE_BLESS PACKET_COUNTER0: PACKET_COUNTER_LOWER (Bit 0) */ +#define BLE_BLESS_PACKET_COUNTER0_PACKET_COUNTER_LOWER_Msk (0xffffffffUL) /*!< BLE_BLESS PACKET_COUNTER0: PACKET_COUNTER_LOWER (Bitfield-Mask: 0xffffffff)*/ +/* =============================================== BLE_BLESS.PACKET_COUNTER2 =============================================== */ +#define BLE_BLESS_PACKET_COUNTER2_PACKET_COUNTER_UPPER_Pos (0UL) /*!< BLE_BLESS PACKET_COUNTER2: PACKET_COUNTER_UPPER (Bit 0) */ +#define BLE_BLESS_PACKET_COUNTER2_PACKET_COUNTER_UPPER_Msk (0xffUL) /*!< BLE_BLESS PACKET_COUNTER2: PACKET_COUNTER_UPPER (Bitfield-Mask: 0xff)*/ +/* ================================================= BLE_BLESS.IV_MASTER0 ================================================== */ +#define BLE_BLESS_IV_MASTER0_IV_MASTER_Pos (0UL) /*!< BLE_BLESS IV_MASTER0: IV_MASTER (Bit 0) */ +#define BLE_BLESS_IV_MASTER0_IV_MASTER_Msk (0xffffffffUL) /*!< BLE_BLESS IV_MASTER0: IV_MASTER (Bitfield-Mask: 0xffffffff)*/ +/* ================================================== BLE_BLESS.IV_SLAVE0 ================================================== */ +#define BLE_BLESS_IV_SLAVE0_IV_SLAVE_Pos (0UL) /*!< BLE_BLESS IV_SLAVE0: IV_SLAVE (Bit 0) */ +#define BLE_BLESS_IV_SLAVE0_IV_SLAVE_Msk (0xffffffffUL) /*!< BLE_BLESS IV_SLAVE0: IV_SLAVE (Bitfield-Mask: 0xffffffff) */ +/* =================================================== BLE_BLESS.ENC_KEY =================================================== */ +#define BLE_BLESS_ENC_KEY_ENC_KEY_Pos (0UL) /*!< BLE_BLESS ENC_KEY: ENC_KEY (Bit 0) */ +#define BLE_BLESS_ENC_KEY_ENC_KEY_Msk (0xffffffffUL) /*!< BLE_BLESS ENC_KEY: ENC_KEY (Bitfield-Mask: 0xffffffff) */ +/* =================================================== BLE_BLESS.MIC_IN0 =================================================== */ +#define BLE_BLESS_MIC_IN0_MIC_IN_Pos (0UL) /*!< BLE_BLESS MIC_IN0: MIC_IN (Bit 0) */ +#define BLE_BLESS_MIC_IN0_MIC_IN_Msk (0xffffffffUL) /*!< BLE_BLESS MIC_IN0: MIC_IN (Bitfield-Mask: 0xffffffff) */ +/* ================================================== BLE_BLESS.MIC_OUT0 =================================================== */ +#define BLE_BLESS_MIC_OUT0_MIC_OUT_Pos (0UL) /*!< BLE_BLESS MIC_OUT0: MIC_OUT (Bit 0) */ +#define BLE_BLESS_MIC_OUT0_MIC_OUT_Msk (0xffffffffUL) /*!< BLE_BLESS MIC_OUT0: MIC_OUT (Bitfield-Mask: 0xffffffff) */ +/* ================================================= BLE_BLESS.ENC_PARAMS ================================================== */ +#define BLE_BLESS_ENC_PARAMS_DATA_PDU_HEADER_Pos (0UL) /*!< BLE_BLESS ENC_PARAMS: DATA_PDU_HEADER (Bit 0) */ +#define BLE_BLESS_ENC_PARAMS_DATA_PDU_HEADER_Msk (0x3UL) /*!< BLE_BLESS ENC_PARAMS: DATA_PDU_HEADER (Bitfield-Mask: 0x03)*/ +#define BLE_BLESS_ENC_PARAMS_PAYLOAD_LENGTH_LSB_Pos (2UL) /*!< BLE_BLESS ENC_PARAMS: PAYLOAD_LENGTH_LSB (Bit 2) */ +#define BLE_BLESS_ENC_PARAMS_PAYLOAD_LENGTH_LSB_Msk (0x7cUL) /*!< BLE_BLESS ENC_PARAMS: PAYLOAD_LENGTH_LSB (Bitfield-Mask: 0x1f)*/ +#define BLE_BLESS_ENC_PARAMS_DIRECTION_Pos (7UL) /*!< BLE_BLESS ENC_PARAMS: DIRECTION (Bit 7) */ +#define BLE_BLESS_ENC_PARAMS_DIRECTION_Msk (0x80UL) /*!< BLE_BLESS ENC_PARAMS: DIRECTION (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_ENC_PARAMS_PAYLOAD_LENGTH_LSB_EXT_Pos (8UL) /*!< BLE_BLESS ENC_PARAMS: PAYLOAD_LENGTH_LSB_EXT (Bit 8) */ +#define BLE_BLESS_ENC_PARAMS_PAYLOAD_LENGTH_LSB_EXT_Msk (0x700UL) /*!< BLE_BLESS ENC_PARAMS: PAYLOAD_LENGTH_LSB_EXT (Bitfield-Mask: 0x07)*/ +#define BLE_BLESS_ENC_PARAMS_MEM_LATENCY_HIDE_Pos (11UL) /*!< BLE_BLESS ENC_PARAMS: MEM_LATENCY_HIDE (Bit 11) */ +#define BLE_BLESS_ENC_PARAMS_MEM_LATENCY_HIDE_Msk (0x800UL) /*!< BLE_BLESS ENC_PARAMS: MEM_LATENCY_HIDE (Bitfield-Mask: 0x01)*/ +/* ================================================= BLE_BLESS.ENC_CONFIG ================================================== */ +#define BLE_BLESS_ENC_CONFIG_START_PROC_Pos (0UL) /*!< BLE_BLESS ENC_CONFIG: START_PROC (Bit 0) */ +#define BLE_BLESS_ENC_CONFIG_START_PROC_Msk (0x1UL) /*!< BLE_BLESS ENC_CONFIG: START_PROC (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_ENC_CONFIG_ECB_CCM_Pos (1UL) /*!< BLE_BLESS ENC_CONFIG: ECB_CCM (Bit 1) */ +#define BLE_BLESS_ENC_CONFIG_ECB_CCM_Msk (0x2UL) /*!< BLE_BLESS ENC_CONFIG: ECB_CCM (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_ENC_CONFIG_DEC_ENC_Pos (2UL) /*!< BLE_BLESS ENC_CONFIG: DEC_ENC (Bit 2) */ +#define BLE_BLESS_ENC_CONFIG_DEC_ENC_Msk (0x4UL) /*!< BLE_BLESS ENC_CONFIG: DEC_ENC (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_ENC_CONFIG_PAYLOAD_LENGTH_MSB_Pos (8UL) /*!< BLE_BLESS ENC_CONFIG: PAYLOAD_LENGTH_MSB (Bit 8) */ +#define BLE_BLESS_ENC_CONFIG_PAYLOAD_LENGTH_MSB_Msk (0xff00UL) /*!< BLE_BLESS ENC_CONFIG: PAYLOAD_LENGTH_MSB (Bitfield-Mask: 0xff)*/ +#define BLE_BLESS_ENC_CONFIG_B0_FLAGS_Pos (16UL) /*!< BLE_BLESS ENC_CONFIG: B0_FLAGS (Bit 16) */ +#define BLE_BLESS_ENC_CONFIG_B0_FLAGS_Msk (0xff0000UL) /*!< BLE_BLESS ENC_CONFIG: B0_FLAGS (Bitfield-Mask: 0xff) */ +#define BLE_BLESS_ENC_CONFIG_AES_B0_DATA_OVERRIDE_Pos (24UL) /*!< BLE_BLESS ENC_CONFIG: AES_B0_DATA_OVERRIDE (Bit 24) */ +#define BLE_BLESS_ENC_CONFIG_AES_B0_DATA_OVERRIDE_Msk (0x1000000UL) /*!< BLE_BLESS ENC_CONFIG: AES_B0_DATA_OVERRIDE (Bitfield-Mask: 0x01)*/ +/* ================================================= BLE_BLESS.ENC_INTR_EN ================================================= */ +#define BLE_BLESS_ENC_INTR_EN_AUTH_PASS_INTR_EN_Pos (0UL) /*!< BLE_BLESS ENC_INTR_EN: AUTH_PASS_INTR_EN (Bit 0) */ +#define BLE_BLESS_ENC_INTR_EN_AUTH_PASS_INTR_EN_Msk (0x1UL) /*!< BLE_BLESS ENC_INTR_EN: AUTH_PASS_INTR_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_ENC_INTR_EN_ECB_PROC_INTR_EN_Pos (1UL) /*!< BLE_BLESS ENC_INTR_EN: ECB_PROC_INTR_EN (Bit 1) */ +#define BLE_BLESS_ENC_INTR_EN_ECB_PROC_INTR_EN_Msk (0x2UL) /*!< BLE_BLESS ENC_INTR_EN: ECB_PROC_INTR_EN (Bitfield-Mask: 0x01)*/ +#define BLE_BLESS_ENC_INTR_EN_CCM_PROC_INTR_EN_Pos (2UL) /*!< BLE_BLESS ENC_INTR_EN: CCM_PROC_INTR_EN (Bit 2) */ +#define BLE_BLESS_ENC_INTR_EN_CCM_PROC_INTR_EN_Msk (0x4UL) /*!< BLE_BLESS ENC_INTR_EN: CCM_PROC_INTR_EN (Bitfield-Mask: 0x01)*/ +/* ================================================== BLE_BLESS.ENC_INTR =================================================== */ +#define BLE_BLESS_ENC_INTR_AUTH_PASS_INTR_Pos (0UL) /*!< BLE_BLESS ENC_INTR: AUTH_PASS_INTR (Bit 0) */ +#define BLE_BLESS_ENC_INTR_AUTH_PASS_INTR_Msk (0x1UL) /*!< BLE_BLESS ENC_INTR: AUTH_PASS_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_ENC_INTR_ECB_PROC_INTR_Pos (1UL) /*!< BLE_BLESS ENC_INTR: ECB_PROC_INTR (Bit 1) */ +#define BLE_BLESS_ENC_INTR_ECB_PROC_INTR_Msk (0x2UL) /*!< BLE_BLESS ENC_INTR: ECB_PROC_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_ENC_INTR_CCM_PROC_INTR_Pos (2UL) /*!< BLE_BLESS ENC_INTR: CCM_PROC_INTR (Bit 2) */ +#define BLE_BLESS_ENC_INTR_CCM_PROC_INTR_Msk (0x4UL) /*!< BLE_BLESS ENC_INTR: CCM_PROC_INTR (Bitfield-Mask: 0x01) */ +#define BLE_BLESS_ENC_INTR_IN_DATA_CLEAR_Pos (3UL) /*!< BLE_BLESS ENC_INTR: IN_DATA_CLEAR (Bit 3) */ +#define BLE_BLESS_ENC_INTR_IN_DATA_CLEAR_Msk (0x8UL) /*!< BLE_BLESS ENC_INTR: IN_DATA_CLEAR (Bitfield-Mask: 0x01) */ +/* ================================================= BLE_BLESS.B1_DATA_REG ================================================= */ +#define BLE_BLESS_B1_DATA_REG_B1_DATA_Pos (0UL) /*!< BLE_BLESS B1_DATA_REG: B1_DATA (Bit 0) */ +#define BLE_BLESS_B1_DATA_REG_B1_DATA_Msk (0xffffffffUL) /*!< BLE_BLESS B1_DATA_REG: B1_DATA (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== BLE_BLESS.ENC_MEM_BASE_ADDR ============================================== */ +#define BLE_BLESS_ENC_MEM_BASE_ADDR_ENC_MEM_Pos (0UL) /*!< BLE_BLESS ENC_MEM_BASE_ADDR: ENC_MEM (Bit 0) */ +#define BLE_BLESS_ENC_MEM_BASE_ADDR_ENC_MEM_Msk (0xffffffffUL) /*!< BLE_BLESS ENC_MEM_BASE_ADDR: ENC_MEM (Bitfield-Mask: 0xffffffff)*/ +/* ================================================= BLE_BLESS.TRIM_LDO_0 ================================================== */ +#define BLE_BLESS_TRIM_LDO_0_ACT_LDO_VREG_Pos (0UL) /*!< BLE_BLESS TRIM_LDO_0: ACT_LDO_VREG (Bit 0) */ +#define BLE_BLESS_TRIM_LDO_0_ACT_LDO_VREG_Msk (0xfUL) /*!< BLE_BLESS TRIM_LDO_0: ACT_LDO_VREG (Bitfield-Mask: 0x0f) */ +#define BLE_BLESS_TRIM_LDO_0_ACT_LDO_ITAIL_Pos (4UL) /*!< BLE_BLESS TRIM_LDO_0: ACT_LDO_ITAIL (Bit 4) */ +#define BLE_BLESS_TRIM_LDO_0_ACT_LDO_ITAIL_Msk (0xf0UL) /*!< BLE_BLESS TRIM_LDO_0: ACT_LDO_ITAIL (Bitfield-Mask: 0x0f) */ +/* ================================================= BLE_BLESS.TRIM_LDO_1 ================================================== */ +#define BLE_BLESS_TRIM_LDO_1_ACT_REF_BGR_Pos (0UL) /*!< BLE_BLESS TRIM_LDO_1: ACT_REF_BGR (Bit 0) */ +#define BLE_BLESS_TRIM_LDO_1_ACT_REF_BGR_Msk (0xfUL) /*!< BLE_BLESS TRIM_LDO_1: ACT_REF_BGR (Bitfield-Mask: 0x0f) */ +#define BLE_BLESS_TRIM_LDO_1_SB_BGRES_Pos (4UL) /*!< BLE_BLESS TRIM_LDO_1: SB_BGRES (Bit 4) */ +#define BLE_BLESS_TRIM_LDO_1_SB_BGRES_Msk (0xf0UL) /*!< BLE_BLESS TRIM_LDO_1: SB_BGRES (Bitfield-Mask: 0x0f) */ +/* ================================================= BLE_BLESS.TRIM_LDO_2 ================================================== */ +#define BLE_BLESS_TRIM_LDO_2_SB_BMULT_RES_Pos (0UL) /*!< BLE_BLESS TRIM_LDO_2: SB_BMULT_RES (Bit 0) */ +#define BLE_BLESS_TRIM_LDO_2_SB_BMULT_RES_Msk (0x1fUL) /*!< BLE_BLESS TRIM_LDO_2: SB_BMULT_RES (Bitfield-Mask: 0x1f) */ +#define BLE_BLESS_TRIM_LDO_2_SB_BMULT_NBIAS_Pos (5UL) /*!< BLE_BLESS TRIM_LDO_2: SB_BMULT_NBIAS (Bit 5) */ +#define BLE_BLESS_TRIM_LDO_2_SB_BMULT_NBIAS_Msk (0x60UL) /*!< BLE_BLESS TRIM_LDO_2: SB_BMULT_NBIAS (Bitfield-Mask: 0x03)*/ +/* ================================================= BLE_BLESS.TRIM_LDO_3 ================================================== */ +#define BLE_BLESS_TRIM_LDO_3_LVDET_Pos (0UL) /*!< BLE_BLESS TRIM_LDO_3: LVDET (Bit 0) */ +#define BLE_BLESS_TRIM_LDO_3_LVDET_Msk (0x1fUL) /*!< BLE_BLESS TRIM_LDO_3: LVDET (Bitfield-Mask: 0x1f) */ +#define BLE_BLESS_TRIM_LDO_3_SLOPE_SB_BMULT_Pos (5UL) /*!< BLE_BLESS TRIM_LDO_3: SLOPE_SB_BMULT (Bit 5) */ +#define BLE_BLESS_TRIM_LDO_3_SLOPE_SB_BMULT_Msk (0x60UL) /*!< BLE_BLESS TRIM_LDO_3: SLOPE_SB_BMULT (Bitfield-Mask: 0x03)*/ +/* ================================================== BLE_BLESS.TRIM_MXD =================================================== */ +#define BLE_BLESS_TRIM_MXD_MXD_TRIM_BITS_Pos (0UL) /*!< BLE_BLESS TRIM_MXD: MXD_TRIM_BITS (Bit 0) */ +#define BLE_BLESS_TRIM_MXD_MXD_TRIM_BITS_Msk (0xffUL) /*!< BLE_BLESS TRIM_MXD: MXD_TRIM_BITS (Bitfield-Mask: 0xff) */ +/* ================================================= BLE_BLESS.TRIM_LDO_4 ================================================== */ +#define BLE_BLESS_TRIM_LDO_4_T_LDO_Pos (0UL) /*!< BLE_BLESS TRIM_LDO_4: T_LDO (Bit 0) */ +#define BLE_BLESS_TRIM_LDO_4_T_LDO_Msk (0xffUL) /*!< BLE_BLESS TRIM_LDO_4: T_LDO (Bitfield-Mask: 0xff) */ +/* ================================================= BLE_BLESS.TRIM_LDO_5 ================================================== */ +#define BLE_BLESS_TRIM_LDO_5_RESERVED_Pos (0UL) /*!< BLE_BLESS TRIM_LDO_5: RESERVED (Bit 0) */ +#define BLE_BLESS_TRIM_LDO_5_RESERVED_Msk (0xffUL) /*!< BLE_BLESS TRIM_LDO_5: RESERVED (Bitfield-Mask: 0xff) */ + + +#endif /* _CYIP_BLE_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_cpuss.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_cpuss.h new file mode 100644 index 0000000000..a2320dfa79 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_cpuss.h @@ -0,0 +1,346 @@ +/***************************************************************************//** +* \file cyip_cpuss.h +* +* \brief +* CPUSS IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_CPUSS_H_ +#define _CYIP_CPUSS_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ CPUSS ================ */ +/* =========================================================================================================================== */ + +#define CPUSS_SECTION_SIZE 0x00010000UL + +/** + * \brief CPU subsystem (CPUSS) (CPUSS) + */ +typedef struct { /*!< CPUSS Structure */ + __IOM uint32_t CM0_CTL; /*!< 0x00000000 CM0+ control */ + __IM uint32_t RESERVED; + __IM uint32_t CM0_STATUS; /*!< 0x00000008 CM0+ status */ + __IM uint32_t RESERVED1; + __IOM uint32_t CM0_CLOCK_CTL; /*!< 0x00000010 CM0+ clock control */ + __IM uint32_t RESERVED2[2]; + __IOM uint32_t CM0_NMI_CTL; /*!< 0x0000001C CM0+ NMI control */ + __IOM uint32_t CM0_INT_CTL0; /*!< 0x00000020 CM0+ interrupt control 0 */ + __IOM uint32_t CM0_INT_CTL1; /*!< 0x00000024 CM0+ interrupt control 1 */ + __IOM uint32_t CM0_INT_CTL2; /*!< 0x00000028 CM0+ interrupt control 2 */ + __IOM uint32_t CM0_INT_CTL3; /*!< 0x0000002C CM0+ interrupt control 3 */ + __IOM uint32_t CM0_INT_CTL4; /*!< 0x00000030 CM0+ interrupt control 4 */ + __IOM uint32_t CM0_INT_CTL5; /*!< 0x00000034 CM0+ interrupt control 5 */ + __IOM uint32_t CM0_INT_CTL6; /*!< 0x00000038 CM0+ interrupt control 6 */ + __IOM uint32_t CM0_INT_CTL7; /*!< 0x0000003C CM0+ interrupt control 7 */ + __IM uint32_t RESERVED3[16]; + __IOM uint32_t CM4_PWR_CTL; /*!< 0x00000080 CM4 power control */ + __IM uint32_t RESERVED4; + __IM uint32_t CM4_STATUS; /*!< 0x00000088 CM4 status */ + __IM uint32_t RESERVED5; + __IOM uint32_t CM4_CLOCK_CTL; /*!< 0x00000090 CM4 clock control */ + __IM uint32_t RESERVED6[3]; + __IOM uint32_t CM4_NMI_CTL; /*!< 0x000000A0 CM4 NMI control */ + __IM uint32_t RESERVED7[7]; + __IOM uint32_t UDB_PWR_CTL; /*!< 0x000000C0 UDB power control */ + __IM uint32_t RESERVED8[15]; + __IOM uint32_t RAM0_CTL0; /*!< 0x00000100 RAM 0 control 0 */ + __IM uint32_t RESERVED9[15]; + __IOM uint32_t RAM0_PWR_MACRO_CTL[16]; /*!< 0x00000140 RAM 0 power control */ + __IOM uint32_t RAM1_CTL0; /*!< 0x00000180 RAM 1 control 0 */ + __IM uint32_t RESERVED10[3]; + __IOM uint32_t RAM1_PWR_CTL; /*!< 0x00000190 RAM1 power control */ + __IM uint32_t RESERVED11[3]; + __IOM uint32_t RAM2_CTL0; /*!< 0x000001A0 RAM 2 control 0 */ + __IM uint32_t RESERVED12[3]; + __IOM uint32_t RAM2_PWR_CTL; /*!< 0x000001B0 RAM2 power control */ + __IM uint32_t RESERVED13[3]; + __IOM uint32_t ROM_CTL; /*!< 0x000001C0 ROM control */ + __IM uint32_t RESERVED14[7]; + __IOM uint32_t ETB_PWR_CTL; /*!< 0x000001E0 ETB power control */ + __IM uint32_t RESERVED15[9]; + __IM uint32_t DP_STATUS; /*!< 0x00000208 Debug port status */ + __IM uint32_t RESERVED16[5]; + __IOM uint32_t BUFF_CTL; /*!< 0x00000220 Buffer control */ + __IM uint32_t RESERVED17[7]; + __IOM uint32_t SYSTICK_CTL; /*!< 0x00000240 SysTick timer control */ + __IM uint32_t RESERVED18[12]; + __IM uint32_t MBIST_STAT; /*!< 0x00000274 Memory BIST status */ + __IM uint32_t RESERVED19[2]; + __IOM uint32_t WOUNDING; /*!< 0x00000280 Wounding */ + __IM uint32_t RESERVED20[3]; + __IOM uint32_t PROTECTION; /*!< 0x00000290 Protection status */ + __IM uint32_t RESERVED21[3]; + __IOM uint32_t CM0_PC0_HANDLER; /*!< 0x000002A0 CM0+ protection context 0 handler */ + __IM uint32_t RESERVED22[3]; + __IOM uint32_t CM0_VECTOR_TABLE_BASE; /*!< 0x000002B0 CM0+ vector table base */ + __IM uint32_t RESERVED23[3]; + __IOM uint32_t CM4_VECTOR_TABLE_BASE; /*!< 0x000002C0 CM4 vector table base */ + __IM uint32_t RESERVED24[79]; + __IM uint32_t IDENTITY; /*!< 0x00000400 Identity */ + __IM uint32_t RESERVED25[15103]; + __IOM uint32_t TRIM_ROM_CTL; /*!< 0x0000F000 ROM trim control */ + __IOM uint32_t TRIM_RAM_CTL; /*!< 0x0000F004 RAM trim control */ +} CPUSS_Type; /*!< Size = 61448 (0xF008) */ + + +/* ===================================================== CPUSS.CM0_CTL ===================================================== */ +#define CPUSS_CM0_CTL_SLV_STALL_Pos (28UL) /*!< CPUSS CM0_CTL: SLV_STALL (Bit 28) */ +#define CPUSS_CM0_CTL_SLV_STALL_Msk (0x10000000UL) /*!< CPUSS CM0_CTL: SLV_STALL (Bitfield-Mask: 0x01) */ +#define CPUSS_CM0_CTL_ENABLED_Pos (31UL) /*!< CPUSS CM0_CTL: ENABLED (Bit 31) */ +#define CPUSS_CM0_CTL_ENABLED_Msk (0x80000000UL) /*!< CPUSS CM0_CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* =================================================== CPUSS.CM0_STATUS ==================================================== */ +#define CPUSS_CM0_STATUS_SLEEPING_Pos (0UL) /*!< CPUSS CM0_STATUS: SLEEPING (Bit 0) */ +#define CPUSS_CM0_STATUS_SLEEPING_Msk (0x1UL) /*!< CPUSS CM0_STATUS: SLEEPING (Bitfield-Mask: 0x01) */ +#define CPUSS_CM0_STATUS_SLEEPDEEP_Pos (1UL) /*!< CPUSS CM0_STATUS: SLEEPDEEP (Bit 1) */ +#define CPUSS_CM0_STATUS_SLEEPDEEP_Msk (0x2UL) /*!< CPUSS CM0_STATUS: SLEEPDEEP (Bitfield-Mask: 0x01) */ +/* ================================================== CPUSS.CM0_CLOCK_CTL ================================================== */ +#define CPUSS_CM0_CLOCK_CTL_SLOW_INT_DIV_Pos (8UL) /*!< CPUSS CM0_CLOCK_CTL: SLOW_INT_DIV (Bit 8) */ +#define CPUSS_CM0_CLOCK_CTL_SLOW_INT_DIV_Msk (0xff00UL) /*!< CPUSS CM0_CLOCK_CTL: SLOW_INT_DIV (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV_Pos (24UL) /*!< CPUSS CM0_CLOCK_CTL: PERI_INT_DIV (Bit 24) */ +#define CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV_Msk (0xff000000UL) /*!< CPUSS CM0_CLOCK_CTL: PERI_INT_DIV (Bitfield-Mask: 0xff) */ +/* =================================================== CPUSS.CM0_NMI_CTL =================================================== */ +#define CPUSS_CM0_NMI_CTL_MUX0_SEL_Pos (0UL) /*!< CPUSS CM0_NMI_CTL: MUX0_SEL (Bit 0) */ +#define CPUSS_CM0_NMI_CTL_MUX0_SEL_Msk (0xffUL) /*!< CPUSS CM0_NMI_CTL: MUX0_SEL (Bitfield-Mask: 0xff) */ +/* ================================================== CPUSS.CM0_INT_CTL0 =================================================== */ +#define CPUSS_CM0_INT_CTL0_MUX0_SEL_Pos (0UL) /*!< CPUSS CM0_INT_CTL0: MUX0_SEL (Bit 0) */ +#define CPUSS_CM0_INT_CTL0_MUX0_SEL_Msk (0xffUL) /*!< CPUSS CM0_INT_CTL0: MUX0_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL0_MUX1_SEL_Pos (8UL) /*!< CPUSS CM0_INT_CTL0: MUX1_SEL (Bit 8) */ +#define CPUSS_CM0_INT_CTL0_MUX1_SEL_Msk (0xff00UL) /*!< CPUSS CM0_INT_CTL0: MUX1_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL0_MUX2_SEL_Pos (16UL) /*!< CPUSS CM0_INT_CTL0: MUX2_SEL (Bit 16) */ +#define CPUSS_CM0_INT_CTL0_MUX2_SEL_Msk (0xff0000UL) /*!< CPUSS CM0_INT_CTL0: MUX2_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL0_MUX3_SEL_Pos (24UL) /*!< CPUSS CM0_INT_CTL0: MUX3_SEL (Bit 24) */ +#define CPUSS_CM0_INT_CTL0_MUX3_SEL_Msk (0xff000000UL) /*!< CPUSS CM0_INT_CTL0: MUX3_SEL (Bitfield-Mask: 0xff) */ +/* ================================================== CPUSS.CM0_INT_CTL1 =================================================== */ +#define CPUSS_CM0_INT_CTL1_MUX0_SEL_Pos (0UL) /*!< CPUSS CM0_INT_CTL1: MUX0_SEL (Bit 0) */ +#define CPUSS_CM0_INT_CTL1_MUX0_SEL_Msk (0xffUL) /*!< CPUSS CM0_INT_CTL1: MUX0_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL1_MUX1_SEL_Pos (8UL) /*!< CPUSS CM0_INT_CTL1: MUX1_SEL (Bit 8) */ +#define CPUSS_CM0_INT_CTL1_MUX1_SEL_Msk (0xff00UL) /*!< CPUSS CM0_INT_CTL1: MUX1_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL1_MUX2_SEL_Pos (16UL) /*!< CPUSS CM0_INT_CTL1: MUX2_SEL (Bit 16) */ +#define CPUSS_CM0_INT_CTL1_MUX2_SEL_Msk (0xff0000UL) /*!< CPUSS CM0_INT_CTL1: MUX2_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL1_MUX3_SEL_Pos (24UL) /*!< CPUSS CM0_INT_CTL1: MUX3_SEL (Bit 24) */ +#define CPUSS_CM0_INT_CTL1_MUX3_SEL_Msk (0xff000000UL) /*!< CPUSS CM0_INT_CTL1: MUX3_SEL (Bitfield-Mask: 0xff) */ +/* ================================================== CPUSS.CM0_INT_CTL2 =================================================== */ +#define CPUSS_CM0_INT_CTL2_MUX0_SEL_Pos (0UL) /*!< CPUSS CM0_INT_CTL2: MUX0_SEL (Bit 0) */ +#define CPUSS_CM0_INT_CTL2_MUX0_SEL_Msk (0xffUL) /*!< CPUSS CM0_INT_CTL2: MUX0_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL2_MUX1_SEL_Pos (8UL) /*!< CPUSS CM0_INT_CTL2: MUX1_SEL (Bit 8) */ +#define CPUSS_CM0_INT_CTL2_MUX1_SEL_Msk (0xff00UL) /*!< CPUSS CM0_INT_CTL2: MUX1_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL2_MUX2_SEL_Pos (16UL) /*!< CPUSS CM0_INT_CTL2: MUX2_SEL (Bit 16) */ +#define CPUSS_CM0_INT_CTL2_MUX2_SEL_Msk (0xff0000UL) /*!< CPUSS CM0_INT_CTL2: MUX2_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL2_MUX3_SEL_Pos (24UL) /*!< CPUSS CM0_INT_CTL2: MUX3_SEL (Bit 24) */ +#define CPUSS_CM0_INT_CTL2_MUX3_SEL_Msk (0xff000000UL) /*!< CPUSS CM0_INT_CTL2: MUX3_SEL (Bitfield-Mask: 0xff) */ +/* ================================================== CPUSS.CM0_INT_CTL3 =================================================== */ +#define CPUSS_CM0_INT_CTL3_MUX0_SEL_Pos (0UL) /*!< CPUSS CM0_INT_CTL3: MUX0_SEL (Bit 0) */ +#define CPUSS_CM0_INT_CTL3_MUX0_SEL_Msk (0xffUL) /*!< CPUSS CM0_INT_CTL3: MUX0_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL3_MUX1_SEL_Pos (8UL) /*!< CPUSS CM0_INT_CTL3: MUX1_SEL (Bit 8) */ +#define CPUSS_CM0_INT_CTL3_MUX1_SEL_Msk (0xff00UL) /*!< CPUSS CM0_INT_CTL3: MUX1_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL3_MUX2_SEL_Pos (16UL) /*!< CPUSS CM0_INT_CTL3: MUX2_SEL (Bit 16) */ +#define CPUSS_CM0_INT_CTL3_MUX2_SEL_Msk (0xff0000UL) /*!< CPUSS CM0_INT_CTL3: MUX2_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL3_MUX3_SEL_Pos (24UL) /*!< CPUSS CM0_INT_CTL3: MUX3_SEL (Bit 24) */ +#define CPUSS_CM0_INT_CTL3_MUX3_SEL_Msk (0xff000000UL) /*!< CPUSS CM0_INT_CTL3: MUX3_SEL (Bitfield-Mask: 0xff) */ +/* ================================================== CPUSS.CM0_INT_CTL4 =================================================== */ +#define CPUSS_CM0_INT_CTL4_MUX0_SEL_Pos (0UL) /*!< CPUSS CM0_INT_CTL4: MUX0_SEL (Bit 0) */ +#define CPUSS_CM0_INT_CTL4_MUX0_SEL_Msk (0xffUL) /*!< CPUSS CM0_INT_CTL4: MUX0_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL4_MUX1_SEL_Pos (8UL) /*!< CPUSS CM0_INT_CTL4: MUX1_SEL (Bit 8) */ +#define CPUSS_CM0_INT_CTL4_MUX1_SEL_Msk (0xff00UL) /*!< CPUSS CM0_INT_CTL4: MUX1_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL4_MUX2_SEL_Pos (16UL) /*!< CPUSS CM0_INT_CTL4: MUX2_SEL (Bit 16) */ +#define CPUSS_CM0_INT_CTL4_MUX2_SEL_Msk (0xff0000UL) /*!< CPUSS CM0_INT_CTL4: MUX2_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL4_MUX3_SEL_Pos (24UL) /*!< CPUSS CM0_INT_CTL4: MUX3_SEL (Bit 24) */ +#define CPUSS_CM0_INT_CTL4_MUX3_SEL_Msk (0xff000000UL) /*!< CPUSS CM0_INT_CTL4: MUX3_SEL (Bitfield-Mask: 0xff) */ +/* ================================================== CPUSS.CM0_INT_CTL5 =================================================== */ +#define CPUSS_CM0_INT_CTL5_MUX0_SEL_Pos (0UL) /*!< CPUSS CM0_INT_CTL5: MUX0_SEL (Bit 0) */ +#define CPUSS_CM0_INT_CTL5_MUX0_SEL_Msk (0xffUL) /*!< CPUSS CM0_INT_CTL5: MUX0_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL5_MUX1_SEL_Pos (8UL) /*!< CPUSS CM0_INT_CTL5: MUX1_SEL (Bit 8) */ +#define CPUSS_CM0_INT_CTL5_MUX1_SEL_Msk (0xff00UL) /*!< CPUSS CM0_INT_CTL5: MUX1_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL5_MUX2_SEL_Pos (16UL) /*!< CPUSS CM0_INT_CTL5: MUX2_SEL (Bit 16) */ +#define CPUSS_CM0_INT_CTL5_MUX2_SEL_Msk (0xff0000UL) /*!< CPUSS CM0_INT_CTL5: MUX2_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL5_MUX3_SEL_Pos (24UL) /*!< CPUSS CM0_INT_CTL5: MUX3_SEL (Bit 24) */ +#define CPUSS_CM0_INT_CTL5_MUX3_SEL_Msk (0xff000000UL) /*!< CPUSS CM0_INT_CTL5: MUX3_SEL (Bitfield-Mask: 0xff) */ +/* ================================================== CPUSS.CM0_INT_CTL6 =================================================== */ +#define CPUSS_CM0_INT_CTL6_MUX0_SEL_Pos (0UL) /*!< CPUSS CM0_INT_CTL6: MUX0_SEL (Bit 0) */ +#define CPUSS_CM0_INT_CTL6_MUX0_SEL_Msk (0xffUL) /*!< CPUSS CM0_INT_CTL6: MUX0_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL6_MUX1_SEL_Pos (8UL) /*!< CPUSS CM0_INT_CTL6: MUX1_SEL (Bit 8) */ +#define CPUSS_CM0_INT_CTL6_MUX1_SEL_Msk (0xff00UL) /*!< CPUSS CM0_INT_CTL6: MUX1_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL6_MUX2_SEL_Pos (16UL) /*!< CPUSS CM0_INT_CTL6: MUX2_SEL (Bit 16) */ +#define CPUSS_CM0_INT_CTL6_MUX2_SEL_Msk (0xff0000UL) /*!< CPUSS CM0_INT_CTL6: MUX2_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL6_MUX3_SEL_Pos (24UL) /*!< CPUSS CM0_INT_CTL6: MUX3_SEL (Bit 24) */ +#define CPUSS_CM0_INT_CTL6_MUX3_SEL_Msk (0xff000000UL) /*!< CPUSS CM0_INT_CTL6: MUX3_SEL (Bitfield-Mask: 0xff) */ +/* ================================================== CPUSS.CM0_INT_CTL7 =================================================== */ +#define CPUSS_CM0_INT_CTL7_MUX0_SEL_Pos (0UL) /*!< CPUSS CM0_INT_CTL7: MUX0_SEL (Bit 0) */ +#define CPUSS_CM0_INT_CTL7_MUX0_SEL_Msk (0xffUL) /*!< CPUSS CM0_INT_CTL7: MUX0_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL7_MUX1_SEL_Pos (8UL) /*!< CPUSS CM0_INT_CTL7: MUX1_SEL (Bit 8) */ +#define CPUSS_CM0_INT_CTL7_MUX1_SEL_Msk (0xff00UL) /*!< CPUSS CM0_INT_CTL7: MUX1_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL7_MUX2_SEL_Pos (16UL) /*!< CPUSS CM0_INT_CTL7: MUX2_SEL (Bit 16) */ +#define CPUSS_CM0_INT_CTL7_MUX2_SEL_Msk (0xff0000UL) /*!< CPUSS CM0_INT_CTL7: MUX2_SEL (Bitfield-Mask: 0xff) */ +#define CPUSS_CM0_INT_CTL7_MUX3_SEL_Pos (24UL) /*!< CPUSS CM0_INT_CTL7: MUX3_SEL (Bit 24) */ +#define CPUSS_CM0_INT_CTL7_MUX3_SEL_Msk (0xff000000UL) /*!< CPUSS CM0_INT_CTL7: MUX3_SEL (Bitfield-Mask: 0xff) */ +/* =================================================== CPUSS.CM4_PWR_CTL =================================================== */ +#define CPUSS_CM4_PWR_CTL_ISOLATE_Pos (0UL) /*!< CPUSS CM4_PWR_CTL: ISOLATE (Bit 0) */ +#define CPUSS_CM4_PWR_CTL_ISOLATE_Msk (0x1UL) /*!< CPUSS CM4_PWR_CTL: ISOLATE (Bitfield-Mask: 0x01) */ +#define CPUSS_CM4_PWR_CTL_RETAIN_Pos (1UL) /*!< CPUSS CM4_PWR_CTL: RETAIN (Bit 1) */ +#define CPUSS_CM4_PWR_CTL_RETAIN_Msk (0x2UL) /*!< CPUSS CM4_PWR_CTL: RETAIN (Bitfield-Mask: 0x01) */ +#define CPUSS_CM4_PWR_CTL_POWER_Pos (2UL) /*!< CPUSS CM4_PWR_CTL: POWER (Bit 2) */ +#define CPUSS_CM4_PWR_CTL_POWER_Msk (0x4UL) /*!< CPUSS CM4_PWR_CTL: POWER (Bitfield-Mask: 0x01) */ +#define CPUSS_CM4_PWR_CTL_RESET_Pos (3UL) /*!< CPUSS CM4_PWR_CTL: RESET (Bit 3) */ +#define CPUSS_CM4_PWR_CTL_RESET_Msk (0x8UL) /*!< CPUSS CM4_PWR_CTL: RESET (Bitfield-Mask: 0x01) */ +#define CPUSS_CM4_PWR_CTL_CLOCK_Pos (4UL) /*!< CPUSS CM4_PWR_CTL: CLOCK (Bit 4) */ +#define CPUSS_CM4_PWR_CTL_CLOCK_Msk (0x10UL) /*!< CPUSS CM4_PWR_CTL: CLOCK (Bitfield-Mask: 0x01) */ +/* =================================================== CPUSS.CM4_STATUS ==================================================== */ +#define CPUSS_CM4_STATUS_SLEEPING_Pos (0UL) /*!< CPUSS CM4_STATUS: SLEEPING (Bit 0) */ +#define CPUSS_CM4_STATUS_SLEEPING_Msk (0x1UL) /*!< CPUSS CM4_STATUS: SLEEPING (Bitfield-Mask: 0x01) */ +#define CPUSS_CM4_STATUS_SLEEPDEEP_Pos (1UL) /*!< CPUSS CM4_STATUS: SLEEPDEEP (Bit 1) */ +#define CPUSS_CM4_STATUS_SLEEPDEEP_Msk (0x2UL) /*!< CPUSS CM4_STATUS: SLEEPDEEP (Bitfield-Mask: 0x01) */ +/* ================================================== CPUSS.CM4_CLOCK_CTL ================================================== */ +#define CPUSS_CM4_CLOCK_CTL_FAST_INT_DIV_Pos (8UL) /*!< CPUSS CM4_CLOCK_CTL: FAST_INT_DIV (Bit 8) */ +#define CPUSS_CM4_CLOCK_CTL_FAST_INT_DIV_Msk (0xff00UL) /*!< CPUSS CM4_CLOCK_CTL: FAST_INT_DIV (Bitfield-Mask: 0xff) */ +/* =================================================== CPUSS.CM4_NMI_CTL =================================================== */ +#define CPUSS_CM4_NMI_CTL_MUX0_SEL_Pos (0UL) /*!< CPUSS CM4_NMI_CTL: MUX0_SEL (Bit 0) */ +#define CPUSS_CM4_NMI_CTL_MUX0_SEL_Msk (0xffUL) /*!< CPUSS CM4_NMI_CTL: MUX0_SEL (Bitfield-Mask: 0xff) */ +/* =================================================== CPUSS.UDB_PWR_CTL =================================================== */ +#define CPUSS_UDB_PWR_CTL_ISOLATE_Pos (0UL) /*!< CPUSS UDB_PWR_CTL: ISOLATE (Bit 0) */ +#define CPUSS_UDB_PWR_CTL_ISOLATE_Msk (0x1UL) /*!< CPUSS UDB_PWR_CTL: ISOLATE (Bitfield-Mask: 0x01) */ +#define CPUSS_UDB_PWR_CTL_RETAIN_Pos (1UL) /*!< CPUSS UDB_PWR_CTL: RETAIN (Bit 1) */ +#define CPUSS_UDB_PWR_CTL_RETAIN_Msk (0x2UL) /*!< CPUSS UDB_PWR_CTL: RETAIN (Bitfield-Mask: 0x01) */ +#define CPUSS_UDB_PWR_CTL_POWER_Pos (2UL) /*!< CPUSS UDB_PWR_CTL: POWER (Bit 2) */ +#define CPUSS_UDB_PWR_CTL_POWER_Msk (0x4UL) /*!< CPUSS UDB_PWR_CTL: POWER (Bitfield-Mask: 0x01) */ +#define CPUSS_UDB_PWR_CTL_RESET_Pos (3UL) /*!< CPUSS UDB_PWR_CTL: RESET (Bit 3) */ +#define CPUSS_UDB_PWR_CTL_RESET_Msk (0x8UL) /*!< CPUSS UDB_PWR_CTL: RESET (Bitfield-Mask: 0x01) */ +#define CPUSS_UDB_PWR_CTL_CLOCK_Pos (4UL) /*!< CPUSS UDB_PWR_CTL: CLOCK (Bit 4) */ +#define CPUSS_UDB_PWR_CTL_CLOCK_Msk (0x10UL) /*!< CPUSS UDB_PWR_CTL: CLOCK (Bitfield-Mask: 0x01) */ +/* ==================================================== CPUSS.RAM0_CTL0 ==================================================== */ +#define CPUSS_RAM0_CTL0_SLOW_WS_Pos (0UL) /*!< CPUSS RAM0_CTL0: SLOW_WS (Bit 0) */ +#define CPUSS_RAM0_CTL0_SLOW_WS_Msk (0x3UL) /*!< CPUSS RAM0_CTL0: SLOW_WS (Bitfield-Mask: 0x03) */ +#define CPUSS_RAM0_CTL0_FAST_WS_Pos (8UL) /*!< CPUSS RAM0_CTL0: FAST_WS (Bit 8) */ +#define CPUSS_RAM0_CTL0_FAST_WS_Msk (0x300UL) /*!< CPUSS RAM0_CTL0: FAST_WS (Bitfield-Mask: 0x03) */ +/* =============================================== CPUSS.RAM0_PWR_MACRO_CTL ================================================ */ +#define CPUSS_RAM0_PWR_MACRO_CTL_ISOLATE_Pos (0UL) /*!< CPUSS RAM0_PWR_MACRO_CTL: ISOLATE (Bit 0) */ +#define CPUSS_RAM0_PWR_MACRO_CTL_ISOLATE_Msk (0x1UL) /*!< CPUSS RAM0_PWR_MACRO_CTL: ISOLATE (Bitfield-Mask: 0x01) */ +#define CPUSS_RAM0_PWR_MACRO_CTL_RETAIN_Pos (1UL) /*!< CPUSS RAM0_PWR_MACRO_CTL: RETAIN (Bit 1) */ +#define CPUSS_RAM0_PWR_MACRO_CTL_RETAIN_Msk (0x2UL) /*!< CPUSS RAM0_PWR_MACRO_CTL: RETAIN (Bitfield-Mask: 0x01) */ +#define CPUSS_RAM0_PWR_MACRO_CTL_POWER_Pos (2UL) /*!< CPUSS RAM0_PWR_MACRO_CTL: POWER (Bit 2) */ +#define CPUSS_RAM0_PWR_MACRO_CTL_POWER_Msk (0x4UL) /*!< CPUSS RAM0_PWR_MACRO_CTL: POWER (Bitfield-Mask: 0x01) */ +/* ==================================================== CPUSS.RAM1_CTL0 ==================================================== */ +#define CPUSS_RAM1_CTL0_SLOW_WS_Pos (0UL) /*!< CPUSS RAM1_CTL0: SLOW_WS (Bit 0) */ +#define CPUSS_RAM1_CTL0_SLOW_WS_Msk (0x3UL) /*!< CPUSS RAM1_CTL0: SLOW_WS (Bitfield-Mask: 0x03) */ +#define CPUSS_RAM1_CTL0_FAST_WS_Pos (8UL) /*!< CPUSS RAM1_CTL0: FAST_WS (Bit 8) */ +#define CPUSS_RAM1_CTL0_FAST_WS_Msk (0x300UL) /*!< CPUSS RAM1_CTL0: FAST_WS (Bitfield-Mask: 0x03) */ +/* ================================================== CPUSS.RAM1_PWR_CTL =================================================== */ +#define CPUSS_RAM1_PWR_CTL_ISOLATE_Pos (0UL) /*!< CPUSS RAM1_PWR_CTL: ISOLATE (Bit 0) */ +#define CPUSS_RAM1_PWR_CTL_ISOLATE_Msk (0x1UL) /*!< CPUSS RAM1_PWR_CTL: ISOLATE (Bitfield-Mask: 0x01) */ +#define CPUSS_RAM1_PWR_CTL_RETAIN_Pos (1UL) /*!< CPUSS RAM1_PWR_CTL: RETAIN (Bit 1) */ +#define CPUSS_RAM1_PWR_CTL_RETAIN_Msk (0x2UL) /*!< CPUSS RAM1_PWR_CTL: RETAIN (Bitfield-Mask: 0x01) */ +#define CPUSS_RAM1_PWR_CTL_POWER_Pos (2UL) /*!< CPUSS RAM1_PWR_CTL: POWER (Bit 2) */ +#define CPUSS_RAM1_PWR_CTL_POWER_Msk (0x4UL) /*!< CPUSS RAM1_PWR_CTL: POWER (Bitfield-Mask: 0x01) */ +/* ==================================================== CPUSS.RAM2_CTL0 ==================================================== */ +#define CPUSS_RAM2_CTL0_SLOW_WS_Pos (0UL) /*!< CPUSS RAM2_CTL0: SLOW_WS (Bit 0) */ +#define CPUSS_RAM2_CTL0_SLOW_WS_Msk (0x3UL) /*!< CPUSS RAM2_CTL0: SLOW_WS (Bitfield-Mask: 0x03) */ +#define CPUSS_RAM2_CTL0_FAST_WS_Pos (8UL) /*!< CPUSS RAM2_CTL0: FAST_WS (Bit 8) */ +#define CPUSS_RAM2_CTL0_FAST_WS_Msk (0x300UL) /*!< CPUSS RAM2_CTL0: FAST_WS (Bitfield-Mask: 0x03) */ +/* ================================================== CPUSS.RAM2_PWR_CTL =================================================== */ +#define CPUSS_RAM2_PWR_CTL_ISOLATE_Pos (0UL) /*!< CPUSS RAM2_PWR_CTL: ISOLATE (Bit 0) */ +#define CPUSS_RAM2_PWR_CTL_ISOLATE_Msk (0x1UL) /*!< CPUSS RAM2_PWR_CTL: ISOLATE (Bitfield-Mask: 0x01) */ +#define CPUSS_RAM2_PWR_CTL_RETAIN_Pos (1UL) /*!< CPUSS RAM2_PWR_CTL: RETAIN (Bit 1) */ +#define CPUSS_RAM2_PWR_CTL_RETAIN_Msk (0x2UL) /*!< CPUSS RAM2_PWR_CTL: RETAIN (Bitfield-Mask: 0x01) */ +#define CPUSS_RAM2_PWR_CTL_POWER_Pos (2UL) /*!< CPUSS RAM2_PWR_CTL: POWER (Bit 2) */ +#define CPUSS_RAM2_PWR_CTL_POWER_Msk (0x4UL) /*!< CPUSS RAM2_PWR_CTL: POWER (Bitfield-Mask: 0x01) */ +/* ===================================================== CPUSS.ROM_CTL ===================================================== */ +#define CPUSS_ROM_CTL_SLOW_WS_Pos (0UL) /*!< CPUSS ROM_CTL: SLOW_WS (Bit 0) */ +#define CPUSS_ROM_CTL_SLOW_WS_Msk (0x3UL) /*!< CPUSS ROM_CTL: SLOW_WS (Bitfield-Mask: 0x03) */ +#define CPUSS_ROM_CTL_FAST_WS_Pos (8UL) /*!< CPUSS ROM_CTL: FAST_WS (Bit 8) */ +#define CPUSS_ROM_CTL_FAST_WS_Msk (0x300UL) /*!< CPUSS ROM_CTL: FAST_WS (Bitfield-Mask: 0x03) */ +/* =================================================== CPUSS.ETB_PWR_CTL =================================================== */ +#define CPUSS_ETB_PWR_CTL_ISOLATE_Pos (0UL) /*!< CPUSS ETB_PWR_CTL: ISOLATE (Bit 0) */ +#define CPUSS_ETB_PWR_CTL_ISOLATE_Msk (0x1UL) /*!< CPUSS ETB_PWR_CTL: ISOLATE (Bitfield-Mask: 0x01) */ +#define CPUSS_ETB_PWR_CTL_RETAIN_Pos (1UL) /*!< CPUSS ETB_PWR_CTL: RETAIN (Bit 1) */ +#define CPUSS_ETB_PWR_CTL_RETAIN_Msk (0x2UL) /*!< CPUSS ETB_PWR_CTL: RETAIN (Bitfield-Mask: 0x01) */ +#define CPUSS_ETB_PWR_CTL_POWER_Pos (2UL) /*!< CPUSS ETB_PWR_CTL: POWER (Bit 2) */ +#define CPUSS_ETB_PWR_CTL_POWER_Msk (0x4UL) /*!< CPUSS ETB_PWR_CTL: POWER (Bitfield-Mask: 0x01) */ +/* ==================================================== CPUSS.DP_STATUS ==================================================== */ +#define CPUSS_DP_STATUS_SWJ_CONNECTED_Pos (0UL) /*!< CPUSS DP_STATUS: SWJ_CONNECTED (Bit 0) */ +#define CPUSS_DP_STATUS_SWJ_CONNECTED_Msk (0x1UL) /*!< CPUSS DP_STATUS: SWJ_CONNECTED (Bitfield-Mask: 0x01) */ +#define CPUSS_DP_STATUS_SWJ_DEBUG_EN_Pos (1UL) /*!< CPUSS DP_STATUS: SWJ_DEBUG_EN (Bit 1) */ +#define CPUSS_DP_STATUS_SWJ_DEBUG_EN_Msk (0x2UL) /*!< CPUSS DP_STATUS: SWJ_DEBUG_EN (Bitfield-Mask: 0x01) */ +#define CPUSS_DP_STATUS_SWJ_JTAG_SEL_Pos (2UL) /*!< CPUSS DP_STATUS: SWJ_JTAG_SEL (Bit 2) */ +#define CPUSS_DP_STATUS_SWJ_JTAG_SEL_Msk (0x4UL) /*!< CPUSS DP_STATUS: SWJ_JTAG_SEL (Bitfield-Mask: 0x01) */ +/* ==================================================== CPUSS.BUFF_CTL ===================================================== */ +#define CPUSS_BUFF_CTL_WRITE_BUFF_Pos (0UL) /*!< CPUSS BUFF_CTL: WRITE_BUFF (Bit 0) */ +#define CPUSS_BUFF_CTL_WRITE_BUFF_Msk (0x1UL) /*!< CPUSS BUFF_CTL: WRITE_BUFF (Bitfield-Mask: 0x01) */ +/* =================================================== CPUSS.SYSTICK_CTL =================================================== */ +#define CPUSS_SYSTICK_CTL_TENMS_Pos (0UL) /*!< CPUSS SYSTICK_CTL: TENMS (Bit 0) */ +#define CPUSS_SYSTICK_CTL_TENMS_Msk (0xffffffUL) /*!< CPUSS SYSTICK_CTL: TENMS (Bitfield-Mask: 0xffffff) */ +#define CPUSS_SYSTICK_CTL_CLOCK_SOURCE_Pos (24UL) /*!< CPUSS SYSTICK_CTL: CLOCK_SOURCE (Bit 24) */ +#define CPUSS_SYSTICK_CTL_CLOCK_SOURCE_Msk (0x3000000UL) /*!< CPUSS SYSTICK_CTL: CLOCK_SOURCE (Bitfield-Mask: 0x03) */ +#define CPUSS_SYSTICK_CTL_SKEW_Pos (30UL) /*!< CPUSS SYSTICK_CTL: SKEW (Bit 30) */ +#define CPUSS_SYSTICK_CTL_SKEW_Msk (0x40000000UL) /*!< CPUSS SYSTICK_CTL: SKEW (Bitfield-Mask: 0x01) */ +#define CPUSS_SYSTICK_CTL_NOREF_Pos (31UL) /*!< CPUSS SYSTICK_CTL: NOREF (Bit 31) */ +#define CPUSS_SYSTICK_CTL_NOREF_Msk (0x80000000UL) /*!< CPUSS SYSTICK_CTL: NOREF (Bitfield-Mask: 0x01) */ +/* =================================================== CPUSS.MBIST_STAT ==================================================== */ +#define CPUSS_MBIST_STAT_SFP_READY_Pos (0UL) /*!< CPUSS MBIST_STAT: SFP_READY (Bit 0) */ +#define CPUSS_MBIST_STAT_SFP_READY_Msk (0x1UL) /*!< CPUSS MBIST_STAT: SFP_READY (Bitfield-Mask: 0x01) */ +#define CPUSS_MBIST_STAT_SFP_FAIL_Pos (1UL) /*!< CPUSS MBIST_STAT: SFP_FAIL (Bit 1) */ +#define CPUSS_MBIST_STAT_SFP_FAIL_Msk (0x2UL) /*!< CPUSS MBIST_STAT: SFP_FAIL (Bitfield-Mask: 0x01) */ +/* ==================================================== CPUSS.WOUNDING ===================================================== */ +#define CPUSS_WOUNDING_RAM0_WOUND_Pos (0UL) /*!< CPUSS WOUNDING: RAM0_WOUND (Bit 0) */ +#define CPUSS_WOUNDING_RAM0_WOUND_Msk (0x7UL) /*!< CPUSS WOUNDING: RAM0_WOUND (Bitfield-Mask: 0x07) */ +#define CPUSS_WOUNDING_RAM1_WOUND_Pos (4UL) /*!< CPUSS WOUNDING: RAM1_WOUND (Bit 4) */ +#define CPUSS_WOUNDING_RAM1_WOUND_Msk (0x70UL) /*!< CPUSS WOUNDING: RAM1_WOUND (Bitfield-Mask: 0x07) */ +#define CPUSS_WOUNDING_RAM2_WOUND_Pos (8UL) /*!< CPUSS WOUNDING: RAM2_WOUND (Bit 8) */ +#define CPUSS_WOUNDING_RAM2_WOUND_Msk (0x700UL) /*!< CPUSS WOUNDING: RAM2_WOUND (Bitfield-Mask: 0x07) */ +#define CPUSS_WOUNDING_FLASH_WOUND_Pos (12UL) /*!< CPUSS WOUNDING: FLASH_WOUND (Bit 12) */ +#define CPUSS_WOUNDING_FLASH_WOUND_Msk (0x7000UL) /*!< CPUSS WOUNDING: FLASH_WOUND (Bitfield-Mask: 0x07) */ +/* =================================================== CPUSS.PROTECTION ==================================================== */ +#define CPUSS_PROTECTION_STATE_Pos (0UL) /*!< CPUSS PROTECTION: STATE (Bit 0) */ +#define CPUSS_PROTECTION_STATE_Msk (0x7UL) /*!< CPUSS PROTECTION: STATE (Bitfield-Mask: 0x07) */ +/* ================================================= CPUSS.CM0_PC0_HANDLER ================================================= */ +#define CPUSS_CM0_PC0_HANDLER_ADDR_Pos (0UL) /*!< CPUSS CM0_PC0_HANDLER: ADDR (Bit 0) */ +#define CPUSS_CM0_PC0_HANDLER_ADDR_Msk (0xffffffffUL) /*!< CPUSS CM0_PC0_HANDLER: ADDR (Bitfield-Mask: 0xffffffff) */ +/* ============================================== CPUSS.CM0_VECTOR_TABLE_BASE ============================================== */ +#define CPUSS_CM0_VECTOR_TABLE_BASE_ADDR24_Pos (8UL) /*!< CPUSS CM0_VECTOR_TABLE_BASE: ADDR24 (Bit 8) */ +#define CPUSS_CM0_VECTOR_TABLE_BASE_ADDR24_Msk (0xffffff00UL) /*!< CPUSS CM0_VECTOR_TABLE_BASE: ADDR24 (Bitfield-Mask: 0xffffff)*/ +/* ============================================== CPUSS.CM4_VECTOR_TABLE_BASE ============================================== */ +#define CPUSS_CM4_VECTOR_TABLE_BASE_ADDR22_Pos (10UL) /*!< CPUSS CM4_VECTOR_TABLE_BASE: ADDR22 (Bit 10) */ +#define CPUSS_CM4_VECTOR_TABLE_BASE_ADDR22_Msk (0xfffffc00UL) /*!< CPUSS CM4_VECTOR_TABLE_BASE: ADDR22 (Bitfield-Mask: 0x3fffff)*/ +/* ==================================================== CPUSS.IDENTITY ===================================================== */ +#define CPUSS_IDENTITY_P_Pos (0UL) /*!< CPUSS IDENTITY: P (Bit 0) */ +#define CPUSS_IDENTITY_P_Msk (0x1UL) /*!< CPUSS IDENTITY: P (Bitfield-Mask: 0x01) */ +#define CPUSS_IDENTITY_NS_Pos (1UL) /*!< CPUSS IDENTITY: NS (Bit 1) */ +#define CPUSS_IDENTITY_NS_Msk (0x2UL) /*!< CPUSS IDENTITY: NS (Bitfield-Mask: 0x01) */ +#define CPUSS_IDENTITY_PC_Pos (4UL) /*!< CPUSS IDENTITY: PC (Bit 4) */ +#define CPUSS_IDENTITY_PC_Msk (0xf0UL) /*!< CPUSS IDENTITY: PC (Bitfield-Mask: 0x0f) */ +#define CPUSS_IDENTITY_MS_Pos (8UL) /*!< CPUSS IDENTITY: MS (Bit 8) */ +#define CPUSS_IDENTITY_MS_Msk (0xf00UL) /*!< CPUSS IDENTITY: MS (Bitfield-Mask: 0x0f) */ +/* ================================================== CPUSS.TRIM_ROM_CTL =================================================== */ +#define CPUSS_TRIM_ROM_CTL_RM_Pos (0UL) /*!< CPUSS TRIM_ROM_CTL: RM (Bit 0) */ +#define CPUSS_TRIM_ROM_CTL_RM_Msk (0xfUL) /*!< CPUSS TRIM_ROM_CTL: RM (Bitfield-Mask: 0x0f) */ +#define CPUSS_TRIM_ROM_CTL_RME_Pos (4UL) /*!< CPUSS TRIM_ROM_CTL: RME (Bit 4) */ +#define CPUSS_TRIM_ROM_CTL_RME_Msk (0x10UL) /*!< CPUSS TRIM_ROM_CTL: RME (Bitfield-Mask: 0x01) */ +/* ================================================== CPUSS.TRIM_RAM_CTL =================================================== */ +#define CPUSS_TRIM_RAM_CTL_RM_Pos (0UL) /*!< CPUSS TRIM_RAM_CTL: RM (Bit 0) */ +#define CPUSS_TRIM_RAM_CTL_RM_Msk (0xfUL) /*!< CPUSS TRIM_RAM_CTL: RM (Bitfield-Mask: 0x0f) */ +#define CPUSS_TRIM_RAM_CTL_RME_Pos (4UL) /*!< CPUSS TRIM_RAM_CTL: RME (Bit 4) */ +#define CPUSS_TRIM_RAM_CTL_RME_Msk (0x10UL) /*!< CPUSS TRIM_RAM_CTL: RME (Bitfield-Mask: 0x01) */ +#define CPUSS_TRIM_RAM_CTL_WPULSE_Pos (5UL) /*!< CPUSS TRIM_RAM_CTL: WPULSE (Bit 5) */ +#define CPUSS_TRIM_RAM_CTL_WPULSE_Msk (0xe0UL) /*!< CPUSS TRIM_RAM_CTL: WPULSE (Bitfield-Mask: 0x07) */ +#define CPUSS_TRIM_RAM_CTL_RA_Pos (8UL) /*!< CPUSS TRIM_RAM_CTL: RA (Bit 8) */ +#define CPUSS_TRIM_RAM_CTL_RA_Msk (0x300UL) /*!< CPUSS TRIM_RAM_CTL: RA (Bitfield-Mask: 0x03) */ +#define CPUSS_TRIM_RAM_CTL_WA_Pos (12UL) /*!< CPUSS TRIM_RAM_CTL: WA (Bit 12) */ +#define CPUSS_TRIM_RAM_CTL_WA_Msk (0x7000UL) /*!< CPUSS TRIM_RAM_CTL: WA (Bitfield-Mask: 0x07) */ + + +#endif /* _CYIP_CPUSS_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_crypto.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_crypto.h new file mode 100644 index 0000000000..d32888bb00 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_crypto.h @@ -0,0 +1,375 @@ +/***************************************************************************//** +* \file cyip_crypto.h +* +* \brief +* CRYPTO IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_CRYPTO_H_ +#define _CYIP_CRYPTO_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ CRYPTO ================ */ +/* =========================================================================================================================== */ + +#define CRYPTO_SECTION_SIZE 0x00010000UL + +/** + * \brief Cryptography component (CRYPTO) + */ +typedef struct { /*!< CRYPTO Structure */ + __IOM uint32_t CTL; /*!< 0x00000000 Control */ + __IM uint32_t STATUS; /*!< 0x00000004 Status */ + __IM uint32_t RESERVED[6]; + __IM uint32_t ERROR_STATUS0; /*!< 0x00000020 Error status 0 */ + __IOM uint32_t ERROR_STATUS1; /*!< 0x00000024 Error status 1 */ + __IM uint32_t RESERVED1[6]; + __IOM uint32_t INSTR_FF_CTL; /*!< 0x00000040 Instruction FIFO control */ + __IM uint32_t INSTR_FF_STATUS; /*!< 0x00000044 Instruction FIFO status */ + __OM uint32_t INSTR_FF_WR; /*!< 0x00000048 Instruction FIFO write */ + __IM uint32_t RESERVED2[13]; + __IM uint32_t RF_DATA[16]; /*!< 0x00000080 Register-file */ + __IM uint32_t RESERVED3[16]; + __IOM uint32_t AES_CTL; /*!< 0x00000100 AES control */ + __IM uint32_t RESERVED4[31]; + __IM uint32_t STR_RESULT; /*!< 0x00000180 String result */ + __IM uint32_t RESERVED5[31]; + __IOM uint32_t PR_LFSR_CTL0; /*!< 0x00000200 Pseudo random LFSR control 0 */ + __IOM uint32_t PR_LFSR_CTL1; /*!< 0x00000204 Pseudo random LFSR control 1 */ + __IOM uint32_t PR_LFSR_CTL2; /*!< 0x00000208 Pseudo random LFSR control 2 */ + __IM uint32_t RESERVED6; + __IOM uint32_t PR_RESULT; /*!< 0x00000210 Pseudo random result */ + __IM uint32_t RESERVED7[27]; + __IOM uint32_t TR_CTL0; /*!< 0x00000280 True random control 0 */ + __IOM uint32_t TR_CTL1; /*!< 0x00000284 True random control 1 */ + __IOM uint32_t TR_RESULT; /*!< 0x00000288 True random result */ + __IM uint32_t RESERVED8[5]; + __IOM uint32_t TR_GARO_CTL; /*!< 0x000002A0 True random GARO control */ + __IOM uint32_t TR_FIRO_CTL; /*!< 0x000002A4 True random FIRO control */ + __IM uint32_t RESERVED9[6]; + __IOM uint32_t TR_MON_CTL; /*!< 0x000002C0 True random monitor control */ + __IM uint32_t RESERVED10; + __IOM uint32_t TR_MON_CMD; /*!< 0x000002C8 True random monitor command */ + __IM uint32_t RESERVED11; + __IOM uint32_t TR_MON_RC_CTL; /*!< 0x000002D0 True random monitor RC control */ + __IM uint32_t RESERVED12; + __IM uint32_t TR_MON_RC_STATUS0; /*!< 0x000002D8 True random monitor RC status 0 */ + __IM uint32_t TR_MON_RC_STATUS1; /*!< 0x000002DC True random monitor RC status 1 */ + __IOM uint32_t TR_MON_AP_CTL; /*!< 0x000002E0 True random monitor AP control */ + __IM uint32_t RESERVED13; + __IM uint32_t TR_MON_AP_STATUS0; /*!< 0x000002E8 True random monitor AP status 0 */ + __IM uint32_t TR_MON_AP_STATUS1; /*!< 0x000002EC True random monitor AP status 1 */ + __IM uint32_t RESERVED14[4]; + __IOM uint32_t SHA_CTL; /*!< 0x00000300 SHA control */ + __IM uint32_t RESERVED15[63]; + __IOM uint32_t CRC_CTL; /*!< 0x00000400 CRC control */ + __IM uint32_t RESERVED16[3]; + __IOM uint32_t CRC_DATA_CTL; /*!< 0x00000410 CRC data control */ + __IM uint32_t RESERVED17[3]; + __IOM uint32_t CRC_POL_CTL; /*!< 0x00000420 CRC polynomial control */ + __IM uint32_t RESERVED18[3]; + __IOM uint32_t CRC_LFSR_CTL; /*!< 0x00000430 CRC LFSR control */ + __IM uint32_t RESERVED19[3]; + __IOM uint32_t CRC_REM_CTL; /*!< 0x00000440 CRC remainder control */ + __IM uint32_t RESERVED20; + __IM uint32_t CRC_REM_RESULT; /*!< 0x00000448 CRC remainder result */ + __IM uint32_t RESERVED21[13]; + __IOM uint32_t VU_CTL0; /*!< 0x00000480 Vector unit control 0 */ + __IOM uint32_t VU_CTL1; /*!< 0x00000484 Vector unit control 1 */ + __IM uint32_t RESERVED22[2]; + __IM uint32_t VU_STATUS; /*!< 0x00000490 Vector unit status */ + __IM uint32_t RESERVED23[203]; + __IOM uint32_t INTR; /*!< 0x000007C0 Interrupt register */ + __IOM uint32_t INTR_SET; /*!< 0x000007C4 Interrupt set register */ + __IOM uint32_t INTR_MASK; /*!< 0x000007C8 Interrupt mask register */ + __IM uint32_t INTR_MASKED; /*!< 0x000007CC Interrupt masked register */ + __IM uint32_t RESERVED24[3596]; + __IOM uint32_t MEM_BUFF[4096]; /*!< 0x00004000 Memory buffer */ +} CRYPTO_Type; /*!< Size = 32768 (0x8000) */ + + +/* ====================================================== CRYPTO.CTL ======================================================= */ +#define CRYPTO_CTL_ISOLATE_Pos (0UL) /*!< CRYPTO CTL: ISOLATE (Bit 0) */ +#define CRYPTO_CTL_ISOLATE_Msk (0x1UL) /*!< CRYPTO CTL: ISOLATE (Bitfield-Mask: 0x01) */ +#define CRYPTO_CTL_RETAIN_Pos (1UL) /*!< CRYPTO CTL: RETAIN (Bit 1) */ +#define CRYPTO_CTL_RETAIN_Msk (0x2UL) /*!< CRYPTO CTL: RETAIN (Bitfield-Mask: 0x01) */ +#define CRYPTO_CTL_POWER_Pos (2UL) /*!< CRYPTO CTL: POWER (Bit 2) */ +#define CRYPTO_CTL_POWER_Msk (0x4UL) /*!< CRYPTO CTL: POWER (Bitfield-Mask: 0x01) */ +#define CRYPTO_CTL_ENABLED_Pos (31UL) /*!< CRYPTO CTL: ENABLED (Bit 31) */ +#define CRYPTO_CTL_ENABLED_Msk (0x80000000UL) /*!< CRYPTO CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ===================================================== CRYPTO.STATUS ===================================================== */ +#define CRYPTO_STATUS_AES_BUSY_Pos (0UL) /*!< CRYPTO STATUS: AES_BUSY (Bit 0) */ +#define CRYPTO_STATUS_AES_BUSY_Msk (0x1UL) /*!< CRYPTO STATUS: AES_BUSY (Bitfield-Mask: 0x01) */ +#define CRYPTO_STATUS_DES_BUSY_Pos (1UL) /*!< CRYPTO STATUS: DES_BUSY (Bit 1) */ +#define CRYPTO_STATUS_DES_BUSY_Msk (0x2UL) /*!< CRYPTO STATUS: DES_BUSY (Bitfield-Mask: 0x01) */ +#define CRYPTO_STATUS_SHA_BUSY_Pos (2UL) /*!< CRYPTO STATUS: SHA_BUSY (Bit 2) */ +#define CRYPTO_STATUS_SHA_BUSY_Msk (0x4UL) /*!< CRYPTO STATUS: SHA_BUSY (Bitfield-Mask: 0x01) */ +#define CRYPTO_STATUS_CRC_BUSY_Pos (3UL) /*!< CRYPTO STATUS: CRC_BUSY (Bit 3) */ +#define CRYPTO_STATUS_CRC_BUSY_Msk (0x8UL) /*!< CRYPTO STATUS: CRC_BUSY (Bitfield-Mask: 0x01) */ +#define CRYPTO_STATUS_STR_BUSY_Pos (4UL) /*!< CRYPTO STATUS: STR_BUSY (Bit 4) */ +#define CRYPTO_STATUS_STR_BUSY_Msk (0x10UL) /*!< CRYPTO STATUS: STR_BUSY (Bitfield-Mask: 0x01) */ +#define CRYPTO_STATUS_PR_BUSY_Pos (5UL) /*!< CRYPTO STATUS: PR_BUSY (Bit 5) */ +#define CRYPTO_STATUS_PR_BUSY_Msk (0x20UL) /*!< CRYPTO STATUS: PR_BUSY (Bitfield-Mask: 0x01) */ +#define CRYPTO_STATUS_TR_BUSY_Pos (6UL) /*!< CRYPTO STATUS: TR_BUSY (Bit 6) */ +#define CRYPTO_STATUS_TR_BUSY_Msk (0x40UL) /*!< CRYPTO STATUS: TR_BUSY (Bitfield-Mask: 0x01) */ +#define CRYPTO_STATUS_VU_BUSY_Pos (7UL) /*!< CRYPTO STATUS: VU_BUSY (Bit 7) */ +#define CRYPTO_STATUS_VU_BUSY_Msk (0x80UL) /*!< CRYPTO STATUS: VU_BUSY (Bitfield-Mask: 0x01) */ +#define CRYPTO_STATUS_CMD_FF_BUSY_Pos (31UL) /*!< CRYPTO STATUS: CMD_FF_BUSY (Bit 31) */ +#define CRYPTO_STATUS_CMD_FF_BUSY_Msk (0x80000000UL) /*!< CRYPTO STATUS: CMD_FF_BUSY (Bitfield-Mask: 0x01) */ +/* ================================================= CRYPTO.ERROR_STATUS0 ================================================== */ +#define CRYPTO_ERROR_STATUS0_DATA32_Pos (0UL) /*!< CRYPTO ERROR_STATUS0: DATA32 (Bit 0) */ +#define CRYPTO_ERROR_STATUS0_DATA32_Msk (0xffffffffUL) /*!< CRYPTO ERROR_STATUS0: DATA32 (Bitfield-Mask: 0xffffffff) */ +/* ================================================= CRYPTO.ERROR_STATUS1 ================================================== */ +#define CRYPTO_ERROR_STATUS1_DATA23_Pos (0UL) /*!< CRYPTO ERROR_STATUS1: DATA23 (Bit 0) */ +#define CRYPTO_ERROR_STATUS1_DATA23_Msk (0xffffffUL) /*!< CRYPTO ERROR_STATUS1: DATA23 (Bitfield-Mask: 0xffffff) */ +#define CRYPTO_ERROR_STATUS1_IDX_Pos (24UL) /*!< CRYPTO ERROR_STATUS1: IDX (Bit 24) */ +#define CRYPTO_ERROR_STATUS1_IDX_Msk (0x7000000UL) /*!< CRYPTO ERROR_STATUS1: IDX (Bitfield-Mask: 0x07) */ +#define CRYPTO_ERROR_STATUS1_VALID_Pos (31UL) /*!< CRYPTO ERROR_STATUS1: VALID (Bit 31) */ +#define CRYPTO_ERROR_STATUS1_VALID_Msk (0x80000000UL) /*!< CRYPTO ERROR_STATUS1: VALID (Bitfield-Mask: 0x01) */ +/* ================================================== CRYPTO.INSTR_FF_CTL ================================================== */ +#define CRYPTO_INSTR_FF_CTL_EVENT_LEVEL_Pos (0UL) /*!< CRYPTO INSTR_FF_CTL: EVENT_LEVEL (Bit 0) */ +#define CRYPTO_INSTR_FF_CTL_EVENT_LEVEL_Msk (0x7UL) /*!< CRYPTO INSTR_FF_CTL: EVENT_LEVEL (Bitfield-Mask: 0x07) */ +#define CRYPTO_INSTR_FF_CTL_CLEAR_Pos (16UL) /*!< CRYPTO INSTR_FF_CTL: CLEAR (Bit 16) */ +#define CRYPTO_INSTR_FF_CTL_CLEAR_Msk (0x10000UL) /*!< CRYPTO INSTR_FF_CTL: CLEAR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INSTR_FF_CTL_BLOCK_Pos (17UL) /*!< CRYPTO INSTR_FF_CTL: BLOCK (Bit 17) */ +#define CRYPTO_INSTR_FF_CTL_BLOCK_Msk (0x20000UL) /*!< CRYPTO INSTR_FF_CTL: BLOCK (Bitfield-Mask: 0x01) */ +/* ================================================ CRYPTO.INSTR_FF_STATUS ================================================= */ +#define CRYPTO_INSTR_FF_STATUS_USED_Pos (0UL) /*!< CRYPTO INSTR_FF_STATUS: USED (Bit 0) */ +#define CRYPTO_INSTR_FF_STATUS_USED_Msk (0xfUL) /*!< CRYPTO INSTR_FF_STATUS: USED (Bitfield-Mask: 0x0f) */ +#define CRYPTO_INSTR_FF_STATUS_EVENT_Pos (16UL) /*!< CRYPTO INSTR_FF_STATUS: EVENT (Bit 16) */ +#define CRYPTO_INSTR_FF_STATUS_EVENT_Msk (0x10000UL) /*!< CRYPTO INSTR_FF_STATUS: EVENT (Bitfield-Mask: 0x01) */ +#define CRYPTO_INSTR_FF_STATUS_BUSY_Pos (31UL) /*!< CRYPTO INSTR_FF_STATUS: BUSY (Bit 31) */ +#define CRYPTO_INSTR_FF_STATUS_BUSY_Msk (0x80000000UL) /*!< CRYPTO INSTR_FF_STATUS: BUSY (Bitfield-Mask: 0x01) */ +/* ================================================== CRYPTO.INSTR_FF_WR =================================================== */ +#define CRYPTO_INSTR_FF_WR_DATA32_Pos (0UL) /*!< CRYPTO INSTR_FF_WR: DATA32 (Bit 0) */ +#define CRYPTO_INSTR_FF_WR_DATA32_Msk (0xffffffffUL) /*!< CRYPTO INSTR_FF_WR: DATA32 (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== CRYPTO.RF_DATA ===================================================== */ +#define CRYPTO_RF_DATA_DATA32_Pos (0UL) /*!< CRYPTO RF_DATA: DATA32 (Bit 0) */ +#define CRYPTO_RF_DATA_DATA32_Msk (0xffffffffUL) /*!< CRYPTO RF_DATA: DATA32 (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== CRYPTO.AES_CTL ===================================================== */ +#define CRYPTO_AES_CTL_KEY_SIZE_Pos (0UL) /*!< CRYPTO AES_CTL: KEY_SIZE (Bit 0) */ +#define CRYPTO_AES_CTL_KEY_SIZE_Msk (0x3UL) /*!< CRYPTO AES_CTL: KEY_SIZE (Bitfield-Mask: 0x03) */ +/* =================================================== CRYPTO.STR_RESULT =================================================== */ +#define CRYPTO_STR_RESULT_MEMCMP_Pos (0UL) /*!< CRYPTO STR_RESULT: MEMCMP (Bit 0) */ +#define CRYPTO_STR_RESULT_MEMCMP_Msk (0x1UL) /*!< CRYPTO STR_RESULT: MEMCMP (Bitfield-Mask: 0x01) */ +/* ================================================== CRYPTO.PR_LFSR_CTL0 ================================================== */ +#define CRYPTO_PR_LFSR_CTL0_LFSR32_Pos (0UL) /*!< CRYPTO PR_LFSR_CTL0: LFSR32 (Bit 0) */ +#define CRYPTO_PR_LFSR_CTL0_LFSR32_Msk (0xffffffffUL) /*!< CRYPTO PR_LFSR_CTL0: LFSR32 (Bitfield-Mask: 0xffffffff) */ +/* ================================================== CRYPTO.PR_LFSR_CTL1 ================================================== */ +#define CRYPTO_PR_LFSR_CTL1_LFSR31_Pos (0UL) /*!< CRYPTO PR_LFSR_CTL1: LFSR31 (Bit 0) */ +#define CRYPTO_PR_LFSR_CTL1_LFSR31_Msk (0x7fffffffUL) /*!< CRYPTO PR_LFSR_CTL1: LFSR31 (Bitfield-Mask: 0x7fffffff) */ +/* ================================================== CRYPTO.PR_LFSR_CTL2 ================================================== */ +#define CRYPTO_PR_LFSR_CTL2_LFSR29_Pos (0UL) /*!< CRYPTO PR_LFSR_CTL2: LFSR29 (Bit 0) */ +#define CRYPTO_PR_LFSR_CTL2_LFSR29_Msk (0x1fffffffUL) /*!< CRYPTO PR_LFSR_CTL2: LFSR29 (Bitfield-Mask: 0x1fffffff) */ +/* =================================================== CRYPTO.PR_RESULT ==================================================== */ +#define CRYPTO_PR_RESULT_DATA32_Pos (0UL) /*!< CRYPTO PR_RESULT: DATA32 (Bit 0) */ +#define CRYPTO_PR_RESULT_DATA32_Msk (0xffffffffUL) /*!< CRYPTO PR_RESULT: DATA32 (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== CRYPTO.TR_CTL0 ===================================================== */ +#define CRYPTO_TR_CTL0_SAMPLE_CLOCK_DIV_Pos (0UL) /*!< CRYPTO TR_CTL0: SAMPLE_CLOCK_DIV (Bit 0) */ +#define CRYPTO_TR_CTL0_SAMPLE_CLOCK_DIV_Msk (0xffUL) /*!< CRYPTO TR_CTL0: SAMPLE_CLOCK_DIV (Bitfield-Mask: 0xff) */ +#define CRYPTO_TR_CTL0_RED_CLOCK_DIV_Pos (8UL) /*!< CRYPTO TR_CTL0: RED_CLOCK_DIV (Bit 8) */ +#define CRYPTO_TR_CTL0_RED_CLOCK_DIV_Msk (0xff00UL) /*!< CRYPTO TR_CTL0: RED_CLOCK_DIV (Bitfield-Mask: 0xff) */ +#define CRYPTO_TR_CTL0_INIT_DELAY_Pos (16UL) /*!< CRYPTO TR_CTL0: INIT_DELAY (Bit 16) */ +#define CRYPTO_TR_CTL0_INIT_DELAY_Msk (0xff0000UL) /*!< CRYPTO TR_CTL0: INIT_DELAY (Bitfield-Mask: 0xff) */ +#define CRYPTO_TR_CTL0_VON_NEUMANN_CORR_Pos (24UL) /*!< CRYPTO TR_CTL0: VON_NEUMANN_CORR (Bit 24) */ +#define CRYPTO_TR_CTL0_VON_NEUMANN_CORR_Msk (0x1000000UL) /*!< CRYPTO TR_CTL0: VON_NEUMANN_CORR (Bitfield-Mask: 0x01) */ +#define CRYPTO_TR_CTL0_STOP_ON_AP_DETECT_Pos (28UL) /*!< CRYPTO TR_CTL0: STOP_ON_AP_DETECT (Bit 28) */ +#define CRYPTO_TR_CTL0_STOP_ON_AP_DETECT_Msk (0x10000000UL) /*!< CRYPTO TR_CTL0: STOP_ON_AP_DETECT (Bitfield-Mask: 0x01) */ +#define CRYPTO_TR_CTL0_STOP_ON_RC_DETECT_Pos (29UL) /*!< CRYPTO TR_CTL0: STOP_ON_RC_DETECT (Bit 29) */ +#define CRYPTO_TR_CTL0_STOP_ON_RC_DETECT_Msk (0x20000000UL) /*!< CRYPTO TR_CTL0: STOP_ON_RC_DETECT (Bitfield-Mask: 0x01) */ +/* ==================================================== CRYPTO.TR_CTL1 ===================================================== */ +#define CRYPTO_TR_CTL1_RO11_EN_Pos (0UL) /*!< CRYPTO TR_CTL1: RO11_EN (Bit 0) */ +#define CRYPTO_TR_CTL1_RO11_EN_Msk (0x1UL) /*!< CRYPTO TR_CTL1: RO11_EN (Bitfield-Mask: 0x01) */ +#define CRYPTO_TR_CTL1_RO15_EN_Pos (1UL) /*!< CRYPTO TR_CTL1: RO15_EN (Bit 1) */ +#define CRYPTO_TR_CTL1_RO15_EN_Msk (0x2UL) /*!< CRYPTO TR_CTL1: RO15_EN (Bitfield-Mask: 0x01) */ +#define CRYPTO_TR_CTL1_GARO15_EN_Pos (2UL) /*!< CRYPTO TR_CTL1: GARO15_EN (Bit 2) */ +#define CRYPTO_TR_CTL1_GARO15_EN_Msk (0x4UL) /*!< CRYPTO TR_CTL1: GARO15_EN (Bitfield-Mask: 0x01) */ +#define CRYPTO_TR_CTL1_GARO31_EN_Pos (3UL) /*!< CRYPTO TR_CTL1: GARO31_EN (Bit 3) */ +#define CRYPTO_TR_CTL1_GARO31_EN_Msk (0x8UL) /*!< CRYPTO TR_CTL1: GARO31_EN (Bitfield-Mask: 0x01) */ +#define CRYPTO_TR_CTL1_FIRO15_EN_Pos (4UL) /*!< CRYPTO TR_CTL1: FIRO15_EN (Bit 4) */ +#define CRYPTO_TR_CTL1_FIRO15_EN_Msk (0x10UL) /*!< CRYPTO TR_CTL1: FIRO15_EN (Bitfield-Mask: 0x01) */ +#define CRYPTO_TR_CTL1_FIRO31_EN_Pos (5UL) /*!< CRYPTO TR_CTL1: FIRO31_EN (Bit 5) */ +#define CRYPTO_TR_CTL1_FIRO31_EN_Msk (0x20UL) /*!< CRYPTO TR_CTL1: FIRO31_EN (Bitfield-Mask: 0x01) */ +/* =================================================== CRYPTO.TR_RESULT ==================================================== */ +#define CRYPTO_TR_RESULT_DATA32_Pos (0UL) /*!< CRYPTO TR_RESULT: DATA32 (Bit 0) */ +#define CRYPTO_TR_RESULT_DATA32_Msk (0xffffffffUL) /*!< CRYPTO TR_RESULT: DATA32 (Bitfield-Mask: 0xffffffff) */ +/* ================================================== CRYPTO.TR_GARO_CTL =================================================== */ +#define CRYPTO_TR_GARO_CTL_POLYNOMIAL31_Pos (0UL) /*!< CRYPTO TR_GARO_CTL: POLYNOMIAL31 (Bit 0) */ +#define CRYPTO_TR_GARO_CTL_POLYNOMIAL31_Msk (0x7fffffffUL) /*!< CRYPTO TR_GARO_CTL: POLYNOMIAL31 (Bitfield-Mask: 0x7fffffff)*/ +/* ================================================== CRYPTO.TR_FIRO_CTL =================================================== */ +#define CRYPTO_TR_FIRO_CTL_POLYNOMIAL31_Pos (0UL) /*!< CRYPTO TR_FIRO_CTL: POLYNOMIAL31 (Bit 0) */ +#define CRYPTO_TR_FIRO_CTL_POLYNOMIAL31_Msk (0x7fffffffUL) /*!< CRYPTO TR_FIRO_CTL: POLYNOMIAL31 (Bitfield-Mask: 0x7fffffff)*/ +/* =================================================== CRYPTO.TR_MON_CTL =================================================== */ +#define CRYPTO_TR_MON_CTL_BITSTREAM_SEL_Pos (0UL) /*!< CRYPTO TR_MON_CTL: BITSTREAM_SEL (Bit 0) */ +#define CRYPTO_TR_MON_CTL_BITSTREAM_SEL_Msk (0x3UL) /*!< CRYPTO TR_MON_CTL: BITSTREAM_SEL (Bitfield-Mask: 0x03) */ +/* =================================================== CRYPTO.TR_MON_CMD =================================================== */ +#define CRYPTO_TR_MON_CMD_START_AP_Pos (0UL) /*!< CRYPTO TR_MON_CMD: START_AP (Bit 0) */ +#define CRYPTO_TR_MON_CMD_START_AP_Msk (0x1UL) /*!< CRYPTO TR_MON_CMD: START_AP (Bitfield-Mask: 0x01) */ +#define CRYPTO_TR_MON_CMD_START_RC_Pos (1UL) /*!< CRYPTO TR_MON_CMD: START_RC (Bit 1) */ +#define CRYPTO_TR_MON_CMD_START_RC_Msk (0x2UL) /*!< CRYPTO TR_MON_CMD: START_RC (Bitfield-Mask: 0x01) */ +/* ================================================= CRYPTO.TR_MON_RC_CTL ================================================== */ +#define CRYPTO_TR_MON_RC_CTL_CUTOFF_COUNT8_Pos (0UL) /*!< CRYPTO TR_MON_RC_CTL: CUTOFF_COUNT8 (Bit 0) */ +#define CRYPTO_TR_MON_RC_CTL_CUTOFF_COUNT8_Msk (0xffUL) /*!< CRYPTO TR_MON_RC_CTL: CUTOFF_COUNT8 (Bitfield-Mask: 0xff) */ +/* =============================================== CRYPTO.TR_MON_RC_STATUS0 ================================================ */ +#define CRYPTO_TR_MON_RC_STATUS0_BIT_Pos (0UL) /*!< CRYPTO TR_MON_RC_STATUS0: BIT (Bit 0) */ +#define CRYPTO_TR_MON_RC_STATUS0_BIT_Msk (0x1UL) /*!< CRYPTO TR_MON_RC_STATUS0: BIT (Bitfield-Mask: 0x01) */ +/* =============================================== CRYPTO.TR_MON_RC_STATUS1 ================================================ */ +#define CRYPTO_TR_MON_RC_STATUS1_REP_COUNT_Pos (0UL) /*!< CRYPTO TR_MON_RC_STATUS1: REP_COUNT (Bit 0) */ +#define CRYPTO_TR_MON_RC_STATUS1_REP_COUNT_Msk (0xffUL) /*!< CRYPTO TR_MON_RC_STATUS1: REP_COUNT (Bitfield-Mask: 0xff) */ +/* ================================================= CRYPTO.TR_MON_AP_CTL ================================================== */ +#define CRYPTO_TR_MON_AP_CTL_CUTOFF_COUNT16_Pos (0UL) /*!< CRYPTO TR_MON_AP_CTL: CUTOFF_COUNT16 (Bit 0) */ +#define CRYPTO_TR_MON_AP_CTL_CUTOFF_COUNT16_Msk (0xffffUL) /*!< CRYPTO TR_MON_AP_CTL: CUTOFF_COUNT16 (Bitfield-Mask: 0xffff)*/ +#define CRYPTO_TR_MON_AP_CTL_WINDOW_SIZE_Pos (16UL) /*!< CRYPTO TR_MON_AP_CTL: WINDOW_SIZE (Bit 16) */ +#define CRYPTO_TR_MON_AP_CTL_WINDOW_SIZE_Msk (0xffff0000UL) /*!< CRYPTO TR_MON_AP_CTL: WINDOW_SIZE (Bitfield-Mask: 0xffff) */ +/* =============================================== CRYPTO.TR_MON_AP_STATUS0 ================================================ */ +#define CRYPTO_TR_MON_AP_STATUS0_BIT_Pos (0UL) /*!< CRYPTO TR_MON_AP_STATUS0: BIT (Bit 0) */ +#define CRYPTO_TR_MON_AP_STATUS0_BIT_Msk (0x1UL) /*!< CRYPTO TR_MON_AP_STATUS0: BIT (Bitfield-Mask: 0x01) */ +/* =============================================== CRYPTO.TR_MON_AP_STATUS1 ================================================ */ +#define CRYPTO_TR_MON_AP_STATUS1_OCC_COUNT_Pos (0UL) /*!< CRYPTO TR_MON_AP_STATUS1: OCC_COUNT (Bit 0) */ +#define CRYPTO_TR_MON_AP_STATUS1_OCC_COUNT_Msk (0xffffUL) /*!< CRYPTO TR_MON_AP_STATUS1: OCC_COUNT (Bitfield-Mask: 0xffff)*/ +#define CRYPTO_TR_MON_AP_STATUS1_WINDOW_INDEX_Pos (16UL) /*!< CRYPTO TR_MON_AP_STATUS1: WINDOW_INDEX (Bit 16) */ +#define CRYPTO_TR_MON_AP_STATUS1_WINDOW_INDEX_Msk (0xffff0000UL) /*!< CRYPTO TR_MON_AP_STATUS1: WINDOW_INDEX (Bitfield-Mask: 0xffff)*/ +/* ==================================================== CRYPTO.SHA_CTL ===================================================== */ +#define CRYPTO_SHA_CTL_MODE_Pos (0UL) /*!< CRYPTO SHA_CTL: MODE (Bit 0) */ +#define CRYPTO_SHA_CTL_MODE_Msk (0x7UL) /*!< CRYPTO SHA_CTL: MODE (Bitfield-Mask: 0x07) */ +/* ==================================================== CRYPTO.CRC_CTL ===================================================== */ +#define CRYPTO_CRC_CTL_DATA_REVERSE_Pos (0UL) /*!< CRYPTO CRC_CTL: DATA_REVERSE (Bit 0) */ +#define CRYPTO_CRC_CTL_DATA_REVERSE_Msk (0x1UL) /*!< CRYPTO CRC_CTL: DATA_REVERSE (Bitfield-Mask: 0x01) */ +#define CRYPTO_CRC_CTL_REM_REVERSE_Pos (8UL) /*!< CRYPTO CRC_CTL: REM_REVERSE (Bit 8) */ +#define CRYPTO_CRC_CTL_REM_REVERSE_Msk (0x100UL) /*!< CRYPTO CRC_CTL: REM_REVERSE (Bitfield-Mask: 0x01) */ +/* ================================================== CRYPTO.CRC_DATA_CTL ================================================== */ +#define CRYPTO_CRC_DATA_CTL_DATA_XOR_Pos (0UL) /*!< CRYPTO CRC_DATA_CTL: DATA_XOR (Bit 0) */ +#define CRYPTO_CRC_DATA_CTL_DATA_XOR_Msk (0xffUL) /*!< CRYPTO CRC_DATA_CTL: DATA_XOR (Bitfield-Mask: 0xff) */ +/* ================================================== CRYPTO.CRC_POL_CTL =================================================== */ +#define CRYPTO_CRC_POL_CTL_POLYNOMIAL_Pos (0UL) /*!< CRYPTO CRC_POL_CTL: POLYNOMIAL (Bit 0) */ +#define CRYPTO_CRC_POL_CTL_POLYNOMIAL_Msk (0xffffffffUL) /*!< CRYPTO CRC_POL_CTL: POLYNOMIAL (Bitfield-Mask: 0xffffffff)*/ +/* ================================================== CRYPTO.CRC_LFSR_CTL ================================================== */ +#define CRYPTO_CRC_LFSR_CTL_LFSR32_Pos (0UL) /*!< CRYPTO CRC_LFSR_CTL: LFSR32 (Bit 0) */ +#define CRYPTO_CRC_LFSR_CTL_LFSR32_Msk (0xffffffffUL) /*!< CRYPTO CRC_LFSR_CTL: LFSR32 (Bitfield-Mask: 0xffffffff) */ +/* ================================================== CRYPTO.CRC_REM_CTL =================================================== */ +#define CRYPTO_CRC_REM_CTL_REM_XOR_Pos (0UL) /*!< CRYPTO CRC_REM_CTL: REM_XOR (Bit 0) */ +#define CRYPTO_CRC_REM_CTL_REM_XOR_Msk (0xffffffffUL) /*!< CRYPTO CRC_REM_CTL: REM_XOR (Bitfield-Mask: 0xffffffff) */ +/* ================================================= CRYPTO.CRC_REM_RESULT ================================================= */ +#define CRYPTO_CRC_REM_RESULT_REM_Pos (0UL) /*!< CRYPTO CRC_REM_RESULT: REM (Bit 0) */ +#define CRYPTO_CRC_REM_RESULT_REM_Msk (0xffffffffUL) /*!< CRYPTO CRC_REM_RESULT: REM (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== CRYPTO.VU_CTL0 ===================================================== */ +#define CRYPTO_VU_CTL0_ALWAYS_EXECUTE_Pos (0UL) /*!< CRYPTO VU_CTL0: ALWAYS_EXECUTE (Bit 0) */ +#define CRYPTO_VU_CTL0_ALWAYS_EXECUTE_Msk (0x1UL) /*!< CRYPTO VU_CTL0: ALWAYS_EXECUTE (Bitfield-Mask: 0x01) */ +/* ==================================================== CRYPTO.VU_CTL1 ===================================================== */ +#define CRYPTO_VU_CTL1_ADDR_Pos (14UL) /*!< CRYPTO VU_CTL1: ADDR (Bit 14) */ +#define CRYPTO_VU_CTL1_ADDR_Msk (0xffffc000UL) /*!< CRYPTO VU_CTL1: ADDR (Bitfield-Mask: 0x3ffff) */ +/* =================================================== CRYPTO.VU_STATUS ==================================================== */ +#define CRYPTO_VU_STATUS_CARRY_Pos (0UL) /*!< CRYPTO VU_STATUS: CARRY (Bit 0) */ +#define CRYPTO_VU_STATUS_CARRY_Msk (0x1UL) /*!< CRYPTO VU_STATUS: CARRY (Bitfield-Mask: 0x01) */ +#define CRYPTO_VU_STATUS_EVEN_Pos (1UL) /*!< CRYPTO VU_STATUS: EVEN (Bit 1) */ +#define CRYPTO_VU_STATUS_EVEN_Msk (0x2UL) /*!< CRYPTO VU_STATUS: EVEN (Bitfield-Mask: 0x01) */ +#define CRYPTO_VU_STATUS_ZERO_Pos (2UL) /*!< CRYPTO VU_STATUS: ZERO (Bit 2) */ +#define CRYPTO_VU_STATUS_ZERO_Msk (0x4UL) /*!< CRYPTO VU_STATUS: ZERO (Bitfield-Mask: 0x01) */ +#define CRYPTO_VU_STATUS_ONE_Pos (3UL) /*!< CRYPTO VU_STATUS: ONE (Bit 3) */ +#define CRYPTO_VU_STATUS_ONE_Msk (0x8UL) /*!< CRYPTO VU_STATUS: ONE (Bitfield-Mask: 0x01) */ +/* ====================================================== CRYPTO.INTR ====================================================== */ +#define CRYPTO_INTR_INSTR_FF_LEVEL_Pos (0UL) /*!< CRYPTO INTR: INSTR_FF_LEVEL (Bit 0) */ +#define CRYPTO_INTR_INSTR_FF_LEVEL_Msk (0x1UL) /*!< CRYPTO INTR: INSTR_FF_LEVEL (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_INSTR_FF_OVERFLOW_Pos (1UL) /*!< CRYPTO INTR: INSTR_FF_OVERFLOW (Bit 1) */ +#define CRYPTO_INTR_INSTR_FF_OVERFLOW_Msk (0x2UL) /*!< CRYPTO INTR: INSTR_FF_OVERFLOW (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_TR_INITIALIZED_Pos (2UL) /*!< CRYPTO INTR: TR_INITIALIZED (Bit 2) */ +#define CRYPTO_INTR_TR_INITIALIZED_Msk (0x4UL) /*!< CRYPTO INTR: TR_INITIALIZED (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_TR_DATA_AVAILABLE_Pos (3UL) /*!< CRYPTO INTR: TR_DATA_AVAILABLE (Bit 3) */ +#define CRYPTO_INTR_TR_DATA_AVAILABLE_Msk (0x8UL) /*!< CRYPTO INTR: TR_DATA_AVAILABLE (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_PR_DATA_AVAILABLE_Pos (4UL) /*!< CRYPTO INTR: PR_DATA_AVAILABLE (Bit 4) */ +#define CRYPTO_INTR_PR_DATA_AVAILABLE_Msk (0x10UL) /*!< CRYPTO INTR: PR_DATA_AVAILABLE (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_INSTR_OPC_ERROR_Pos (16UL) /*!< CRYPTO INTR: INSTR_OPC_ERROR (Bit 16) */ +#define CRYPTO_INTR_INSTR_OPC_ERROR_Msk (0x10000UL) /*!< CRYPTO INTR: INSTR_OPC_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_INSTR_CC_ERROR_Pos (17UL) /*!< CRYPTO INTR: INSTR_CC_ERROR (Bit 17) */ +#define CRYPTO_INTR_INSTR_CC_ERROR_Msk (0x20000UL) /*!< CRYPTO INTR: INSTR_CC_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_BUS_ERROR_Pos (18UL) /*!< CRYPTO INTR: BUS_ERROR (Bit 18) */ +#define CRYPTO_INTR_BUS_ERROR_Msk (0x40000UL) /*!< CRYPTO INTR: BUS_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_TR_AP_DETECT_ERROR_Pos (19UL) /*!< CRYPTO INTR: TR_AP_DETECT_ERROR (Bit 19) */ +#define CRYPTO_INTR_TR_AP_DETECT_ERROR_Msk (0x80000UL) /*!< CRYPTO INTR: TR_AP_DETECT_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_TR_RC_DETECT_ERROR_Pos (20UL) /*!< CRYPTO INTR: TR_RC_DETECT_ERROR (Bit 20) */ +#define CRYPTO_INTR_TR_RC_DETECT_ERROR_Msk (0x100000UL) /*!< CRYPTO INTR: TR_RC_DETECT_ERROR (Bitfield-Mask: 0x01) */ +/* ==================================================== CRYPTO.INTR_SET ==================================================== */ +#define CRYPTO_INTR_SET_INSTR_FF_LEVEL_Pos (0UL) /*!< CRYPTO INTR_SET: INSTR_FF_LEVEL (Bit 0) */ +#define CRYPTO_INTR_SET_INSTR_FF_LEVEL_Msk (0x1UL) /*!< CRYPTO INTR_SET: INSTR_FF_LEVEL (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_SET_INSTR_FF_OVERFLOW_Pos (1UL) /*!< CRYPTO INTR_SET: INSTR_FF_OVERFLOW (Bit 1) */ +#define CRYPTO_INTR_SET_INSTR_FF_OVERFLOW_Msk (0x2UL) /*!< CRYPTO INTR_SET: INSTR_FF_OVERFLOW (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_SET_TR_INITIALIZED_Pos (2UL) /*!< CRYPTO INTR_SET: TR_INITIALIZED (Bit 2) */ +#define CRYPTO_INTR_SET_TR_INITIALIZED_Msk (0x4UL) /*!< CRYPTO INTR_SET: TR_INITIALIZED (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_SET_TR_DATA_AVAILABLE_Pos (3UL) /*!< CRYPTO INTR_SET: TR_DATA_AVAILABLE (Bit 3) */ +#define CRYPTO_INTR_SET_TR_DATA_AVAILABLE_Msk (0x8UL) /*!< CRYPTO INTR_SET: TR_DATA_AVAILABLE (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_SET_PR_DATA_AVAILABLE_Pos (4UL) /*!< CRYPTO INTR_SET: PR_DATA_AVAILABLE (Bit 4) */ +#define CRYPTO_INTR_SET_PR_DATA_AVAILABLE_Msk (0x10UL) /*!< CRYPTO INTR_SET: PR_DATA_AVAILABLE (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_SET_INSTR_OPC_ERROR_Pos (16UL) /*!< CRYPTO INTR_SET: INSTR_OPC_ERROR (Bit 16) */ +#define CRYPTO_INTR_SET_INSTR_OPC_ERROR_Msk (0x10000UL) /*!< CRYPTO INTR_SET: INSTR_OPC_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_SET_INSTR_CC_ERROR_Pos (17UL) /*!< CRYPTO INTR_SET: INSTR_CC_ERROR (Bit 17) */ +#define CRYPTO_INTR_SET_INSTR_CC_ERROR_Msk (0x20000UL) /*!< CRYPTO INTR_SET: INSTR_CC_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_SET_BUS_ERROR_Pos (18UL) /*!< CRYPTO INTR_SET: BUS_ERROR (Bit 18) */ +#define CRYPTO_INTR_SET_BUS_ERROR_Msk (0x40000UL) /*!< CRYPTO INTR_SET: BUS_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_SET_TR_AP_DETECT_ERROR_Pos (19UL) /*!< CRYPTO INTR_SET: TR_AP_DETECT_ERROR (Bit 19) */ +#define CRYPTO_INTR_SET_TR_AP_DETECT_ERROR_Msk (0x80000UL) /*!< CRYPTO INTR_SET: TR_AP_DETECT_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_SET_TR_RC_DETECT_ERROR_Pos (20UL) /*!< CRYPTO INTR_SET: TR_RC_DETECT_ERROR (Bit 20) */ +#define CRYPTO_INTR_SET_TR_RC_DETECT_ERROR_Msk (0x100000UL) /*!< CRYPTO INTR_SET: TR_RC_DETECT_ERROR (Bitfield-Mask: 0x01) */ +/* =================================================== CRYPTO.INTR_MASK ==================================================== */ +#define CRYPTO_INTR_MASK_INSTR_FF_LEVEL_Pos (0UL) /*!< CRYPTO INTR_MASK: INSTR_FF_LEVEL (Bit 0) */ +#define CRYPTO_INTR_MASK_INSTR_FF_LEVEL_Msk (0x1UL) /*!< CRYPTO INTR_MASK: INSTR_FF_LEVEL (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASK_INSTR_FF_OVERFLOW_Pos (1UL) /*!< CRYPTO INTR_MASK: INSTR_FF_OVERFLOW (Bit 1) */ +#define CRYPTO_INTR_MASK_INSTR_FF_OVERFLOW_Msk (0x2UL) /*!< CRYPTO INTR_MASK: INSTR_FF_OVERFLOW (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASK_TR_INITIALIZED_Pos (2UL) /*!< CRYPTO INTR_MASK: TR_INITIALIZED (Bit 2) */ +#define CRYPTO_INTR_MASK_TR_INITIALIZED_Msk (0x4UL) /*!< CRYPTO INTR_MASK: TR_INITIALIZED (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASK_TR_DATA_AVAILABLE_Pos (3UL) /*!< CRYPTO INTR_MASK: TR_DATA_AVAILABLE (Bit 3) */ +#define CRYPTO_INTR_MASK_TR_DATA_AVAILABLE_Msk (0x8UL) /*!< CRYPTO INTR_MASK: TR_DATA_AVAILABLE (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASK_PR_DATA_AVAILABLE_Pos (4UL) /*!< CRYPTO INTR_MASK: PR_DATA_AVAILABLE (Bit 4) */ +#define CRYPTO_INTR_MASK_PR_DATA_AVAILABLE_Msk (0x10UL) /*!< CRYPTO INTR_MASK: PR_DATA_AVAILABLE (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASK_INSTR_OPC_ERROR_Pos (16UL) /*!< CRYPTO INTR_MASK: INSTR_OPC_ERROR (Bit 16) */ +#define CRYPTO_INTR_MASK_INSTR_OPC_ERROR_Msk (0x10000UL) /*!< CRYPTO INTR_MASK: INSTR_OPC_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASK_INSTR_CC_ERROR_Pos (17UL) /*!< CRYPTO INTR_MASK: INSTR_CC_ERROR (Bit 17) */ +#define CRYPTO_INTR_MASK_INSTR_CC_ERROR_Msk (0x20000UL) /*!< CRYPTO INTR_MASK: INSTR_CC_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASK_BUS_ERROR_Pos (18UL) /*!< CRYPTO INTR_MASK: BUS_ERROR (Bit 18) */ +#define CRYPTO_INTR_MASK_BUS_ERROR_Msk (0x40000UL) /*!< CRYPTO INTR_MASK: BUS_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASK_TR_AP_DETECT_ERROR_Pos (19UL) /*!< CRYPTO INTR_MASK: TR_AP_DETECT_ERROR (Bit 19) */ +#define CRYPTO_INTR_MASK_TR_AP_DETECT_ERROR_Msk (0x80000UL) /*!< CRYPTO INTR_MASK: TR_AP_DETECT_ERROR (Bitfield-Mask: 0x01)*/ +#define CRYPTO_INTR_MASK_TR_RC_DETECT_ERROR_Pos (20UL) /*!< CRYPTO INTR_MASK: TR_RC_DETECT_ERROR (Bit 20) */ +#define CRYPTO_INTR_MASK_TR_RC_DETECT_ERROR_Msk (0x100000UL) /*!< CRYPTO INTR_MASK: TR_RC_DETECT_ERROR (Bitfield-Mask: 0x01)*/ +/* ================================================== CRYPTO.INTR_MASKED =================================================== */ +#define CRYPTO_INTR_MASKED_INSTR_FF_LEVEL_Pos (0UL) /*!< CRYPTO INTR_MASKED: INSTR_FF_LEVEL (Bit 0) */ +#define CRYPTO_INTR_MASKED_INSTR_FF_LEVEL_Msk (0x1UL) /*!< CRYPTO INTR_MASKED: INSTR_FF_LEVEL (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASKED_INSTR_FF_OVERFLOW_Pos (1UL) /*!< CRYPTO INTR_MASKED: INSTR_FF_OVERFLOW (Bit 1) */ +#define CRYPTO_INTR_MASKED_INSTR_FF_OVERFLOW_Msk (0x2UL) /*!< CRYPTO INTR_MASKED: INSTR_FF_OVERFLOW (Bitfield-Mask: 0x01)*/ +#define CRYPTO_INTR_MASKED_TR_INITIALIZED_Pos (2UL) /*!< CRYPTO INTR_MASKED: TR_INITIALIZED (Bit 2) */ +#define CRYPTO_INTR_MASKED_TR_INITIALIZED_Msk (0x4UL) /*!< CRYPTO INTR_MASKED: TR_INITIALIZED (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASKED_TR_DATA_AVAILABLE_Pos (3UL) /*!< CRYPTO INTR_MASKED: TR_DATA_AVAILABLE (Bit 3) */ +#define CRYPTO_INTR_MASKED_TR_DATA_AVAILABLE_Msk (0x8UL) /*!< CRYPTO INTR_MASKED: TR_DATA_AVAILABLE (Bitfield-Mask: 0x01)*/ +#define CRYPTO_INTR_MASKED_PR_DATA_AVAILABLE_Pos (4UL) /*!< CRYPTO INTR_MASKED: PR_DATA_AVAILABLE (Bit 4) */ +#define CRYPTO_INTR_MASKED_PR_DATA_AVAILABLE_Msk (0x10UL) /*!< CRYPTO INTR_MASKED: PR_DATA_AVAILABLE (Bitfield-Mask: 0x01)*/ +#define CRYPTO_INTR_MASKED_INSTR_OPC_ERROR_Pos (16UL) /*!< CRYPTO INTR_MASKED: INSTR_OPC_ERROR (Bit 16) */ +#define CRYPTO_INTR_MASKED_INSTR_OPC_ERROR_Msk (0x10000UL) /*!< CRYPTO INTR_MASKED: INSTR_OPC_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASKED_INSTR_CC_ERROR_Pos (17UL) /*!< CRYPTO INTR_MASKED: INSTR_CC_ERROR (Bit 17) */ +#define CRYPTO_INTR_MASKED_INSTR_CC_ERROR_Msk (0x20000UL) /*!< CRYPTO INTR_MASKED: INSTR_CC_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASKED_BUS_ERROR_Pos (18UL) /*!< CRYPTO INTR_MASKED: BUS_ERROR (Bit 18) */ +#define CRYPTO_INTR_MASKED_BUS_ERROR_Msk (0x40000UL) /*!< CRYPTO INTR_MASKED: BUS_ERROR (Bitfield-Mask: 0x01) */ +#define CRYPTO_INTR_MASKED_TR_AP_DETECT_ERROR_Pos (19UL) /*!< CRYPTO INTR_MASKED: TR_AP_DETECT_ERROR (Bit 19) */ +#define CRYPTO_INTR_MASKED_TR_AP_DETECT_ERROR_Msk (0x80000UL) /*!< CRYPTO INTR_MASKED: TR_AP_DETECT_ERROR (Bitfield-Mask: 0x01)*/ +#define CRYPTO_INTR_MASKED_TR_RC_DETECT_ERROR_Pos (20UL) /*!< CRYPTO INTR_MASKED: TR_RC_DETECT_ERROR (Bit 20) */ +#define CRYPTO_INTR_MASKED_TR_RC_DETECT_ERROR_Msk (0x100000UL) /*!< CRYPTO INTR_MASKED: TR_RC_DETECT_ERROR (Bitfield-Mask: 0x01)*/ +/* ==================================================== CRYPTO.MEM_BUFF ==================================================== */ +#define CRYPTO_MEM_BUFF_DATA32_Pos (0UL) /*!< CRYPTO MEM_BUFF: DATA32 (Bit 0) */ +#define CRYPTO_MEM_BUFF_DATA32_Msk (0xffffffffUL) /*!< CRYPTO MEM_BUFF: DATA32 (Bitfield-Mask: 0xffffffff) */ + + +#endif /* _CYIP_CRYPTO_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_csd.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_csd.h new file mode 100644 index 0000000000..f939ab9e29 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_csd.h @@ -0,0 +1,473 @@ +/***************************************************************************//** +* \file cyip_csd.h +* +* \brief +* CSD IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_CSD_H_ +#define _CYIP_CSD_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ CSD ================ */ +/* =========================================================================================================================== */ + +#define CSD_SECTION_SIZE 0x00001000UL + +/** + * \brief Capsense Controller (CSD) + */ +typedef struct { /*!< CSD Structure */ + __IOM uint32_t CONFIG; /*!< 0x00000000 Configuration and Control */ + __IOM uint32_t SPARE; /*!< 0x00000004 Spare MMIO */ + __IM uint32_t RESERVED[30]; + __IM uint32_t STATUS; /*!< 0x00000080 Status Register */ + __IM uint32_t STAT_SEQ; /*!< 0x00000084 Current Sequencer status */ + __IM uint32_t STAT_CNTS; /*!< 0x00000088 Current status counts */ + __IM uint32_t RESERVED1[17]; + __IM uint32_t RESULT_VAL1; /*!< 0x000000D0 Result CSD/CSX accumulation counter value 1 */ + __IM uint32_t RESULT_VAL2; /*!< 0x000000D4 Result CSX accumulation counter value 2 */ + __IM uint32_t RESERVED2[2]; + __IM uint32_t ADC_RES; /*!< 0x000000E0 ADC measurement */ + __IM uint32_t RESERVED3[3]; + __IOM uint32_t INTR; /*!< 0x000000F0 CSD Interrupt Request Register */ + __IOM uint32_t INTR_SET; /*!< 0x000000F4 CSD Interrupt set register */ + __IOM uint32_t INTR_MASK; /*!< 0x000000F8 CSD Interrupt mask register */ + __IM uint32_t INTR_MASKED; /*!< 0x000000FC CSD Interrupt masked register */ + __IM uint32_t RESERVED4[32]; + __IOM uint32_t HSCMP; /*!< 0x00000180 High Speed Comparator configuration */ + __IOM uint32_t AMBUF; /*!< 0x00000184 Reference Generator configuration */ + __IOM uint32_t REFGEN; /*!< 0x00000188 Reference Generator configuration */ + __IOM uint32_t CSDCMP; /*!< 0x0000018C CSD Comparator configuration */ + __IM uint32_t RESERVED5[24]; + __IOM uint32_t SW_RES; /*!< 0x000001F0 Switch Resistance configuration */ + __IM uint32_t RESERVED6[3]; + __IOM uint32_t SENSE_PERIOD; /*!< 0x00000200 Sense clock period */ + __IOM uint32_t SENSE_DUTY; /*!< 0x00000204 Sense clock duty cycle */ + __IM uint32_t RESERVED7[30]; + __IOM uint32_t SW_HS_P_SEL; /*!< 0x00000280 HSCMP Pos input switch Waveform selection */ + __IOM uint32_t SW_HS_N_SEL; /*!< 0x00000284 HSCMP Neg input switch Waveform selection */ + __IOM uint32_t SW_SHIELD_SEL; /*!< 0x00000288 Shielding switches Waveform selection */ + __IM uint32_t RESERVED8; + __IOM uint32_t SW_AMUXBUF_SEL; /*!< 0x00000290 Amuxbuffer switches Waveform selection */ + __IOM uint32_t SW_BYP_SEL; /*!< 0x00000294 AMUXBUS bypass switches Waveform selection */ + __IM uint32_t RESERVED9[2]; + __IOM uint32_t SW_CMP_P_SEL; /*!< 0x000002A0 CSDCMP Pos Switch Waveform selection */ + __IOM uint32_t SW_CMP_N_SEL; /*!< 0x000002A4 CSDCMP Neg Switch Waveform selection */ + __IOM uint32_t SW_REFGEN_SEL; /*!< 0x000002A8 Reference Generator Switch Waveform selection */ + __IM uint32_t RESERVED10; + __IOM uint32_t SW_FW_MOD_SEL; /*!< 0x000002B0 Full Wave Cmod Switch Waveform selection */ + __IOM uint32_t SW_FW_TANK_SEL; /*!< 0x000002B4 Full Wave Csh_tank Switch Waveform selection */ + __IM uint32_t RESERVED11[2]; + __IOM uint32_t SW_DSI_SEL; /*!< 0x000002C0 DSI output switch control Waveform selection */ + __IM uint32_t RESERVED12[3]; + __IOM uint32_t IO_SEL; /*!< 0x000002D0 IO output control Waveform selection */ + __IM uint32_t RESERVED13[11]; + __IOM uint32_t SEQ_TIME; /*!< 0x00000300 Sequencer Timing */ + __IM uint32_t RESERVED14[3]; + __IOM uint32_t SEQ_INIT_CNT; /*!< 0x00000310 Sequencer Initial conversion and sample counts */ + __IOM uint32_t SEQ_NORM_CNT; /*!< 0x00000314 Sequencer Normal conversion and sample counts */ + __IM uint32_t RESERVED15[2]; + __IOM uint32_t ADC_CTL; /*!< 0x00000320 ADC Control */ + __IM uint32_t RESERVED16[7]; + __IOM uint32_t SEQ_START; /*!< 0x00000340 Sequencer start */ + __IM uint32_t RESERVED17[47]; + __IOM uint32_t IDACA; /*!< 0x00000400 IDACA Configuration */ + __IM uint32_t RESERVED18[63]; + __IOM uint32_t IDACB; /*!< 0x00000500 IDACB Configuration */ +} CSD_Type; /*!< Size = 1284 (0x504) */ + + +/* ====================================================== CSD.CONFIG ======================================================= */ +#define CSD_CONFIG_IREF_SEL_Pos (0UL) /*!< CSD CONFIG: IREF_SEL (Bit 0) */ +#define CSD_CONFIG_IREF_SEL_Msk (0x1UL) /*!< CSD CONFIG: IREF_SEL (Bitfield-Mask: 0x01) */ +#define CSD_CONFIG_FILTER_DELAY_Pos (4UL) /*!< CSD CONFIG: FILTER_DELAY (Bit 4) */ +#define CSD_CONFIG_FILTER_DELAY_Msk (0x1f0UL) /*!< CSD CONFIG: FILTER_DELAY (Bitfield-Mask: 0x1f) */ +#define CSD_CONFIG_SHIELD_DELAY_Pos (10UL) /*!< CSD CONFIG: SHIELD_DELAY (Bit 10) */ +#define CSD_CONFIG_SHIELD_DELAY_Msk (0xc00UL) /*!< CSD CONFIG: SHIELD_DELAY (Bitfield-Mask: 0x03) */ +#define CSD_CONFIG_SENSE_EN_Pos (12UL) /*!< CSD CONFIG: SENSE_EN (Bit 12) */ +#define CSD_CONFIG_SENSE_EN_Msk (0x1000UL) /*!< CSD CONFIG: SENSE_EN (Bitfield-Mask: 0x01) */ +#define CSD_CONFIG_FULL_WAVE_Pos (17UL) /*!< CSD CONFIG: FULL_WAVE (Bit 17) */ +#define CSD_CONFIG_FULL_WAVE_Msk (0x20000UL) /*!< CSD CONFIG: FULL_WAVE (Bitfield-Mask: 0x01) */ +#define CSD_CONFIG_MUTUAL_CAP_Pos (18UL) /*!< CSD CONFIG: MUTUAL_CAP (Bit 18) */ +#define CSD_CONFIG_MUTUAL_CAP_Msk (0x40000UL) /*!< CSD CONFIG: MUTUAL_CAP (Bitfield-Mask: 0x01) */ +#define CSD_CONFIG_CSX_DUAL_CNT_Pos (19UL) /*!< CSD CONFIG: CSX_DUAL_CNT (Bit 19) */ +#define CSD_CONFIG_CSX_DUAL_CNT_Msk (0x80000UL) /*!< CSD CONFIG: CSX_DUAL_CNT (Bitfield-Mask: 0x01) */ +#define CSD_CONFIG_DSI_COUNT_SEL_Pos (24UL) /*!< CSD CONFIG: DSI_COUNT_SEL (Bit 24) */ +#define CSD_CONFIG_DSI_COUNT_SEL_Msk (0x1000000UL) /*!< CSD CONFIG: DSI_COUNT_SEL (Bitfield-Mask: 0x01) */ +#define CSD_CONFIG_DSI_SAMPLE_EN_Pos (25UL) /*!< CSD CONFIG: DSI_SAMPLE_EN (Bit 25) */ +#define CSD_CONFIG_DSI_SAMPLE_EN_Msk (0x2000000UL) /*!< CSD CONFIG: DSI_SAMPLE_EN (Bitfield-Mask: 0x01) */ +#define CSD_CONFIG_SAMPLE_SYNC_Pos (26UL) /*!< CSD CONFIG: SAMPLE_SYNC (Bit 26) */ +#define CSD_CONFIG_SAMPLE_SYNC_Msk (0x4000000UL) /*!< CSD CONFIG: SAMPLE_SYNC (Bitfield-Mask: 0x01) */ +#define CSD_CONFIG_DSI_SENSE_EN_Pos (27UL) /*!< CSD CONFIG: DSI_SENSE_EN (Bit 27) */ +#define CSD_CONFIG_DSI_SENSE_EN_Msk (0x8000000UL) /*!< CSD CONFIG: DSI_SENSE_EN (Bitfield-Mask: 0x01) */ +#define CSD_CONFIG_LP_MODE_Pos (30UL) /*!< CSD CONFIG: LP_MODE (Bit 30) */ +#define CSD_CONFIG_LP_MODE_Msk (0x40000000UL) /*!< CSD CONFIG: LP_MODE (Bitfield-Mask: 0x01) */ +#define CSD_CONFIG_ENABLE_Pos (31UL) /*!< CSD CONFIG: ENABLE (Bit 31) */ +#define CSD_CONFIG_ENABLE_Msk (0x80000000UL) /*!< CSD CONFIG: ENABLE (Bitfield-Mask: 0x01) */ +/* ======================================================= CSD.SPARE ======================================================= */ +#define CSD_SPARE_SPARE_Pos (0UL) /*!< CSD SPARE: SPARE (Bit 0) */ +#define CSD_SPARE_SPARE_Msk (0xfUL) /*!< CSD SPARE: SPARE (Bitfield-Mask: 0x0f) */ +/* ====================================================== CSD.STATUS ======================================================= */ +#define CSD_STATUS_CSD_SENSE_Pos (1UL) /*!< CSD STATUS: CSD_SENSE (Bit 1) */ +#define CSD_STATUS_CSD_SENSE_Msk (0x2UL) /*!< CSD STATUS: CSD_SENSE (Bitfield-Mask: 0x01) */ +#define CSD_STATUS_HSCMP_OUT_Pos (2UL) /*!< CSD STATUS: HSCMP_OUT (Bit 2) */ +#define CSD_STATUS_HSCMP_OUT_Msk (0x4UL) /*!< CSD STATUS: HSCMP_OUT (Bitfield-Mask: 0x01) */ +#define CSD_STATUS_CSDCMP_OUT_Pos (3UL) /*!< CSD STATUS: CSDCMP_OUT (Bit 3) */ +#define CSD_STATUS_CSDCMP_OUT_Msk (0x8UL) /*!< CSD STATUS: CSDCMP_OUT (Bitfield-Mask: 0x01) */ +/* ===================================================== CSD.STAT_SEQ ====================================================== */ +#define CSD_STAT_SEQ_SEQ_STATE_Pos (0UL) /*!< CSD STAT_SEQ: SEQ_STATE (Bit 0) */ +#define CSD_STAT_SEQ_SEQ_STATE_Msk (0x7UL) /*!< CSD STAT_SEQ: SEQ_STATE (Bitfield-Mask: 0x07) */ +#define CSD_STAT_SEQ_ADC_STATE_Pos (16UL) /*!< CSD STAT_SEQ: ADC_STATE (Bit 16) */ +#define CSD_STAT_SEQ_ADC_STATE_Msk (0x70000UL) /*!< CSD STAT_SEQ: ADC_STATE (Bitfield-Mask: 0x07) */ +/* ===================================================== CSD.STAT_CNTS ===================================================== */ +#define CSD_STAT_CNTS_NUM_CONV_Pos (0UL) /*!< CSD STAT_CNTS: NUM_CONV (Bit 0) */ +#define CSD_STAT_CNTS_NUM_CONV_Msk (0xffffUL) /*!< CSD STAT_CNTS: NUM_CONV (Bitfield-Mask: 0xffff) */ +/* ==================================================== CSD.RESULT_VAL1 ==================================================== */ +#define CSD_RESULT_VAL1_VALUE_Pos (0UL) /*!< CSD RESULT_VAL1: VALUE (Bit 0) */ +#define CSD_RESULT_VAL1_VALUE_Msk (0xffffUL) /*!< CSD RESULT_VAL1: VALUE (Bitfield-Mask: 0xffff) */ +#define CSD_RESULT_VAL1_BAD_CONVS_Pos (16UL) /*!< CSD RESULT_VAL1: BAD_CONVS (Bit 16) */ +#define CSD_RESULT_VAL1_BAD_CONVS_Msk (0xff0000UL) /*!< CSD RESULT_VAL1: BAD_CONVS (Bitfield-Mask: 0xff) */ +/* ==================================================== CSD.RESULT_VAL2 ==================================================== */ +#define CSD_RESULT_VAL2_VALUE_Pos (0UL) /*!< CSD RESULT_VAL2: VALUE (Bit 0) */ +#define CSD_RESULT_VAL2_VALUE_Msk (0xffffUL) /*!< CSD RESULT_VAL2: VALUE (Bitfield-Mask: 0xffff) */ +/* ====================================================== CSD.ADC_RES ====================================================== */ +#define CSD_ADC_RES_VIN_CNT_Pos (0UL) /*!< CSD ADC_RES: VIN_CNT (Bit 0) */ +#define CSD_ADC_RES_VIN_CNT_Msk (0xffffUL) /*!< CSD ADC_RES: VIN_CNT (Bitfield-Mask: 0xffff) */ +#define CSD_ADC_RES_HSCMP_POL_Pos (16UL) /*!< CSD ADC_RES: HSCMP_POL (Bit 16) */ +#define CSD_ADC_RES_HSCMP_POL_Msk (0x10000UL) /*!< CSD ADC_RES: HSCMP_POL (Bitfield-Mask: 0x01) */ +#define CSD_ADC_RES_ADC_OVERFLOW_Pos (30UL) /*!< CSD ADC_RES: ADC_OVERFLOW (Bit 30) */ +#define CSD_ADC_RES_ADC_OVERFLOW_Msk (0x40000000UL) /*!< CSD ADC_RES: ADC_OVERFLOW (Bitfield-Mask: 0x01) */ +#define CSD_ADC_RES_ADC_ABORT_Pos (31UL) /*!< CSD ADC_RES: ADC_ABORT (Bit 31) */ +#define CSD_ADC_RES_ADC_ABORT_Msk (0x80000000UL) /*!< CSD ADC_RES: ADC_ABORT (Bitfield-Mask: 0x01) */ +/* ======================================================= CSD.INTR ======================================================== */ +#define CSD_INTR_SAMPLE_Pos (1UL) /*!< CSD INTR: SAMPLE (Bit 1) */ +#define CSD_INTR_SAMPLE_Msk (0x2UL) /*!< CSD INTR: SAMPLE (Bitfield-Mask: 0x01) */ +#define CSD_INTR_INIT_Pos (2UL) /*!< CSD INTR: INIT (Bit 2) */ +#define CSD_INTR_INIT_Msk (0x4UL) /*!< CSD INTR: INIT (Bitfield-Mask: 0x01) */ +#define CSD_INTR_ADC_RES_Pos (8UL) /*!< CSD INTR: ADC_RES (Bit 8) */ +#define CSD_INTR_ADC_RES_Msk (0x100UL) /*!< CSD INTR: ADC_RES (Bitfield-Mask: 0x01) */ +/* ===================================================== CSD.INTR_SET ====================================================== */ +#define CSD_INTR_SET_SAMPLE_Pos (1UL) /*!< CSD INTR_SET: SAMPLE (Bit 1) */ +#define CSD_INTR_SET_SAMPLE_Msk (0x2UL) /*!< CSD INTR_SET: SAMPLE (Bitfield-Mask: 0x01) */ +#define CSD_INTR_SET_INIT_Pos (2UL) /*!< CSD INTR_SET: INIT (Bit 2) */ +#define CSD_INTR_SET_INIT_Msk (0x4UL) /*!< CSD INTR_SET: INIT (Bitfield-Mask: 0x01) */ +#define CSD_INTR_SET_ADC_RES_Pos (8UL) /*!< CSD INTR_SET: ADC_RES (Bit 8) */ +#define CSD_INTR_SET_ADC_RES_Msk (0x100UL) /*!< CSD INTR_SET: ADC_RES (Bitfield-Mask: 0x01) */ +/* ===================================================== CSD.INTR_MASK ===================================================== */ +#define CSD_INTR_MASK_SAMPLE_Pos (1UL) /*!< CSD INTR_MASK: SAMPLE (Bit 1) */ +#define CSD_INTR_MASK_SAMPLE_Msk (0x2UL) /*!< CSD INTR_MASK: SAMPLE (Bitfield-Mask: 0x01) */ +#define CSD_INTR_MASK_INIT_Pos (2UL) /*!< CSD INTR_MASK: INIT (Bit 2) */ +#define CSD_INTR_MASK_INIT_Msk (0x4UL) /*!< CSD INTR_MASK: INIT (Bitfield-Mask: 0x01) */ +#define CSD_INTR_MASK_ADC_RES_Pos (8UL) /*!< CSD INTR_MASK: ADC_RES (Bit 8) */ +#define CSD_INTR_MASK_ADC_RES_Msk (0x100UL) /*!< CSD INTR_MASK: ADC_RES (Bitfield-Mask: 0x01) */ +/* ==================================================== CSD.INTR_MASKED ==================================================== */ +#define CSD_INTR_MASKED_SAMPLE_Pos (1UL) /*!< CSD INTR_MASKED: SAMPLE (Bit 1) */ +#define CSD_INTR_MASKED_SAMPLE_Msk (0x2UL) /*!< CSD INTR_MASKED: SAMPLE (Bitfield-Mask: 0x01) */ +#define CSD_INTR_MASKED_INIT_Pos (2UL) /*!< CSD INTR_MASKED: INIT (Bit 2) */ +#define CSD_INTR_MASKED_INIT_Msk (0x4UL) /*!< CSD INTR_MASKED: INIT (Bitfield-Mask: 0x01) */ +#define CSD_INTR_MASKED_ADC_RES_Pos (8UL) /*!< CSD INTR_MASKED: ADC_RES (Bit 8) */ +#define CSD_INTR_MASKED_ADC_RES_Msk (0x100UL) /*!< CSD INTR_MASKED: ADC_RES (Bitfield-Mask: 0x01) */ +/* ======================================================= CSD.HSCMP ======================================================= */ +#define CSD_HSCMP_HSCMP_EN_Pos (0UL) /*!< CSD HSCMP: HSCMP_EN (Bit 0) */ +#define CSD_HSCMP_HSCMP_EN_Msk (0x1UL) /*!< CSD HSCMP: HSCMP_EN (Bitfield-Mask: 0x01) */ +#define CSD_HSCMP_HSCMP_INVERT_Pos (4UL) /*!< CSD HSCMP: HSCMP_INVERT (Bit 4) */ +#define CSD_HSCMP_HSCMP_INVERT_Msk (0x10UL) /*!< CSD HSCMP: HSCMP_INVERT (Bitfield-Mask: 0x01) */ +#define CSD_HSCMP_AZ_EN_Pos (31UL) /*!< CSD HSCMP: AZ_EN (Bit 31) */ +#define CSD_HSCMP_AZ_EN_Msk (0x80000000UL) /*!< CSD HSCMP: AZ_EN (Bitfield-Mask: 0x01) */ +/* ======================================================= CSD.AMBUF ======================================================= */ +#define CSD_AMBUF_PWR_MODE_Pos (0UL) /*!< CSD AMBUF: PWR_MODE (Bit 0) */ +#define CSD_AMBUF_PWR_MODE_Msk (0x3UL) /*!< CSD AMBUF: PWR_MODE (Bitfield-Mask: 0x03) */ +/* ====================================================== CSD.REFGEN ======================================================= */ +#define CSD_REFGEN_REFGEN_EN_Pos (0UL) /*!< CSD REFGEN: REFGEN_EN (Bit 0) */ +#define CSD_REFGEN_REFGEN_EN_Msk (0x1UL) /*!< CSD REFGEN: REFGEN_EN (Bitfield-Mask: 0x01) */ +#define CSD_REFGEN_BYPASS_Pos (4UL) /*!< CSD REFGEN: BYPASS (Bit 4) */ +#define CSD_REFGEN_BYPASS_Msk (0x10UL) /*!< CSD REFGEN: BYPASS (Bitfield-Mask: 0x01) */ +#define CSD_REFGEN_VDDA_EN_Pos (5UL) /*!< CSD REFGEN: VDDA_EN (Bit 5) */ +#define CSD_REFGEN_VDDA_EN_Msk (0x20UL) /*!< CSD REFGEN: VDDA_EN (Bitfield-Mask: 0x01) */ +#define CSD_REFGEN_RES_EN_Pos (6UL) /*!< CSD REFGEN: RES_EN (Bit 6) */ +#define CSD_REFGEN_RES_EN_Msk (0x40UL) /*!< CSD REFGEN: RES_EN (Bitfield-Mask: 0x01) */ +#define CSD_REFGEN_GAIN_Pos (8UL) /*!< CSD REFGEN: GAIN (Bit 8) */ +#define CSD_REFGEN_GAIN_Msk (0x1f00UL) /*!< CSD REFGEN: GAIN (Bitfield-Mask: 0x1f) */ +#define CSD_REFGEN_VREFLO_SEL_Pos (16UL) /*!< CSD REFGEN: VREFLO_SEL (Bit 16) */ +#define CSD_REFGEN_VREFLO_SEL_Msk (0x1f0000UL) /*!< CSD REFGEN: VREFLO_SEL (Bitfield-Mask: 0x1f) */ +#define CSD_REFGEN_VREFLO_INT_Pos (23UL) /*!< CSD REFGEN: VREFLO_INT (Bit 23) */ +#define CSD_REFGEN_VREFLO_INT_Msk (0x800000UL) /*!< CSD REFGEN: VREFLO_INT (Bitfield-Mask: 0x01) */ +/* ====================================================== CSD.CSDCMP ======================================================= */ +#define CSD_CSDCMP_CSDCMP_EN_Pos (0UL) /*!< CSD CSDCMP: CSDCMP_EN (Bit 0) */ +#define CSD_CSDCMP_CSDCMP_EN_Msk (0x1UL) /*!< CSD CSDCMP: CSDCMP_EN (Bitfield-Mask: 0x01) */ +#define CSD_CSDCMP_POLARITY_SEL_Pos (4UL) /*!< CSD CSDCMP: POLARITY_SEL (Bit 4) */ +#define CSD_CSDCMP_POLARITY_SEL_Msk (0x30UL) /*!< CSD CSDCMP: POLARITY_SEL (Bitfield-Mask: 0x03) */ +#define CSD_CSDCMP_CMP_PHASE_Pos (8UL) /*!< CSD CSDCMP: CMP_PHASE (Bit 8) */ +#define CSD_CSDCMP_CMP_PHASE_Msk (0x300UL) /*!< CSD CSDCMP: CMP_PHASE (Bitfield-Mask: 0x03) */ +#define CSD_CSDCMP_CMP_MODE_Pos (28UL) /*!< CSD CSDCMP: CMP_MODE (Bit 28) */ +#define CSD_CSDCMP_CMP_MODE_Msk (0x10000000UL) /*!< CSD CSDCMP: CMP_MODE (Bitfield-Mask: 0x01) */ +#define CSD_CSDCMP_FEEDBACK_MODE_Pos (29UL) /*!< CSD CSDCMP: FEEDBACK_MODE (Bit 29) */ +#define CSD_CSDCMP_FEEDBACK_MODE_Msk (0x20000000UL) /*!< CSD CSDCMP: FEEDBACK_MODE (Bitfield-Mask: 0x01) */ +#define CSD_CSDCMP_AZ_EN_Pos (31UL) /*!< CSD CSDCMP: AZ_EN (Bit 31) */ +#define CSD_CSDCMP_AZ_EN_Msk (0x80000000UL) /*!< CSD CSDCMP: AZ_EN (Bitfield-Mask: 0x01) */ +/* ====================================================== CSD.SW_RES ======================================================= */ +#define CSD_SW_RES_RES_HCAV_Pos (0UL) /*!< CSD SW_RES: RES_HCAV (Bit 0) */ +#define CSD_SW_RES_RES_HCAV_Msk (0x3UL) /*!< CSD SW_RES: RES_HCAV (Bitfield-Mask: 0x03) */ +#define CSD_SW_RES_RES_HCAG_Pos (2UL) /*!< CSD SW_RES: RES_HCAG (Bit 2) */ +#define CSD_SW_RES_RES_HCAG_Msk (0xcUL) /*!< CSD SW_RES: RES_HCAG (Bitfield-Mask: 0x03) */ +#define CSD_SW_RES_RES_HCBV_Pos (4UL) /*!< CSD SW_RES: RES_HCBV (Bit 4) */ +#define CSD_SW_RES_RES_HCBV_Msk (0x30UL) /*!< CSD SW_RES: RES_HCBV (Bitfield-Mask: 0x03) */ +#define CSD_SW_RES_RES_HCBG_Pos (6UL) /*!< CSD SW_RES: RES_HCBG (Bit 6) */ +#define CSD_SW_RES_RES_HCBG_Msk (0xc0UL) /*!< CSD SW_RES: RES_HCBG (Bitfield-Mask: 0x03) */ +#define CSD_SW_RES_RES_F1PM_Pos (16UL) /*!< CSD SW_RES: RES_F1PM (Bit 16) */ +#define CSD_SW_RES_RES_F1PM_Msk (0x30000UL) /*!< CSD SW_RES: RES_F1PM (Bitfield-Mask: 0x03) */ +#define CSD_SW_RES_RES_F2PT_Pos (18UL) /*!< CSD SW_RES: RES_F2PT (Bit 18) */ +#define CSD_SW_RES_RES_F2PT_Msk (0xc0000UL) /*!< CSD SW_RES: RES_F2PT (Bitfield-Mask: 0x03) */ +/* =================================================== CSD.SENSE_PERIOD ==================================================== */ +#define CSD_SENSE_PERIOD_SENSE_DIV_Pos (0UL) /*!< CSD SENSE_PERIOD: SENSE_DIV (Bit 0) */ +#define CSD_SENSE_PERIOD_SENSE_DIV_Msk (0xfffUL) /*!< CSD SENSE_PERIOD: SENSE_DIV (Bitfield-Mask: 0xfff) */ +#define CSD_SENSE_PERIOD_LFSR_SIZE_Pos (16UL) /*!< CSD SENSE_PERIOD: LFSR_SIZE (Bit 16) */ +#define CSD_SENSE_PERIOD_LFSR_SIZE_Msk (0x70000UL) /*!< CSD SENSE_PERIOD: LFSR_SIZE (Bitfield-Mask: 0x07) */ +#define CSD_SENSE_PERIOD_LFSR_SCALE_Pos (20UL) /*!< CSD SENSE_PERIOD: LFSR_SCALE (Bit 20) */ +#define CSD_SENSE_PERIOD_LFSR_SCALE_Msk (0xf00000UL) /*!< CSD SENSE_PERIOD: LFSR_SCALE (Bitfield-Mask: 0x0f) */ +#define CSD_SENSE_PERIOD_LFSR_CLEAR_Pos (24UL) /*!< CSD SENSE_PERIOD: LFSR_CLEAR (Bit 24) */ +#define CSD_SENSE_PERIOD_LFSR_CLEAR_Msk (0x1000000UL) /*!< CSD SENSE_PERIOD: LFSR_CLEAR (Bitfield-Mask: 0x01) */ +#define CSD_SENSE_PERIOD_SEL_LFSR_MSB_Pos (25UL) /*!< CSD SENSE_PERIOD: SEL_LFSR_MSB (Bit 25) */ +#define CSD_SENSE_PERIOD_SEL_LFSR_MSB_Msk (0x2000000UL) /*!< CSD SENSE_PERIOD: SEL_LFSR_MSB (Bitfield-Mask: 0x01) */ +#define CSD_SENSE_PERIOD_LFSR_BITS_Pos (26UL) /*!< CSD SENSE_PERIOD: LFSR_BITS (Bit 26) */ +#define CSD_SENSE_PERIOD_LFSR_BITS_Msk (0xc000000UL) /*!< CSD SENSE_PERIOD: LFSR_BITS (Bitfield-Mask: 0x03) */ +/* ==================================================== CSD.SENSE_DUTY ===================================================== */ +#define CSD_SENSE_DUTY_SENSE_WIDTH_Pos (0UL) /*!< CSD SENSE_DUTY: SENSE_WIDTH (Bit 0) */ +#define CSD_SENSE_DUTY_SENSE_WIDTH_Msk (0xfffUL) /*!< CSD SENSE_DUTY: SENSE_WIDTH (Bitfield-Mask: 0xfff) */ +#define CSD_SENSE_DUTY_SENSE_POL_Pos (16UL) /*!< CSD SENSE_DUTY: SENSE_POL (Bit 16) */ +#define CSD_SENSE_DUTY_SENSE_POL_Msk (0x10000UL) /*!< CSD SENSE_DUTY: SENSE_POL (Bitfield-Mask: 0x01) */ +#define CSD_SENSE_DUTY_OVERLAP_PHI1_Pos (18UL) /*!< CSD SENSE_DUTY: OVERLAP_PHI1 (Bit 18) */ +#define CSD_SENSE_DUTY_OVERLAP_PHI1_Msk (0x40000UL) /*!< CSD SENSE_DUTY: OVERLAP_PHI1 (Bitfield-Mask: 0x01) */ +#define CSD_SENSE_DUTY_OVERLAP_PHI2_Pos (19UL) /*!< CSD SENSE_DUTY: OVERLAP_PHI2 (Bit 19) */ +#define CSD_SENSE_DUTY_OVERLAP_PHI2_Msk (0x80000UL) /*!< CSD SENSE_DUTY: OVERLAP_PHI2 (Bitfield-Mask: 0x01) */ +/* ==================================================== CSD.SW_HS_P_SEL ==================================================== */ +#define CSD_SW_HS_P_SEL_SW_HMPM_Pos (0UL) /*!< CSD SW_HS_P_SEL: SW_HMPM (Bit 0) */ +#define CSD_SW_HS_P_SEL_SW_HMPM_Msk (0x1UL) /*!< CSD SW_HS_P_SEL: SW_HMPM (Bitfield-Mask: 0x01) */ +#define CSD_SW_HS_P_SEL_SW_HMPT_Pos (4UL) /*!< CSD SW_HS_P_SEL: SW_HMPT (Bit 4) */ +#define CSD_SW_HS_P_SEL_SW_HMPT_Msk (0x10UL) /*!< CSD SW_HS_P_SEL: SW_HMPT (Bitfield-Mask: 0x01) */ +#define CSD_SW_HS_P_SEL_SW_HMPS_Pos (8UL) /*!< CSD SW_HS_P_SEL: SW_HMPS (Bit 8) */ +#define CSD_SW_HS_P_SEL_SW_HMPS_Msk (0x100UL) /*!< CSD SW_HS_P_SEL: SW_HMPS (Bitfield-Mask: 0x01) */ +#define CSD_SW_HS_P_SEL_SW_HMMA_Pos (12UL) /*!< CSD SW_HS_P_SEL: SW_HMMA (Bit 12) */ +#define CSD_SW_HS_P_SEL_SW_HMMA_Msk (0x1000UL) /*!< CSD SW_HS_P_SEL: SW_HMMA (Bitfield-Mask: 0x01) */ +#define CSD_SW_HS_P_SEL_SW_HMMB_Pos (16UL) /*!< CSD SW_HS_P_SEL: SW_HMMB (Bit 16) */ +#define CSD_SW_HS_P_SEL_SW_HMMB_Msk (0x10000UL) /*!< CSD SW_HS_P_SEL: SW_HMMB (Bitfield-Mask: 0x01) */ +#define CSD_SW_HS_P_SEL_SW_HMCA_Pos (20UL) /*!< CSD SW_HS_P_SEL: SW_HMCA (Bit 20) */ +#define CSD_SW_HS_P_SEL_SW_HMCA_Msk (0x100000UL) /*!< CSD SW_HS_P_SEL: SW_HMCA (Bitfield-Mask: 0x01) */ +#define CSD_SW_HS_P_SEL_SW_HMCB_Pos (24UL) /*!< CSD SW_HS_P_SEL: SW_HMCB (Bit 24) */ +#define CSD_SW_HS_P_SEL_SW_HMCB_Msk (0x1000000UL) /*!< CSD SW_HS_P_SEL: SW_HMCB (Bitfield-Mask: 0x01) */ +#define CSD_SW_HS_P_SEL_SW_HMRH_Pos (28UL) /*!< CSD SW_HS_P_SEL: SW_HMRH (Bit 28) */ +#define CSD_SW_HS_P_SEL_SW_HMRH_Msk (0x10000000UL) /*!< CSD SW_HS_P_SEL: SW_HMRH (Bitfield-Mask: 0x01) */ +/* ==================================================== CSD.SW_HS_N_SEL ==================================================== */ +#define CSD_SW_HS_N_SEL_SW_HCCC_Pos (16UL) /*!< CSD SW_HS_N_SEL: SW_HCCC (Bit 16) */ +#define CSD_SW_HS_N_SEL_SW_HCCC_Msk (0x10000UL) /*!< CSD SW_HS_N_SEL: SW_HCCC (Bitfield-Mask: 0x01) */ +#define CSD_SW_HS_N_SEL_SW_HCCD_Pos (20UL) /*!< CSD SW_HS_N_SEL: SW_HCCD (Bit 20) */ +#define CSD_SW_HS_N_SEL_SW_HCCD_Msk (0x100000UL) /*!< CSD SW_HS_N_SEL: SW_HCCD (Bitfield-Mask: 0x01) */ +#define CSD_SW_HS_N_SEL_SW_HCRH_Pos (24UL) /*!< CSD SW_HS_N_SEL: SW_HCRH (Bit 24) */ +#define CSD_SW_HS_N_SEL_SW_HCRH_Msk (0x7000000UL) /*!< CSD SW_HS_N_SEL: SW_HCRH (Bitfield-Mask: 0x07) */ +#define CSD_SW_HS_N_SEL_SW_HCRL_Pos (28UL) /*!< CSD SW_HS_N_SEL: SW_HCRL (Bit 28) */ +#define CSD_SW_HS_N_SEL_SW_HCRL_Msk (0x70000000UL) /*!< CSD SW_HS_N_SEL: SW_HCRL (Bitfield-Mask: 0x07) */ +/* =================================================== CSD.SW_SHIELD_SEL =================================================== */ +#define CSD_SW_SHIELD_SEL_SW_HCAV_Pos (0UL) /*!< CSD SW_SHIELD_SEL: SW_HCAV (Bit 0) */ +#define CSD_SW_SHIELD_SEL_SW_HCAV_Msk (0x7UL) /*!< CSD SW_SHIELD_SEL: SW_HCAV (Bitfield-Mask: 0x07) */ +#define CSD_SW_SHIELD_SEL_SW_HCAG_Pos (4UL) /*!< CSD SW_SHIELD_SEL: SW_HCAG (Bit 4) */ +#define CSD_SW_SHIELD_SEL_SW_HCAG_Msk (0x70UL) /*!< CSD SW_SHIELD_SEL: SW_HCAG (Bitfield-Mask: 0x07) */ +#define CSD_SW_SHIELD_SEL_SW_HCBV_Pos (8UL) /*!< CSD SW_SHIELD_SEL: SW_HCBV (Bit 8) */ +#define CSD_SW_SHIELD_SEL_SW_HCBV_Msk (0x700UL) /*!< CSD SW_SHIELD_SEL: SW_HCBV (Bitfield-Mask: 0x07) */ +#define CSD_SW_SHIELD_SEL_SW_HCBG_Pos (12UL) /*!< CSD SW_SHIELD_SEL: SW_HCBG (Bit 12) */ +#define CSD_SW_SHIELD_SEL_SW_HCBG_Msk (0x7000UL) /*!< CSD SW_SHIELD_SEL: SW_HCBG (Bitfield-Mask: 0x07) */ +#define CSD_SW_SHIELD_SEL_SW_HCCV_Pos (16UL) /*!< CSD SW_SHIELD_SEL: SW_HCCV (Bit 16) */ +#define CSD_SW_SHIELD_SEL_SW_HCCV_Msk (0x10000UL) /*!< CSD SW_SHIELD_SEL: SW_HCCV (Bitfield-Mask: 0x01) */ +#define CSD_SW_SHIELD_SEL_SW_HCCG_Pos (20UL) /*!< CSD SW_SHIELD_SEL: SW_HCCG (Bit 20) */ +#define CSD_SW_SHIELD_SEL_SW_HCCG_Msk (0x100000UL) /*!< CSD SW_SHIELD_SEL: SW_HCCG (Bitfield-Mask: 0x01) */ +/* ================================================== CSD.SW_AMUXBUF_SEL =================================================== */ +#define CSD_SW_AMUXBUF_SEL_SW_IRBY_Pos (4UL) /*!< CSD SW_AMUXBUF_SEL: SW_IRBY (Bit 4) */ +#define CSD_SW_AMUXBUF_SEL_SW_IRBY_Msk (0x10UL) /*!< CSD SW_AMUXBUF_SEL: SW_IRBY (Bitfield-Mask: 0x01) */ +#define CSD_SW_AMUXBUF_SEL_SW_IRLB_Pos (8UL) /*!< CSD SW_AMUXBUF_SEL: SW_IRLB (Bit 8) */ +#define CSD_SW_AMUXBUF_SEL_SW_IRLB_Msk (0x100UL) /*!< CSD SW_AMUXBUF_SEL: SW_IRLB (Bitfield-Mask: 0x01) */ +#define CSD_SW_AMUXBUF_SEL_SW_ICA_Pos (12UL) /*!< CSD SW_AMUXBUF_SEL: SW_ICA (Bit 12) */ +#define CSD_SW_AMUXBUF_SEL_SW_ICA_Msk (0x1000UL) /*!< CSD SW_AMUXBUF_SEL: SW_ICA (Bitfield-Mask: 0x01) */ +#define CSD_SW_AMUXBUF_SEL_SW_ICB_Pos (16UL) /*!< CSD SW_AMUXBUF_SEL: SW_ICB (Bit 16) */ +#define CSD_SW_AMUXBUF_SEL_SW_ICB_Msk (0x70000UL) /*!< CSD SW_AMUXBUF_SEL: SW_ICB (Bitfield-Mask: 0x07) */ +#define CSD_SW_AMUXBUF_SEL_SW_IRLI_Pos (20UL) /*!< CSD SW_AMUXBUF_SEL: SW_IRLI (Bit 20) */ +#define CSD_SW_AMUXBUF_SEL_SW_IRLI_Msk (0x100000UL) /*!< CSD SW_AMUXBUF_SEL: SW_IRLI (Bitfield-Mask: 0x01) */ +#define CSD_SW_AMUXBUF_SEL_SW_IRH_Pos (24UL) /*!< CSD SW_AMUXBUF_SEL: SW_IRH (Bit 24) */ +#define CSD_SW_AMUXBUF_SEL_SW_IRH_Msk (0x1000000UL) /*!< CSD SW_AMUXBUF_SEL: SW_IRH (Bitfield-Mask: 0x01) */ +#define CSD_SW_AMUXBUF_SEL_SW_IRL_Pos (28UL) /*!< CSD SW_AMUXBUF_SEL: SW_IRL (Bit 28) */ +#define CSD_SW_AMUXBUF_SEL_SW_IRL_Msk (0x10000000UL) /*!< CSD SW_AMUXBUF_SEL: SW_IRL (Bitfield-Mask: 0x01) */ +/* ==================================================== CSD.SW_BYP_SEL ===================================================== */ +#define CSD_SW_BYP_SEL_SW_BYA_Pos (12UL) /*!< CSD SW_BYP_SEL: SW_BYA (Bit 12) */ +#define CSD_SW_BYP_SEL_SW_BYA_Msk (0x1000UL) /*!< CSD SW_BYP_SEL: SW_BYA (Bitfield-Mask: 0x01) */ +#define CSD_SW_BYP_SEL_SW_BYB_Pos (16UL) /*!< CSD SW_BYP_SEL: SW_BYB (Bit 16) */ +#define CSD_SW_BYP_SEL_SW_BYB_Msk (0x10000UL) /*!< CSD SW_BYP_SEL: SW_BYB (Bitfield-Mask: 0x01) */ +#define CSD_SW_BYP_SEL_SW_CBCC_Pos (20UL) /*!< CSD SW_BYP_SEL: SW_CBCC (Bit 20) */ +#define CSD_SW_BYP_SEL_SW_CBCC_Msk (0x100000UL) /*!< CSD SW_BYP_SEL: SW_CBCC (Bitfield-Mask: 0x01) */ +/* =================================================== CSD.SW_CMP_P_SEL ==================================================== */ +#define CSD_SW_CMP_P_SEL_SW_SFPM_Pos (0UL) /*!< CSD SW_CMP_P_SEL: SW_SFPM (Bit 0) */ +#define CSD_SW_CMP_P_SEL_SW_SFPM_Msk (0x7UL) /*!< CSD SW_CMP_P_SEL: SW_SFPM (Bitfield-Mask: 0x07) */ +#define CSD_SW_CMP_P_SEL_SW_SFPT_Pos (4UL) /*!< CSD SW_CMP_P_SEL: SW_SFPT (Bit 4) */ +#define CSD_SW_CMP_P_SEL_SW_SFPT_Msk (0x70UL) /*!< CSD SW_CMP_P_SEL: SW_SFPT (Bitfield-Mask: 0x07) */ +#define CSD_SW_CMP_P_SEL_SW_SFPS_Pos (8UL) /*!< CSD SW_CMP_P_SEL: SW_SFPS (Bit 8) */ +#define CSD_SW_CMP_P_SEL_SW_SFPS_Msk (0x700UL) /*!< CSD SW_CMP_P_SEL: SW_SFPS (Bitfield-Mask: 0x07) */ +#define CSD_SW_CMP_P_SEL_SW_SFMA_Pos (12UL) /*!< CSD SW_CMP_P_SEL: SW_SFMA (Bit 12) */ +#define CSD_SW_CMP_P_SEL_SW_SFMA_Msk (0x1000UL) /*!< CSD SW_CMP_P_SEL: SW_SFMA (Bitfield-Mask: 0x01) */ +#define CSD_SW_CMP_P_SEL_SW_SFMB_Pos (16UL) /*!< CSD SW_CMP_P_SEL: SW_SFMB (Bit 16) */ +#define CSD_SW_CMP_P_SEL_SW_SFMB_Msk (0x10000UL) /*!< CSD SW_CMP_P_SEL: SW_SFMB (Bitfield-Mask: 0x01) */ +#define CSD_SW_CMP_P_SEL_SW_SFCA_Pos (20UL) /*!< CSD SW_CMP_P_SEL: SW_SFCA (Bit 20) */ +#define CSD_SW_CMP_P_SEL_SW_SFCA_Msk (0x100000UL) /*!< CSD SW_CMP_P_SEL: SW_SFCA (Bitfield-Mask: 0x01) */ +#define CSD_SW_CMP_P_SEL_SW_SFCB_Pos (24UL) /*!< CSD SW_CMP_P_SEL: SW_SFCB (Bit 24) */ +#define CSD_SW_CMP_P_SEL_SW_SFCB_Msk (0x1000000UL) /*!< CSD SW_CMP_P_SEL: SW_SFCB (Bitfield-Mask: 0x01) */ +/* =================================================== CSD.SW_CMP_N_SEL ==================================================== */ +#define CSD_SW_CMP_N_SEL_SW_SCRH_Pos (24UL) /*!< CSD SW_CMP_N_SEL: SW_SCRH (Bit 24) */ +#define CSD_SW_CMP_N_SEL_SW_SCRH_Msk (0x7000000UL) /*!< CSD SW_CMP_N_SEL: SW_SCRH (Bitfield-Mask: 0x07) */ +#define CSD_SW_CMP_N_SEL_SW_SCRL_Pos (28UL) /*!< CSD SW_CMP_N_SEL: SW_SCRL (Bit 28) */ +#define CSD_SW_CMP_N_SEL_SW_SCRL_Msk (0x70000000UL) /*!< CSD SW_CMP_N_SEL: SW_SCRL (Bitfield-Mask: 0x07) */ +/* =================================================== CSD.SW_REFGEN_SEL =================================================== */ +#define CSD_SW_REFGEN_SEL_SW_IAIB_Pos (0UL) /*!< CSD SW_REFGEN_SEL: SW_IAIB (Bit 0) */ +#define CSD_SW_REFGEN_SEL_SW_IAIB_Msk (0x1UL) /*!< CSD SW_REFGEN_SEL: SW_IAIB (Bitfield-Mask: 0x01) */ +#define CSD_SW_REFGEN_SEL_SW_IBCB_Pos (4UL) /*!< CSD SW_REFGEN_SEL: SW_IBCB (Bit 4) */ +#define CSD_SW_REFGEN_SEL_SW_IBCB_Msk (0x10UL) /*!< CSD SW_REFGEN_SEL: SW_IBCB (Bitfield-Mask: 0x01) */ +#define CSD_SW_REFGEN_SEL_SW_SGMB_Pos (16UL) /*!< CSD SW_REFGEN_SEL: SW_SGMB (Bit 16) */ +#define CSD_SW_REFGEN_SEL_SW_SGMB_Msk (0x10000UL) /*!< CSD SW_REFGEN_SEL: SW_SGMB (Bitfield-Mask: 0x01) */ +#define CSD_SW_REFGEN_SEL_SW_SGRP_Pos (20UL) /*!< CSD SW_REFGEN_SEL: SW_SGRP (Bit 20) */ +#define CSD_SW_REFGEN_SEL_SW_SGRP_Msk (0x100000UL) /*!< CSD SW_REFGEN_SEL: SW_SGRP (Bitfield-Mask: 0x01) */ +#define CSD_SW_REFGEN_SEL_SW_SGRE_Pos (24UL) /*!< CSD SW_REFGEN_SEL: SW_SGRE (Bit 24) */ +#define CSD_SW_REFGEN_SEL_SW_SGRE_Msk (0x1000000UL) /*!< CSD SW_REFGEN_SEL: SW_SGRE (Bitfield-Mask: 0x01) */ +#define CSD_SW_REFGEN_SEL_SW_SGR_Pos (28UL) /*!< CSD SW_REFGEN_SEL: SW_SGR (Bit 28) */ +#define CSD_SW_REFGEN_SEL_SW_SGR_Msk (0x10000000UL) /*!< CSD SW_REFGEN_SEL: SW_SGR (Bitfield-Mask: 0x01) */ +/* =================================================== CSD.SW_FW_MOD_SEL =================================================== */ +#define CSD_SW_FW_MOD_SEL_SW_F1PM_Pos (0UL) /*!< CSD SW_FW_MOD_SEL: SW_F1PM (Bit 0) */ +#define CSD_SW_FW_MOD_SEL_SW_F1PM_Msk (0x1UL) /*!< CSD SW_FW_MOD_SEL: SW_F1PM (Bitfield-Mask: 0x01) */ +#define CSD_SW_FW_MOD_SEL_SW_F1MA_Pos (8UL) /*!< CSD SW_FW_MOD_SEL: SW_F1MA (Bit 8) */ +#define CSD_SW_FW_MOD_SEL_SW_F1MA_Msk (0x700UL) /*!< CSD SW_FW_MOD_SEL: SW_F1MA (Bitfield-Mask: 0x07) */ +#define CSD_SW_FW_MOD_SEL_SW_F1CA_Pos (16UL) /*!< CSD SW_FW_MOD_SEL: SW_F1CA (Bit 16) */ +#define CSD_SW_FW_MOD_SEL_SW_F1CA_Msk (0x70000UL) /*!< CSD SW_FW_MOD_SEL: SW_F1CA (Bitfield-Mask: 0x07) */ +#define CSD_SW_FW_MOD_SEL_SW_C1CC_Pos (20UL) /*!< CSD SW_FW_MOD_SEL: SW_C1CC (Bit 20) */ +#define CSD_SW_FW_MOD_SEL_SW_C1CC_Msk (0x100000UL) /*!< CSD SW_FW_MOD_SEL: SW_C1CC (Bitfield-Mask: 0x01) */ +#define CSD_SW_FW_MOD_SEL_SW_C1CD_Pos (24UL) /*!< CSD SW_FW_MOD_SEL: SW_C1CD (Bit 24) */ +#define CSD_SW_FW_MOD_SEL_SW_C1CD_Msk (0x1000000UL) /*!< CSD SW_FW_MOD_SEL: SW_C1CD (Bitfield-Mask: 0x01) */ +#define CSD_SW_FW_MOD_SEL_SW_C1F1_Pos (28UL) /*!< CSD SW_FW_MOD_SEL: SW_C1F1 (Bit 28) */ +#define CSD_SW_FW_MOD_SEL_SW_C1F1_Msk (0x10000000UL) /*!< CSD SW_FW_MOD_SEL: SW_C1F1 (Bitfield-Mask: 0x01) */ +/* ================================================== CSD.SW_FW_TANK_SEL =================================================== */ +#define CSD_SW_FW_TANK_SEL_SW_F2PT_Pos (4UL) /*!< CSD SW_FW_TANK_SEL: SW_F2PT (Bit 4) */ +#define CSD_SW_FW_TANK_SEL_SW_F2PT_Msk (0x10UL) /*!< CSD SW_FW_TANK_SEL: SW_F2PT (Bitfield-Mask: 0x01) */ +#define CSD_SW_FW_TANK_SEL_SW_F2MA_Pos (8UL) /*!< CSD SW_FW_TANK_SEL: SW_F2MA (Bit 8) */ +#define CSD_SW_FW_TANK_SEL_SW_F2MA_Msk (0x700UL) /*!< CSD SW_FW_TANK_SEL: SW_F2MA (Bitfield-Mask: 0x07) */ +#define CSD_SW_FW_TANK_SEL_SW_F2CA_Pos (12UL) /*!< CSD SW_FW_TANK_SEL: SW_F2CA (Bit 12) */ +#define CSD_SW_FW_TANK_SEL_SW_F2CA_Msk (0x7000UL) /*!< CSD SW_FW_TANK_SEL: SW_F2CA (Bitfield-Mask: 0x07) */ +#define CSD_SW_FW_TANK_SEL_SW_F2CB_Pos (16UL) /*!< CSD SW_FW_TANK_SEL: SW_F2CB (Bit 16) */ +#define CSD_SW_FW_TANK_SEL_SW_F2CB_Msk (0x70000UL) /*!< CSD SW_FW_TANK_SEL: SW_F2CB (Bitfield-Mask: 0x07) */ +#define CSD_SW_FW_TANK_SEL_SW_C2CC_Pos (20UL) /*!< CSD SW_FW_TANK_SEL: SW_C2CC (Bit 20) */ +#define CSD_SW_FW_TANK_SEL_SW_C2CC_Msk (0x100000UL) /*!< CSD SW_FW_TANK_SEL: SW_C2CC (Bitfield-Mask: 0x01) */ +#define CSD_SW_FW_TANK_SEL_SW_C2CD_Pos (24UL) /*!< CSD SW_FW_TANK_SEL: SW_C2CD (Bit 24) */ +#define CSD_SW_FW_TANK_SEL_SW_C2CD_Msk (0x1000000UL) /*!< CSD SW_FW_TANK_SEL: SW_C2CD (Bitfield-Mask: 0x01) */ +#define CSD_SW_FW_TANK_SEL_SW_C2F2_Pos (28UL) /*!< CSD SW_FW_TANK_SEL: SW_C2F2 (Bit 28) */ +#define CSD_SW_FW_TANK_SEL_SW_C2F2_Msk (0x10000000UL) /*!< CSD SW_FW_TANK_SEL: SW_C2F2 (Bitfield-Mask: 0x01) */ +/* ==================================================== CSD.SW_DSI_SEL ===================================================== */ +#define CSD_SW_DSI_SEL_DSI_CSH_TANK_Pos (0UL) /*!< CSD SW_DSI_SEL: DSI_CSH_TANK (Bit 0) */ +#define CSD_SW_DSI_SEL_DSI_CSH_TANK_Msk (0xfUL) /*!< CSD SW_DSI_SEL: DSI_CSH_TANK (Bitfield-Mask: 0x0f) */ +#define CSD_SW_DSI_SEL_DSI_CMOD_Pos (4UL) /*!< CSD SW_DSI_SEL: DSI_CMOD (Bit 4) */ +#define CSD_SW_DSI_SEL_DSI_CMOD_Msk (0xf0UL) /*!< CSD SW_DSI_SEL: DSI_CMOD (Bitfield-Mask: 0x0f) */ +/* ====================================================== CSD.IO_SEL ======================================================= */ +#define CSD_IO_SEL_CSD_TX_OUT_Pos (0UL) /*!< CSD IO_SEL: CSD_TX_OUT (Bit 0) */ +#define CSD_IO_SEL_CSD_TX_OUT_Msk (0xfUL) /*!< CSD IO_SEL: CSD_TX_OUT (Bitfield-Mask: 0x0f) */ +#define CSD_IO_SEL_CSD_TX_OUT_EN_Pos (4UL) /*!< CSD IO_SEL: CSD_TX_OUT_EN (Bit 4) */ +#define CSD_IO_SEL_CSD_TX_OUT_EN_Msk (0xf0UL) /*!< CSD IO_SEL: CSD_TX_OUT_EN (Bitfield-Mask: 0x0f) */ +#define CSD_IO_SEL_CSD_TX_AMUXB_EN_Pos (12UL) /*!< CSD IO_SEL: CSD_TX_AMUXB_EN (Bit 12) */ +#define CSD_IO_SEL_CSD_TX_AMUXB_EN_Msk (0xf000UL) /*!< CSD IO_SEL: CSD_TX_AMUXB_EN (Bitfield-Mask: 0x0f) */ +#define CSD_IO_SEL_CSD_TX_N_OUT_Pos (16UL) /*!< CSD IO_SEL: CSD_TX_N_OUT (Bit 16) */ +#define CSD_IO_SEL_CSD_TX_N_OUT_Msk (0xf0000UL) /*!< CSD IO_SEL: CSD_TX_N_OUT (Bitfield-Mask: 0x0f) */ +#define CSD_IO_SEL_CSD_TX_N_OUT_EN_Pos (20UL) /*!< CSD IO_SEL: CSD_TX_N_OUT_EN (Bit 20) */ +#define CSD_IO_SEL_CSD_TX_N_OUT_EN_Msk (0xf00000UL) /*!< CSD IO_SEL: CSD_TX_N_OUT_EN (Bitfield-Mask: 0x0f) */ +#define CSD_IO_SEL_CSD_TX_N_AMUXA_EN_Pos (24UL) /*!< CSD IO_SEL: CSD_TX_N_AMUXA_EN (Bit 24) */ +#define CSD_IO_SEL_CSD_TX_N_AMUXA_EN_Msk (0xf000000UL) /*!< CSD IO_SEL: CSD_TX_N_AMUXA_EN (Bitfield-Mask: 0x0f) */ +/* ===================================================== CSD.SEQ_TIME ====================================================== */ +#define CSD_SEQ_TIME_AZ_TIME_Pos (0UL) /*!< CSD SEQ_TIME: AZ_TIME (Bit 0) */ +#define CSD_SEQ_TIME_AZ_TIME_Msk (0xffUL) /*!< CSD SEQ_TIME: AZ_TIME (Bitfield-Mask: 0xff) */ +/* =================================================== CSD.SEQ_INIT_CNT ==================================================== */ +#define CSD_SEQ_INIT_CNT_CONV_CNT_Pos (0UL) /*!< CSD SEQ_INIT_CNT: CONV_CNT (Bit 0) */ +#define CSD_SEQ_INIT_CNT_CONV_CNT_Msk (0xffffUL) /*!< CSD SEQ_INIT_CNT: CONV_CNT (Bitfield-Mask: 0xffff) */ +/* =================================================== CSD.SEQ_NORM_CNT ==================================================== */ +#define CSD_SEQ_NORM_CNT_CONV_CNT_Pos (0UL) /*!< CSD SEQ_NORM_CNT: CONV_CNT (Bit 0) */ +#define CSD_SEQ_NORM_CNT_CONV_CNT_Msk (0xffffUL) /*!< CSD SEQ_NORM_CNT: CONV_CNT (Bitfield-Mask: 0xffff) */ +/* ====================================================== CSD.ADC_CTL ====================================================== */ +#define CSD_ADC_CTL_ADC_TIME_Pos (0UL) /*!< CSD ADC_CTL: ADC_TIME (Bit 0) */ +#define CSD_ADC_CTL_ADC_TIME_Msk (0xffUL) /*!< CSD ADC_CTL: ADC_TIME (Bitfield-Mask: 0xff) */ +#define CSD_ADC_CTL_ADC_MODE_Pos (16UL) /*!< CSD ADC_CTL: ADC_MODE (Bit 16) */ +#define CSD_ADC_CTL_ADC_MODE_Msk (0x30000UL) /*!< CSD ADC_CTL: ADC_MODE (Bitfield-Mask: 0x03) */ +/* ===================================================== CSD.SEQ_START ===================================================== */ +#define CSD_SEQ_START_START_Pos (0UL) /*!< CSD SEQ_START: START (Bit 0) */ +#define CSD_SEQ_START_START_Msk (0x1UL) /*!< CSD SEQ_START: START (Bitfield-Mask: 0x01) */ +#define CSD_SEQ_START_SEQ_MODE_Pos (1UL) /*!< CSD SEQ_START: SEQ_MODE (Bit 1) */ +#define CSD_SEQ_START_SEQ_MODE_Msk (0x2UL) /*!< CSD SEQ_START: SEQ_MODE (Bitfield-Mask: 0x01) */ +#define CSD_SEQ_START_ABORT_Pos (3UL) /*!< CSD SEQ_START: ABORT (Bit 3) */ +#define CSD_SEQ_START_ABORT_Msk (0x8UL) /*!< CSD SEQ_START: ABORT (Bitfield-Mask: 0x01) */ +#define CSD_SEQ_START_DSI_START_EN_Pos (4UL) /*!< CSD SEQ_START: DSI_START_EN (Bit 4) */ +#define CSD_SEQ_START_DSI_START_EN_Msk (0x10UL) /*!< CSD SEQ_START: DSI_START_EN (Bitfield-Mask: 0x01) */ +#define CSD_SEQ_START_AZ0_SKIP_Pos (8UL) /*!< CSD SEQ_START: AZ0_SKIP (Bit 8) */ +#define CSD_SEQ_START_AZ0_SKIP_Msk (0x100UL) /*!< CSD SEQ_START: AZ0_SKIP (Bitfield-Mask: 0x01) */ +#define CSD_SEQ_START_AZ1_SKIP_Pos (9UL) /*!< CSD SEQ_START: AZ1_SKIP (Bit 9) */ +#define CSD_SEQ_START_AZ1_SKIP_Msk (0x200UL) /*!< CSD SEQ_START: AZ1_SKIP (Bitfield-Mask: 0x01) */ +/* ======================================================= CSD.IDACA ======================================================= */ +#define CSD_IDACA_VAL_Pos (0UL) /*!< CSD IDACA: VAL (Bit 0) */ +#define CSD_IDACA_VAL_Msk (0x7fUL) /*!< CSD IDACA: VAL (Bitfield-Mask: 0x7f) */ +#define CSD_IDACA_POL_DYN_Pos (7UL) /*!< CSD IDACA: POL_DYN (Bit 7) */ +#define CSD_IDACA_POL_DYN_Msk (0x80UL) /*!< CSD IDACA: POL_DYN (Bitfield-Mask: 0x01) */ +#define CSD_IDACA_POLARITY_Pos (8UL) /*!< CSD IDACA: POLARITY (Bit 8) */ +#define CSD_IDACA_POLARITY_Msk (0x300UL) /*!< CSD IDACA: POLARITY (Bitfield-Mask: 0x03) */ +#define CSD_IDACA_BAL_MODE_Pos (10UL) /*!< CSD IDACA: BAL_MODE (Bit 10) */ +#define CSD_IDACA_BAL_MODE_Msk (0xc00UL) /*!< CSD IDACA: BAL_MODE (Bitfield-Mask: 0x03) */ +#define CSD_IDACA_LEG1_MODE_Pos (16UL) /*!< CSD IDACA: LEG1_MODE (Bit 16) */ +#define CSD_IDACA_LEG1_MODE_Msk (0x30000UL) /*!< CSD IDACA: LEG1_MODE (Bitfield-Mask: 0x03) */ +#define CSD_IDACA_LEG2_MODE_Pos (18UL) /*!< CSD IDACA: LEG2_MODE (Bit 18) */ +#define CSD_IDACA_LEG2_MODE_Msk (0xc0000UL) /*!< CSD IDACA: LEG2_MODE (Bitfield-Mask: 0x03) */ +#define CSD_IDACA_DSI_CTRL_EN_Pos (21UL) /*!< CSD IDACA: DSI_CTRL_EN (Bit 21) */ +#define CSD_IDACA_DSI_CTRL_EN_Msk (0x200000UL) /*!< CSD IDACA: DSI_CTRL_EN (Bitfield-Mask: 0x01) */ +#define CSD_IDACA_RANGE_Pos (22UL) /*!< CSD IDACA: RANGE (Bit 22) */ +#define CSD_IDACA_RANGE_Msk (0xc00000UL) /*!< CSD IDACA: RANGE (Bitfield-Mask: 0x03) */ +#define CSD_IDACA_LEG1_EN_Pos (24UL) /*!< CSD IDACA: LEG1_EN (Bit 24) */ +#define CSD_IDACA_LEG1_EN_Msk (0x1000000UL) /*!< CSD IDACA: LEG1_EN (Bitfield-Mask: 0x01) */ +#define CSD_IDACA_LEG2_EN_Pos (25UL) /*!< CSD IDACA: LEG2_EN (Bit 25) */ +#define CSD_IDACA_LEG2_EN_Msk (0x2000000UL) /*!< CSD IDACA: LEG2_EN (Bitfield-Mask: 0x01) */ +/* ======================================================= CSD.IDACB ======================================================= */ +#define CSD_IDACB_VAL_Pos (0UL) /*!< CSD IDACB: VAL (Bit 0) */ +#define CSD_IDACB_VAL_Msk (0x7fUL) /*!< CSD IDACB: VAL (Bitfield-Mask: 0x7f) */ +#define CSD_IDACB_POL_DYN_Pos (7UL) /*!< CSD IDACB: POL_DYN (Bit 7) */ +#define CSD_IDACB_POL_DYN_Msk (0x80UL) /*!< CSD IDACB: POL_DYN (Bitfield-Mask: 0x01) */ +#define CSD_IDACB_POLARITY_Pos (8UL) /*!< CSD IDACB: POLARITY (Bit 8) */ +#define CSD_IDACB_POLARITY_Msk (0x300UL) /*!< CSD IDACB: POLARITY (Bitfield-Mask: 0x03) */ +#define CSD_IDACB_BAL_MODE_Pos (10UL) /*!< CSD IDACB: BAL_MODE (Bit 10) */ +#define CSD_IDACB_BAL_MODE_Msk (0xc00UL) /*!< CSD IDACB: BAL_MODE (Bitfield-Mask: 0x03) */ +#define CSD_IDACB_LEG1_MODE_Pos (16UL) /*!< CSD IDACB: LEG1_MODE (Bit 16) */ +#define CSD_IDACB_LEG1_MODE_Msk (0x30000UL) /*!< CSD IDACB: LEG1_MODE (Bitfield-Mask: 0x03) */ +#define CSD_IDACB_LEG2_MODE_Pos (18UL) /*!< CSD IDACB: LEG2_MODE (Bit 18) */ +#define CSD_IDACB_LEG2_MODE_Msk (0xc0000UL) /*!< CSD IDACB: LEG2_MODE (Bitfield-Mask: 0x03) */ +#define CSD_IDACB_DSI_CTRL_EN_Pos (21UL) /*!< CSD IDACB: DSI_CTRL_EN (Bit 21) */ +#define CSD_IDACB_DSI_CTRL_EN_Msk (0x200000UL) /*!< CSD IDACB: DSI_CTRL_EN (Bitfield-Mask: 0x01) */ +#define CSD_IDACB_RANGE_Pos (22UL) /*!< CSD IDACB: RANGE (Bit 22) */ +#define CSD_IDACB_RANGE_Msk (0xc00000UL) /*!< CSD IDACB: RANGE (Bitfield-Mask: 0x03) */ +#define CSD_IDACB_LEG1_EN_Pos (24UL) /*!< CSD IDACB: LEG1_EN (Bit 24) */ +#define CSD_IDACB_LEG1_EN_Msk (0x1000000UL) /*!< CSD IDACB: LEG1_EN (Bitfield-Mask: 0x01) */ +#define CSD_IDACB_LEG2_EN_Pos (25UL) /*!< CSD IDACB: LEG2_EN (Bit 25) */ +#define CSD_IDACB_LEG2_EN_Msk (0x2000000UL) /*!< CSD IDACB: LEG2_EN (Bitfield-Mask: 0x01) */ +#define CSD_IDACB_LEG3_EN_Pos (26UL) /*!< CSD IDACB: LEG3_EN (Bit 26) */ +#define CSD_IDACB_LEG3_EN_Msk (0x4000000UL) /*!< CSD IDACB: LEG3_EN (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_CSD_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ctbm.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ctbm.h new file mode 100644 index 0000000000..cca584cc15 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ctbm.h @@ -0,0 +1,287 @@ +/***************************************************************************//** +* \file cyip_ctbm.h +* +* \brief +* CTBM IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_CTBM_H_ +#define _CYIP_CTBM_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ CTBM ================ */ +/* =========================================================================================================================== */ + +#define CTBM_SECTION_SIZE 0x00010000UL + +/** + * \brief Continuous Time Block Mini (CTBM) + */ +typedef struct { /*!< CTBM Structure */ + __IOM uint32_t CTB_CTRL; /*!< 0x00000000 global CTB and power control */ + __IOM uint32_t OA_RES0_CTRL; /*!< 0x00000004 Opamp0 and resistor0 control */ + __IOM uint32_t OA_RES1_CTRL; /*!< 0x00000008 Opamp1 and resistor1 control */ + __IM uint32_t COMP_STAT; /*!< 0x0000000C Comparator status */ + __IM uint32_t RESERVED[4]; + __IOM uint32_t INTR; /*!< 0x00000020 Interrupt request register */ + __IOM uint32_t INTR_SET; /*!< 0x00000024 Interrupt request set register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000028 Interrupt request mask */ + __IM uint32_t INTR_MASKED; /*!< 0x0000002C Interrupt request masked */ + __IM uint32_t RESERVED1[20]; + __IOM uint32_t OA0_SW; /*!< 0x00000080 Opamp0 switch control */ + __IOM uint32_t OA0_SW_CLEAR; /*!< 0x00000084 Opamp0 switch control clear */ + __IOM uint32_t OA1_SW; /*!< 0x00000088 Opamp1 switch control */ + __IOM uint32_t OA1_SW_CLEAR; /*!< 0x0000008C Opamp1 switch control clear */ + __IM uint32_t RESERVED2[4]; + __IOM uint32_t CTD_SW; /*!< 0x000000A0 CTDAC connection switch control */ + __IOM uint32_t CTD_SW_CLEAR; /*!< 0x000000A4 CTDAC connection switch control clear */ + __IM uint32_t RESERVED3[6]; + __IOM uint32_t CTB_SW_DS_CTRL; /*!< 0x000000C0 CTB bus switch control */ + __IOM uint32_t CTB_SW_SQ_CTRL; /*!< 0x000000C4 CTB bus switch Sar Sequencer control */ + __IM uint32_t CTB_SW_STATUS; /*!< 0x000000C8 CTB bus switch control status */ + __IM uint32_t RESERVED4[909]; + __IOM uint32_t OA0_OFFSET_TRIM; /*!< 0x00000F00 Opamp0 trim control */ + __IOM uint32_t OA0_SLOPE_OFFSET_TRIM; /*!< 0x00000F04 Opamp0 trim control */ + __IOM uint32_t OA0_COMP_TRIM; /*!< 0x00000F08 Opamp0 trim control */ + __IOM uint32_t OA1_OFFSET_TRIM; /*!< 0x00000F0C Opamp1 trim control */ + __IOM uint32_t OA1_SLOPE_OFFSET_TRIM; /*!< 0x00000F10 Opamp1 trim control */ + __IOM uint32_t OA1_COMP_TRIM; /*!< 0x00000F14 Opamp1 trim control */ +} CTBM_Type; /*!< Size = 3864 (0xF18) */ + + +/* ===================================================== CTBM.CTB_CTRL ===================================================== */ +#define CTBM_CTB_CTRL_DEEPSLEEP_ON_Pos (30UL) /*!< CTBM CTB_CTRL: DEEPSLEEP_ON (Bit 30) */ +#define CTBM_CTB_CTRL_DEEPSLEEP_ON_Msk (0x40000000UL) /*!< CTBM CTB_CTRL: DEEPSLEEP_ON (Bitfield-Mask: 0x01) */ +#define CTBM_CTB_CTRL_ENABLED_Pos (31UL) /*!< CTBM CTB_CTRL: ENABLED (Bit 31) */ +#define CTBM_CTB_CTRL_ENABLED_Msk (0x80000000UL) /*!< CTBM CTB_CTRL: ENABLED (Bitfield-Mask: 0x01) */ +/* =================================================== CTBM.OA_RES0_CTRL =================================================== */ +#define CTBM_OA_RES0_CTRL_OA0_PWR_MODE_Pos (0UL) /*!< CTBM OA_RES0_CTRL: OA0_PWR_MODE (Bit 0) */ +#define CTBM_OA_RES0_CTRL_OA0_PWR_MODE_Msk (0x7UL) /*!< CTBM OA_RES0_CTRL: OA0_PWR_MODE (Bitfield-Mask: 0x07) */ +#define CTBM_OA_RES0_CTRL_OA0_DRIVE_STR_SEL_Pos (3UL) /*!< CTBM OA_RES0_CTRL: OA0_DRIVE_STR_SEL (Bit 3) */ +#define CTBM_OA_RES0_CTRL_OA0_DRIVE_STR_SEL_Msk (0x8UL) /*!< CTBM OA_RES0_CTRL: OA0_DRIVE_STR_SEL (Bitfield-Mask: 0x01)*/ +#define CTBM_OA_RES0_CTRL_OA0_COMP_EN_Pos (4UL) /*!< CTBM OA_RES0_CTRL: OA0_COMP_EN (Bit 4) */ +#define CTBM_OA_RES0_CTRL_OA0_COMP_EN_Msk (0x10UL) /*!< CTBM OA_RES0_CTRL: OA0_COMP_EN (Bitfield-Mask: 0x01) */ +#define CTBM_OA_RES0_CTRL_OA0_HYST_EN_Pos (5UL) /*!< CTBM OA_RES0_CTRL: OA0_HYST_EN (Bit 5) */ +#define CTBM_OA_RES0_CTRL_OA0_HYST_EN_Msk (0x20UL) /*!< CTBM OA_RES0_CTRL: OA0_HYST_EN (Bitfield-Mask: 0x01) */ +#define CTBM_OA_RES0_CTRL_OA0_BYPASS_DSI_SYNC_Pos (6UL) /*!< CTBM OA_RES0_CTRL: OA0_BYPASS_DSI_SYNC (Bit 6) */ +#define CTBM_OA_RES0_CTRL_OA0_BYPASS_DSI_SYNC_Msk (0x40UL) /*!< CTBM OA_RES0_CTRL: OA0_BYPASS_DSI_SYNC (Bitfield-Mask: 0x01)*/ +#define CTBM_OA_RES0_CTRL_OA0_DSI_LEVEL_Pos (7UL) /*!< CTBM OA_RES0_CTRL: OA0_DSI_LEVEL (Bit 7) */ +#define CTBM_OA_RES0_CTRL_OA0_DSI_LEVEL_Msk (0x80UL) /*!< CTBM OA_RES0_CTRL: OA0_DSI_LEVEL (Bitfield-Mask: 0x01) */ +#define CTBM_OA_RES0_CTRL_OA0_COMPINT_Pos (8UL) /*!< CTBM OA_RES0_CTRL: OA0_COMPINT (Bit 8) */ +#define CTBM_OA_RES0_CTRL_OA0_COMPINT_Msk (0x300UL) /*!< CTBM OA_RES0_CTRL: OA0_COMPINT (Bitfield-Mask: 0x03) */ +#define CTBM_OA_RES0_CTRL_OA0_PUMP_EN_Pos (11UL) /*!< CTBM OA_RES0_CTRL: OA0_PUMP_EN (Bit 11) */ +#define CTBM_OA_RES0_CTRL_OA0_PUMP_EN_Msk (0x800UL) /*!< CTBM OA_RES0_CTRL: OA0_PUMP_EN (Bitfield-Mask: 0x01) */ +#define CTBM_OA_RES0_CTRL_OA0_BOOST_EN_Pos (12UL) /*!< CTBM OA_RES0_CTRL: OA0_BOOST_EN (Bit 12) */ +#define CTBM_OA_RES0_CTRL_OA0_BOOST_EN_Msk (0x1000UL) /*!< CTBM OA_RES0_CTRL: OA0_BOOST_EN (Bitfield-Mask: 0x01) */ +/* =================================================== CTBM.OA_RES1_CTRL =================================================== */ +#define CTBM_OA_RES1_CTRL_OA1_PWR_MODE_Pos (0UL) /*!< CTBM OA_RES1_CTRL: OA1_PWR_MODE (Bit 0) */ +#define CTBM_OA_RES1_CTRL_OA1_PWR_MODE_Msk (0x7UL) /*!< CTBM OA_RES1_CTRL: OA1_PWR_MODE (Bitfield-Mask: 0x07) */ +#define CTBM_OA_RES1_CTRL_OA1_DRIVE_STR_SEL_Pos (3UL) /*!< CTBM OA_RES1_CTRL: OA1_DRIVE_STR_SEL (Bit 3) */ +#define CTBM_OA_RES1_CTRL_OA1_DRIVE_STR_SEL_Msk (0x8UL) /*!< CTBM OA_RES1_CTRL: OA1_DRIVE_STR_SEL (Bitfield-Mask: 0x01)*/ +#define CTBM_OA_RES1_CTRL_OA1_COMP_EN_Pos (4UL) /*!< CTBM OA_RES1_CTRL: OA1_COMP_EN (Bit 4) */ +#define CTBM_OA_RES1_CTRL_OA1_COMP_EN_Msk (0x10UL) /*!< CTBM OA_RES1_CTRL: OA1_COMP_EN (Bitfield-Mask: 0x01) */ +#define CTBM_OA_RES1_CTRL_OA1_HYST_EN_Pos (5UL) /*!< CTBM OA_RES1_CTRL: OA1_HYST_EN (Bit 5) */ +#define CTBM_OA_RES1_CTRL_OA1_HYST_EN_Msk (0x20UL) /*!< CTBM OA_RES1_CTRL: OA1_HYST_EN (Bitfield-Mask: 0x01) */ +#define CTBM_OA_RES1_CTRL_OA1_BYPASS_DSI_SYNC_Pos (6UL) /*!< CTBM OA_RES1_CTRL: OA1_BYPASS_DSI_SYNC (Bit 6) */ +#define CTBM_OA_RES1_CTRL_OA1_BYPASS_DSI_SYNC_Msk (0x40UL) /*!< CTBM OA_RES1_CTRL: OA1_BYPASS_DSI_SYNC (Bitfield-Mask: 0x01)*/ +#define CTBM_OA_RES1_CTRL_OA1_DSI_LEVEL_Pos (7UL) /*!< CTBM OA_RES1_CTRL: OA1_DSI_LEVEL (Bit 7) */ +#define CTBM_OA_RES1_CTRL_OA1_DSI_LEVEL_Msk (0x80UL) /*!< CTBM OA_RES1_CTRL: OA1_DSI_LEVEL (Bitfield-Mask: 0x01) */ +#define CTBM_OA_RES1_CTRL_OA1_COMPINT_Pos (8UL) /*!< CTBM OA_RES1_CTRL: OA1_COMPINT (Bit 8) */ +#define CTBM_OA_RES1_CTRL_OA1_COMPINT_Msk (0x300UL) /*!< CTBM OA_RES1_CTRL: OA1_COMPINT (Bitfield-Mask: 0x03) */ +#define CTBM_OA_RES1_CTRL_OA1_PUMP_EN_Pos (11UL) /*!< CTBM OA_RES1_CTRL: OA1_PUMP_EN (Bit 11) */ +#define CTBM_OA_RES1_CTRL_OA1_PUMP_EN_Msk (0x800UL) /*!< CTBM OA_RES1_CTRL: OA1_PUMP_EN (Bitfield-Mask: 0x01) */ +#define CTBM_OA_RES1_CTRL_OA1_BOOST_EN_Pos (12UL) /*!< CTBM OA_RES1_CTRL: OA1_BOOST_EN (Bit 12) */ +#define CTBM_OA_RES1_CTRL_OA1_BOOST_EN_Msk (0x1000UL) /*!< CTBM OA_RES1_CTRL: OA1_BOOST_EN (Bitfield-Mask: 0x01) */ +/* ==================================================== CTBM.COMP_STAT ===================================================== */ +#define CTBM_COMP_STAT_OA0_COMP_Pos (0UL) /*!< CTBM COMP_STAT: OA0_COMP (Bit 0) */ +#define CTBM_COMP_STAT_OA0_COMP_Msk (0x1UL) /*!< CTBM COMP_STAT: OA0_COMP (Bitfield-Mask: 0x01) */ +#define CTBM_COMP_STAT_OA1_COMP_Pos (16UL) /*!< CTBM COMP_STAT: OA1_COMP (Bit 16) */ +#define CTBM_COMP_STAT_OA1_COMP_Msk (0x10000UL) /*!< CTBM COMP_STAT: OA1_COMP (Bitfield-Mask: 0x01) */ +/* ======================================================= CTBM.INTR ======================================================= */ +#define CTBM_INTR_COMP0_Pos (0UL) /*!< CTBM INTR: COMP0 (Bit 0) */ +#define CTBM_INTR_COMP0_Msk (0x1UL) /*!< CTBM INTR: COMP0 (Bitfield-Mask: 0x01) */ +#define CTBM_INTR_COMP1_Pos (1UL) /*!< CTBM INTR: COMP1 (Bit 1) */ +#define CTBM_INTR_COMP1_Msk (0x2UL) /*!< CTBM INTR: COMP1 (Bitfield-Mask: 0x01) */ +/* ===================================================== CTBM.INTR_SET ===================================================== */ +#define CTBM_INTR_SET_COMP0_SET_Pos (0UL) /*!< CTBM INTR_SET: COMP0_SET (Bit 0) */ +#define CTBM_INTR_SET_COMP0_SET_Msk (0x1UL) /*!< CTBM INTR_SET: COMP0_SET (Bitfield-Mask: 0x01) */ +#define CTBM_INTR_SET_COMP1_SET_Pos (1UL) /*!< CTBM INTR_SET: COMP1_SET (Bit 1) */ +#define CTBM_INTR_SET_COMP1_SET_Msk (0x2UL) /*!< CTBM INTR_SET: COMP1_SET (Bitfield-Mask: 0x01) */ +/* ==================================================== CTBM.INTR_MASK ===================================================== */ +#define CTBM_INTR_MASK_COMP0_MASK_Pos (0UL) /*!< CTBM INTR_MASK: COMP0_MASK (Bit 0) */ +#define CTBM_INTR_MASK_COMP0_MASK_Msk (0x1UL) /*!< CTBM INTR_MASK: COMP0_MASK (Bitfield-Mask: 0x01) */ +#define CTBM_INTR_MASK_COMP1_MASK_Pos (1UL) /*!< CTBM INTR_MASK: COMP1_MASK (Bit 1) */ +#define CTBM_INTR_MASK_COMP1_MASK_Msk (0x2UL) /*!< CTBM INTR_MASK: COMP1_MASK (Bitfield-Mask: 0x01) */ +/* =================================================== CTBM.INTR_MASKED ==================================================== */ +#define CTBM_INTR_MASKED_COMP0_MASKED_Pos (0UL) /*!< CTBM INTR_MASKED: COMP0_MASKED (Bit 0) */ +#define CTBM_INTR_MASKED_COMP0_MASKED_Msk (0x1UL) /*!< CTBM INTR_MASKED: COMP0_MASKED (Bitfield-Mask: 0x01) */ +#define CTBM_INTR_MASKED_COMP1_MASKED_Pos (1UL) /*!< CTBM INTR_MASKED: COMP1_MASKED (Bit 1) */ +#define CTBM_INTR_MASKED_COMP1_MASKED_Msk (0x2UL) /*!< CTBM INTR_MASKED: COMP1_MASKED (Bitfield-Mask: 0x01) */ +/* ====================================================== CTBM.OA0_SW ====================================================== */ +#define CTBM_OA0_SW_OA0P_A00_Pos (0UL) /*!< CTBM OA0_SW: OA0P_A00 (Bit 0) */ +#define CTBM_OA0_SW_OA0P_A00_Msk (0x1UL) /*!< CTBM OA0_SW: OA0P_A00 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_OA0P_A20_Pos (2UL) /*!< CTBM OA0_SW: OA0P_A20 (Bit 2) */ +#define CTBM_OA0_SW_OA0P_A20_Msk (0x4UL) /*!< CTBM OA0_SW: OA0P_A20 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_OA0P_A30_Pos (3UL) /*!< CTBM OA0_SW: OA0P_A30 (Bit 3) */ +#define CTBM_OA0_SW_OA0P_A30_Msk (0x8UL) /*!< CTBM OA0_SW: OA0P_A30 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_OA0M_A11_Pos (8UL) /*!< CTBM OA0_SW: OA0M_A11 (Bit 8) */ +#define CTBM_OA0_SW_OA0M_A11_Msk (0x100UL) /*!< CTBM OA0_SW: OA0M_A11 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_OA0M_A81_Pos (14UL) /*!< CTBM OA0_SW: OA0M_A81 (Bit 14) */ +#define CTBM_OA0_SW_OA0M_A81_Msk (0x4000UL) /*!< CTBM OA0_SW: OA0M_A81 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_OA0O_D51_Pos (18UL) /*!< CTBM OA0_SW: OA0O_D51 (Bit 18) */ +#define CTBM_OA0_SW_OA0O_D51_Msk (0x40000UL) /*!< CTBM OA0_SW: OA0O_D51 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_OA0O_D81_Pos (21UL) /*!< CTBM OA0_SW: OA0O_D81 (Bit 21) */ +#define CTBM_OA0_SW_OA0O_D81_Msk (0x200000UL) /*!< CTBM OA0_SW: OA0O_D81 (Bitfield-Mask: 0x01) */ +/* =================================================== CTBM.OA0_SW_CLEAR =================================================== */ +#define CTBM_OA0_SW_CLEAR_OA0P_A00_Pos (0UL) /*!< CTBM OA0_SW_CLEAR: OA0P_A00 (Bit 0) */ +#define CTBM_OA0_SW_CLEAR_OA0P_A00_Msk (0x1UL) /*!< CTBM OA0_SW_CLEAR: OA0P_A00 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_CLEAR_OA0P_A20_Pos (2UL) /*!< CTBM OA0_SW_CLEAR: OA0P_A20 (Bit 2) */ +#define CTBM_OA0_SW_CLEAR_OA0P_A20_Msk (0x4UL) /*!< CTBM OA0_SW_CLEAR: OA0P_A20 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_CLEAR_OA0P_A30_Pos (3UL) /*!< CTBM OA0_SW_CLEAR: OA0P_A30 (Bit 3) */ +#define CTBM_OA0_SW_CLEAR_OA0P_A30_Msk (0x8UL) /*!< CTBM OA0_SW_CLEAR: OA0P_A30 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_CLEAR_OA0M_A11_Pos (8UL) /*!< CTBM OA0_SW_CLEAR: OA0M_A11 (Bit 8) */ +#define CTBM_OA0_SW_CLEAR_OA0M_A11_Msk (0x100UL) /*!< CTBM OA0_SW_CLEAR: OA0M_A11 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_CLEAR_OA0M_A81_Pos (14UL) /*!< CTBM OA0_SW_CLEAR: OA0M_A81 (Bit 14) */ +#define CTBM_OA0_SW_CLEAR_OA0M_A81_Msk (0x4000UL) /*!< CTBM OA0_SW_CLEAR: OA0M_A81 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_CLEAR_OA0O_D51_Pos (18UL) /*!< CTBM OA0_SW_CLEAR: OA0O_D51 (Bit 18) */ +#define CTBM_OA0_SW_CLEAR_OA0O_D51_Msk (0x40000UL) /*!< CTBM OA0_SW_CLEAR: OA0O_D51 (Bitfield-Mask: 0x01) */ +#define CTBM_OA0_SW_CLEAR_OA0O_D81_Pos (21UL) /*!< CTBM OA0_SW_CLEAR: OA0O_D81 (Bit 21) */ +#define CTBM_OA0_SW_CLEAR_OA0O_D81_Msk (0x200000UL) /*!< CTBM OA0_SW_CLEAR: OA0O_D81 (Bitfield-Mask: 0x01) */ +/* ====================================================== CTBM.OA1_SW ====================================================== */ +#define CTBM_OA1_SW_OA1P_A03_Pos (0UL) /*!< CTBM OA1_SW: OA1P_A03 (Bit 0) */ +#define CTBM_OA1_SW_OA1P_A03_Msk (0x1UL) /*!< CTBM OA1_SW: OA1P_A03 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_OA1P_A13_Pos (1UL) /*!< CTBM OA1_SW: OA1P_A13 (Bit 1) */ +#define CTBM_OA1_SW_OA1P_A13_Msk (0x2UL) /*!< CTBM OA1_SW: OA1P_A13 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_OA1P_A43_Pos (4UL) /*!< CTBM OA1_SW: OA1P_A43 (Bit 4) */ +#define CTBM_OA1_SW_OA1P_A43_Msk (0x10UL) /*!< CTBM OA1_SW: OA1P_A43 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_OA1P_A73_Pos (7UL) /*!< CTBM OA1_SW: OA1P_A73 (Bit 7) */ +#define CTBM_OA1_SW_OA1P_A73_Msk (0x80UL) /*!< CTBM OA1_SW: OA1P_A73 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_OA1M_A22_Pos (8UL) /*!< CTBM OA1_SW: OA1M_A22 (Bit 8) */ +#define CTBM_OA1_SW_OA1M_A22_Msk (0x100UL) /*!< CTBM OA1_SW: OA1M_A22 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_OA1M_A82_Pos (14UL) /*!< CTBM OA1_SW: OA1M_A82 (Bit 14) */ +#define CTBM_OA1_SW_OA1M_A82_Msk (0x4000UL) /*!< CTBM OA1_SW: OA1M_A82 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_OA1O_D52_Pos (18UL) /*!< CTBM OA1_SW: OA1O_D52 (Bit 18) */ +#define CTBM_OA1_SW_OA1O_D52_Msk (0x40000UL) /*!< CTBM OA1_SW: OA1O_D52 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_OA1O_D62_Pos (19UL) /*!< CTBM OA1_SW: OA1O_D62 (Bit 19) */ +#define CTBM_OA1_SW_OA1O_D62_Msk (0x80000UL) /*!< CTBM OA1_SW: OA1O_D62 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_OA1O_D82_Pos (21UL) /*!< CTBM OA1_SW: OA1O_D82 (Bit 21) */ +#define CTBM_OA1_SW_OA1O_D82_Msk (0x200000UL) /*!< CTBM OA1_SW: OA1O_D82 (Bitfield-Mask: 0x01) */ +/* =================================================== CTBM.OA1_SW_CLEAR =================================================== */ +#define CTBM_OA1_SW_CLEAR_OA1P_A03_Pos (0UL) /*!< CTBM OA1_SW_CLEAR: OA1P_A03 (Bit 0) */ +#define CTBM_OA1_SW_CLEAR_OA1P_A03_Msk (0x1UL) /*!< CTBM OA1_SW_CLEAR: OA1P_A03 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_CLEAR_OA1P_A13_Pos (1UL) /*!< CTBM OA1_SW_CLEAR: OA1P_A13 (Bit 1) */ +#define CTBM_OA1_SW_CLEAR_OA1P_A13_Msk (0x2UL) /*!< CTBM OA1_SW_CLEAR: OA1P_A13 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_CLEAR_OA1P_A43_Pos (4UL) /*!< CTBM OA1_SW_CLEAR: OA1P_A43 (Bit 4) */ +#define CTBM_OA1_SW_CLEAR_OA1P_A43_Msk (0x10UL) /*!< CTBM OA1_SW_CLEAR: OA1P_A43 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_CLEAR_OA1P_A73_Pos (7UL) /*!< CTBM OA1_SW_CLEAR: OA1P_A73 (Bit 7) */ +#define CTBM_OA1_SW_CLEAR_OA1P_A73_Msk (0x80UL) /*!< CTBM OA1_SW_CLEAR: OA1P_A73 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_CLEAR_OA1M_A22_Pos (8UL) /*!< CTBM OA1_SW_CLEAR: OA1M_A22 (Bit 8) */ +#define CTBM_OA1_SW_CLEAR_OA1M_A22_Msk (0x100UL) /*!< CTBM OA1_SW_CLEAR: OA1M_A22 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_CLEAR_OA1M_A82_Pos (14UL) /*!< CTBM OA1_SW_CLEAR: OA1M_A82 (Bit 14) */ +#define CTBM_OA1_SW_CLEAR_OA1M_A82_Msk (0x4000UL) /*!< CTBM OA1_SW_CLEAR: OA1M_A82 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_CLEAR_OA1O_D52_Pos (18UL) /*!< CTBM OA1_SW_CLEAR: OA1O_D52 (Bit 18) */ +#define CTBM_OA1_SW_CLEAR_OA1O_D52_Msk (0x40000UL) /*!< CTBM OA1_SW_CLEAR: OA1O_D52 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_CLEAR_OA1O_D62_Pos (19UL) /*!< CTBM OA1_SW_CLEAR: OA1O_D62 (Bit 19) */ +#define CTBM_OA1_SW_CLEAR_OA1O_D62_Msk (0x80000UL) /*!< CTBM OA1_SW_CLEAR: OA1O_D62 (Bitfield-Mask: 0x01) */ +#define CTBM_OA1_SW_CLEAR_OA1O_D82_Pos (21UL) /*!< CTBM OA1_SW_CLEAR: OA1O_D82 (Bit 21) */ +#define CTBM_OA1_SW_CLEAR_OA1O_D82_Msk (0x200000UL) /*!< CTBM OA1_SW_CLEAR: OA1O_D82 (Bitfield-Mask: 0x01) */ +/* ====================================================== CTBM.CTD_SW ====================================================== */ +#define CTBM_CTD_SW_CTDD_CRD_Pos (1UL) /*!< CTBM CTD_SW: CTDD_CRD (Bit 1) */ +#define CTBM_CTD_SW_CTDD_CRD_Msk (0x2UL) /*!< CTBM CTD_SW: CTDD_CRD (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CTDS_CRS_Pos (4UL) /*!< CTBM CTD_SW: CTDS_CRS (Bit 4) */ +#define CTBM_CTD_SW_CTDS_CRS_Msk (0x10UL) /*!< CTBM CTD_SW: CTDS_CRS (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CTDS_COR_Pos (5UL) /*!< CTBM CTD_SW: CTDS_COR (Bit 5) */ +#define CTBM_CTD_SW_CTDS_COR_Msk (0x20UL) /*!< CTBM CTD_SW: CTDS_COR (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CTDO_C6H_Pos (8UL) /*!< CTBM CTD_SW: CTDO_C6H (Bit 8) */ +#define CTBM_CTD_SW_CTDO_C6H_Msk (0x100UL) /*!< CTBM CTD_SW: CTDO_C6H (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CTDO_COS_Pos (9UL) /*!< CTBM CTD_SW: CTDO_COS (Bit 9) */ +#define CTBM_CTD_SW_CTDO_COS_Msk (0x200UL) /*!< CTBM CTD_SW: CTDO_COS (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CTDH_COB_Pos (10UL) /*!< CTBM CTD_SW: CTDH_COB (Bit 10) */ +#define CTBM_CTD_SW_CTDH_COB_Msk (0x400UL) /*!< CTBM CTD_SW: CTDH_COB (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CTDH_CHD_Pos (12UL) /*!< CTBM CTD_SW: CTDH_CHD (Bit 12) */ +#define CTBM_CTD_SW_CTDH_CHD_Msk (0x1000UL) /*!< CTBM CTD_SW: CTDH_CHD (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CTDH_CA0_Pos (13UL) /*!< CTBM CTD_SW: CTDH_CA0 (Bit 13) */ +#define CTBM_CTD_SW_CTDH_CA0_Msk (0x2000UL) /*!< CTBM CTD_SW: CTDH_CA0 (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CTDH_CIS_Pos (14UL) /*!< CTBM CTD_SW: CTDH_CIS (Bit 14) */ +#define CTBM_CTD_SW_CTDH_CIS_Msk (0x4000UL) /*!< CTBM CTD_SW: CTDH_CIS (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CTDH_ILR_Pos (15UL) /*!< CTBM CTD_SW: CTDH_ILR (Bit 15) */ +#define CTBM_CTD_SW_CTDH_ILR_Msk (0x8000UL) /*!< CTBM CTD_SW: CTDH_ILR (Bitfield-Mask: 0x01) */ +/* =================================================== CTBM.CTD_SW_CLEAR =================================================== */ +#define CTBM_CTD_SW_CLEAR_CTDD_CRD_Pos (1UL) /*!< CTBM CTD_SW_CLEAR: CTDD_CRD (Bit 1) */ +#define CTBM_CTD_SW_CLEAR_CTDD_CRD_Msk (0x2UL) /*!< CTBM CTD_SW_CLEAR: CTDD_CRD (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CLEAR_CTDS_CRS_Pos (4UL) /*!< CTBM CTD_SW_CLEAR: CTDS_CRS (Bit 4) */ +#define CTBM_CTD_SW_CLEAR_CTDS_CRS_Msk (0x10UL) /*!< CTBM CTD_SW_CLEAR: CTDS_CRS (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CLEAR_CTDS_COR_Pos (5UL) /*!< CTBM CTD_SW_CLEAR: CTDS_COR (Bit 5) */ +#define CTBM_CTD_SW_CLEAR_CTDS_COR_Msk (0x20UL) /*!< CTBM CTD_SW_CLEAR: CTDS_COR (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CLEAR_CTDO_C6H_Pos (8UL) /*!< CTBM CTD_SW_CLEAR: CTDO_C6H (Bit 8) */ +#define CTBM_CTD_SW_CLEAR_CTDO_C6H_Msk (0x100UL) /*!< CTBM CTD_SW_CLEAR: CTDO_C6H (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CLEAR_CTDO_COS_Pos (9UL) /*!< CTBM CTD_SW_CLEAR: CTDO_COS (Bit 9) */ +#define CTBM_CTD_SW_CLEAR_CTDO_COS_Msk (0x200UL) /*!< CTBM CTD_SW_CLEAR: CTDO_COS (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CLEAR_CTDH_COB_Pos (10UL) /*!< CTBM CTD_SW_CLEAR: CTDH_COB (Bit 10) */ +#define CTBM_CTD_SW_CLEAR_CTDH_COB_Msk (0x400UL) /*!< CTBM CTD_SW_CLEAR: CTDH_COB (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CLEAR_CTDH_CHD_Pos (12UL) /*!< CTBM CTD_SW_CLEAR: CTDH_CHD (Bit 12) */ +#define CTBM_CTD_SW_CLEAR_CTDH_CHD_Msk (0x1000UL) /*!< CTBM CTD_SW_CLEAR: CTDH_CHD (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CLEAR_CTDH_CA0_Pos (13UL) /*!< CTBM CTD_SW_CLEAR: CTDH_CA0 (Bit 13) */ +#define CTBM_CTD_SW_CLEAR_CTDH_CA0_Msk (0x2000UL) /*!< CTBM CTD_SW_CLEAR: CTDH_CA0 (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CLEAR_CTDH_CIS_Pos (14UL) /*!< CTBM CTD_SW_CLEAR: CTDH_CIS (Bit 14) */ +#define CTBM_CTD_SW_CLEAR_CTDH_CIS_Msk (0x4000UL) /*!< CTBM CTD_SW_CLEAR: CTDH_CIS (Bitfield-Mask: 0x01) */ +#define CTBM_CTD_SW_CLEAR_CTDH_ILR_Pos (15UL) /*!< CTBM CTD_SW_CLEAR: CTDH_ILR (Bit 15) */ +#define CTBM_CTD_SW_CLEAR_CTDH_ILR_Msk (0x8000UL) /*!< CTBM CTD_SW_CLEAR: CTDH_ILR (Bitfield-Mask: 0x01) */ +/* ================================================== CTBM.CTB_SW_DS_CTRL ================================================== */ +#define CTBM_CTB_SW_DS_CTRL_P2_DS_CTRL23_Pos (10UL) /*!< CTBM CTB_SW_DS_CTRL: P2_DS_CTRL23 (Bit 10) */ +#define CTBM_CTB_SW_DS_CTRL_P2_DS_CTRL23_Msk (0x400UL) /*!< CTBM CTB_SW_DS_CTRL: P2_DS_CTRL23 (Bitfield-Mask: 0x01) */ +#define CTBM_CTB_SW_DS_CTRL_P3_DS_CTRL23_Pos (11UL) /*!< CTBM CTB_SW_DS_CTRL: P3_DS_CTRL23 (Bit 11) */ +#define CTBM_CTB_SW_DS_CTRL_P3_DS_CTRL23_Msk (0x800UL) /*!< CTBM CTB_SW_DS_CTRL: P3_DS_CTRL23 (Bitfield-Mask: 0x01) */ +#define CTBM_CTB_SW_DS_CTRL_CTD_COS_DS_CTRL_Pos (31UL) /*!< CTBM CTB_SW_DS_CTRL: CTD_COS_DS_CTRL (Bit 31) */ +#define CTBM_CTB_SW_DS_CTRL_CTD_COS_DS_CTRL_Msk (0x80000000UL) /*!< CTBM CTB_SW_DS_CTRL: CTD_COS_DS_CTRL (Bitfield-Mask: 0x01)*/ +/* ================================================== CTBM.CTB_SW_SQ_CTRL ================================================== */ +#define CTBM_CTB_SW_SQ_CTRL_P2_SQ_CTRL23_Pos (10UL) /*!< CTBM CTB_SW_SQ_CTRL: P2_SQ_CTRL23 (Bit 10) */ +#define CTBM_CTB_SW_SQ_CTRL_P2_SQ_CTRL23_Msk (0x400UL) /*!< CTBM CTB_SW_SQ_CTRL: P2_SQ_CTRL23 (Bitfield-Mask: 0x01) */ +#define CTBM_CTB_SW_SQ_CTRL_P3_SQ_CTRL23_Pos (11UL) /*!< CTBM CTB_SW_SQ_CTRL: P3_SQ_CTRL23 (Bit 11) */ +#define CTBM_CTB_SW_SQ_CTRL_P3_SQ_CTRL23_Msk (0x800UL) /*!< CTBM CTB_SW_SQ_CTRL: P3_SQ_CTRL23 (Bitfield-Mask: 0x01) */ +/* ================================================== CTBM.CTB_SW_STATUS =================================================== */ +#define CTBM_CTB_SW_STATUS_OA0O_D51_STAT_Pos (28UL) /*!< CTBM CTB_SW_STATUS: OA0O_D51_STAT (Bit 28) */ +#define CTBM_CTB_SW_STATUS_OA0O_D51_STAT_Msk (0x10000000UL) /*!< CTBM CTB_SW_STATUS: OA0O_D51_STAT (Bitfield-Mask: 0x01) */ +#define CTBM_CTB_SW_STATUS_OA1O_D52_STAT_Pos (29UL) /*!< CTBM CTB_SW_STATUS: OA1O_D52_STAT (Bit 29) */ +#define CTBM_CTB_SW_STATUS_OA1O_D52_STAT_Msk (0x20000000UL) /*!< CTBM CTB_SW_STATUS: OA1O_D52_STAT (Bitfield-Mask: 0x01) */ +#define CTBM_CTB_SW_STATUS_OA1O_D62_STAT_Pos (30UL) /*!< CTBM CTB_SW_STATUS: OA1O_D62_STAT (Bit 30) */ +#define CTBM_CTB_SW_STATUS_OA1O_D62_STAT_Msk (0x40000000UL) /*!< CTBM CTB_SW_STATUS: OA1O_D62_STAT (Bitfield-Mask: 0x01) */ +#define CTBM_CTB_SW_STATUS_CTD_COS_STAT_Pos (31UL) /*!< CTBM CTB_SW_STATUS: CTD_COS_STAT (Bit 31) */ +#define CTBM_CTB_SW_STATUS_CTD_COS_STAT_Msk (0x80000000UL) /*!< CTBM CTB_SW_STATUS: CTD_COS_STAT (Bitfield-Mask: 0x01) */ +/* ================================================= CTBM.OA0_OFFSET_TRIM ================================================== */ +#define CTBM_OA0_OFFSET_TRIM_OA0_OFFSET_TRIM_Pos (0UL) /*!< CTBM OA0_OFFSET_TRIM: OA0_OFFSET_TRIM (Bit 0) */ +#define CTBM_OA0_OFFSET_TRIM_OA0_OFFSET_TRIM_Msk (0x3fUL) /*!< CTBM OA0_OFFSET_TRIM: OA0_OFFSET_TRIM (Bitfield-Mask: 0x3f)*/ +/* ============================================== CTBM.OA0_SLOPE_OFFSET_TRIM =============================================== */ +#define CTBM_OA0_SLOPE_OFFSET_TRIM_OA0_SLOPE_OFFSET_TRIM_Pos (0UL) /*!< CTBM OA0_SLOPE_OFFSET_TRIM: OA0_SLOPE_OFFSET_TRIM (Bit 0)*/ +#define CTBM_OA0_SLOPE_OFFSET_TRIM_OA0_SLOPE_OFFSET_TRIM_Msk (0x3fUL) /*!< CTBM OA0_SLOPE_OFFSET_TRIM: OA0_SLOPE_OFFSET_TRIM (Bitfield-Mask: 0x3f)*/ +/* ================================================== CTBM.OA0_COMP_TRIM =================================================== */ +#define CTBM_OA0_COMP_TRIM_OA0_COMP_TRIM_Pos (0UL) /*!< CTBM OA0_COMP_TRIM: OA0_COMP_TRIM (Bit 0) */ +#define CTBM_OA0_COMP_TRIM_OA0_COMP_TRIM_Msk (0x3UL) /*!< CTBM OA0_COMP_TRIM: OA0_COMP_TRIM (Bitfield-Mask: 0x03) */ +/* ================================================= CTBM.OA1_OFFSET_TRIM ================================================== */ +#define CTBM_OA1_OFFSET_TRIM_OA1_OFFSET_TRIM_Pos (0UL) /*!< CTBM OA1_OFFSET_TRIM: OA1_OFFSET_TRIM (Bit 0) */ +#define CTBM_OA1_OFFSET_TRIM_OA1_OFFSET_TRIM_Msk (0x3fUL) /*!< CTBM OA1_OFFSET_TRIM: OA1_OFFSET_TRIM (Bitfield-Mask: 0x3f)*/ +/* ============================================== CTBM.OA1_SLOPE_OFFSET_TRIM =============================================== */ +#define CTBM_OA1_SLOPE_OFFSET_TRIM_OA1_SLOPE_OFFSET_TRIM_Pos (0UL) /*!< CTBM OA1_SLOPE_OFFSET_TRIM: OA1_SLOPE_OFFSET_TRIM (Bit 0)*/ +#define CTBM_OA1_SLOPE_OFFSET_TRIM_OA1_SLOPE_OFFSET_TRIM_Msk (0x3fUL) /*!< CTBM OA1_SLOPE_OFFSET_TRIM: OA1_SLOPE_OFFSET_TRIM (Bitfield-Mask: 0x3f)*/ +/* ================================================== CTBM.OA1_COMP_TRIM =================================================== */ +#define CTBM_OA1_COMP_TRIM_OA1_COMP_TRIM_Pos (0UL) /*!< CTBM OA1_COMP_TRIM: OA1_COMP_TRIM (Bit 0) */ +#define CTBM_OA1_COMP_TRIM_OA1_COMP_TRIM_Msk (0x3UL) /*!< CTBM OA1_COMP_TRIM: OA1_COMP_TRIM (Bitfield-Mask: 0x03) */ + + +#endif /* _CYIP_CTBM_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ctdac.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ctdac.h new file mode 100644 index 0000000000..79832bfb3b --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ctdac.h @@ -0,0 +1,110 @@ +/***************************************************************************//** +* \file cyip_ctdac.h +* +* \brief +* CTDAC IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_CTDAC_H_ +#define _CYIP_CTDAC_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ CTDAC ================ */ +/* =========================================================================================================================== */ + +#define CTDAC_SECTION_SIZE 0x00010000UL + +/** + * \brief Continuous Time DAC (CTDAC) + */ +typedef struct { /*!< CTDAC Structure */ + __IOM uint32_t CTDAC_CTRL; /*!< 0x00000000 Global CTDAC control */ + __IM uint32_t RESERVED[7]; + __IOM uint32_t INTR; /*!< 0x00000020 Interrupt request register */ + __IOM uint32_t INTR_SET; /*!< 0x00000024 Interrupt request set register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000028 Interrupt request mask */ + __IM uint32_t INTR_MASKED; /*!< 0x0000002C Interrupt request masked */ + __IM uint32_t RESERVED1[32]; + __IOM uint32_t CTDAC_SW; /*!< 0x000000B0 CTDAC switch control */ + __IOM uint32_t CTDAC_SW_CLEAR; /*!< 0x000000B4 CTDAC switch control clear */ + __IM uint32_t RESERVED2[18]; + __IOM uint32_t CTDAC_VAL; /*!< 0x00000100 DAC Value */ + __IOM uint32_t CTDAC_VAL_NXT; /*!< 0x00000104 Next DAC value (double buffering) */ + __IM uint32_t RESERVED3[894]; + __IOM uint32_t TRIM; /*!< 0x00000F00 Trim */ +} CTDAC_Type; /*!< Size = 3844 (0xF04) */ + + +/* =================================================== CTDAC.CTDAC_CTRL ==================================================== */ +#define CTDAC_CTDAC_CTRL_DEGLITCH_CNT_Pos (0UL) /*!< CTDAC CTDAC_CTRL: DEGLITCH_CNT (Bit 0) */ +#define CTDAC_CTDAC_CTRL_DEGLITCH_CNT_Msk (0x3fUL) /*!< CTDAC CTDAC_CTRL: DEGLITCH_CNT (Bitfield-Mask: 0x3f) */ +#define CTDAC_CTDAC_CTRL_DEGLITCH_CO6_Pos (8UL) /*!< CTDAC CTDAC_CTRL: DEGLITCH_CO6 (Bit 8) */ +#define CTDAC_CTDAC_CTRL_DEGLITCH_CO6_Msk (0x100UL) /*!< CTDAC CTDAC_CTRL: DEGLITCH_CO6 (Bitfield-Mask: 0x01) */ +#define CTDAC_CTDAC_CTRL_DEGLITCH_COS_Pos (9UL) /*!< CTDAC CTDAC_CTRL: DEGLITCH_COS (Bit 9) */ +#define CTDAC_CTDAC_CTRL_DEGLITCH_COS_Msk (0x200UL) /*!< CTDAC CTDAC_CTRL: DEGLITCH_COS (Bitfield-Mask: 0x01) */ +#define CTDAC_CTDAC_CTRL_OUT_EN_Pos (22UL) /*!< CTDAC CTDAC_CTRL: OUT_EN (Bit 22) */ +#define CTDAC_CTDAC_CTRL_OUT_EN_Msk (0x400000UL) /*!< CTDAC CTDAC_CTRL: OUT_EN (Bitfield-Mask: 0x01) */ +#define CTDAC_CTDAC_CTRL_CTDAC_RANGE_Pos (23UL) /*!< CTDAC CTDAC_CTRL: CTDAC_RANGE (Bit 23) */ +#define CTDAC_CTDAC_CTRL_CTDAC_RANGE_Msk (0x800000UL) /*!< CTDAC CTDAC_CTRL: CTDAC_RANGE (Bitfield-Mask: 0x01) */ +#define CTDAC_CTDAC_CTRL_CTDAC_MODE_Pos (24UL) /*!< CTDAC CTDAC_CTRL: CTDAC_MODE (Bit 24) */ +#define CTDAC_CTDAC_CTRL_CTDAC_MODE_Msk (0x3000000UL) /*!< CTDAC CTDAC_CTRL: CTDAC_MODE (Bitfield-Mask: 0x03) */ +#define CTDAC_CTDAC_CTRL_DISABLED_MODE_Pos (27UL) /*!< CTDAC CTDAC_CTRL: DISABLED_MODE (Bit 27) */ +#define CTDAC_CTDAC_CTRL_DISABLED_MODE_Msk (0x8000000UL) /*!< CTDAC CTDAC_CTRL: DISABLED_MODE (Bitfield-Mask: 0x01) */ +#define CTDAC_CTDAC_CTRL_DSI_STROBE_EN_Pos (28UL) /*!< CTDAC CTDAC_CTRL: DSI_STROBE_EN (Bit 28) */ +#define CTDAC_CTDAC_CTRL_DSI_STROBE_EN_Msk (0x10000000UL) /*!< CTDAC CTDAC_CTRL: DSI_STROBE_EN (Bitfield-Mask: 0x01) */ +#define CTDAC_CTDAC_CTRL_DSI_STROBE_LEVEL_Pos (29UL) /*!< CTDAC CTDAC_CTRL: DSI_STROBE_LEVEL (Bit 29) */ +#define CTDAC_CTDAC_CTRL_DSI_STROBE_LEVEL_Msk (0x20000000UL) /*!< CTDAC CTDAC_CTRL: DSI_STROBE_LEVEL (Bitfield-Mask: 0x01) */ +#define CTDAC_CTDAC_CTRL_DEEPSLEEP_ON_Pos (30UL) /*!< CTDAC CTDAC_CTRL: DEEPSLEEP_ON (Bit 30) */ +#define CTDAC_CTDAC_CTRL_DEEPSLEEP_ON_Msk (0x40000000UL) /*!< CTDAC CTDAC_CTRL: DEEPSLEEP_ON (Bitfield-Mask: 0x01) */ +#define CTDAC_CTDAC_CTRL_ENABLED_Pos (31UL) /*!< CTDAC CTDAC_CTRL: ENABLED (Bit 31) */ +#define CTDAC_CTDAC_CTRL_ENABLED_Msk (0x80000000UL) /*!< CTDAC CTDAC_CTRL: ENABLED (Bitfield-Mask: 0x01) */ +/* ====================================================== CTDAC.INTR ======================================================= */ +#define CTDAC_INTR_VDAC_EMPTY_Pos (0UL) /*!< CTDAC INTR: VDAC_EMPTY (Bit 0) */ +#define CTDAC_INTR_VDAC_EMPTY_Msk (0x1UL) /*!< CTDAC INTR: VDAC_EMPTY (Bitfield-Mask: 0x01) */ +/* ==================================================== CTDAC.INTR_SET ===================================================== */ +#define CTDAC_INTR_SET_VDAC_EMPTY_SET_Pos (0UL) /*!< CTDAC INTR_SET: VDAC_EMPTY_SET (Bit 0) */ +#define CTDAC_INTR_SET_VDAC_EMPTY_SET_Msk (0x1UL) /*!< CTDAC INTR_SET: VDAC_EMPTY_SET (Bitfield-Mask: 0x01) */ +/* ==================================================== CTDAC.INTR_MASK ==================================================== */ +#define CTDAC_INTR_MASK_VDAC_EMPTY_MASK_Pos (0UL) /*!< CTDAC INTR_MASK: VDAC_EMPTY_MASK (Bit 0) */ +#define CTDAC_INTR_MASK_VDAC_EMPTY_MASK_Msk (0x1UL) /*!< CTDAC INTR_MASK: VDAC_EMPTY_MASK (Bitfield-Mask: 0x01) */ +/* =================================================== CTDAC.INTR_MASKED =================================================== */ +#define CTDAC_INTR_MASKED_VDAC_EMPTY_MASKED_Pos (0UL) /*!< CTDAC INTR_MASKED: VDAC_EMPTY_MASKED (Bit 0) */ +#define CTDAC_INTR_MASKED_VDAC_EMPTY_MASKED_Msk (0x1UL) /*!< CTDAC INTR_MASKED: VDAC_EMPTY_MASKED (Bitfield-Mask: 0x01)*/ +/* ==================================================== CTDAC.CTDAC_SW ===================================================== */ +#define CTDAC_CTDAC_SW_CTDD_CVD_Pos (0UL) /*!< CTDAC CTDAC_SW: CTDD_CVD (Bit 0) */ +#define CTDAC_CTDAC_SW_CTDD_CVD_Msk (0x1UL) /*!< CTDAC CTDAC_SW: CTDD_CVD (Bitfield-Mask: 0x01) */ +#define CTDAC_CTDAC_SW_CTDO_CO6_Pos (8UL) /*!< CTDAC CTDAC_SW: CTDO_CO6 (Bit 8) */ +#define CTDAC_CTDAC_SW_CTDO_CO6_Msk (0x100UL) /*!< CTDAC CTDAC_SW: CTDO_CO6 (Bitfield-Mask: 0x01) */ +/* ================================================= CTDAC.CTDAC_SW_CLEAR ================================================== */ +#define CTDAC_CTDAC_SW_CLEAR_CTDD_CVD_Pos (0UL) /*!< CTDAC CTDAC_SW_CLEAR: CTDD_CVD (Bit 0) */ +#define CTDAC_CTDAC_SW_CLEAR_CTDD_CVD_Msk (0x1UL) /*!< CTDAC CTDAC_SW_CLEAR: CTDD_CVD (Bitfield-Mask: 0x01) */ +#define CTDAC_CTDAC_SW_CLEAR_CTDO_CO6_Pos (8UL) /*!< CTDAC CTDAC_SW_CLEAR: CTDO_CO6 (Bit 8) */ +#define CTDAC_CTDAC_SW_CLEAR_CTDO_CO6_Msk (0x100UL) /*!< CTDAC CTDAC_SW_CLEAR: CTDO_CO6 (Bitfield-Mask: 0x01) */ +/* ==================================================== CTDAC.CTDAC_VAL ==================================================== */ +#define CTDAC_CTDAC_VAL_VALUE_Pos (0UL) /*!< CTDAC CTDAC_VAL: VALUE (Bit 0) */ +#define CTDAC_CTDAC_VAL_VALUE_Msk (0xfffUL) /*!< CTDAC CTDAC_VAL: VALUE (Bitfield-Mask: 0xfff) */ +/* ================================================== CTDAC.CTDAC_VAL_NXT ================================================== */ +#define CTDAC_CTDAC_VAL_NXT_VALUE_Pos (0UL) /*!< CTDAC CTDAC_VAL_NXT: VALUE (Bit 0) */ +#define CTDAC_CTDAC_VAL_NXT_VALUE_Msk (0xfffUL) /*!< CTDAC CTDAC_VAL_NXT: VALUE (Bitfield-Mask: 0xfff) */ +/* ====================================================== CTDAC.TRIM ======================================================= */ +#define CTDAC_TRIM_TRIM_VAL_Pos (0UL) /*!< CTDAC TRIM: TRIM_VAL (Bit 0) */ +#define CTDAC_TRIM_TRIM_VAL_Msk (0xfUL) /*!< CTDAC TRIM: TRIM_VAL (Bitfield-Mask: 0x0f) */ + + +#endif /* _CYIP_CTDAC_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_dw.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_dw.h new file mode 100644 index 0000000000..7d723f89c0 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_dw.h @@ -0,0 +1,230 @@ +/***************************************************************************//** +* \file cyip_dw.h +* +* \brief +* DW IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_DW_H_ +#define _CYIP_DW_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ DW ================ */ +/* =========================================================================================================================== */ + +#define DW_CH_STRUCT_SECTION_SIZE 0x00000020UL +#define DW_DESCR_STRUCT_SECTION_SIZE 0x00000020UL +#define DW_SECTION_SIZE 0x00001000UL + +/** + * \brief DW channel structure (DW_CH_STRUCT) + */ +typedef struct { + __IOM uint32_t CH_CTL; /*!< 0x00000000 Channel control */ + __IM uint32_t CH_STATUS; /*!< 0x00000004 Channel status */ + __IOM uint32_t CH_IDX; /*!< 0x00000008 Channel current indices */ + __IOM uint32_t CH_CURR_PTR; /*!< 0x0000000C Channel current descriptor pointer */ + __IOM uint32_t INTR; /*!< 0x00000010 Interrupt */ + __IOM uint32_t INTR_SET; /*!< 0x00000014 Interrupt set */ + __IOM uint32_t INTR_MASK; /*!< 0x00000018 Interrupt mask */ + __IM uint32_t INTR_MASKED; /*!< 0x0000001C Interrupt masked */ +} DW_CH_STRUCT_Type; /*!< Size = 32 (0x20) */ + +/** + * \brief DW descriptor structure (DW_DESCR_STRUCT) + */ +typedef struct { + __IOM uint32_t DESCR_CTL; /*!< 0x00000000 Descriptor control */ + __IOM uint32_t DESCR_SRC; /*!< 0x00000004 Descriptor source */ + __IOM uint32_t DESCR_DST; /*!< 0x00000008 Descriptor destination */ + __IOM uint32_t DESCR_X_CTL; /*!< 0x0000000C Descriptor X loop control */ + __IOM uint32_t DESCR_Y_CTL; /*!< 0x00000010 Descriptor Y loop control */ + __IOM uint32_t DESCR_NEXT_PTR; /*!< 0x00000014 Descriptor next pointer */ + __IM uint32_t RESERVED[2]; +} DW_DESCR_STRUCT_Type; /*!< Size = 24 (0x18) */ + +/** + * \brief Datawire Controller (DW) + */ +typedef struct { /*!< DW Structure */ + __IOM uint32_t CTL; /*!< 0x00000000 Control */ + __IM uint32_t STATUS; /*!< 0x00000004 Status */ + __IM uint32_t PENDING; /*!< 0x00000008 Pending channels */ + __IM uint32_t RESERVED; + __IM uint32_t STATUS_INTR; /*!< 0x00000010 System interrupt control */ + __IM uint32_t STATUS_INTR_MASKED; /*!< 0x00000014 Status of interrupts masked */ + __IM uint32_t RESERVED1[2]; + __IM uint32_t ACT_DESCR_CTL; /*!< 0x00000020 Active descriptor control */ + __IM uint32_t ACT_DESCR_SRC; /*!< 0x00000024 Active descriptor source */ + __IM uint32_t ACT_DESCR_DST; /*!< 0x00000028 Active descriptor destination */ + __IM uint32_t RESERVED2; + __IM uint32_t ACT_DESCR_X_CTL; /*!< 0x00000030 Active descriptor X loop control */ + __IM uint32_t ACT_DESCR_Y_CTL; /*!< 0x00000034 Active descriptor Y loop control */ + __IM uint32_t ACT_DESCR_NEXT_PTR; /*!< 0x00000038 Active descriptor next pointer */ + __IM uint32_t RESERVED3; + __IM uint32_t ACT_SRC; /*!< 0x00000040 Active source */ + __IM uint32_t ACT_DST; /*!< 0x00000044 Active destination */ + __IM uint32_t RESERVED4[494]; + DW_CH_STRUCT_Type CH_STRUCT[32]; /*!< 0x00000800 DW channel structure */ + DW_DESCR_STRUCT_Type DESCR_STRUCT; /*!< 0x00000C00 DW descriptor structure */ +} DW_Type; /*!< Size = 3104 (0xC20) */ + + +/* ================================================== DW_CH_STRUCT.CH_CTL ================================================== */ +#define DW_CH_STRUCT_CH_CTL_P_Pos (0UL) /*!< DW_CH_STRUCT CH_CTL: P (Bit 0) */ +#define DW_CH_STRUCT_CH_CTL_P_Msk (0x1UL) /*!< DW_CH_STRUCT CH_CTL: P (Bitfield-Mask: 0x01) */ +#define DW_CH_STRUCT_CH_CTL_NS_Pos (1UL) /*!< DW_CH_STRUCT CH_CTL: NS (Bit 1) */ +#define DW_CH_STRUCT_CH_CTL_NS_Msk (0x2UL) /*!< DW_CH_STRUCT CH_CTL: NS (Bitfield-Mask: 0x01) */ +#define DW_CH_STRUCT_CH_CTL_B_Pos (2UL) /*!< DW_CH_STRUCT CH_CTL: B (Bit 2) */ +#define DW_CH_STRUCT_CH_CTL_B_Msk (0x4UL) /*!< DW_CH_STRUCT CH_CTL: B (Bitfield-Mask: 0x01) */ +#define DW_CH_STRUCT_CH_CTL_PC_Pos (4UL) /*!< DW_CH_STRUCT CH_CTL: PC (Bit 4) */ +#define DW_CH_STRUCT_CH_CTL_PC_Msk (0xf0UL) /*!< DW_CH_STRUCT CH_CTL: PC (Bitfield-Mask: 0x0f) */ +#define DW_CH_STRUCT_CH_CTL_PRIO_Pos (16UL) /*!< DW_CH_STRUCT CH_CTL: PRIO (Bit 16) */ +#define DW_CH_STRUCT_CH_CTL_PRIO_Msk (0x30000UL) /*!< DW_CH_STRUCT CH_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define DW_CH_STRUCT_CH_CTL_PREEMPTABLE_Pos (18UL) /*!< DW_CH_STRUCT CH_CTL: PREEMPTABLE (Bit 18) */ +#define DW_CH_STRUCT_CH_CTL_PREEMPTABLE_Msk (0x40000UL) /*!< DW_CH_STRUCT CH_CTL: PREEMPTABLE (Bitfield-Mask: 0x01) */ +#define DW_CH_STRUCT_CH_CTL_ENABLED_Pos (31UL) /*!< DW_CH_STRUCT CH_CTL: ENABLED (Bit 31) */ +#define DW_CH_STRUCT_CH_CTL_ENABLED_Msk (0x80000000UL) /*!< DW_CH_STRUCT CH_CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================ DW_CH_STRUCT.CH_STATUS ================================================= */ +#define DW_CH_STRUCT_CH_STATUS_INTR_CAUSE_Pos (0UL) /*!< DW_CH_STRUCT CH_STATUS: INTR_CAUSE (Bit 0) */ +#define DW_CH_STRUCT_CH_STATUS_INTR_CAUSE_Msk (0xfUL) /*!< DW_CH_STRUCT CH_STATUS: INTR_CAUSE (Bitfield-Mask: 0x0f) */ +/* ================================================== DW_CH_STRUCT.CH_IDX ================================================== */ +#define DW_CH_STRUCT_CH_IDX_X_IDX_Pos (0UL) /*!< DW_CH_STRUCT CH_IDX: X_IDX (Bit 0) */ +#define DW_CH_STRUCT_CH_IDX_X_IDX_Msk (0xffUL) /*!< DW_CH_STRUCT CH_IDX: X_IDX (Bitfield-Mask: 0xff) */ +#define DW_CH_STRUCT_CH_IDX_Y_IDX_Pos (8UL) /*!< DW_CH_STRUCT CH_IDX: Y_IDX (Bit 8) */ +#define DW_CH_STRUCT_CH_IDX_Y_IDX_Msk (0xff00UL) /*!< DW_CH_STRUCT CH_IDX: Y_IDX (Bitfield-Mask: 0xff) */ +/* =============================================== DW_CH_STRUCT.CH_CURR_PTR ================================================ */ +#define DW_CH_STRUCT_CH_CURR_PTR_ADDR_Pos (2UL) /*!< DW_CH_STRUCT CH_CURR_PTR: ADDR (Bit 2) */ +#define DW_CH_STRUCT_CH_CURR_PTR_ADDR_Msk (0xfffffffcUL) /*!< DW_CH_STRUCT CH_CURR_PTR: ADDR (Bitfield-Mask: 0x3fffffff)*/ +/* =================================================== DW_CH_STRUCT.INTR =================================================== */ +#define DW_CH_STRUCT_INTR_CH_Pos (0UL) /*!< DW_CH_STRUCT INTR: CH (Bit 0) */ +#define DW_CH_STRUCT_INTR_CH_Msk (0x1UL) /*!< DW_CH_STRUCT INTR: CH (Bitfield-Mask: 0x01) */ +/* ================================================= DW_CH_STRUCT.INTR_SET ================================================= */ +#define DW_CH_STRUCT_INTR_SET_CH_Pos (0UL) /*!< DW_CH_STRUCT INTR_SET: CH (Bit 0) */ +#define DW_CH_STRUCT_INTR_SET_CH_Msk (0x1UL) /*!< DW_CH_STRUCT INTR_SET: CH (Bitfield-Mask: 0x01) */ +/* ================================================ DW_CH_STRUCT.INTR_MASK ================================================= */ +#define DW_CH_STRUCT_INTR_MASK_CH_Pos (0UL) /*!< DW_CH_STRUCT INTR_MASK: CH (Bit 0) */ +#define DW_CH_STRUCT_INTR_MASK_CH_Msk (0x1UL) /*!< DW_CH_STRUCT INTR_MASK: CH (Bitfield-Mask: 0x01) */ +/* =============================================== DW_CH_STRUCT.INTR_MASKED ================================================ */ +#define DW_CH_STRUCT_INTR_MASKED_CH_Pos (0UL) /*!< DW_CH_STRUCT INTR_MASKED: CH (Bit 0) */ +#define DW_CH_STRUCT_INTR_MASKED_CH_Msk (0x1UL) /*!< DW_CH_STRUCT INTR_MASKED: CH (Bitfield-Mask: 0x01) */ + + +/* =============================================== DW_DESCR_STRUCT.DESCR_CTL =============================================== */ +#define DW_DESCR_STRUCT_DESCR_CTL_WAIT_FOR_DEACT_Pos (0UL) /*!< DW_DESCR_STRUCT DESCR_CTL: WAIT_FOR_DEACT (Bit 0) */ +#define DW_DESCR_STRUCT_DESCR_CTL_WAIT_FOR_DEACT_Msk (0x3UL) /*!< DW_DESCR_STRUCT DESCR_CTL: WAIT_FOR_DEACT (Bitfield-Mask: 0x03)*/ +#define DW_DESCR_STRUCT_DESCR_CTL_INTR_TYPE_Pos (2UL) /*!< DW_DESCR_STRUCT DESCR_CTL: INTR_TYPE (Bit 2) */ +#define DW_DESCR_STRUCT_DESCR_CTL_INTR_TYPE_Msk (0xcUL) /*!< DW_DESCR_STRUCT DESCR_CTL: INTR_TYPE (Bitfield-Mask: 0x03)*/ +#define DW_DESCR_STRUCT_DESCR_CTL_TR_OUT_TYPE_Pos (4UL) /*!< DW_DESCR_STRUCT DESCR_CTL: TR_OUT_TYPE (Bit 4) */ +#define DW_DESCR_STRUCT_DESCR_CTL_TR_OUT_TYPE_Msk (0x30UL) /*!< DW_DESCR_STRUCT DESCR_CTL: TR_OUT_TYPE (Bitfield-Mask: 0x03)*/ +#define DW_DESCR_STRUCT_DESCR_CTL_TR_IN_TYPE_Pos (6UL) /*!< DW_DESCR_STRUCT DESCR_CTL: TR_IN_TYPE (Bit 6) */ +#define DW_DESCR_STRUCT_DESCR_CTL_TR_IN_TYPE_Msk (0xc0UL) /*!< DW_DESCR_STRUCT DESCR_CTL: TR_IN_TYPE (Bitfield-Mask: 0x03)*/ +#define DW_DESCR_STRUCT_DESCR_CTL_CH_DISABLE_Pos (24UL) /*!< DW_DESCR_STRUCT DESCR_CTL: CH_DISABLE (Bit 24) */ +#define DW_DESCR_STRUCT_DESCR_CTL_CH_DISABLE_Msk (0x1000000UL) /*!< DW_DESCR_STRUCT DESCR_CTL: CH_DISABLE (Bitfield-Mask: 0x01)*/ +#define DW_DESCR_STRUCT_DESCR_CTL_SRC_TRANSFER_SIZE_Pos (26UL) /*!< DW_DESCR_STRUCT DESCR_CTL: SRC_TRANSFER_SIZE (Bit 26) */ +#define DW_DESCR_STRUCT_DESCR_CTL_SRC_TRANSFER_SIZE_Msk (0x4000000UL) /*!< DW_DESCR_STRUCT DESCR_CTL: SRC_TRANSFER_SIZE (Bitfield-Mask: 0x01)*/ +#define DW_DESCR_STRUCT_DESCR_CTL_DST_TRANSFER_SIZE_Pos (27UL) /*!< DW_DESCR_STRUCT DESCR_CTL: DST_TRANSFER_SIZE (Bit 27) */ +#define DW_DESCR_STRUCT_DESCR_CTL_DST_TRANSFER_SIZE_Msk (0x8000000UL) /*!< DW_DESCR_STRUCT DESCR_CTL: DST_TRANSFER_SIZE (Bitfield-Mask: 0x01)*/ +#define DW_DESCR_STRUCT_DESCR_CTL_DATA_SIZE_Pos (28UL) /*!< DW_DESCR_STRUCT DESCR_CTL: DATA_SIZE (Bit 28) */ +#define DW_DESCR_STRUCT_DESCR_CTL_DATA_SIZE_Msk (0x30000000UL) /*!< DW_DESCR_STRUCT DESCR_CTL: DATA_SIZE (Bitfield-Mask: 0x03)*/ +#define DW_DESCR_STRUCT_DESCR_CTL_DESCR_TYPE_Pos (30UL) /*!< DW_DESCR_STRUCT DESCR_CTL: DESCR_TYPE (Bit 30) */ +#define DW_DESCR_STRUCT_DESCR_CTL_DESCR_TYPE_Msk (0xc0000000UL) /*!< DW_DESCR_STRUCT DESCR_CTL: DESCR_TYPE (Bitfield-Mask: 0x03)*/ +/* =============================================== DW_DESCR_STRUCT.DESCR_SRC =============================================== */ +#define DW_DESCR_STRUCT_DESCR_SRC_SRC_ADDR_Pos (0UL) /*!< DW_DESCR_STRUCT DESCR_SRC: SRC_ADDR (Bit 0) */ +#define DW_DESCR_STRUCT_DESCR_SRC_SRC_ADDR_Msk (0xffffffffUL) /*!< DW_DESCR_STRUCT DESCR_SRC: SRC_ADDR (Bitfield-Mask: 0xffffffff)*/ +/* =============================================== DW_DESCR_STRUCT.DESCR_DST =============================================== */ +#define DW_DESCR_STRUCT_DESCR_DST_DST_ADDR_Pos (0UL) /*!< DW_DESCR_STRUCT DESCR_DST: DST_ADDR (Bit 0) */ +#define DW_DESCR_STRUCT_DESCR_DST_DST_ADDR_Msk (0xffffffffUL) /*!< DW_DESCR_STRUCT DESCR_DST: DST_ADDR (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== DW_DESCR_STRUCT.DESCR_X_CTL ============================================== */ +#define DW_DESCR_STRUCT_DESCR_X_CTL_SRC_X_INCR_Pos (0UL) /*!< DW_DESCR_STRUCT DESCR_X_CTL: SRC_X_INCR (Bit 0) */ +#define DW_DESCR_STRUCT_DESCR_X_CTL_SRC_X_INCR_Msk (0xfffUL) /*!< DW_DESCR_STRUCT DESCR_X_CTL: SRC_X_INCR (Bitfield-Mask: 0xfff)*/ +#define DW_DESCR_STRUCT_DESCR_X_CTL_DST_X_INCR_Pos (12UL) /*!< DW_DESCR_STRUCT DESCR_X_CTL: DST_X_INCR (Bit 12) */ +#define DW_DESCR_STRUCT_DESCR_X_CTL_DST_X_INCR_Msk (0xfff000UL) /*!< DW_DESCR_STRUCT DESCR_X_CTL: DST_X_INCR (Bitfield-Mask: 0xfff)*/ +#define DW_DESCR_STRUCT_DESCR_X_CTL_X_COUNT_Pos (24UL) /*!< DW_DESCR_STRUCT DESCR_X_CTL: X_COUNT (Bit 24) */ +#define DW_DESCR_STRUCT_DESCR_X_CTL_X_COUNT_Msk (0xff000000UL) /*!< DW_DESCR_STRUCT DESCR_X_CTL: X_COUNT (Bitfield-Mask: 0xff)*/ +/* ============================================== DW_DESCR_STRUCT.DESCR_Y_CTL ============================================== */ +#define DW_DESCR_STRUCT_DESCR_Y_CTL_SRC_Y_INCR_Pos (0UL) /*!< DW_DESCR_STRUCT DESCR_Y_CTL: SRC_Y_INCR (Bit 0) */ +#define DW_DESCR_STRUCT_DESCR_Y_CTL_SRC_Y_INCR_Msk (0xfffUL) /*!< DW_DESCR_STRUCT DESCR_Y_CTL: SRC_Y_INCR (Bitfield-Mask: 0xfff)*/ +#define DW_DESCR_STRUCT_DESCR_Y_CTL_DST_Y_INCR_Pos (12UL) /*!< DW_DESCR_STRUCT DESCR_Y_CTL: DST_Y_INCR (Bit 12) */ +#define DW_DESCR_STRUCT_DESCR_Y_CTL_DST_Y_INCR_Msk (0xfff000UL) /*!< DW_DESCR_STRUCT DESCR_Y_CTL: DST_Y_INCR (Bitfield-Mask: 0xfff)*/ +#define DW_DESCR_STRUCT_DESCR_Y_CTL_Y_COUNT_Pos (24UL) /*!< DW_DESCR_STRUCT DESCR_Y_CTL: Y_COUNT (Bit 24) */ +#define DW_DESCR_STRUCT_DESCR_Y_CTL_Y_COUNT_Msk (0xff000000UL) /*!< DW_DESCR_STRUCT DESCR_Y_CTL: Y_COUNT (Bitfield-Mask: 0xff)*/ +/* ============================================ DW_DESCR_STRUCT.DESCR_NEXT_PTR ============================================= */ +#define DW_DESCR_STRUCT_DESCR_NEXT_PTR_ADDR_Pos (2UL) /*!< DW_DESCR_STRUCT DESCR_NEXT_PTR: ADDR (Bit 2) */ +#define DW_DESCR_STRUCT_DESCR_NEXT_PTR_ADDR_Msk (0xfffffffcUL) /*!< DW_DESCR_STRUCT DESCR_NEXT_PTR: ADDR (Bitfield-Mask: 0x3fffffff)*/ + + +/* ======================================================== DW.CTL ========================================================= */ +#define DW_CTL_ENABLED_Pos (31UL) /*!< DW CTL: ENABLED (Bit 31) */ +#define DW_CTL_ENABLED_Msk (0x80000000UL) /*!< DW CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ======================================================= DW.STATUS ======================================================= */ +#define DW_STATUS_P_Pos (0UL) /*!< DW STATUS: P (Bit 0) */ +#define DW_STATUS_P_Msk (0x1UL) /*!< DW STATUS: P (Bitfield-Mask: 0x01) */ +#define DW_STATUS_NS_Pos (1UL) /*!< DW STATUS: NS (Bit 1) */ +#define DW_STATUS_NS_Msk (0x2UL) /*!< DW STATUS: NS (Bitfield-Mask: 0x01) */ +#define DW_STATUS_B_Pos (2UL) /*!< DW STATUS: B (Bit 2) */ +#define DW_STATUS_B_Msk (0x4UL) /*!< DW STATUS: B (Bitfield-Mask: 0x01) */ +#define DW_STATUS_PC_Pos (4UL) /*!< DW STATUS: PC (Bit 4) */ +#define DW_STATUS_PC_Msk (0xf0UL) /*!< DW STATUS: PC (Bitfield-Mask: 0x0f) */ +#define DW_STATUS_CH_IDX_Pos (8UL) /*!< DW STATUS: CH_IDX (Bit 8) */ +#define DW_STATUS_CH_IDX_Msk (0x1f00UL) /*!< DW STATUS: CH_IDX (Bitfield-Mask: 0x1f) */ +#define DW_STATUS_PRIO_Pos (16UL) /*!< DW STATUS: PRIO (Bit 16) */ +#define DW_STATUS_PRIO_Msk (0x30000UL) /*!< DW STATUS: PRIO (Bitfield-Mask: 0x03) */ +#define DW_STATUS_PREEMPTABLE_Pos (18UL) /*!< DW STATUS: PREEMPTABLE (Bit 18) */ +#define DW_STATUS_PREEMPTABLE_Msk (0x40000UL) /*!< DW STATUS: PREEMPTABLE (Bitfield-Mask: 0x01) */ +#define DW_STATUS_STATE_Pos (20UL) /*!< DW STATUS: STATE (Bit 20) */ +#define DW_STATUS_STATE_Msk (0x700000UL) /*!< DW STATUS: STATE (Bitfield-Mask: 0x07) */ +#define DW_STATUS_ACTIVE_Pos (31UL) /*!< DW STATUS: ACTIVE (Bit 31) */ +#define DW_STATUS_ACTIVE_Msk (0x80000000UL) /*!< DW STATUS: ACTIVE (Bitfield-Mask: 0x01) */ +/* ====================================================== DW.PENDING ======================================================= */ +#define DW_PENDING_CH_PENDING_Pos (0UL) /*!< DW PENDING: CH_PENDING (Bit 0) */ +#define DW_PENDING_CH_PENDING_Msk (0xffffffffUL) /*!< DW PENDING: CH_PENDING (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== DW.STATUS_INTR ===================================================== */ +#define DW_STATUS_INTR_CH_Pos (0UL) /*!< DW STATUS_INTR: CH (Bit 0) */ +#define DW_STATUS_INTR_CH_Msk (0xffffffffUL) /*!< DW STATUS_INTR: CH (Bitfield-Mask: 0xffffffff) */ +/* ================================================= DW.STATUS_INTR_MASKED ================================================= */ +#define DW_STATUS_INTR_MASKED_CH_Pos (0UL) /*!< DW STATUS_INTR_MASKED: CH (Bit 0) */ +#define DW_STATUS_INTR_MASKED_CH_Msk (0xffffffffUL) /*!< DW STATUS_INTR_MASKED: CH (Bitfield-Mask: 0xffffffff) */ +/* =================================================== DW.ACT_DESCR_CTL ==================================================== */ +#define DW_ACT_DESCR_CTL_DATA_Pos (0UL) /*!< DW ACT_DESCR_CTL: DATA (Bit 0) */ +#define DW_ACT_DESCR_CTL_DATA_Msk (0xffffffffUL) /*!< DW ACT_DESCR_CTL: DATA (Bitfield-Mask: 0xffffffff) */ +/* =================================================== DW.ACT_DESCR_SRC ==================================================== */ +#define DW_ACT_DESCR_SRC_DATA_Pos (0UL) /*!< DW ACT_DESCR_SRC: DATA (Bit 0) */ +#define DW_ACT_DESCR_SRC_DATA_Msk (0xffffffffUL) /*!< DW ACT_DESCR_SRC: DATA (Bitfield-Mask: 0xffffffff) */ +/* =================================================== DW.ACT_DESCR_DST ==================================================== */ +#define DW_ACT_DESCR_DST_DATA_Pos (0UL) /*!< DW ACT_DESCR_DST: DATA (Bit 0) */ +#define DW_ACT_DESCR_DST_DATA_Msk (0xffffffffUL) /*!< DW ACT_DESCR_DST: DATA (Bitfield-Mask: 0xffffffff) */ +/* ================================================== DW.ACT_DESCR_X_CTL =================================================== */ +#define DW_ACT_DESCR_X_CTL_DATA_Pos (0UL) /*!< DW ACT_DESCR_X_CTL: DATA (Bit 0) */ +#define DW_ACT_DESCR_X_CTL_DATA_Msk (0xffffffffUL) /*!< DW ACT_DESCR_X_CTL: DATA (Bitfield-Mask: 0xffffffff) */ +/* ================================================== DW.ACT_DESCR_Y_CTL =================================================== */ +#define DW_ACT_DESCR_Y_CTL_DATA_Pos (0UL) /*!< DW ACT_DESCR_Y_CTL: DATA (Bit 0) */ +#define DW_ACT_DESCR_Y_CTL_DATA_Msk (0xffffffffUL) /*!< DW ACT_DESCR_Y_CTL: DATA (Bitfield-Mask: 0xffffffff) */ +/* ================================================= DW.ACT_DESCR_NEXT_PTR ================================================= */ +#define DW_ACT_DESCR_NEXT_PTR_ADDR_Pos (2UL) /*!< DW ACT_DESCR_NEXT_PTR: ADDR (Bit 2) */ +#define DW_ACT_DESCR_NEXT_PTR_ADDR_Msk (0xfffffffcUL) /*!< DW ACT_DESCR_NEXT_PTR: ADDR (Bitfield-Mask: 0x3fffffff) */ +/* ====================================================== DW.ACT_SRC ======================================================= */ +#define DW_ACT_SRC_SRC_ADDR_Pos (0UL) /*!< DW ACT_SRC: SRC_ADDR (Bit 0) */ +#define DW_ACT_SRC_SRC_ADDR_Msk (0xffffffffUL) /*!< DW ACT_SRC: SRC_ADDR (Bitfield-Mask: 0xffffffff) */ +/* ====================================================== DW.ACT_DST ======================================================= */ +#define DW_ACT_DST_DST_ADDR_Pos (0UL) /*!< DW ACT_DST: DST_ADDR (Bit 0) */ +#define DW_ACT_DST_DST_ADDR_Msk (0xffffffffUL) /*!< DW ACT_DST: DST_ADDR (Bitfield-Mask: 0xffffffff) */ + + +#endif /* _CYIP_DW_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_efuse.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_efuse.h new file mode 100644 index 0000000000..e03d5e6d35 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_efuse.h @@ -0,0 +1,318 @@ +/***************************************************************************//** +* \file cyip_efuse.h +* +* \brief +* EFUSE IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_EFUSE_H_ +#define _CYIP_EFUSE_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ EFUSE ================ */ +/* =========================================================================================================================== */ + +#define EFUSE_SECTION_SIZE 0x00000080UL + +/** + * \brief EFUSE MXS40 registers (EFUSE) + */ +typedef struct { /*!< EFUSE Structure */ + __IOM uint32_t CTL; /*!< 0x00000000 Control */ + __IM uint32_t RESERVED[3]; + __IOM uint32_t CMD; /*!< 0x00000010 Command */ + __IM uint32_t RESERVED1[3]; + __IOM uint32_t SEQ_DEFAULT; /*!< 0x00000020 Sequencer Default value */ + __IM uint32_t RESERVED2[7]; + __IOM uint32_t SEQ_READ_CTL_0; /*!< 0x00000040 Sequencer read control 0 */ + __IOM uint32_t SEQ_READ_CTL_1; /*!< 0x00000044 Sequencer read control 1 */ + __IOM uint32_t SEQ_READ_CTL_2; /*!< 0x00000048 Sequencer read control 2 */ + __IOM uint32_t SEQ_READ_CTL_3; /*!< 0x0000004C Sequencer read control 3 */ + __IOM uint32_t SEQ_READ_CTL_4; /*!< 0x00000050 Sequencer read control 4 */ + __IOM uint32_t SEQ_READ_CTL_5; /*!< 0x00000054 Sequencer read control 5 */ + __IM uint32_t RESERVED3[2]; + __IOM uint32_t SEQ_PROGRAM_CTL_0; /*!< 0x00000060 Sequencer program control 0 */ + __IOM uint32_t SEQ_PROGRAM_CTL_1; /*!< 0x00000064 Sequencer program control 1 */ + __IOM uint32_t SEQ_PROGRAM_CTL_2; /*!< 0x00000068 Sequencer program control 2 */ + __IOM uint32_t SEQ_PROGRAM_CTL_3; /*!< 0x0000006C Sequencer program control 3 */ + __IOM uint32_t SEQ_PROGRAM_CTL_4; /*!< 0x00000070 Sequencer program control 4 */ + __IOM uint32_t SEQ_PROGRAM_CTL_5; /*!< 0x00000074 Sequencer program control 5 */ +} EFUSE_Type; /*!< Size = 120 (0x78) */ + + +/* ======================================================= EFUSE.CTL ======================================================= */ +#define EFUSE_CTL_ENABLED_Pos (31UL) /*!< EFUSE CTL: ENABLED (Bit 31) */ +#define EFUSE_CTL_ENABLED_Msk (0x80000000UL) /*!< EFUSE CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ======================================================= EFUSE.CMD ======================================================= */ +#define EFUSE_CMD_BIT_DATA_Pos (0UL) /*!< EFUSE CMD: BIT_DATA (Bit 0) */ +#define EFUSE_CMD_BIT_DATA_Msk (0x1UL) /*!< EFUSE CMD: BIT_DATA (Bitfield-Mask: 0x01) */ +#define EFUSE_CMD_BIT_ADDR_Pos (4UL) /*!< EFUSE CMD: BIT_ADDR (Bit 4) */ +#define EFUSE_CMD_BIT_ADDR_Msk (0x70UL) /*!< EFUSE CMD: BIT_ADDR (Bitfield-Mask: 0x07) */ +#define EFUSE_CMD_BYTE_ADDR_Pos (8UL) /*!< EFUSE CMD: BYTE_ADDR (Bit 8) */ +#define EFUSE_CMD_BYTE_ADDR_Msk (0x1f00UL) /*!< EFUSE CMD: BYTE_ADDR (Bitfield-Mask: 0x1f) */ +#define EFUSE_CMD_MACRO_ADDR_Pos (16UL) /*!< EFUSE CMD: MACRO_ADDR (Bit 16) */ +#define EFUSE_CMD_MACRO_ADDR_Msk (0xf0000UL) /*!< EFUSE CMD: MACRO_ADDR (Bitfield-Mask: 0x0f) */ +#define EFUSE_CMD_START_Pos (31UL) /*!< EFUSE CMD: START (Bit 31) */ +#define EFUSE_CMD_START_Msk (0x80000000UL) /*!< EFUSE CMD: START (Bitfield-Mask: 0x01) */ +/* =================================================== EFUSE.SEQ_DEFAULT =================================================== */ +#define EFUSE_SEQ_DEFAULT_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_DEFAULT: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_DEFAULT_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_DEFAULT: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_DEFAULT_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_DEFAULT: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_DEFAULT_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_DEFAULT: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_DEFAULT_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_DEFAULT: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_DEFAULT_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_DEFAULT: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_DEFAULT_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_DEFAULT: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_DEFAULT_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_DEFAULT: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_DEFAULT_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_DEFAULT: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_DEFAULT_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_DEFAULT: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_DEFAULT_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_DEFAULT: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_DEFAULT_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_DEFAULT: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_DEFAULT_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_DEFAULT: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_DEFAULT_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_DEFAULT: STROBE_G (Bitfield-Mask: 0x01) */ +/* ================================================= EFUSE.SEQ_READ_CTL_0 ================================================== */ +#define EFUSE_SEQ_READ_CTL_0_CYCLES_Pos (0UL) /*!< EFUSE SEQ_READ_CTL_0: CYCLES (Bit 0) */ +#define EFUSE_SEQ_READ_CTL_0_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_READ_CTL_0: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_READ_CTL_0_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_READ_CTL_0: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_0_DONE_Pos (31UL) /*!< EFUSE SEQ_READ_CTL_0: DONE (Bit 31) */ +#define EFUSE_SEQ_READ_CTL_0_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_READ_CTL_0: DONE (Bitfield-Mask: 0x01) */ +/* ================================================= EFUSE.SEQ_READ_CTL_1 ================================================== */ +#define EFUSE_SEQ_READ_CTL_1_CYCLES_Pos (0UL) /*!< EFUSE SEQ_READ_CTL_1: CYCLES (Bit 0) */ +#define EFUSE_SEQ_READ_CTL_1_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_READ_CTL_1: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_READ_CTL_1_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_READ_CTL_1: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_1_DONE_Pos (31UL) /*!< EFUSE SEQ_READ_CTL_1: DONE (Bit 31) */ +#define EFUSE_SEQ_READ_CTL_1_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_READ_CTL_1: DONE (Bitfield-Mask: 0x01) */ +/* ================================================= EFUSE.SEQ_READ_CTL_2 ================================================== */ +#define EFUSE_SEQ_READ_CTL_2_CYCLES_Pos (0UL) /*!< EFUSE SEQ_READ_CTL_2: CYCLES (Bit 0) */ +#define EFUSE_SEQ_READ_CTL_2_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_READ_CTL_2: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_READ_CTL_2_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_READ_CTL_2: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_2_DONE_Pos (31UL) /*!< EFUSE SEQ_READ_CTL_2: DONE (Bit 31) */ +#define EFUSE_SEQ_READ_CTL_2_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_READ_CTL_2: DONE (Bitfield-Mask: 0x01) */ +/* ================================================= EFUSE.SEQ_READ_CTL_3 ================================================== */ +#define EFUSE_SEQ_READ_CTL_3_CYCLES_Pos (0UL) /*!< EFUSE SEQ_READ_CTL_3: CYCLES (Bit 0) */ +#define EFUSE_SEQ_READ_CTL_3_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_READ_CTL_3: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_READ_CTL_3_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_READ_CTL_3: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_3_DONE_Pos (31UL) /*!< EFUSE SEQ_READ_CTL_3: DONE (Bit 31) */ +#define EFUSE_SEQ_READ_CTL_3_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_READ_CTL_3: DONE (Bitfield-Mask: 0x01) */ +/* ================================================= EFUSE.SEQ_READ_CTL_4 ================================================== */ +#define EFUSE_SEQ_READ_CTL_4_CYCLES_Pos (0UL) /*!< EFUSE SEQ_READ_CTL_4: CYCLES (Bit 0) */ +#define EFUSE_SEQ_READ_CTL_4_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_READ_CTL_4: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_READ_CTL_4_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_READ_CTL_4: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_4_DONE_Pos (31UL) /*!< EFUSE SEQ_READ_CTL_4: DONE (Bit 31) */ +#define EFUSE_SEQ_READ_CTL_4_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_READ_CTL_4: DONE (Bitfield-Mask: 0x01) */ +/* ================================================= EFUSE.SEQ_READ_CTL_5 ================================================== */ +#define EFUSE_SEQ_READ_CTL_5_CYCLES_Pos (0UL) /*!< EFUSE SEQ_READ_CTL_5: CYCLES (Bit 0) */ +#define EFUSE_SEQ_READ_CTL_5_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_READ_CTL_5: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_READ_CTL_5_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_READ_CTL_5: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_READ_CTL_5_DONE_Pos (31UL) /*!< EFUSE SEQ_READ_CTL_5: DONE (Bit 31) */ +#define EFUSE_SEQ_READ_CTL_5_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_READ_CTL_5: DONE (Bitfield-Mask: 0x01) */ +/* ================================================ EFUSE.SEQ_PROGRAM_CTL_0 ================================================ */ +#define EFUSE_SEQ_PROGRAM_CTL_0_CYCLES_Pos (0UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: CYCLES (Bit 0) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_PROGRAM_CTL_0: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_DONE_Pos (31UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: DONE (Bit 31) */ +#define EFUSE_SEQ_PROGRAM_CTL_0_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_PROGRAM_CTL_0: DONE (Bitfield-Mask: 0x01) */ +/* ================================================ EFUSE.SEQ_PROGRAM_CTL_1 ================================================ */ +#define EFUSE_SEQ_PROGRAM_CTL_1_CYCLES_Pos (0UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: CYCLES (Bit 0) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_PROGRAM_CTL_1: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_DONE_Pos (31UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: DONE (Bit 31) */ +#define EFUSE_SEQ_PROGRAM_CTL_1_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_PROGRAM_CTL_1: DONE (Bitfield-Mask: 0x01) */ +/* ================================================ EFUSE.SEQ_PROGRAM_CTL_2 ================================================ */ +#define EFUSE_SEQ_PROGRAM_CTL_2_CYCLES_Pos (0UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: CYCLES (Bit 0) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_PROGRAM_CTL_2: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_DONE_Pos (31UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: DONE (Bit 31) */ +#define EFUSE_SEQ_PROGRAM_CTL_2_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_PROGRAM_CTL_2: DONE (Bitfield-Mask: 0x01) */ +/* ================================================ EFUSE.SEQ_PROGRAM_CTL_3 ================================================ */ +#define EFUSE_SEQ_PROGRAM_CTL_3_CYCLES_Pos (0UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: CYCLES (Bit 0) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_PROGRAM_CTL_3: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_DONE_Pos (31UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: DONE (Bit 31) */ +#define EFUSE_SEQ_PROGRAM_CTL_3_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_PROGRAM_CTL_3: DONE (Bitfield-Mask: 0x01) */ +/* ================================================ EFUSE.SEQ_PROGRAM_CTL_4 ================================================ */ +#define EFUSE_SEQ_PROGRAM_CTL_4_CYCLES_Pos (0UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: CYCLES (Bit 0) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_PROGRAM_CTL_4: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_DONE_Pos (31UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: DONE (Bit 31) */ +#define EFUSE_SEQ_PROGRAM_CTL_4_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_PROGRAM_CTL_4: DONE (Bitfield-Mask: 0x01) */ +/* ================================================ EFUSE.SEQ_PROGRAM_CTL_5 ================================================ */ +#define EFUSE_SEQ_PROGRAM_CTL_5_CYCLES_Pos (0UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: CYCLES (Bit 0) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_CYCLES_Msk (0x3ffUL) /*!< EFUSE SEQ_PROGRAM_CTL_5: CYCLES (Bitfield-Mask: 0x3ff) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_A_Pos (16UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_A (Bit 16) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_A_Msk (0x10000UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_A (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_B_Pos (17UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_B (Bit 17) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_B_Msk (0x20000UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_B (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_C_Pos (18UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_C (Bit 18) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_C_Msk (0x40000UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_C (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_D_Pos (19UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_D (Bit 19) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_D_Msk (0x80000UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_D (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_E_Pos (20UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_E (Bit 20) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_E_Msk (0x100000UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_E (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_F_Pos (21UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_F (Bit 21) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_F_Msk (0x200000UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_F (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_G_Pos (22UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_G (Bit 22) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_STROBE_G_Msk (0x400000UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: STROBE_G (Bitfield-Mask: 0x01) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_DONE_Pos (31UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: DONE (Bit 31) */ +#define EFUSE_SEQ_PROGRAM_CTL_5_DONE_Msk (0x80000000UL) /*!< EFUSE SEQ_PROGRAM_CTL_5: DONE (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_EFUSE_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_fault.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_fault.h new file mode 100644 index 0000000000..cd5922f014 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_fault.h @@ -0,0 +1,113 @@ +/***************************************************************************//** +* \file cyip_fault.h +* +* \brief +* FAULT IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_FAULT_H_ +#define _CYIP_FAULT_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ FAULT ================ */ +/* =========================================================================================================================== */ + +#define FAULT_STRUCT_SECTION_SIZE 0x00000100UL +#define FAULT_SECTION_SIZE 0x00010000UL + +/** + * \brief Fault structure (FAULT_STRUCT) + */ +typedef struct { + __IOM uint32_t CTL; /*!< 0x00000000 Fault control */ + __IM uint32_t RESERVED[2]; + __IOM uint32_t STATUS; /*!< 0x0000000C Fault status */ + __IM uint32_t DATA[4]; /*!< 0x00000010 Fault data */ + __IM uint32_t RESERVED1[8]; + __IM uint32_t PENDING0; /*!< 0x00000040 Fault pending 0 */ + __IM uint32_t PENDING1; /*!< 0x00000044 Fault pending 1 */ + __IM uint32_t PENDING2; /*!< 0x00000048 Fault pending 2 */ + __IM uint32_t RESERVED2; + __IOM uint32_t MASK0; /*!< 0x00000050 Fault mask 0 */ + __IOM uint32_t MASK1; /*!< 0x00000054 Fault mask 1 */ + __IOM uint32_t MASK2; /*!< 0x00000058 Fault mask 2 */ + __IM uint32_t RESERVED3[25]; + __IOM uint32_t INTR; /*!< 0x000000C0 Interrupt */ + __IOM uint32_t INTR_SET; /*!< 0x000000C4 Interrupt set */ + __IOM uint32_t INTR_MASK; /*!< 0x000000C8 Interrupt mask */ + __IM uint32_t INTR_MASKED; /*!< 0x000000CC Interrupt masked */ + __IM uint32_t RESERVED4[12]; +} FAULT_STRUCT_Type; /*!< Size = 208 (0xD0) */ + +/** + * \brief Fault structures (FAULT) + */ +typedef struct { /*!< FAULT Structure */ + FAULT_STRUCT_Type STRUCT[4]; /*!< 0x00000000 Fault structure */ +} FAULT_Type; /*!< Size = 1024 (0x400) */ + + +/* =================================================== FAULT_STRUCT.CTL ==================================================== */ +#define FAULT_STRUCT_CTL_TR_EN_Pos (0UL) /*!< FAULT_STRUCT CTL: TR_EN (Bit 0) */ +#define FAULT_STRUCT_CTL_TR_EN_Msk (0x1UL) /*!< FAULT_STRUCT CTL: TR_EN (Bitfield-Mask: 0x01) */ +#define FAULT_STRUCT_CTL_OUT_EN_Pos (1UL) /*!< FAULT_STRUCT CTL: OUT_EN (Bit 1) */ +#define FAULT_STRUCT_CTL_OUT_EN_Msk (0x2UL) /*!< FAULT_STRUCT CTL: OUT_EN (Bitfield-Mask: 0x01) */ +#define FAULT_STRUCT_CTL_RESET_REQ_EN_Pos (2UL) /*!< FAULT_STRUCT CTL: RESET_REQ_EN (Bit 2) */ +#define FAULT_STRUCT_CTL_RESET_REQ_EN_Msk (0x4UL) /*!< FAULT_STRUCT CTL: RESET_REQ_EN (Bitfield-Mask: 0x01) */ +/* ================================================== FAULT_STRUCT.STATUS ================================================== */ +#define FAULT_STRUCT_STATUS_IDX_Pos (0UL) /*!< FAULT_STRUCT STATUS: IDX (Bit 0) */ +#define FAULT_STRUCT_STATUS_IDX_Msk (0x7fUL) /*!< FAULT_STRUCT STATUS: IDX (Bitfield-Mask: 0x7f) */ +#define FAULT_STRUCT_STATUS_VALID_Pos (31UL) /*!< FAULT_STRUCT STATUS: VALID (Bit 31) */ +#define FAULT_STRUCT_STATUS_VALID_Msk (0x80000000UL) /*!< FAULT_STRUCT STATUS: VALID (Bitfield-Mask: 0x01) */ +/* =================================================== FAULT_STRUCT.DATA =================================================== */ +#define FAULT_STRUCT_DATA_DATA_Pos (0UL) /*!< FAULT_STRUCT DATA: DATA (Bit 0) */ +#define FAULT_STRUCT_DATA_DATA_Msk (0xffffffffUL) /*!< FAULT_STRUCT DATA: DATA (Bitfield-Mask: 0xffffffff) */ +/* ================================================= FAULT_STRUCT.PENDING0 ================================================= */ +#define FAULT_STRUCT_PENDING0_SOURCE_Pos (0UL) /*!< FAULT_STRUCT PENDING0: SOURCE (Bit 0) */ +#define FAULT_STRUCT_PENDING0_SOURCE_Msk (0xffffffffUL) /*!< FAULT_STRUCT PENDING0: SOURCE (Bitfield-Mask: 0xffffffff) */ +/* ================================================= FAULT_STRUCT.PENDING1 ================================================= */ +#define FAULT_STRUCT_PENDING1_SOURCE_Pos (0UL) /*!< FAULT_STRUCT PENDING1: SOURCE (Bit 0) */ +#define FAULT_STRUCT_PENDING1_SOURCE_Msk (0xffffffffUL) /*!< FAULT_STRUCT PENDING1: SOURCE (Bitfield-Mask: 0xffffffff) */ +/* ================================================= FAULT_STRUCT.PENDING2 ================================================= */ +#define FAULT_STRUCT_PENDING2_SOURCE_Pos (0UL) /*!< FAULT_STRUCT PENDING2: SOURCE (Bit 0) */ +#define FAULT_STRUCT_PENDING2_SOURCE_Msk (0xffffffffUL) /*!< FAULT_STRUCT PENDING2: SOURCE (Bitfield-Mask: 0xffffffff) */ +/* ================================================== FAULT_STRUCT.MASK0 =================================================== */ +#define FAULT_STRUCT_MASK0_SOURCE_Pos (0UL) /*!< FAULT_STRUCT MASK0: SOURCE (Bit 0) */ +#define FAULT_STRUCT_MASK0_SOURCE_Msk (0xffffffffUL) /*!< FAULT_STRUCT MASK0: SOURCE (Bitfield-Mask: 0xffffffff) */ +/* ================================================== FAULT_STRUCT.MASK1 =================================================== */ +#define FAULT_STRUCT_MASK1_SOURCE_Pos (0UL) /*!< FAULT_STRUCT MASK1: SOURCE (Bit 0) */ +#define FAULT_STRUCT_MASK1_SOURCE_Msk (0xffffffffUL) /*!< FAULT_STRUCT MASK1: SOURCE (Bitfield-Mask: 0xffffffff) */ +/* ================================================== FAULT_STRUCT.MASK2 =================================================== */ +#define FAULT_STRUCT_MASK2_SOURCE_Pos (0UL) /*!< FAULT_STRUCT MASK2: SOURCE (Bit 0) */ +#define FAULT_STRUCT_MASK2_SOURCE_Msk (0xffffffffUL) /*!< FAULT_STRUCT MASK2: SOURCE (Bitfield-Mask: 0xffffffff) */ +/* =================================================== FAULT_STRUCT.INTR =================================================== */ +#define FAULT_STRUCT_INTR_FAULT_Pos (0UL) /*!< FAULT_STRUCT INTR: FAULT (Bit 0) */ +#define FAULT_STRUCT_INTR_FAULT_Msk (0x1UL) /*!< FAULT_STRUCT INTR: FAULT (Bitfield-Mask: 0x01) */ +/* ================================================= FAULT_STRUCT.INTR_SET ================================================= */ +#define FAULT_STRUCT_INTR_SET_FAULT_Pos (0UL) /*!< FAULT_STRUCT INTR_SET: FAULT (Bit 0) */ +#define FAULT_STRUCT_INTR_SET_FAULT_Msk (0x1UL) /*!< FAULT_STRUCT INTR_SET: FAULT (Bitfield-Mask: 0x01) */ +/* ================================================ FAULT_STRUCT.INTR_MASK ================================================= */ +#define FAULT_STRUCT_INTR_MASK_FAULT_Pos (0UL) /*!< FAULT_STRUCT INTR_MASK: FAULT (Bit 0) */ +#define FAULT_STRUCT_INTR_MASK_FAULT_Msk (0x1UL) /*!< FAULT_STRUCT INTR_MASK: FAULT (Bitfield-Mask: 0x01) */ +/* =============================================== FAULT_STRUCT.INTR_MASKED ================================================ */ +#define FAULT_STRUCT_INTR_MASKED_FAULT_Pos (0UL) /*!< FAULT_STRUCT INTR_MASKED: FAULT (Bit 0) */ +#define FAULT_STRUCT_INTR_MASKED_FAULT_Msk (0x1UL) /*!< FAULT_STRUCT INTR_MASKED: FAULT (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_FAULT_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_flashc.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_flashc.h new file mode 100644 index 0000000000..6243a8e5d6 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_flashc.h @@ -0,0 +1,518 @@ +/***************************************************************************//** +* \file cyip_flashc.h +* +* \brief +* FLASHC IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_FLASHC_H_ +#define _CYIP_FLASHC_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ FLASHC ================ */ +/* =========================================================================================================================== */ + +#define FLASHC_FM_CTL_SECTION_SIZE 0x00001000UL +#define FLASHC_SECTION_SIZE 0x00010000UL + +/** + * \brief Flash Macro Registers (FLASHC_FM_CTL) + */ +typedef struct { + __IOM uint32_t FM_CTL; /*!< 0x00000000 Flash macro control */ + __IM uint32_t STATUS; /*!< 0x00000004 Status */ + __IOM uint32_t FM_ADDR; /*!< 0x00000008 Flash macro address */ + __IM uint32_t GEOMETRY; /*!< 0x0000000C Regular flash geometry */ + __IM uint32_t GEOMETRY_SUPERVISORY; /*!< 0x00000010 Supervisory flash geometry */ + __IOM uint32_t TIMER_CTL; /*!< 0x00000014 Timer control */ + __IOM uint32_t ANA_CTL0; /*!< 0x00000018 Analog control 0 */ + __IOM uint32_t ANA_CTL1; /*!< 0x0000001C Analog control 1 */ + __IM uint32_t GEOMETRY_GEN; /*!< 0x00000020 General FM Geometry Info */ + __IOM uint32_t TEST_CTL; /*!< 0x00000024 Test mode control */ + __IOM uint32_t WAIT_CTL; /*!< 0x00000028 Wiat State control */ + __IM uint32_t MONITOR_STATUS; /*!< 0x0000002C Monitor Status */ + __IOM uint32_t SCRATCH_CTL; /*!< 0x00000030 Scratch Control */ + __IOM uint32_t HV_CTL; /*!< 0x00000034 High voltage control */ + __OM uint32_t ACLK_CTL; /*!< 0x00000038 Aclk control */ + __IOM uint32_t INTR; /*!< 0x0000003C Interrupt */ + __IOM uint32_t INTR_SET; /*!< 0x00000040 Interrupt set */ + __IOM uint32_t INTR_MASK; /*!< 0x00000044 Interrupt mask */ + __IM uint32_t INTR_MASKED; /*!< 0x00000048 Interrupt masked */ + __OM uint32_t FM_HV_DATA_ALL; /*!< 0x0000004C Flash macro high Voltage page latches data (for all page + latches) */ + __IOM uint32_t CAL_CTL0; /*!< 0x00000050 Cal control BG LO trim bits */ + __IOM uint32_t CAL_CTL1; /*!< 0x00000054 Cal control BG HI trim bits */ + __IOM uint32_t CAL_CTL2; /*!< 0x00000058 Cal control BG LO&HI ipref trim, ref sel, fm_active, turbo_ext */ + __IOM uint32_t CAL_CTL3; /*!< 0x0000005C Cal control osc trim bits, idac, sdac, itim, bdac. */ + __OM uint32_t BOOKMARK; /*!< 0x00000060 Bookmark register - keeps the current FW HV seq */ + __IM uint32_t RESERVED[7]; + __IOM uint32_t RED_CTL01; /*!< 0x00000080 Redundancy Control normal sectors 0,1 */ + __IOM uint32_t RED_CTL23; /*!< 0x00000084 Redundancy Controll normal sectors 2,3 */ + __IOM uint32_t RED_CTL45; /*!< 0x00000088 Redundancy Controll normal sectors 4,5 */ + __IOM uint32_t RED_CTL67; /*!< 0x0000008C Redundancy Controll normal sectors 6,7 */ + __IOM uint32_t RED_CTL_SM01; /*!< 0x00000090 Redundancy Controll special sectors 0,1 */ + __IM uint32_t RESERVED1[27]; + __IM uint32_t TM_CMPR[32]; /*!< 0x00000100 Comparison between FM data out and Page Latches on each + column. */ + __IM uint32_t RESERVED2[416]; + __IOM uint32_t FM_HV_DATA[256]; /*!< 0x00000800 Flash macro high Voltage page latches data */ + __IM uint32_t FM_MEM_DATA[256]; /*!< 0x00000C00 Flash macro memory sense amplifier and column decoder data */ +} FLASHC_FM_CTL_Type; /*!< Size = 4096 (0x1000) */ + +/** + * \brief Flash controller (FLASHC) + */ +typedef struct { /*!< FLASHC Structure */ + __IOM uint32_t FLASH_CTL; /*!< 0x00000000 Control */ + __IOM uint32_t FLASH_PWR_CTL; /*!< 0x00000004 Flash power control */ + __IOM uint32_t FLASH_CMD; /*!< 0x00000008 Command */ + __IM uint32_t RESERVED[253]; + __IOM uint32_t CM0_CA_CTL0; /*!< 0x00000400 CM0+ cache control */ + __IOM uint32_t CM0_CA_CTL1; /*!< 0x00000404 CM0+ cache control */ + __IOM uint32_t CM0_CA_CMD; /*!< 0x00000408 CM0+ cache command */ + __IM uint32_t RESERVED1[13]; + __IM uint32_t CM0_CA_STATUS0; /*!< 0x00000440 CM0+ cache status 0 */ + __IM uint32_t CM0_CA_STATUS1; /*!< 0x00000444 CM0+ cache status 1 */ + __IM uint32_t CM0_CA_STATUS2; /*!< 0x00000448 CM0+ cache status 2 */ + __IM uint32_t RESERVED2[13]; + __IOM uint32_t CM4_CA_CTL0; /*!< 0x00000480 CM4 cache control */ + __IOM uint32_t CM4_CA_CTL1; /*!< 0x00000484 CM0+ cache control */ + __IOM uint32_t CM4_CA_CMD; /*!< 0x00000488 CM4 cache command */ + __IM uint32_t RESERVED3[13]; + __IM uint32_t CM4_CA_STATUS0; /*!< 0x000004C0 CM4 cache status 0 */ + __IM uint32_t CM4_CA_STATUS1; /*!< 0x000004C4 CM4 cache status 1 */ + __IM uint32_t CM4_CA_STATUS2; /*!< 0x000004C8 CM4 cache status 2 */ + __IM uint32_t RESERVED4[13]; + __IOM uint32_t CRYPTO_BUFF_CTL; /*!< 0x00000500 Cryptography buffer control */ + __IM uint32_t RESERVED5; + __IOM uint32_t CRYPTO_BUFF_CMD; /*!< 0x00000508 Cryptography buffer command */ + __IM uint32_t RESERVED6[29]; + __IOM uint32_t DW0_BUFF_CTL; /*!< 0x00000580 Datawire 0 buffer control */ + __IM uint32_t RESERVED7; + __IOM uint32_t DW0_BUFF_CMD; /*!< 0x00000588 Datawire 0 buffer command */ + __IM uint32_t RESERVED8[29]; + __IOM uint32_t DW1_BUFF_CTL; /*!< 0x00000600 Datawire 1 buffer control */ + __IM uint32_t RESERVED9; + __IOM uint32_t DW1_BUFF_CMD; /*!< 0x00000608 Datawire 1 buffer command */ + __IM uint32_t RESERVED10[29]; + __IOM uint32_t DAP_BUFF_CTL; /*!< 0x00000680 Debug access port buffer control */ + __IM uint32_t RESERVED11; + __IOM uint32_t DAP_BUFF_CMD; /*!< 0x00000688 Debug access port buffer command */ + __IM uint32_t RESERVED12[29]; + __IOM uint32_t EXT_MS0_BUFF_CTL; /*!< 0x00000700 External master 0 buffer control */ + __IM uint32_t RESERVED13; + __IOM uint32_t EXT_MS0_BUFF_CMD; /*!< 0x00000708 External master 0 buffer command */ + __IM uint32_t RESERVED14[29]; + __IOM uint32_t EXT_MS1_BUFF_CTL; /*!< 0x00000780 External master 1 buffer control */ + __IM uint32_t RESERVED15; + __IOM uint32_t EXT_MS1_BUFF_CMD; /*!< 0x00000788 External master 1 buffer command */ + __IM uint32_t RESERVED16[14877]; + FLASHC_FM_CTL_Type FM_CTL; /*!< 0x0000F000 Flash Macro Registers */ +} FLASHC_Type; /*!< Size = 65536 (0x10000) */ + + +/* ================================================= FLASHC_FM_CTL.FM_CTL ================================================== */ +#define FLASHC_FM_CTL_FM_CTL_FM_MODE_Pos (0UL) /*!< FLASHC_FM_CTL FM_CTL: FM_MODE (Bit 0) */ +#define FLASHC_FM_CTL_FM_CTL_FM_MODE_Msk (0xfUL) /*!< FLASHC_FM_CTL FM_CTL: FM_MODE (Bitfield-Mask: 0x0f) */ +#define FLASHC_FM_CTL_FM_CTL_FM_SEQ_Pos (8UL) /*!< FLASHC_FM_CTL FM_CTL: FM_SEQ (Bit 8) */ +#define FLASHC_FM_CTL_FM_CTL_FM_SEQ_Msk (0x300UL) /*!< FLASHC_FM_CTL FM_CTL: FM_SEQ (Bitfield-Mask: 0x03) */ +#define FLASHC_FM_CTL_FM_CTL_DAA_MUX_SEL_Pos (16UL) /*!< FLASHC_FM_CTL FM_CTL: DAA_MUX_SEL (Bit 16) */ +#define FLASHC_FM_CTL_FM_CTL_DAA_MUX_SEL_Msk (0x7f0000UL) /*!< FLASHC_FM_CTL FM_CTL: DAA_MUX_SEL (Bitfield-Mask: 0x7f) */ +#define FLASHC_FM_CTL_FM_CTL_IF_SEL_Pos (24UL) /*!< FLASHC_FM_CTL FM_CTL: IF_SEL (Bit 24) */ +#define FLASHC_FM_CTL_FM_CTL_IF_SEL_Msk (0x1000000UL) /*!< FLASHC_FM_CTL FM_CTL: IF_SEL (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_FM_CTL_WR_EN_Pos (25UL) /*!< FLASHC_FM_CTL FM_CTL: WR_EN (Bit 25) */ +#define FLASHC_FM_CTL_FM_CTL_WR_EN_Msk (0x2000000UL) /*!< FLASHC_FM_CTL FM_CTL: WR_EN (Bitfield-Mask: 0x01) */ +/* ================================================= FLASHC_FM_CTL.STATUS ================================================== */ +#define FLASHC_FM_CTL_STATUS_HV_TIMER_RUNNING_Pos (0UL) /*!< FLASHC_FM_CTL STATUS: HV_TIMER_RUNNING (Bit 0) */ +#define FLASHC_FM_CTL_STATUS_HV_TIMER_RUNNING_Msk (0x1UL) /*!< FLASHC_FM_CTL STATUS: HV_TIMER_RUNNING (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_STATUS_HV_REGS_ISOLATED_Pos (1UL) /*!< FLASHC_FM_CTL STATUS: HV_REGS_ISOLATED (Bit 1) */ +#define FLASHC_FM_CTL_STATUS_HV_REGS_ISOLATED_Msk (0x2UL) /*!< FLASHC_FM_CTL STATUS: HV_REGS_ISOLATED (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_STATUS_ILLEGAL_HVOP_Pos (2UL) /*!< FLASHC_FM_CTL STATUS: ILLEGAL_HVOP (Bit 2) */ +#define FLASHC_FM_CTL_STATUS_ILLEGAL_HVOP_Msk (0x4UL) /*!< FLASHC_FM_CTL STATUS: ILLEGAL_HVOP (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_STATUS_TURBO_N_Pos (3UL) /*!< FLASHC_FM_CTL STATUS: TURBO_N (Bit 3) */ +#define FLASHC_FM_CTL_STATUS_TURBO_N_Msk (0x8UL) /*!< FLASHC_FM_CTL STATUS: TURBO_N (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_STATUS_WR_EN_MON_Pos (4UL) /*!< FLASHC_FM_CTL STATUS: WR_EN_MON (Bit 4) */ +#define FLASHC_FM_CTL_STATUS_WR_EN_MON_Msk (0x10UL) /*!< FLASHC_FM_CTL STATUS: WR_EN_MON (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_STATUS_IF_SEL_MON_Pos (5UL) /*!< FLASHC_FM_CTL STATUS: IF_SEL_MON (Bit 5) */ +#define FLASHC_FM_CTL_STATUS_IF_SEL_MON_Msk (0x20UL) /*!< FLASHC_FM_CTL STATUS: IF_SEL_MON (Bitfield-Mask: 0x01) */ +/* ================================================= FLASHC_FM_CTL.FM_ADDR ================================================= */ +#define FLASHC_FM_CTL_FM_ADDR_RA_Pos (0UL) /*!< FLASHC_FM_CTL FM_ADDR: RA (Bit 0) */ +#define FLASHC_FM_CTL_FM_ADDR_RA_Msk (0xffffUL) /*!< FLASHC_FM_CTL FM_ADDR: RA (Bitfield-Mask: 0xffff) */ +#define FLASHC_FM_CTL_FM_ADDR_BA_Pos (16UL) /*!< FLASHC_FM_CTL FM_ADDR: BA (Bit 16) */ +#define FLASHC_FM_CTL_FM_ADDR_BA_Msk (0xff0000UL) /*!< FLASHC_FM_CTL FM_ADDR: BA (Bitfield-Mask: 0xff) */ +#define FLASHC_FM_CTL_FM_ADDR_AXA_Pos (24UL) /*!< FLASHC_FM_CTL FM_ADDR: AXA (Bit 24) */ +#define FLASHC_FM_CTL_FM_ADDR_AXA_Msk (0x1000000UL) /*!< FLASHC_FM_CTL FM_ADDR: AXA (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC_FM_CTL.GEOMETRY ================================================= */ +#define FLASHC_FM_CTL_GEOMETRY_WORD_SIZE_LOG2_Pos (0UL) /*!< FLASHC_FM_CTL GEOMETRY: WORD_SIZE_LOG2 (Bit 0) */ +#define FLASHC_FM_CTL_GEOMETRY_WORD_SIZE_LOG2_Msk (0xfUL) /*!< FLASHC_FM_CTL GEOMETRY: WORD_SIZE_LOG2 (Bitfield-Mask: 0x0f)*/ +#define FLASHC_FM_CTL_GEOMETRY_PAGE_SIZE_LOG2_Pos (4UL) /*!< FLASHC_FM_CTL GEOMETRY: PAGE_SIZE_LOG2 (Bit 4) */ +#define FLASHC_FM_CTL_GEOMETRY_PAGE_SIZE_LOG2_Msk (0xf0UL) /*!< FLASHC_FM_CTL GEOMETRY: PAGE_SIZE_LOG2 (Bitfield-Mask: 0x0f)*/ +#define FLASHC_FM_CTL_GEOMETRY_ROW_COUNT_Pos (8UL) /*!< FLASHC_FM_CTL GEOMETRY: ROW_COUNT (Bit 8) */ +#define FLASHC_FM_CTL_GEOMETRY_ROW_COUNT_Msk (0xffff00UL) /*!< FLASHC_FM_CTL GEOMETRY: ROW_COUNT (Bitfield-Mask: 0xffff) */ +#define FLASHC_FM_CTL_GEOMETRY_BANK_COUNT_Pos (24UL) /*!< FLASHC_FM_CTL GEOMETRY: BANK_COUNT (Bit 24) */ +#define FLASHC_FM_CTL_GEOMETRY_BANK_COUNT_Msk (0xff000000UL) /*!< FLASHC_FM_CTL GEOMETRY: BANK_COUNT (Bitfield-Mask: 0xff) */ +/* ========================================== FLASHC_FM_CTL.GEOMETRY_SUPERVISORY =========================================== */ +#define FLASHC_FM_CTL_GEOMETRY_SUPERVISORY_WORD_SIZE_LOG2_Pos (0UL) /*!< FLASHC_FM_CTL GEOMETRY_SUPERVISORY: WORD_SIZE_LOG2 (Bit 0)*/ +#define FLASHC_FM_CTL_GEOMETRY_SUPERVISORY_WORD_SIZE_LOG2_Msk (0xfUL) /*!< FLASHC_FM_CTL GEOMETRY_SUPERVISORY: WORD_SIZE_LOG2 (Bitfield-Mask: 0x0f)*/ +#define FLASHC_FM_CTL_GEOMETRY_SUPERVISORY_PAGE_SIZE_LOG2_Pos (4UL) /*!< FLASHC_FM_CTL GEOMETRY_SUPERVISORY: PAGE_SIZE_LOG2 (Bit 4)*/ +#define FLASHC_FM_CTL_GEOMETRY_SUPERVISORY_PAGE_SIZE_LOG2_Msk (0xf0UL) /*!< FLASHC_FM_CTL GEOMETRY_SUPERVISORY: PAGE_SIZE_LOG2 (Bitfield-Mask: 0x0f)*/ +#define FLASHC_FM_CTL_GEOMETRY_SUPERVISORY_ROW_COUNT_Pos (8UL) /*!< FLASHC_FM_CTL GEOMETRY_SUPERVISORY: ROW_COUNT (Bit 8) */ +#define FLASHC_FM_CTL_GEOMETRY_SUPERVISORY_ROW_COUNT_Msk (0xffff00UL) /*!< FLASHC_FM_CTL GEOMETRY_SUPERVISORY: ROW_COUNT (Bitfield-Mask: 0xffff)*/ +#define FLASHC_FM_CTL_GEOMETRY_SUPERVISORY_BANK_COUNT_Pos (24UL) /*!< FLASHC_FM_CTL GEOMETRY_SUPERVISORY: BANK_COUNT (Bit 24) */ +#define FLASHC_FM_CTL_GEOMETRY_SUPERVISORY_BANK_COUNT_Msk (0xff000000UL) /*!< FLASHC_FM_CTL GEOMETRY_SUPERVISORY: BANK_COUNT (Bitfield-Mask: 0xff)*/ +/* ================================================ FLASHC_FM_CTL.TIMER_CTL ================================================ */ +#define FLASHC_FM_CTL_TIMER_CTL_PERIOD_Pos (0UL) /*!< FLASHC_FM_CTL TIMER_CTL: PERIOD (Bit 0) */ +#define FLASHC_FM_CTL_TIMER_CTL_PERIOD_Msk (0xffffUL) /*!< FLASHC_FM_CTL TIMER_CTL: PERIOD (Bitfield-Mask: 0xffff) */ +#define FLASHC_FM_CTL_TIMER_CTL_SCALE_Pos (16UL) /*!< FLASHC_FM_CTL TIMER_CTL: SCALE (Bit 16) */ +#define FLASHC_FM_CTL_TIMER_CTL_SCALE_Msk (0x10000UL) /*!< FLASHC_FM_CTL TIMER_CTL: SCALE (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TIMER_CTL_PUMP_CLOCK_SEL_Pos (24UL) /*!< FLASHC_FM_CTL TIMER_CTL: PUMP_CLOCK_SEL (Bit 24) */ +#define FLASHC_FM_CTL_TIMER_CTL_PUMP_CLOCK_SEL_Msk (0x1000000UL) /*!< FLASHC_FM_CTL TIMER_CTL: PUMP_CLOCK_SEL (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_TIMER_CTL_PRE_PROG_Pos (25UL) /*!< FLASHC_FM_CTL TIMER_CTL: PRE_PROG (Bit 25) */ +#define FLASHC_FM_CTL_TIMER_CTL_PRE_PROG_Msk (0x2000000UL) /*!< FLASHC_FM_CTL TIMER_CTL: PRE_PROG (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TIMER_CTL_PRE_PROG_CSL_Pos (26UL) /*!< FLASHC_FM_CTL TIMER_CTL: PRE_PROG_CSL (Bit 26) */ +#define FLASHC_FM_CTL_TIMER_CTL_PRE_PROG_CSL_Msk (0x4000000UL) /*!< FLASHC_FM_CTL TIMER_CTL: PRE_PROG_CSL (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_TIMER_CTL_PUMP_EN_Pos (29UL) /*!< FLASHC_FM_CTL TIMER_CTL: PUMP_EN (Bit 29) */ +#define FLASHC_FM_CTL_TIMER_CTL_PUMP_EN_Msk (0x20000000UL) /*!< FLASHC_FM_CTL TIMER_CTL: PUMP_EN (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TIMER_CTL_ACLK_EN_Pos (30UL) /*!< FLASHC_FM_CTL TIMER_CTL: ACLK_EN (Bit 30) */ +#define FLASHC_FM_CTL_TIMER_CTL_ACLK_EN_Msk (0x40000000UL) /*!< FLASHC_FM_CTL TIMER_CTL: ACLK_EN (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TIMER_CTL_TIMER_EN_Pos (31UL) /*!< FLASHC_FM_CTL TIMER_CTL: TIMER_EN (Bit 31) */ +#define FLASHC_FM_CTL_TIMER_CTL_TIMER_EN_Msk (0x80000000UL) /*!< FLASHC_FM_CTL TIMER_CTL: TIMER_EN (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC_FM_CTL.ANA_CTL0 ================================================= */ +#define FLASHC_FM_CTL_ANA_CTL0_CSLDAC_Pos (8UL) /*!< FLASHC_FM_CTL ANA_CTL0: CSLDAC (Bit 8) */ +#define FLASHC_FM_CTL_ANA_CTL0_CSLDAC_Msk (0x700UL) /*!< FLASHC_FM_CTL ANA_CTL0: CSLDAC (Bitfield-Mask: 0x07) */ +#define FLASHC_FM_CTL_ANA_CTL0_VCC_SEL_Pos (24UL) /*!< FLASHC_FM_CTL ANA_CTL0: VCC_SEL (Bit 24) */ +#define FLASHC_FM_CTL_ANA_CTL0_VCC_SEL_Msk (0x1000000UL) /*!< FLASHC_FM_CTL ANA_CTL0: VCC_SEL (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_ANA_CTL0_FLIP_AMUXBUS_AB_Pos (27UL) /*!< FLASHC_FM_CTL ANA_CTL0: FLIP_AMUXBUS_AB (Bit 27) */ +#define FLASHC_FM_CTL_ANA_CTL0_FLIP_AMUXBUS_AB_Msk (0x8000000UL) /*!< FLASHC_FM_CTL ANA_CTL0: FLIP_AMUXBUS_AB (Bitfield-Mask: 0x01)*/ +/* ================================================ FLASHC_FM_CTL.ANA_CTL1 ================================================= */ +#define FLASHC_FM_CTL_ANA_CTL1_MDAC_Pos (0UL) /*!< FLASHC_FM_CTL ANA_CTL1: MDAC (Bit 0) */ +#define FLASHC_FM_CTL_ANA_CTL1_MDAC_Msk (0xffUL) /*!< FLASHC_FM_CTL ANA_CTL1: MDAC (Bitfield-Mask: 0xff) */ +#define FLASHC_FM_CTL_ANA_CTL1_PDAC_Pos (16UL) /*!< FLASHC_FM_CTL ANA_CTL1: PDAC (Bit 16) */ +#define FLASHC_FM_CTL_ANA_CTL1_PDAC_Msk (0xf0000UL) /*!< FLASHC_FM_CTL ANA_CTL1: PDAC (Bitfield-Mask: 0x0f) */ +#define FLASHC_FM_CTL_ANA_CTL1_NDAC_Pos (24UL) /*!< FLASHC_FM_CTL ANA_CTL1: NDAC (Bit 24) */ +#define FLASHC_FM_CTL_ANA_CTL1_NDAC_Msk (0xf000000UL) /*!< FLASHC_FM_CTL ANA_CTL1: NDAC (Bitfield-Mask: 0x0f) */ +#define FLASHC_FM_CTL_ANA_CTL1_VPROT_OVERRIDE_Pos (28UL) /*!< FLASHC_FM_CTL ANA_CTL1: VPROT_OVERRIDE (Bit 28) */ +#define FLASHC_FM_CTL_ANA_CTL1_VPROT_OVERRIDE_Msk (0x10000000UL) /*!< FLASHC_FM_CTL ANA_CTL1: VPROT_OVERRIDE (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_ANA_CTL1_SPARE2_Pos (29UL) /*!< FLASHC_FM_CTL ANA_CTL1: SPARE2 (Bit 29) */ +#define FLASHC_FM_CTL_ANA_CTL1_SPARE2_Msk (0x20000000UL) /*!< FLASHC_FM_CTL ANA_CTL1: SPARE2 (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_ANA_CTL1_RST_SFT_HVPL_Pos (30UL) /*!< FLASHC_FM_CTL ANA_CTL1: RST_SFT_HVPL (Bit 30) */ +#define FLASHC_FM_CTL_ANA_CTL1_RST_SFT_HVPL_Msk (0x40000000UL) /*!< FLASHC_FM_CTL ANA_CTL1: RST_SFT_HVPL (Bitfield-Mask: 0x01)*/ +/* ============================================== FLASHC_FM_CTL.GEOMETRY_GEN =============================================== */ +#define FLASHC_FM_CTL_GEOMETRY_GEN_RWW_Pos (1UL) /*!< FLASHC_FM_CTL GEOMETRY_GEN: RWW (Bit 1) */ +#define FLASHC_FM_CTL_GEOMETRY_GEN_RWW_Msk (0x2UL) /*!< FLASHC_FM_CTL GEOMETRY_GEN: RWW (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_GEOMETRY_GEN_MAX_DOUT_WIDTH_Pos (2UL) /*!< FLASHC_FM_CTL GEOMETRY_GEN: MAX_DOUT_WIDTH (Bit 2) */ +#define FLASHC_FM_CTL_GEOMETRY_GEN_MAX_DOUT_WIDTH_Msk (0x4UL) /*!< FLASHC_FM_CTL GEOMETRY_GEN: MAX_DOUT_WIDTH (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_GEOMETRY_GEN_SECTOR0_SR_Pos (3UL) /*!< FLASHC_FM_CTL GEOMETRY_GEN: SECTOR0_SR (Bit 3) */ +#define FLASHC_FM_CTL_GEOMETRY_GEN_SECTOR0_SR_Msk (0x8UL) /*!< FLASHC_FM_CTL GEOMETRY_GEN: SECTOR0_SR (Bitfield-Mask: 0x01)*/ +/* ================================================ FLASHC_FM_CTL.TEST_CTL ================================================= */ +#define FLASHC_FM_CTL_TEST_CTL_TEST_MODE_Pos (0UL) /*!< FLASHC_FM_CTL TEST_CTL: TEST_MODE (Bit 0) */ +#define FLASHC_FM_CTL_TEST_CTL_TEST_MODE_Msk (0x1fUL) /*!< FLASHC_FM_CTL TEST_CTL: TEST_MODE (Bitfield-Mask: 0x1f) */ +#define FLASHC_FM_CTL_TEST_CTL_PN_CTL_Pos (8UL) /*!< FLASHC_FM_CTL TEST_CTL: PN_CTL (Bit 8) */ +#define FLASHC_FM_CTL_TEST_CTL_PN_CTL_Msk (0x100UL) /*!< FLASHC_FM_CTL TEST_CTL: PN_CTL (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TEST_CTL_TM_PE_Pos (9UL) /*!< FLASHC_FM_CTL TEST_CTL: TM_PE (Bit 9) */ +#define FLASHC_FM_CTL_TEST_CTL_TM_PE_Msk (0x200UL) /*!< FLASHC_FM_CTL TEST_CTL: TM_PE (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TEST_CTL_TM_DISPOS_Pos (10UL) /*!< FLASHC_FM_CTL TEST_CTL: TM_DISPOS (Bit 10) */ +#define FLASHC_FM_CTL_TEST_CTL_TM_DISPOS_Msk (0x400UL) /*!< FLASHC_FM_CTL TEST_CTL: TM_DISPOS (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TEST_CTL_TM_DISNEG_Pos (11UL) /*!< FLASHC_FM_CTL TEST_CTL: TM_DISNEG (Bit 11) */ +#define FLASHC_FM_CTL_TEST_CTL_TM_DISNEG_Msk (0x800UL) /*!< FLASHC_FM_CTL TEST_CTL: TM_DISNEG (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TEST_CTL_EN_CLK_MON_Pos (16UL) /*!< FLASHC_FM_CTL TEST_CTL: EN_CLK_MON (Bit 16) */ +#define FLASHC_FM_CTL_TEST_CTL_EN_CLK_MON_Msk (0x10000UL) /*!< FLASHC_FM_CTL TEST_CTL: EN_CLK_MON (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TEST_CTL_CSL_DEBUG_Pos (17UL) /*!< FLASHC_FM_CTL TEST_CTL: CSL_DEBUG (Bit 17) */ +#define FLASHC_FM_CTL_TEST_CTL_CSL_DEBUG_Msk (0x20000UL) /*!< FLASHC_FM_CTL TEST_CTL: CSL_DEBUG (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TEST_CTL_ENABLE_OSC_Pos (18UL) /*!< FLASHC_FM_CTL TEST_CTL: ENABLE_OSC (Bit 18) */ +#define FLASHC_FM_CTL_TEST_CTL_ENABLE_OSC_Msk (0x40000UL) /*!< FLASHC_FM_CTL TEST_CTL: ENABLE_OSC (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_TEST_CTL_UNSCRAMBLE_WA_Pos (31UL) /*!< FLASHC_FM_CTL TEST_CTL: UNSCRAMBLE_WA (Bit 31) */ +#define FLASHC_FM_CTL_TEST_CTL_UNSCRAMBLE_WA_Msk (0x80000000UL) /*!< FLASHC_FM_CTL TEST_CTL: UNSCRAMBLE_WA (Bitfield-Mask: 0x01)*/ +/* ================================================ FLASHC_FM_CTL.WAIT_CTL ================================================= */ +#define FLASHC_FM_CTL_WAIT_CTL_WAIT_FM_MEM_RD_Pos (0UL) /*!< FLASHC_FM_CTL WAIT_CTL: WAIT_FM_MEM_RD (Bit 0) */ +#define FLASHC_FM_CTL_WAIT_CTL_WAIT_FM_MEM_RD_Msk (0xfUL) /*!< FLASHC_FM_CTL WAIT_CTL: WAIT_FM_MEM_RD (Bitfield-Mask: 0x0f)*/ +#define FLASHC_FM_CTL_WAIT_CTL_WAIT_FM_HV_RD_Pos (8UL) /*!< FLASHC_FM_CTL WAIT_CTL: WAIT_FM_HV_RD (Bit 8) */ +#define FLASHC_FM_CTL_WAIT_CTL_WAIT_FM_HV_RD_Msk (0xf00UL) /*!< FLASHC_FM_CTL WAIT_CTL: WAIT_FM_HV_RD (Bitfield-Mask: 0x0f)*/ +#define FLASHC_FM_CTL_WAIT_CTL_WAIT_FM_HV_WR_Pos (16UL) /*!< FLASHC_FM_CTL WAIT_CTL: WAIT_FM_HV_WR (Bit 16) */ +#define FLASHC_FM_CTL_WAIT_CTL_WAIT_FM_HV_WR_Msk (0x70000UL) /*!< FLASHC_FM_CTL WAIT_CTL: WAIT_FM_HV_WR (Bitfield-Mask: 0x07)*/ +/* ============================================= FLASHC_FM_CTL.MONITOR_STATUS ============================================== */ +#define FLASHC_FM_CTL_MONITOR_STATUS_NEG_PUMP_VLO_Pos (1UL) /*!< FLASHC_FM_CTL MONITOR_STATUS: NEG_PUMP_VLO (Bit 1) */ +#define FLASHC_FM_CTL_MONITOR_STATUS_NEG_PUMP_VLO_Msk (0x2UL) /*!< FLASHC_FM_CTL MONITOR_STATUS: NEG_PUMP_VLO (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_MONITOR_STATUS_POS_PUMP_VHI_Pos (2UL) /*!< FLASHC_FM_CTL MONITOR_STATUS: POS_PUMP_VHI (Bit 2) */ +#define FLASHC_FM_CTL_MONITOR_STATUS_POS_PUMP_VHI_Msk (0x4UL) /*!< FLASHC_FM_CTL MONITOR_STATUS: POS_PUMP_VHI (Bitfield-Mask: 0x01)*/ +/* =============================================== FLASHC_FM_CTL.SCRATCH_CTL =============================================== */ +#define FLASHC_FM_CTL_SCRATCH_CTL_DUMMY32_Pos (0UL) /*!< FLASHC_FM_CTL SCRATCH_CTL: DUMMY32 (Bit 0) */ +#define FLASHC_FM_CTL_SCRATCH_CTL_DUMMY32_Msk (0xffffffffUL) /*!< FLASHC_FM_CTL SCRATCH_CTL: DUMMY32 (Bitfield-Mask: 0xffffffff)*/ +/* ================================================= FLASHC_FM_CTL.HV_CTL ================================================== */ +#define FLASHC_FM_CTL_HV_CTL_TIMER_CLOCK_FREQ_Pos (0UL) /*!< FLASHC_FM_CTL HV_CTL: TIMER_CLOCK_FREQ (Bit 0) */ +#define FLASHC_FM_CTL_HV_CTL_TIMER_CLOCK_FREQ_Msk (0xffUL) /*!< FLASHC_FM_CTL HV_CTL: TIMER_CLOCK_FREQ (Bitfield-Mask: 0xff)*/ +/* ================================================ FLASHC_FM_CTL.ACLK_CTL ================================================= */ +#define FLASHC_FM_CTL_ACLK_CTL_ACLK_GEN_Pos (0UL) /*!< FLASHC_FM_CTL ACLK_CTL: ACLK_GEN (Bit 0) */ +#define FLASHC_FM_CTL_ACLK_CTL_ACLK_GEN_Msk (0x1UL) /*!< FLASHC_FM_CTL ACLK_CTL: ACLK_GEN (Bitfield-Mask: 0x01) */ +/* ================================================== FLASHC_FM_CTL.INTR =================================================== */ +#define FLASHC_FM_CTL_INTR_TIMER_EXPIRED_Pos (0UL) /*!< FLASHC_FM_CTL INTR: TIMER_EXPIRED (Bit 0) */ +#define FLASHC_FM_CTL_INTR_TIMER_EXPIRED_Msk (0x1UL) /*!< FLASHC_FM_CTL INTR: TIMER_EXPIRED (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC_FM_CTL.INTR_SET ================================================= */ +#define FLASHC_FM_CTL_INTR_SET_TIMER_EXPIRED_Pos (0UL) /*!< FLASHC_FM_CTL INTR_SET: TIMER_EXPIRED (Bit 0) */ +#define FLASHC_FM_CTL_INTR_SET_TIMER_EXPIRED_Msk (0x1UL) /*!< FLASHC_FM_CTL INTR_SET: TIMER_EXPIRED (Bitfield-Mask: 0x01)*/ +/* ================================================ FLASHC_FM_CTL.INTR_MASK ================================================ */ +#define FLASHC_FM_CTL_INTR_MASK_TIMER_EXPIRED_Pos (0UL) /*!< FLASHC_FM_CTL INTR_MASK: TIMER_EXPIRED (Bit 0) */ +#define FLASHC_FM_CTL_INTR_MASK_TIMER_EXPIRED_Msk (0x1UL) /*!< FLASHC_FM_CTL INTR_MASK: TIMER_EXPIRED (Bitfield-Mask: 0x01)*/ +/* =============================================== FLASHC_FM_CTL.INTR_MASKED =============================================== */ +#define FLASHC_FM_CTL_INTR_MASKED_TIMER_EXPIRED_Pos (0UL) /*!< FLASHC_FM_CTL INTR_MASKED: TIMER_EXPIRED (Bit 0) */ +#define FLASHC_FM_CTL_INTR_MASKED_TIMER_EXPIRED_Msk (0x1UL) /*!< FLASHC_FM_CTL INTR_MASKED: TIMER_EXPIRED (Bitfield-Mask: 0x01)*/ +/* ============================================= FLASHC_FM_CTL.FM_HV_DATA_ALL ============================================== */ +#define FLASHC_FM_CTL_FM_HV_DATA_ALL_DATA32_Pos (0UL) /*!< FLASHC_FM_CTL FM_HV_DATA_ALL: DATA32 (Bit 0) */ +#define FLASHC_FM_CTL_FM_HV_DATA_ALL_DATA32_Msk (0xffffffffUL) /*!< FLASHC_FM_CTL FM_HV_DATA_ALL: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ================================================ FLASHC_FM_CTL.CAL_CTL0 ================================================= */ +#define FLASHC_FM_CTL_CAL_CTL0_VCT_TRIM_LO_HV_Pos (0UL) /*!< FLASHC_FM_CTL CAL_CTL0: VCT_TRIM_LO_HV (Bit 0) */ +#define FLASHC_FM_CTL_CAL_CTL0_VCT_TRIM_LO_HV_Msk (0x1fUL) /*!< FLASHC_FM_CTL CAL_CTL0: VCT_TRIM_LO_HV (Bitfield-Mask: 0x1f)*/ +#define FLASHC_FM_CTL_CAL_CTL0_CDAC_LO_HV_Pos (5UL) /*!< FLASHC_FM_CTL CAL_CTL0: CDAC_LO_HV (Bit 5) */ +#define FLASHC_FM_CTL_CAL_CTL0_CDAC_LO_HV_Msk (0xe0UL) /*!< FLASHC_FM_CTL CAL_CTL0: CDAC_LO_HV (Bitfield-Mask: 0x07) */ +#define FLASHC_FM_CTL_CAL_CTL0_VBG_TRIM_LO_HV_Pos (8UL) /*!< FLASHC_FM_CTL CAL_CTL0: VBG_TRIM_LO_HV (Bit 8) */ +#define FLASHC_FM_CTL_CAL_CTL0_VBG_TRIM_LO_HV_Msk (0x1f00UL) /*!< FLASHC_FM_CTL CAL_CTL0: VBG_TRIM_LO_HV (Bitfield-Mask: 0x1f)*/ +#define FLASHC_FM_CTL_CAL_CTL0_VBG_TC_TRIM_LO_HV_Pos (13UL) /*!< FLASHC_FM_CTL CAL_CTL0: VBG_TC_TRIM_LO_HV (Bit 13) */ +#define FLASHC_FM_CTL_CAL_CTL0_VBG_TC_TRIM_LO_HV_Msk (0xe000UL) /*!< FLASHC_FM_CTL CAL_CTL0: VBG_TC_TRIM_LO_HV (Bitfield-Mask: 0x07)*/ +#define FLASHC_FM_CTL_CAL_CTL0_IPREF_TRIM_LO_HV_Pos (16UL) /*!< FLASHC_FM_CTL CAL_CTL0: IPREF_TRIM_LO_HV (Bit 16) */ +#define FLASHC_FM_CTL_CAL_CTL0_IPREF_TRIM_LO_HV_Msk (0xf0000UL) /*!< FLASHC_FM_CTL CAL_CTL0: IPREF_TRIM_LO_HV (Bitfield-Mask: 0x0f)*/ +/* ================================================ FLASHC_FM_CTL.CAL_CTL1 ================================================= */ +#define FLASHC_FM_CTL_CAL_CTL1_VCT_TRIM_HI_HV_Pos (0UL) /*!< FLASHC_FM_CTL CAL_CTL1: VCT_TRIM_HI_HV (Bit 0) */ +#define FLASHC_FM_CTL_CAL_CTL1_VCT_TRIM_HI_HV_Msk (0x1fUL) /*!< FLASHC_FM_CTL CAL_CTL1: VCT_TRIM_HI_HV (Bitfield-Mask: 0x1f)*/ +#define FLASHC_FM_CTL_CAL_CTL1_CDAC_HI_HV_Pos (5UL) /*!< FLASHC_FM_CTL CAL_CTL1: CDAC_HI_HV (Bit 5) */ +#define FLASHC_FM_CTL_CAL_CTL1_CDAC_HI_HV_Msk (0xe0UL) /*!< FLASHC_FM_CTL CAL_CTL1: CDAC_HI_HV (Bitfield-Mask: 0x07) */ +#define FLASHC_FM_CTL_CAL_CTL1_VBG_TRIM_HI_HV_Pos (8UL) /*!< FLASHC_FM_CTL CAL_CTL1: VBG_TRIM_HI_HV (Bit 8) */ +#define FLASHC_FM_CTL_CAL_CTL1_VBG_TRIM_HI_HV_Msk (0x1f00UL) /*!< FLASHC_FM_CTL CAL_CTL1: VBG_TRIM_HI_HV (Bitfield-Mask: 0x1f)*/ +#define FLASHC_FM_CTL_CAL_CTL1_VBG_TC_TRIM_HI_HV_Pos (13UL) /*!< FLASHC_FM_CTL CAL_CTL1: VBG_TC_TRIM_HI_HV (Bit 13) */ +#define FLASHC_FM_CTL_CAL_CTL1_VBG_TC_TRIM_HI_HV_Msk (0xe000UL) /*!< FLASHC_FM_CTL CAL_CTL1: VBG_TC_TRIM_HI_HV (Bitfield-Mask: 0x07)*/ +#define FLASHC_FM_CTL_CAL_CTL1_IPREF_TRIM_HI_HV_Pos (16UL) /*!< FLASHC_FM_CTL CAL_CTL1: IPREF_TRIM_HI_HV (Bit 16) */ +#define FLASHC_FM_CTL_CAL_CTL1_IPREF_TRIM_HI_HV_Msk (0xf0000UL) /*!< FLASHC_FM_CTL CAL_CTL1: IPREF_TRIM_HI_HV (Bitfield-Mask: 0x0f)*/ +/* ================================================ FLASHC_FM_CTL.CAL_CTL2 ================================================= */ +#define FLASHC_FM_CTL_CAL_CTL2_ICREF_TRIM_LO_HV_Pos (0UL) /*!< FLASHC_FM_CTL CAL_CTL2: ICREF_TRIM_LO_HV (Bit 0) */ +#define FLASHC_FM_CTL_CAL_CTL2_ICREF_TRIM_LO_HV_Msk (0x1fUL) /*!< FLASHC_FM_CTL CAL_CTL2: ICREF_TRIM_LO_HV (Bitfield-Mask: 0x1f)*/ +#define FLASHC_FM_CTL_CAL_CTL2_ICREF_TC_TRIM_LO_HV_Pos (5UL) /*!< FLASHC_FM_CTL CAL_CTL2: ICREF_TC_TRIM_LO_HV (Bit 5) */ +#define FLASHC_FM_CTL_CAL_CTL2_ICREF_TC_TRIM_LO_HV_Msk (0xe0UL) /*!< FLASHC_FM_CTL CAL_CTL2: ICREF_TC_TRIM_LO_HV (Bitfield-Mask: 0x07)*/ +#define FLASHC_FM_CTL_CAL_CTL2_ICREF_TRIM_HI_HV_Pos (8UL) /*!< FLASHC_FM_CTL CAL_CTL2: ICREF_TRIM_HI_HV (Bit 8) */ +#define FLASHC_FM_CTL_CAL_CTL2_ICREF_TRIM_HI_HV_Msk (0x1f00UL) /*!< FLASHC_FM_CTL CAL_CTL2: ICREF_TRIM_HI_HV (Bitfield-Mask: 0x1f)*/ +#define FLASHC_FM_CTL_CAL_CTL2_ICREF_TC_TRIM_HI_HV_Pos (13UL) /*!< FLASHC_FM_CTL CAL_CTL2: ICREF_TC_TRIM_HI_HV (Bit 13) */ +#define FLASHC_FM_CTL_CAL_CTL2_ICREF_TC_TRIM_HI_HV_Msk (0xe000UL) /*!< FLASHC_FM_CTL CAL_CTL2: ICREF_TC_TRIM_HI_HV (Bitfield-Mask: 0x07)*/ +#define FLASHC_FM_CTL_CAL_CTL2_VREF_SEL_HV_Pos (16UL) /*!< FLASHC_FM_CTL CAL_CTL2: VREF_SEL_HV (Bit 16) */ +#define FLASHC_FM_CTL_CAL_CTL2_VREF_SEL_HV_Msk (0x10000UL) /*!< FLASHC_FM_CTL CAL_CTL2: VREF_SEL_HV (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_CAL_CTL2_IREF_SEL_HV_Pos (17UL) /*!< FLASHC_FM_CTL CAL_CTL2: IREF_SEL_HV (Bit 17) */ +#define FLASHC_FM_CTL_CAL_CTL2_IREF_SEL_HV_Msk (0x20000UL) /*!< FLASHC_FM_CTL CAL_CTL2: IREF_SEL_HV (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_CAL_CTL2_FM_ACTIVE_HV_Pos (18UL) /*!< FLASHC_FM_CTL CAL_CTL2: FM_ACTIVE_HV (Bit 18) */ +#define FLASHC_FM_CTL_CAL_CTL2_FM_ACTIVE_HV_Msk (0x40000UL) /*!< FLASHC_FM_CTL CAL_CTL2: FM_ACTIVE_HV (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_CAL_CTL2_TURBO_EXT_HV_Pos (19UL) /*!< FLASHC_FM_CTL CAL_CTL2: TURBO_EXT_HV (Bit 19) */ +#define FLASHC_FM_CTL_CAL_CTL2_TURBO_EXT_HV_Msk (0x80000UL) /*!< FLASHC_FM_CTL CAL_CTL2: TURBO_EXT_HV (Bitfield-Mask: 0x01)*/ +/* ================================================ FLASHC_FM_CTL.CAL_CTL3 ================================================= */ +#define FLASHC_FM_CTL_CAL_CTL3_OSC_TRIM_HV_Pos (0UL) /*!< FLASHC_FM_CTL CAL_CTL3: OSC_TRIM_HV (Bit 0) */ +#define FLASHC_FM_CTL_CAL_CTL3_OSC_TRIM_HV_Msk (0xfUL) /*!< FLASHC_FM_CTL CAL_CTL3: OSC_TRIM_HV (Bitfield-Mask: 0x0f) */ +#define FLASHC_FM_CTL_CAL_CTL3_OSC_RANGE_TRIM_HV_Pos (4UL) /*!< FLASHC_FM_CTL CAL_CTL3: OSC_RANGE_TRIM_HV (Bit 4) */ +#define FLASHC_FM_CTL_CAL_CTL3_OSC_RANGE_TRIM_HV_Msk (0x10UL) /*!< FLASHC_FM_CTL CAL_CTL3: OSC_RANGE_TRIM_HV (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_CAL_CTL3_IDAC_HV_Pos (5UL) /*!< FLASHC_FM_CTL CAL_CTL3: IDAC_HV (Bit 5) */ +#define FLASHC_FM_CTL_CAL_CTL3_IDAC_HV_Msk (0x1e0UL) /*!< FLASHC_FM_CTL CAL_CTL3: IDAC_HV (Bitfield-Mask: 0x0f) */ +#define FLASHC_FM_CTL_CAL_CTL3_SDAC_HV_Pos (9UL) /*!< FLASHC_FM_CTL CAL_CTL3: SDAC_HV (Bit 9) */ +#define FLASHC_FM_CTL_CAL_CTL3_SDAC_HV_Msk (0x600UL) /*!< FLASHC_FM_CTL CAL_CTL3: SDAC_HV (Bitfield-Mask: 0x03) */ +#define FLASHC_FM_CTL_CAL_CTL3_ITIM_HV_Pos (11UL) /*!< FLASHC_FM_CTL CAL_CTL3: ITIM_HV (Bit 11) */ +#define FLASHC_FM_CTL_CAL_CTL3_ITIM_HV_Msk (0x7800UL) /*!< FLASHC_FM_CTL CAL_CTL3: ITIM_HV (Bitfield-Mask: 0x0f) */ +#define FLASHC_FM_CTL_CAL_CTL3_VDDHI_HV_Pos (15UL) /*!< FLASHC_FM_CTL CAL_CTL3: VDDHI_HV (Bit 15) */ +#define FLASHC_FM_CTL_CAL_CTL3_VDDHI_HV_Msk (0x8000UL) /*!< FLASHC_FM_CTL CAL_CTL3: VDDHI_HV (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_CAL_CTL3_TURBO_PULSEW_HV_Pos (16UL) /*!< FLASHC_FM_CTL CAL_CTL3: TURBO_PULSEW_HV (Bit 16) */ +#define FLASHC_FM_CTL_CAL_CTL3_TURBO_PULSEW_HV_Msk (0x30000UL) /*!< FLASHC_FM_CTL CAL_CTL3: TURBO_PULSEW_HV (Bitfield-Mask: 0x03)*/ +#define FLASHC_FM_CTL_CAL_CTL3_BGLO_EN_HV_Pos (18UL) /*!< FLASHC_FM_CTL CAL_CTL3: BGLO_EN_HV (Bit 18) */ +#define FLASHC_FM_CTL_CAL_CTL3_BGLO_EN_HV_Msk (0x40000UL) /*!< FLASHC_FM_CTL CAL_CTL3: BGLO_EN_HV (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_CAL_CTL3_BGHI_EN_HV_Pos (19UL) /*!< FLASHC_FM_CTL CAL_CTL3: BGHI_EN_HV (Bit 19) */ +#define FLASHC_FM_CTL_CAL_CTL3_BGHI_EN_HV_Msk (0x80000UL) /*!< FLASHC_FM_CTL CAL_CTL3: BGHI_EN_HV (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC_FM_CTL.BOOKMARK ================================================= */ +#define FLASHC_FM_CTL_BOOKMARK_BOOKMARK_Pos (0UL) /*!< FLASHC_FM_CTL BOOKMARK: BOOKMARK (Bit 0) */ +#define FLASHC_FM_CTL_BOOKMARK_BOOKMARK_Msk (0xffffffffUL) /*!< FLASHC_FM_CTL BOOKMARK: BOOKMARK (Bitfield-Mask: 0xffffffff)*/ +/* ================================================ FLASHC_FM_CTL.RED_CTL01 ================================================ */ +#define FLASHC_FM_CTL_RED_CTL01_RED_ADDR_0_Pos (0UL) /*!< FLASHC_FM_CTL RED_CTL01: RED_ADDR_0 (Bit 0) */ +#define FLASHC_FM_CTL_RED_CTL01_RED_ADDR_0_Msk (0xffUL) /*!< FLASHC_FM_CTL RED_CTL01: RED_ADDR_0 (Bitfield-Mask: 0xff) */ +#define FLASHC_FM_CTL_RED_CTL01_RED_EN_0_Pos (8UL) /*!< FLASHC_FM_CTL RED_CTL01: RED_EN_0 (Bit 8) */ +#define FLASHC_FM_CTL_RED_CTL01_RED_EN_0_Msk (0x100UL) /*!< FLASHC_FM_CTL RED_CTL01: RED_EN_0 (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_RED_CTL01_RED_ADDR_1_Pos (16UL) /*!< FLASHC_FM_CTL RED_CTL01: RED_ADDR_1 (Bit 16) */ +#define FLASHC_FM_CTL_RED_CTL01_RED_ADDR_1_Msk (0xff0000UL) /*!< FLASHC_FM_CTL RED_CTL01: RED_ADDR_1 (Bitfield-Mask: 0xff) */ +#define FLASHC_FM_CTL_RED_CTL01_RED_EN_1_Pos (24UL) /*!< FLASHC_FM_CTL RED_CTL01: RED_EN_1 (Bit 24) */ +#define FLASHC_FM_CTL_RED_CTL01_RED_EN_1_Msk (0x1000000UL) /*!< FLASHC_FM_CTL RED_CTL01: RED_EN_1 (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC_FM_CTL.RED_CTL23 ================================================ */ +#define FLASHC_FM_CTL_RED_CTL23_RED_ADDR_2_Pos (0UL) /*!< FLASHC_FM_CTL RED_CTL23: RED_ADDR_2 (Bit 0) */ +#define FLASHC_FM_CTL_RED_CTL23_RED_ADDR_2_Msk (0xffUL) /*!< FLASHC_FM_CTL RED_CTL23: RED_ADDR_2 (Bitfield-Mask: 0xff) */ +#define FLASHC_FM_CTL_RED_CTL23_RED_EN_2_Pos (8UL) /*!< FLASHC_FM_CTL RED_CTL23: RED_EN_2 (Bit 8) */ +#define FLASHC_FM_CTL_RED_CTL23_RED_EN_2_Msk (0x100UL) /*!< FLASHC_FM_CTL RED_CTL23: RED_EN_2 (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_RED_CTL23_RED_ADDR_3_Pos (16UL) /*!< FLASHC_FM_CTL RED_CTL23: RED_ADDR_3 (Bit 16) */ +#define FLASHC_FM_CTL_RED_CTL23_RED_ADDR_3_Msk (0xff0000UL) /*!< FLASHC_FM_CTL RED_CTL23: RED_ADDR_3 (Bitfield-Mask: 0xff) */ +#define FLASHC_FM_CTL_RED_CTL23_RED_EN_3_Pos (24UL) /*!< FLASHC_FM_CTL RED_CTL23: RED_EN_3 (Bit 24) */ +#define FLASHC_FM_CTL_RED_CTL23_RED_EN_3_Msk (0x1000000UL) /*!< FLASHC_FM_CTL RED_CTL23: RED_EN_3 (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC_FM_CTL.RED_CTL45 ================================================ */ +#define FLASHC_FM_CTL_RED_CTL45_RED_ADDR_4_Pos (0UL) /*!< FLASHC_FM_CTL RED_CTL45: RED_ADDR_4 (Bit 0) */ +#define FLASHC_FM_CTL_RED_CTL45_RED_ADDR_4_Msk (0xffUL) /*!< FLASHC_FM_CTL RED_CTL45: RED_ADDR_4 (Bitfield-Mask: 0xff) */ +#define FLASHC_FM_CTL_RED_CTL45_RED_EN_4_Pos (8UL) /*!< FLASHC_FM_CTL RED_CTL45: RED_EN_4 (Bit 8) */ +#define FLASHC_FM_CTL_RED_CTL45_RED_EN_4_Msk (0x100UL) /*!< FLASHC_FM_CTL RED_CTL45: RED_EN_4 (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_RED_CTL45_RED_ADDR_5_Pos (16UL) /*!< FLASHC_FM_CTL RED_CTL45: RED_ADDR_5 (Bit 16) */ +#define FLASHC_FM_CTL_RED_CTL45_RED_ADDR_5_Msk (0xff0000UL) /*!< FLASHC_FM_CTL RED_CTL45: RED_ADDR_5 (Bitfield-Mask: 0xff) */ +#define FLASHC_FM_CTL_RED_CTL45_RED_EN_5_Pos (24UL) /*!< FLASHC_FM_CTL RED_CTL45: RED_EN_5 (Bit 24) */ +#define FLASHC_FM_CTL_RED_CTL45_RED_EN_5_Msk (0x1000000UL) /*!< FLASHC_FM_CTL RED_CTL45: RED_EN_5 (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC_FM_CTL.RED_CTL67 ================================================ */ +#define FLASHC_FM_CTL_RED_CTL67_RED_ADDR_6_Pos (0UL) /*!< FLASHC_FM_CTL RED_CTL67: RED_ADDR_6 (Bit 0) */ +#define FLASHC_FM_CTL_RED_CTL67_RED_ADDR_6_Msk (0xffUL) /*!< FLASHC_FM_CTL RED_CTL67: RED_ADDR_6 (Bitfield-Mask: 0xff) */ +#define FLASHC_FM_CTL_RED_CTL67_RED_EN_6_Pos (8UL) /*!< FLASHC_FM_CTL RED_CTL67: RED_EN_6 (Bit 8) */ +#define FLASHC_FM_CTL_RED_CTL67_RED_EN_6_Msk (0x100UL) /*!< FLASHC_FM_CTL RED_CTL67: RED_EN_6 (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_RED_CTL67_RED_ADDR_7_Pos (16UL) /*!< FLASHC_FM_CTL RED_CTL67: RED_ADDR_7 (Bit 16) */ +#define FLASHC_FM_CTL_RED_CTL67_RED_ADDR_7_Msk (0xff0000UL) /*!< FLASHC_FM_CTL RED_CTL67: RED_ADDR_7 (Bitfield-Mask: 0xff) */ +#define FLASHC_FM_CTL_RED_CTL67_RED_EN_7_Pos (24UL) /*!< FLASHC_FM_CTL RED_CTL67: RED_EN_7 (Bit 24) */ +#define FLASHC_FM_CTL_RED_CTL67_RED_EN_7_Msk (0x1000000UL) /*!< FLASHC_FM_CTL RED_CTL67: RED_EN_7 (Bitfield-Mask: 0x01) */ +/* ============================================== FLASHC_FM_CTL.RED_CTL_SM01 =============================================== */ +#define FLASHC_FM_CTL_RED_CTL_SM01_RED_ADDR_SM0_Pos (0UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: RED_ADDR_SM0 (Bit 0) */ +#define FLASHC_FM_CTL_RED_CTL_SM01_RED_ADDR_SM0_Msk (0xffUL) /*!< FLASHC_FM_CTL RED_CTL_SM01: RED_ADDR_SM0 (Bitfield-Mask: 0xff)*/ +#define FLASHC_FM_CTL_RED_CTL_SM01_RED_EN_SM0_Pos (8UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: RED_EN_SM0 (Bit 8) */ +#define FLASHC_FM_CTL_RED_CTL_SM01_RED_EN_SM0_Msk (0x100UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: RED_EN_SM0 (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_RED_CTL_SM01_RED_ADDR_SM1_Pos (16UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: RED_ADDR_SM1 (Bit 16) */ +#define FLASHC_FM_CTL_RED_CTL_SM01_RED_ADDR_SM1_Msk (0xff0000UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: RED_ADDR_SM1 (Bitfield-Mask: 0xff)*/ +#define FLASHC_FM_CTL_RED_CTL_SM01_RED_EN_SM1_Pos (24UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: RED_EN_SM1 (Bit 24) */ +#define FLASHC_FM_CTL_RED_CTL_SM01_RED_EN_SM1_Msk (0x1000000UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: RED_EN_SM1 (Bitfield-Mask: 0x01)*/ +#define FLASHC_FM_CTL_RED_CTL_SM01_TRKD_Pos (30UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: TRKD (Bit 30) */ +#define FLASHC_FM_CTL_RED_CTL_SM01_TRKD_Msk (0x40000000UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: TRKD (Bitfield-Mask: 0x01) */ +#define FLASHC_FM_CTL_RED_CTL_SM01_R_GRANT_EN_Pos (31UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: R_GRANT_EN (Bit 31) */ +#define FLASHC_FM_CTL_RED_CTL_SM01_R_GRANT_EN_Msk (0x80000000UL) /*!< FLASHC_FM_CTL RED_CTL_SM01: R_GRANT_EN (Bitfield-Mask: 0x01)*/ +/* ================================================= FLASHC_FM_CTL.TM_CMPR ================================================= */ +#define FLASHC_FM_CTL_TM_CMPR_DATA_COMP_RESULT_Pos (0UL) /*!< FLASHC_FM_CTL TM_CMPR: DATA_COMP_RESULT (Bit 0) */ +#define FLASHC_FM_CTL_TM_CMPR_DATA_COMP_RESULT_Msk (0x1UL) /*!< FLASHC_FM_CTL TM_CMPR: DATA_COMP_RESULT (Bitfield-Mask: 0x01)*/ +/* =============================================== FLASHC_FM_CTL.FM_HV_DATA ================================================ */ +#define FLASHC_FM_CTL_FM_HV_DATA_DATA32_Pos (0UL) /*!< FLASHC_FM_CTL FM_HV_DATA: DATA32 (Bit 0) */ +#define FLASHC_FM_CTL_FM_HV_DATA_DATA32_Msk (0xffffffffUL) /*!< FLASHC_FM_CTL FM_HV_DATA: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* =============================================== FLASHC_FM_CTL.FM_MEM_DATA =============================================== */ +#define FLASHC_FM_CTL_FM_MEM_DATA_DATA32_Pos (0UL) /*!< FLASHC_FM_CTL FM_MEM_DATA: DATA32 (Bit 0) */ +#define FLASHC_FM_CTL_FM_MEM_DATA_DATA32_Msk (0xffffffffUL) /*!< FLASHC_FM_CTL FM_MEM_DATA: DATA32 (Bitfield-Mask: 0xffffffff)*/ + + +/* =================================================== FLASHC.FLASH_CTL ==================================================== */ +#define FLASHC_FLASH_CTL_MAIN_WS_Pos (0UL) /*!< FLASHC FLASH_CTL: MAIN_WS (Bit 0) */ +#define FLASHC_FLASH_CTL_MAIN_WS_Msk (0xfUL) /*!< FLASHC FLASH_CTL: MAIN_WS (Bitfield-Mask: 0x0f) */ +#define FLASHC_FLASH_CTL_REMAP_Pos (8UL) /*!< FLASHC FLASH_CTL: REMAP (Bit 8) */ +#define FLASHC_FLASH_CTL_REMAP_Msk (0x100UL) /*!< FLASHC FLASH_CTL: REMAP (Bitfield-Mask: 0x01) */ +/* ================================================= FLASHC.FLASH_PWR_CTL ================================================== */ +#define FLASHC_FLASH_PWR_CTL_ENABLE_Pos (0UL) /*!< FLASHC FLASH_PWR_CTL: ENABLE (Bit 0) */ +#define FLASHC_FLASH_PWR_CTL_ENABLE_Msk (0x1UL) /*!< FLASHC FLASH_PWR_CTL: ENABLE (Bitfield-Mask: 0x01) */ +#define FLASHC_FLASH_PWR_CTL_ENABLE_HV_Pos (1UL) /*!< FLASHC FLASH_PWR_CTL: ENABLE_HV (Bit 1) */ +#define FLASHC_FLASH_PWR_CTL_ENABLE_HV_Msk (0x2UL) /*!< FLASHC FLASH_PWR_CTL: ENABLE_HV (Bitfield-Mask: 0x01) */ +/* =================================================== FLASHC.FLASH_CMD ==================================================== */ +#define FLASHC_FLASH_CMD_INV_Pos (0UL) /*!< FLASHC FLASH_CMD: INV (Bit 0) */ +#define FLASHC_FLASH_CMD_INV_Msk (0x1UL) /*!< FLASHC FLASH_CMD: INV (Bitfield-Mask: 0x01) */ +/* ================================================== FLASHC.CM0_CA_CTL0 =================================================== */ +#define FLASHC_CM0_CA_CTL0_WAY_Pos (16UL) /*!< FLASHC CM0_CA_CTL0: WAY (Bit 16) */ +#define FLASHC_CM0_CA_CTL0_WAY_Msk (0x30000UL) /*!< FLASHC CM0_CA_CTL0: WAY (Bitfield-Mask: 0x03) */ +#define FLASHC_CM0_CA_CTL0_SET_ADDR_Pos (24UL) /*!< FLASHC CM0_CA_CTL0: SET_ADDR (Bit 24) */ +#define FLASHC_CM0_CA_CTL0_SET_ADDR_Msk (0x7000000UL) /*!< FLASHC CM0_CA_CTL0: SET_ADDR (Bitfield-Mask: 0x07) */ +#define FLASHC_CM0_CA_CTL0_PREF_EN_Pos (30UL) /*!< FLASHC CM0_CA_CTL0: PREF_EN (Bit 30) */ +#define FLASHC_CM0_CA_CTL0_PREF_EN_Msk (0x40000000UL) /*!< FLASHC CM0_CA_CTL0: PREF_EN (Bitfield-Mask: 0x01) */ +#define FLASHC_CM0_CA_CTL0_ENABLED_Pos (31UL) /*!< FLASHC CM0_CA_CTL0: ENABLED (Bit 31) */ +#define FLASHC_CM0_CA_CTL0_ENABLED_Msk (0x80000000UL) /*!< FLASHC CM0_CA_CTL0: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================== FLASHC.CM0_CA_CTL1 =================================================== */ +#define FLASHC_CM0_CA_CTL1_ISOLATE_Pos (0UL) /*!< FLASHC CM0_CA_CTL1: ISOLATE (Bit 0) */ +#define FLASHC_CM0_CA_CTL1_ISOLATE_Msk (0x1UL) /*!< FLASHC CM0_CA_CTL1: ISOLATE (Bitfield-Mask: 0x01) */ +#define FLASHC_CM0_CA_CTL1_RETAIN_Pos (1UL) /*!< FLASHC CM0_CA_CTL1: RETAIN (Bit 1) */ +#define FLASHC_CM0_CA_CTL1_RETAIN_Msk (0x2UL) /*!< FLASHC CM0_CA_CTL1: RETAIN (Bitfield-Mask: 0x01) */ +#define FLASHC_CM0_CA_CTL1_POWER_Pos (2UL) /*!< FLASHC CM0_CA_CTL1: POWER (Bit 2) */ +#define FLASHC_CM0_CA_CTL1_POWER_Msk (0x4UL) /*!< FLASHC CM0_CA_CTL1: POWER (Bitfield-Mask: 0x01) */ +/* =================================================== FLASHC.CM0_CA_CMD =================================================== */ +#define FLASHC_CM0_CA_CMD_INV_Pos (0UL) /*!< FLASHC CM0_CA_CMD: INV (Bit 0) */ +#define FLASHC_CM0_CA_CMD_INV_Msk (0x1UL) /*!< FLASHC CM0_CA_CMD: INV (Bitfield-Mask: 0x01) */ +/* ================================================= FLASHC.CM0_CA_STATUS0 ================================================= */ +#define FLASHC_CM0_CA_STATUS0_VALID16_Pos (0UL) /*!< FLASHC CM0_CA_STATUS0: VALID16 (Bit 0) */ +#define FLASHC_CM0_CA_STATUS0_VALID16_Msk (0xffffUL) /*!< FLASHC CM0_CA_STATUS0: VALID16 (Bitfield-Mask: 0xffff) */ +/* ================================================= FLASHC.CM0_CA_STATUS1 ================================================= */ +#define FLASHC_CM0_CA_STATUS1_TAG_Pos (0UL) /*!< FLASHC CM0_CA_STATUS1: TAG (Bit 0) */ +#define FLASHC_CM0_CA_STATUS1_TAG_Msk (0xffffffffUL) /*!< FLASHC CM0_CA_STATUS1: TAG (Bitfield-Mask: 0xffffffff) */ +/* ================================================= FLASHC.CM0_CA_STATUS2 ================================================= */ +#define FLASHC_CM0_CA_STATUS2_LRU_Pos (0UL) /*!< FLASHC CM0_CA_STATUS2: LRU (Bit 0) */ +#define FLASHC_CM0_CA_STATUS2_LRU_Msk (0x3fUL) /*!< FLASHC CM0_CA_STATUS2: LRU (Bitfield-Mask: 0x3f) */ +/* ================================================== FLASHC.CM4_CA_CTL0 =================================================== */ +#define FLASHC_CM4_CA_CTL0_WAY_Pos (16UL) /*!< FLASHC CM4_CA_CTL0: WAY (Bit 16) */ +#define FLASHC_CM4_CA_CTL0_WAY_Msk (0x30000UL) /*!< FLASHC CM4_CA_CTL0: WAY (Bitfield-Mask: 0x03) */ +#define FLASHC_CM4_CA_CTL0_SET_ADDR_Pos (24UL) /*!< FLASHC CM4_CA_CTL0: SET_ADDR (Bit 24) */ +#define FLASHC_CM4_CA_CTL0_SET_ADDR_Msk (0x7000000UL) /*!< FLASHC CM4_CA_CTL0: SET_ADDR (Bitfield-Mask: 0x07) */ +#define FLASHC_CM4_CA_CTL0_PREF_EN_Pos (30UL) /*!< FLASHC CM4_CA_CTL0: PREF_EN (Bit 30) */ +#define FLASHC_CM4_CA_CTL0_PREF_EN_Msk (0x40000000UL) /*!< FLASHC CM4_CA_CTL0: PREF_EN (Bitfield-Mask: 0x01) */ +#define FLASHC_CM4_CA_CTL0_ENABLED_Pos (31UL) /*!< FLASHC CM4_CA_CTL0: ENABLED (Bit 31) */ +#define FLASHC_CM4_CA_CTL0_ENABLED_Msk (0x80000000UL) /*!< FLASHC CM4_CA_CTL0: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================== FLASHC.CM4_CA_CTL1 =================================================== */ +#define FLASHC_CM4_CA_CTL1_ISOLATE_Pos (0UL) /*!< FLASHC CM4_CA_CTL1: ISOLATE (Bit 0) */ +#define FLASHC_CM4_CA_CTL1_ISOLATE_Msk (0x1UL) /*!< FLASHC CM4_CA_CTL1: ISOLATE (Bitfield-Mask: 0x01) */ +#define FLASHC_CM4_CA_CTL1_RETAIN_Pos (1UL) /*!< FLASHC CM4_CA_CTL1: RETAIN (Bit 1) */ +#define FLASHC_CM4_CA_CTL1_RETAIN_Msk (0x2UL) /*!< FLASHC CM4_CA_CTL1: RETAIN (Bitfield-Mask: 0x01) */ +#define FLASHC_CM4_CA_CTL1_POWER_Pos (2UL) /*!< FLASHC CM4_CA_CTL1: POWER (Bit 2) */ +#define FLASHC_CM4_CA_CTL1_POWER_Msk (0x4UL) /*!< FLASHC CM4_CA_CTL1: POWER (Bitfield-Mask: 0x01) */ +/* =================================================== FLASHC.CM4_CA_CMD =================================================== */ +#define FLASHC_CM4_CA_CMD_INV_Pos (0UL) /*!< FLASHC CM4_CA_CMD: INV (Bit 0) */ +#define FLASHC_CM4_CA_CMD_INV_Msk (0x1UL) /*!< FLASHC CM4_CA_CMD: INV (Bitfield-Mask: 0x01) */ +/* ================================================= FLASHC.CM4_CA_STATUS0 ================================================= */ +#define FLASHC_CM4_CA_STATUS0_VALID16_Pos (0UL) /*!< FLASHC CM4_CA_STATUS0: VALID16 (Bit 0) */ +#define FLASHC_CM4_CA_STATUS0_VALID16_Msk (0xffffUL) /*!< FLASHC CM4_CA_STATUS0: VALID16 (Bitfield-Mask: 0xffff) */ +/* ================================================= FLASHC.CM4_CA_STATUS1 ================================================= */ +#define FLASHC_CM4_CA_STATUS1_TAG_Pos (0UL) /*!< FLASHC CM4_CA_STATUS1: TAG (Bit 0) */ +#define FLASHC_CM4_CA_STATUS1_TAG_Msk (0xffffffffUL) /*!< FLASHC CM4_CA_STATUS1: TAG (Bitfield-Mask: 0xffffffff) */ +/* ================================================= FLASHC.CM4_CA_STATUS2 ================================================= */ +#define FLASHC_CM4_CA_STATUS2_LRU_Pos (0UL) /*!< FLASHC CM4_CA_STATUS2: LRU (Bit 0) */ +#define FLASHC_CM4_CA_STATUS2_LRU_Msk (0x3fUL) /*!< FLASHC CM4_CA_STATUS2: LRU (Bitfield-Mask: 0x3f) */ +/* ================================================ FLASHC.CRYPTO_BUFF_CTL ================================================= */ +#define FLASHC_CRYPTO_BUFF_CTL_PREF_EN_Pos (30UL) /*!< FLASHC CRYPTO_BUFF_CTL: PREF_EN (Bit 30) */ +#define FLASHC_CRYPTO_BUFF_CTL_PREF_EN_Msk (0x40000000UL) /*!< FLASHC CRYPTO_BUFF_CTL: PREF_EN (Bitfield-Mask: 0x01) */ +#define FLASHC_CRYPTO_BUFF_CTL_ENABLED_Pos (31UL) /*!< FLASHC CRYPTO_BUFF_CTL: ENABLED (Bit 31) */ +#define FLASHC_CRYPTO_BUFF_CTL_ENABLED_Msk (0x80000000UL) /*!< FLASHC CRYPTO_BUFF_CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC.CRYPTO_BUFF_CMD ================================================= */ +#define FLASHC_CRYPTO_BUFF_CMD_INV_Pos (0UL) /*!< FLASHC CRYPTO_BUFF_CMD: INV (Bit 0) */ +#define FLASHC_CRYPTO_BUFF_CMD_INV_Msk (0x1UL) /*!< FLASHC CRYPTO_BUFF_CMD: INV (Bitfield-Mask: 0x01) */ +/* ================================================== FLASHC.DW0_BUFF_CTL ================================================== */ +#define FLASHC_DW0_BUFF_CTL_PREF_EN_Pos (30UL) /*!< FLASHC DW0_BUFF_CTL: PREF_EN (Bit 30) */ +#define FLASHC_DW0_BUFF_CTL_PREF_EN_Msk (0x40000000UL) /*!< FLASHC DW0_BUFF_CTL: PREF_EN (Bitfield-Mask: 0x01) */ +#define FLASHC_DW0_BUFF_CTL_ENABLED_Pos (31UL) /*!< FLASHC DW0_BUFF_CTL: ENABLED (Bit 31) */ +#define FLASHC_DW0_BUFF_CTL_ENABLED_Msk (0x80000000UL) /*!< FLASHC DW0_BUFF_CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================== FLASHC.DW0_BUFF_CMD ================================================== */ +#define FLASHC_DW0_BUFF_CMD_INV_Pos (0UL) /*!< FLASHC DW0_BUFF_CMD: INV (Bit 0) */ +#define FLASHC_DW0_BUFF_CMD_INV_Msk (0x1UL) /*!< FLASHC DW0_BUFF_CMD: INV (Bitfield-Mask: 0x01) */ +/* ================================================== FLASHC.DW1_BUFF_CTL ================================================== */ +#define FLASHC_DW1_BUFF_CTL_PREF_EN_Pos (30UL) /*!< FLASHC DW1_BUFF_CTL: PREF_EN (Bit 30) */ +#define FLASHC_DW1_BUFF_CTL_PREF_EN_Msk (0x40000000UL) /*!< FLASHC DW1_BUFF_CTL: PREF_EN (Bitfield-Mask: 0x01) */ +#define FLASHC_DW1_BUFF_CTL_ENABLED_Pos (31UL) /*!< FLASHC DW1_BUFF_CTL: ENABLED (Bit 31) */ +#define FLASHC_DW1_BUFF_CTL_ENABLED_Msk (0x80000000UL) /*!< FLASHC DW1_BUFF_CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================== FLASHC.DW1_BUFF_CMD ================================================== */ +#define FLASHC_DW1_BUFF_CMD_INV_Pos (0UL) /*!< FLASHC DW1_BUFF_CMD: INV (Bit 0) */ +#define FLASHC_DW1_BUFF_CMD_INV_Msk (0x1UL) /*!< FLASHC DW1_BUFF_CMD: INV (Bitfield-Mask: 0x01) */ +/* ================================================== FLASHC.DAP_BUFF_CTL ================================================== */ +#define FLASHC_DAP_BUFF_CTL_PREF_EN_Pos (30UL) /*!< FLASHC DAP_BUFF_CTL: PREF_EN (Bit 30) */ +#define FLASHC_DAP_BUFF_CTL_PREF_EN_Msk (0x40000000UL) /*!< FLASHC DAP_BUFF_CTL: PREF_EN (Bitfield-Mask: 0x01) */ +#define FLASHC_DAP_BUFF_CTL_ENABLED_Pos (31UL) /*!< FLASHC DAP_BUFF_CTL: ENABLED (Bit 31) */ +#define FLASHC_DAP_BUFF_CTL_ENABLED_Msk (0x80000000UL) /*!< FLASHC DAP_BUFF_CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================== FLASHC.DAP_BUFF_CMD ================================================== */ +#define FLASHC_DAP_BUFF_CMD_INV_Pos (0UL) /*!< FLASHC DAP_BUFF_CMD: INV (Bit 0) */ +#define FLASHC_DAP_BUFF_CMD_INV_Msk (0x1UL) /*!< FLASHC DAP_BUFF_CMD: INV (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC.EXT_MS0_BUFF_CTL ================================================ */ +#define FLASHC_EXT_MS0_BUFF_CTL_PREF_EN_Pos (30UL) /*!< FLASHC EXT_MS0_BUFF_CTL: PREF_EN (Bit 30) */ +#define FLASHC_EXT_MS0_BUFF_CTL_PREF_EN_Msk (0x40000000UL) /*!< FLASHC EXT_MS0_BUFF_CTL: PREF_EN (Bitfield-Mask: 0x01) */ +#define FLASHC_EXT_MS0_BUFF_CTL_ENABLED_Pos (31UL) /*!< FLASHC EXT_MS0_BUFF_CTL: ENABLED (Bit 31) */ +#define FLASHC_EXT_MS0_BUFF_CTL_ENABLED_Msk (0x80000000UL) /*!< FLASHC EXT_MS0_BUFF_CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC.EXT_MS0_BUFF_CMD ================================================ */ +#define FLASHC_EXT_MS0_BUFF_CMD_INV_Pos (0UL) /*!< FLASHC EXT_MS0_BUFF_CMD: INV (Bit 0) */ +#define FLASHC_EXT_MS0_BUFF_CMD_INV_Msk (0x1UL) /*!< FLASHC EXT_MS0_BUFF_CMD: INV (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC.EXT_MS1_BUFF_CTL ================================================ */ +#define FLASHC_EXT_MS1_BUFF_CTL_PREF_EN_Pos (30UL) /*!< FLASHC EXT_MS1_BUFF_CTL: PREF_EN (Bit 30) */ +#define FLASHC_EXT_MS1_BUFF_CTL_PREF_EN_Msk (0x40000000UL) /*!< FLASHC EXT_MS1_BUFF_CTL: PREF_EN (Bitfield-Mask: 0x01) */ +#define FLASHC_EXT_MS1_BUFF_CTL_ENABLED_Pos (31UL) /*!< FLASHC EXT_MS1_BUFF_CTL: ENABLED (Bit 31) */ +#define FLASHC_EXT_MS1_BUFF_CTL_ENABLED_Msk (0x80000000UL) /*!< FLASHC EXT_MS1_BUFF_CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================ FLASHC.EXT_MS1_BUFF_CMD ================================================ */ +#define FLASHC_EXT_MS1_BUFF_CMD_INV_Pos (0UL) /*!< FLASHC EXT_MS1_BUFF_CMD: INV (Bit 0) */ +#define FLASHC_EXT_MS1_BUFF_CMD_INV_Msk (0x1UL) /*!< FLASHC EXT_MS1_BUFF_CMD: INV (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_FLASHC_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_gpio.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_gpio.h new file mode 100644 index 0000000000..02ef325503 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_gpio.h @@ -0,0 +1,468 @@ +/***************************************************************************//** +* \file cyip_gpio.h +* +* \brief +* GPIO IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_GPIO_H_ +#define _CYIP_GPIO_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ GPIO ================ */ +/* =========================================================================================================================== */ + +#define GPIO_PRT_SECTION_SIZE 0x00000080UL +#define GPIO_SECTION_SIZE 0x00010000UL + +/** + * \brief GPIO port registers (GPIO_PRT) + */ +typedef struct { + __IOM uint32_t OUT; /*!< 0x00000000 Port output data register */ + __IOM uint32_t OUT_CLR; /*!< 0x00000004 Port output data set register */ + __IOM uint32_t OUT_SET; /*!< 0x00000008 Port output data clear register */ + __IOM uint32_t OUT_INV; /*!< 0x0000000C Port output data invert register */ + __IM uint32_t IN; /*!< 0x00000010 Port input state register */ + __IOM uint32_t INTR; /*!< 0x00000014 Port interrupt status register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000018 Port interrupt mask register */ + __IM uint32_t INTR_MASKED; /*!< 0x0000001C Port interrupt masked status register */ + __IOM uint32_t INTR_SET; /*!< 0x00000020 Port interrupt set register */ + __IOM uint32_t INTR_CFG; /*!< 0x00000024 Port interrupt configuration register */ + __IOM uint32_t CFG; /*!< 0x00000028 Port configuration register */ + __IOM uint32_t CFG_IN; /*!< 0x0000002C Port input buffer configuration register */ + __IOM uint32_t CFG_OUT; /*!< 0x00000030 Port output buffer configuration register */ + __IOM uint32_t CFG_SIO; /*!< 0x00000034 Port SIO configuration register */ + __IM uint32_t RESERVED; + __IOM uint32_t CFG_IN_GPIO5V; /*!< 0x0000003C Port GPIO5V input buffer configuration register */ + __IM uint32_t RESERVED1[16]; +} GPIO_PRT_Type; /*!< Size = 64 (0x40) */ + +/** + * \brief GPIO port control/configuration (GPIO) + */ +typedef struct { /*!< GPIO Structure */ + GPIO_PRT_Type PRT[128]; /*!< 0x00000000 GPIO port registers */ + __IM uint32_t INTR_CAUSE0; /*!< 0x00004000 Interrupt port cause register 0 */ + __IM uint32_t INTR_CAUSE1; /*!< 0x00004004 Interrupt port cause register 1 */ + __IM uint32_t INTR_CAUSE2; /*!< 0x00004008 Interrupt port cause register 2 */ + __IM uint32_t INTR_CAUSE3; /*!< 0x0000400C Interrupt port cause register 3 */ + __IM uint32_t VDD_ACTIVE; /*!< 0x00004010 Extern power supply detection register */ + __IOM uint32_t VDD_INTR; /*!< 0x00004014 Supply detection interrupt register */ + __IOM uint32_t VDD_INTR_MASK; /*!< 0x00004018 Supply detection interrupt mask register */ + __IM uint32_t VDD_INTR_MASKED; /*!< 0x0000401C Supply detection interrupt masked register */ + __IOM uint32_t VDD_INTR_SET; /*!< 0x00004020 Supply detection interrupt set register */ +} GPIO_Type; /*!< Size = 16420 (0x4024) */ + + +/* ===================================================== GPIO_PRT.OUT ====================================================== */ +#define GPIO_PRT_OUT_OUT0_Pos (0UL) /*!< GPIO_PRT OUT: OUT0 (Bit 0) */ +#define GPIO_PRT_OUT_OUT0_Msk (0x1UL) /*!< GPIO_PRT OUT: OUT0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_OUT1_Pos (1UL) /*!< GPIO_PRT OUT: OUT1 (Bit 1) */ +#define GPIO_PRT_OUT_OUT1_Msk (0x2UL) /*!< GPIO_PRT OUT: OUT1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_OUT2_Pos (2UL) /*!< GPIO_PRT OUT: OUT2 (Bit 2) */ +#define GPIO_PRT_OUT_OUT2_Msk (0x4UL) /*!< GPIO_PRT OUT: OUT2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_OUT3_Pos (3UL) /*!< GPIO_PRT OUT: OUT3 (Bit 3) */ +#define GPIO_PRT_OUT_OUT3_Msk (0x8UL) /*!< GPIO_PRT OUT: OUT3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_OUT4_Pos (4UL) /*!< GPIO_PRT OUT: OUT4 (Bit 4) */ +#define GPIO_PRT_OUT_OUT4_Msk (0x10UL) /*!< GPIO_PRT OUT: OUT4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_OUT5_Pos (5UL) /*!< GPIO_PRT OUT: OUT5 (Bit 5) */ +#define GPIO_PRT_OUT_OUT5_Msk (0x20UL) /*!< GPIO_PRT OUT: OUT5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_OUT6_Pos (6UL) /*!< GPIO_PRT OUT: OUT6 (Bit 6) */ +#define GPIO_PRT_OUT_OUT6_Msk (0x40UL) /*!< GPIO_PRT OUT: OUT6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_OUT7_Pos (7UL) /*!< GPIO_PRT OUT: OUT7 (Bit 7) */ +#define GPIO_PRT_OUT_OUT7_Msk (0x80UL) /*!< GPIO_PRT OUT: OUT7 (Bitfield-Mask: 0x01) */ +/* =================================================== GPIO_PRT.OUT_CLR ==================================================== */ +#define GPIO_PRT_OUT_CLR_OUT0_Pos (0UL) /*!< GPIO_PRT OUT_CLR: OUT0 (Bit 0) */ +#define GPIO_PRT_OUT_CLR_OUT0_Msk (0x1UL) /*!< GPIO_PRT OUT_CLR: OUT0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_CLR_OUT1_Pos (1UL) /*!< GPIO_PRT OUT_CLR: OUT1 (Bit 1) */ +#define GPIO_PRT_OUT_CLR_OUT1_Msk (0x2UL) /*!< GPIO_PRT OUT_CLR: OUT1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_CLR_OUT2_Pos (2UL) /*!< GPIO_PRT OUT_CLR: OUT2 (Bit 2) */ +#define GPIO_PRT_OUT_CLR_OUT2_Msk (0x4UL) /*!< GPIO_PRT OUT_CLR: OUT2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_CLR_OUT3_Pos (3UL) /*!< GPIO_PRT OUT_CLR: OUT3 (Bit 3) */ +#define GPIO_PRT_OUT_CLR_OUT3_Msk (0x8UL) /*!< GPIO_PRT OUT_CLR: OUT3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_CLR_OUT4_Pos (4UL) /*!< GPIO_PRT OUT_CLR: OUT4 (Bit 4) */ +#define GPIO_PRT_OUT_CLR_OUT4_Msk (0x10UL) /*!< GPIO_PRT OUT_CLR: OUT4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_CLR_OUT5_Pos (5UL) /*!< GPIO_PRT OUT_CLR: OUT5 (Bit 5) */ +#define GPIO_PRT_OUT_CLR_OUT5_Msk (0x20UL) /*!< GPIO_PRT OUT_CLR: OUT5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_CLR_OUT6_Pos (6UL) /*!< GPIO_PRT OUT_CLR: OUT6 (Bit 6) */ +#define GPIO_PRT_OUT_CLR_OUT6_Msk (0x40UL) /*!< GPIO_PRT OUT_CLR: OUT6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_CLR_OUT7_Pos (7UL) /*!< GPIO_PRT OUT_CLR: OUT7 (Bit 7) */ +#define GPIO_PRT_OUT_CLR_OUT7_Msk (0x80UL) /*!< GPIO_PRT OUT_CLR: OUT7 (Bitfield-Mask: 0x01) */ +/* =================================================== GPIO_PRT.OUT_SET ==================================================== */ +#define GPIO_PRT_OUT_SET_OUT0_Pos (0UL) /*!< GPIO_PRT OUT_SET: OUT0 (Bit 0) */ +#define GPIO_PRT_OUT_SET_OUT0_Msk (0x1UL) /*!< GPIO_PRT OUT_SET: OUT0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_SET_OUT1_Pos (1UL) /*!< GPIO_PRT OUT_SET: OUT1 (Bit 1) */ +#define GPIO_PRT_OUT_SET_OUT1_Msk (0x2UL) /*!< GPIO_PRT OUT_SET: OUT1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_SET_OUT2_Pos (2UL) /*!< GPIO_PRT OUT_SET: OUT2 (Bit 2) */ +#define GPIO_PRT_OUT_SET_OUT2_Msk (0x4UL) /*!< GPIO_PRT OUT_SET: OUT2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_SET_OUT3_Pos (3UL) /*!< GPIO_PRT OUT_SET: OUT3 (Bit 3) */ +#define GPIO_PRT_OUT_SET_OUT3_Msk (0x8UL) /*!< GPIO_PRT OUT_SET: OUT3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_SET_OUT4_Pos (4UL) /*!< GPIO_PRT OUT_SET: OUT4 (Bit 4) */ +#define GPIO_PRT_OUT_SET_OUT4_Msk (0x10UL) /*!< GPIO_PRT OUT_SET: OUT4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_SET_OUT5_Pos (5UL) /*!< GPIO_PRT OUT_SET: OUT5 (Bit 5) */ +#define GPIO_PRT_OUT_SET_OUT5_Msk (0x20UL) /*!< GPIO_PRT OUT_SET: OUT5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_SET_OUT6_Pos (6UL) /*!< GPIO_PRT OUT_SET: OUT6 (Bit 6) */ +#define GPIO_PRT_OUT_SET_OUT6_Msk (0x40UL) /*!< GPIO_PRT OUT_SET: OUT6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_SET_OUT7_Pos (7UL) /*!< GPIO_PRT OUT_SET: OUT7 (Bit 7) */ +#define GPIO_PRT_OUT_SET_OUT7_Msk (0x80UL) /*!< GPIO_PRT OUT_SET: OUT7 (Bitfield-Mask: 0x01) */ +/* =================================================== GPIO_PRT.OUT_INV ==================================================== */ +#define GPIO_PRT_OUT_INV_OUT0_Pos (0UL) /*!< GPIO_PRT OUT_INV: OUT0 (Bit 0) */ +#define GPIO_PRT_OUT_INV_OUT0_Msk (0x1UL) /*!< GPIO_PRT OUT_INV: OUT0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_INV_OUT1_Pos (1UL) /*!< GPIO_PRT OUT_INV: OUT1 (Bit 1) */ +#define GPIO_PRT_OUT_INV_OUT1_Msk (0x2UL) /*!< GPIO_PRT OUT_INV: OUT1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_INV_OUT2_Pos (2UL) /*!< GPIO_PRT OUT_INV: OUT2 (Bit 2) */ +#define GPIO_PRT_OUT_INV_OUT2_Msk (0x4UL) /*!< GPIO_PRT OUT_INV: OUT2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_INV_OUT3_Pos (3UL) /*!< GPIO_PRT OUT_INV: OUT3 (Bit 3) */ +#define GPIO_PRT_OUT_INV_OUT3_Msk (0x8UL) /*!< GPIO_PRT OUT_INV: OUT3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_INV_OUT4_Pos (4UL) /*!< GPIO_PRT OUT_INV: OUT4 (Bit 4) */ +#define GPIO_PRT_OUT_INV_OUT4_Msk (0x10UL) /*!< GPIO_PRT OUT_INV: OUT4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_INV_OUT5_Pos (5UL) /*!< GPIO_PRT OUT_INV: OUT5 (Bit 5) */ +#define GPIO_PRT_OUT_INV_OUT5_Msk (0x20UL) /*!< GPIO_PRT OUT_INV: OUT5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_INV_OUT6_Pos (6UL) /*!< GPIO_PRT OUT_INV: OUT6 (Bit 6) */ +#define GPIO_PRT_OUT_INV_OUT6_Msk (0x40UL) /*!< GPIO_PRT OUT_INV: OUT6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_OUT_INV_OUT7_Pos (7UL) /*!< GPIO_PRT OUT_INV: OUT7 (Bit 7) */ +#define GPIO_PRT_OUT_INV_OUT7_Msk (0x80UL) /*!< GPIO_PRT OUT_INV: OUT7 (Bitfield-Mask: 0x01) */ +/* ====================================================== GPIO_PRT.IN ====================================================== */ +#define GPIO_PRT_IN_IN0_Pos (0UL) /*!< GPIO_PRT IN: IN0 (Bit 0) */ +#define GPIO_PRT_IN_IN0_Msk (0x1UL) /*!< GPIO_PRT IN: IN0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_IN_IN1_Pos (1UL) /*!< GPIO_PRT IN: IN1 (Bit 1) */ +#define GPIO_PRT_IN_IN1_Msk (0x2UL) /*!< GPIO_PRT IN: IN1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_IN_IN2_Pos (2UL) /*!< GPIO_PRT IN: IN2 (Bit 2) */ +#define GPIO_PRT_IN_IN2_Msk (0x4UL) /*!< GPIO_PRT IN: IN2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_IN_IN3_Pos (3UL) /*!< GPIO_PRT IN: IN3 (Bit 3) */ +#define GPIO_PRT_IN_IN3_Msk (0x8UL) /*!< GPIO_PRT IN: IN3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_IN_IN4_Pos (4UL) /*!< GPIO_PRT IN: IN4 (Bit 4) */ +#define GPIO_PRT_IN_IN4_Msk (0x10UL) /*!< GPIO_PRT IN: IN4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_IN_IN5_Pos (5UL) /*!< GPIO_PRT IN: IN5 (Bit 5) */ +#define GPIO_PRT_IN_IN5_Msk (0x20UL) /*!< GPIO_PRT IN: IN5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_IN_IN6_Pos (6UL) /*!< GPIO_PRT IN: IN6 (Bit 6) */ +#define GPIO_PRT_IN_IN6_Msk (0x40UL) /*!< GPIO_PRT IN: IN6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_IN_IN7_Pos (7UL) /*!< GPIO_PRT IN: IN7 (Bit 7) */ +#define GPIO_PRT_IN_IN7_Msk (0x80UL) /*!< GPIO_PRT IN: IN7 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_IN_FLT_IN_Pos (8UL) /*!< GPIO_PRT IN: FLT_IN (Bit 8) */ +#define GPIO_PRT_IN_FLT_IN_Msk (0x100UL) /*!< GPIO_PRT IN: FLT_IN (Bitfield-Mask: 0x01) */ +/* ===================================================== GPIO_PRT.INTR ===================================================== */ +#define GPIO_PRT_INTR_EDGE0_Pos (0UL) /*!< GPIO_PRT INTR: EDGE0 (Bit 0) */ +#define GPIO_PRT_INTR_EDGE0_Msk (0x1UL) /*!< GPIO_PRT INTR: EDGE0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_EDGE1_Pos (1UL) /*!< GPIO_PRT INTR: EDGE1 (Bit 1) */ +#define GPIO_PRT_INTR_EDGE1_Msk (0x2UL) /*!< GPIO_PRT INTR: EDGE1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_EDGE2_Pos (2UL) /*!< GPIO_PRT INTR: EDGE2 (Bit 2) */ +#define GPIO_PRT_INTR_EDGE2_Msk (0x4UL) /*!< GPIO_PRT INTR: EDGE2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_EDGE3_Pos (3UL) /*!< GPIO_PRT INTR: EDGE3 (Bit 3) */ +#define GPIO_PRT_INTR_EDGE3_Msk (0x8UL) /*!< GPIO_PRT INTR: EDGE3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_EDGE4_Pos (4UL) /*!< GPIO_PRT INTR: EDGE4 (Bit 4) */ +#define GPIO_PRT_INTR_EDGE4_Msk (0x10UL) /*!< GPIO_PRT INTR: EDGE4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_EDGE5_Pos (5UL) /*!< GPIO_PRT INTR: EDGE5 (Bit 5) */ +#define GPIO_PRT_INTR_EDGE5_Msk (0x20UL) /*!< GPIO_PRT INTR: EDGE5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_EDGE6_Pos (6UL) /*!< GPIO_PRT INTR: EDGE6 (Bit 6) */ +#define GPIO_PRT_INTR_EDGE6_Msk (0x40UL) /*!< GPIO_PRT INTR: EDGE6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_EDGE7_Pos (7UL) /*!< GPIO_PRT INTR: EDGE7 (Bit 7) */ +#define GPIO_PRT_INTR_EDGE7_Msk (0x80UL) /*!< GPIO_PRT INTR: EDGE7 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_FLT_EDGE_Pos (8UL) /*!< GPIO_PRT INTR: FLT_EDGE (Bit 8) */ +#define GPIO_PRT_INTR_FLT_EDGE_Msk (0x100UL) /*!< GPIO_PRT INTR: FLT_EDGE (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_IN_IN0_Pos (16UL) /*!< GPIO_PRT INTR: IN_IN0 (Bit 16) */ +#define GPIO_PRT_INTR_IN_IN0_Msk (0x10000UL) /*!< GPIO_PRT INTR: IN_IN0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_IN_IN1_Pos (17UL) /*!< GPIO_PRT INTR: IN_IN1 (Bit 17) */ +#define GPIO_PRT_INTR_IN_IN1_Msk (0x20000UL) /*!< GPIO_PRT INTR: IN_IN1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_IN_IN2_Pos (18UL) /*!< GPIO_PRT INTR: IN_IN2 (Bit 18) */ +#define GPIO_PRT_INTR_IN_IN2_Msk (0x40000UL) /*!< GPIO_PRT INTR: IN_IN2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_IN_IN3_Pos (19UL) /*!< GPIO_PRT INTR: IN_IN3 (Bit 19) */ +#define GPIO_PRT_INTR_IN_IN3_Msk (0x80000UL) /*!< GPIO_PRT INTR: IN_IN3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_IN_IN4_Pos (20UL) /*!< GPIO_PRT INTR: IN_IN4 (Bit 20) */ +#define GPIO_PRT_INTR_IN_IN4_Msk (0x100000UL) /*!< GPIO_PRT INTR: IN_IN4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_IN_IN5_Pos (21UL) /*!< GPIO_PRT INTR: IN_IN5 (Bit 21) */ +#define GPIO_PRT_INTR_IN_IN5_Msk (0x200000UL) /*!< GPIO_PRT INTR: IN_IN5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_IN_IN6_Pos (22UL) /*!< GPIO_PRT INTR: IN_IN6 (Bit 22) */ +#define GPIO_PRT_INTR_IN_IN6_Msk (0x400000UL) /*!< GPIO_PRT INTR: IN_IN6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_IN_IN7_Pos (23UL) /*!< GPIO_PRT INTR: IN_IN7 (Bit 23) */ +#define GPIO_PRT_INTR_IN_IN7_Msk (0x800000UL) /*!< GPIO_PRT INTR: IN_IN7 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_FLT_IN_IN_Pos (24UL) /*!< GPIO_PRT INTR: FLT_IN_IN (Bit 24) */ +#define GPIO_PRT_INTR_FLT_IN_IN_Msk (0x1000000UL) /*!< GPIO_PRT INTR: FLT_IN_IN (Bitfield-Mask: 0x01) */ +/* ================================================== GPIO_PRT.INTR_MASK =================================================== */ +#define GPIO_PRT_INTR_MASK_EDGE0_Pos (0UL) /*!< GPIO_PRT INTR_MASK: EDGE0 (Bit 0) */ +#define GPIO_PRT_INTR_MASK_EDGE0_Msk (0x1UL) /*!< GPIO_PRT INTR_MASK: EDGE0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASK_EDGE1_Pos (1UL) /*!< GPIO_PRT INTR_MASK: EDGE1 (Bit 1) */ +#define GPIO_PRT_INTR_MASK_EDGE1_Msk (0x2UL) /*!< GPIO_PRT INTR_MASK: EDGE1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASK_EDGE2_Pos (2UL) /*!< GPIO_PRT INTR_MASK: EDGE2 (Bit 2) */ +#define GPIO_PRT_INTR_MASK_EDGE2_Msk (0x4UL) /*!< GPIO_PRT INTR_MASK: EDGE2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASK_EDGE3_Pos (3UL) /*!< GPIO_PRT INTR_MASK: EDGE3 (Bit 3) */ +#define GPIO_PRT_INTR_MASK_EDGE3_Msk (0x8UL) /*!< GPIO_PRT INTR_MASK: EDGE3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASK_EDGE4_Pos (4UL) /*!< GPIO_PRT INTR_MASK: EDGE4 (Bit 4) */ +#define GPIO_PRT_INTR_MASK_EDGE4_Msk (0x10UL) /*!< GPIO_PRT INTR_MASK: EDGE4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASK_EDGE5_Pos (5UL) /*!< GPIO_PRT INTR_MASK: EDGE5 (Bit 5) */ +#define GPIO_PRT_INTR_MASK_EDGE5_Msk (0x20UL) /*!< GPIO_PRT INTR_MASK: EDGE5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASK_EDGE6_Pos (6UL) /*!< GPIO_PRT INTR_MASK: EDGE6 (Bit 6) */ +#define GPIO_PRT_INTR_MASK_EDGE6_Msk (0x40UL) /*!< GPIO_PRT INTR_MASK: EDGE6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASK_EDGE7_Pos (7UL) /*!< GPIO_PRT INTR_MASK: EDGE7 (Bit 7) */ +#define GPIO_PRT_INTR_MASK_EDGE7_Msk (0x80UL) /*!< GPIO_PRT INTR_MASK: EDGE7 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASK_FLT_EDGE_Pos (8UL) /*!< GPIO_PRT INTR_MASK: FLT_EDGE (Bit 8) */ +#define GPIO_PRT_INTR_MASK_FLT_EDGE_Msk (0x100UL) /*!< GPIO_PRT INTR_MASK: FLT_EDGE (Bitfield-Mask: 0x01) */ +/* ================================================= GPIO_PRT.INTR_MASKED ================================================== */ +#define GPIO_PRT_INTR_MASKED_EDGE0_Pos (0UL) /*!< GPIO_PRT INTR_MASKED: EDGE0 (Bit 0) */ +#define GPIO_PRT_INTR_MASKED_EDGE0_Msk (0x1UL) /*!< GPIO_PRT INTR_MASKED: EDGE0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASKED_EDGE1_Pos (1UL) /*!< GPIO_PRT INTR_MASKED: EDGE1 (Bit 1) */ +#define GPIO_PRT_INTR_MASKED_EDGE1_Msk (0x2UL) /*!< GPIO_PRT INTR_MASKED: EDGE1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASKED_EDGE2_Pos (2UL) /*!< GPIO_PRT INTR_MASKED: EDGE2 (Bit 2) */ +#define GPIO_PRT_INTR_MASKED_EDGE2_Msk (0x4UL) /*!< GPIO_PRT INTR_MASKED: EDGE2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASKED_EDGE3_Pos (3UL) /*!< GPIO_PRT INTR_MASKED: EDGE3 (Bit 3) */ +#define GPIO_PRT_INTR_MASKED_EDGE3_Msk (0x8UL) /*!< GPIO_PRT INTR_MASKED: EDGE3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASKED_EDGE4_Pos (4UL) /*!< GPIO_PRT INTR_MASKED: EDGE4 (Bit 4) */ +#define GPIO_PRT_INTR_MASKED_EDGE4_Msk (0x10UL) /*!< GPIO_PRT INTR_MASKED: EDGE4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASKED_EDGE5_Pos (5UL) /*!< GPIO_PRT INTR_MASKED: EDGE5 (Bit 5) */ +#define GPIO_PRT_INTR_MASKED_EDGE5_Msk (0x20UL) /*!< GPIO_PRT INTR_MASKED: EDGE5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASKED_EDGE6_Pos (6UL) /*!< GPIO_PRT INTR_MASKED: EDGE6 (Bit 6) */ +#define GPIO_PRT_INTR_MASKED_EDGE6_Msk (0x40UL) /*!< GPIO_PRT INTR_MASKED: EDGE6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASKED_EDGE7_Pos (7UL) /*!< GPIO_PRT INTR_MASKED: EDGE7 (Bit 7) */ +#define GPIO_PRT_INTR_MASKED_EDGE7_Msk (0x80UL) /*!< GPIO_PRT INTR_MASKED: EDGE7 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_MASKED_FLT_EDGE_Pos (8UL) /*!< GPIO_PRT INTR_MASKED: FLT_EDGE (Bit 8) */ +#define GPIO_PRT_INTR_MASKED_FLT_EDGE_Msk (0x100UL) /*!< GPIO_PRT INTR_MASKED: FLT_EDGE (Bitfield-Mask: 0x01) */ +/* =================================================== GPIO_PRT.INTR_SET =================================================== */ +#define GPIO_PRT_INTR_SET_EDGE0_Pos (0UL) /*!< GPIO_PRT INTR_SET: EDGE0 (Bit 0) */ +#define GPIO_PRT_INTR_SET_EDGE0_Msk (0x1UL) /*!< GPIO_PRT INTR_SET: EDGE0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_SET_EDGE1_Pos (1UL) /*!< GPIO_PRT INTR_SET: EDGE1 (Bit 1) */ +#define GPIO_PRT_INTR_SET_EDGE1_Msk (0x2UL) /*!< GPIO_PRT INTR_SET: EDGE1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_SET_EDGE2_Pos (2UL) /*!< GPIO_PRT INTR_SET: EDGE2 (Bit 2) */ +#define GPIO_PRT_INTR_SET_EDGE2_Msk (0x4UL) /*!< GPIO_PRT INTR_SET: EDGE2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_SET_EDGE3_Pos (3UL) /*!< GPIO_PRT INTR_SET: EDGE3 (Bit 3) */ +#define GPIO_PRT_INTR_SET_EDGE3_Msk (0x8UL) /*!< GPIO_PRT INTR_SET: EDGE3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_SET_EDGE4_Pos (4UL) /*!< GPIO_PRT INTR_SET: EDGE4 (Bit 4) */ +#define GPIO_PRT_INTR_SET_EDGE4_Msk (0x10UL) /*!< GPIO_PRT INTR_SET: EDGE4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_SET_EDGE5_Pos (5UL) /*!< GPIO_PRT INTR_SET: EDGE5 (Bit 5) */ +#define GPIO_PRT_INTR_SET_EDGE5_Msk (0x20UL) /*!< GPIO_PRT INTR_SET: EDGE5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_SET_EDGE6_Pos (6UL) /*!< GPIO_PRT INTR_SET: EDGE6 (Bit 6) */ +#define GPIO_PRT_INTR_SET_EDGE6_Msk (0x40UL) /*!< GPIO_PRT INTR_SET: EDGE6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_SET_EDGE7_Pos (7UL) /*!< GPIO_PRT INTR_SET: EDGE7 (Bit 7) */ +#define GPIO_PRT_INTR_SET_EDGE7_Msk (0x80UL) /*!< GPIO_PRT INTR_SET: EDGE7 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_INTR_SET_FLT_EDGE_Pos (8UL) /*!< GPIO_PRT INTR_SET: FLT_EDGE (Bit 8) */ +#define GPIO_PRT_INTR_SET_FLT_EDGE_Msk (0x100UL) /*!< GPIO_PRT INTR_SET: FLT_EDGE (Bitfield-Mask: 0x01) */ +/* =================================================== GPIO_PRT.INTR_CFG =================================================== */ +#define GPIO_PRT_INTR_CFG_EDGE0_SEL_Pos (0UL) /*!< GPIO_PRT INTR_CFG: EDGE0_SEL (Bit 0) */ +#define GPIO_PRT_INTR_CFG_EDGE0_SEL_Msk (0x3UL) /*!< GPIO_PRT INTR_CFG: EDGE0_SEL (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_INTR_CFG_EDGE1_SEL_Pos (2UL) /*!< GPIO_PRT INTR_CFG: EDGE1_SEL (Bit 2) */ +#define GPIO_PRT_INTR_CFG_EDGE1_SEL_Msk (0xcUL) /*!< GPIO_PRT INTR_CFG: EDGE1_SEL (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_INTR_CFG_EDGE2_SEL_Pos (4UL) /*!< GPIO_PRT INTR_CFG: EDGE2_SEL (Bit 4) */ +#define GPIO_PRT_INTR_CFG_EDGE2_SEL_Msk (0x30UL) /*!< GPIO_PRT INTR_CFG: EDGE2_SEL (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_INTR_CFG_EDGE3_SEL_Pos (6UL) /*!< GPIO_PRT INTR_CFG: EDGE3_SEL (Bit 6) */ +#define GPIO_PRT_INTR_CFG_EDGE3_SEL_Msk (0xc0UL) /*!< GPIO_PRT INTR_CFG: EDGE3_SEL (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_INTR_CFG_EDGE4_SEL_Pos (8UL) /*!< GPIO_PRT INTR_CFG: EDGE4_SEL (Bit 8) */ +#define GPIO_PRT_INTR_CFG_EDGE4_SEL_Msk (0x300UL) /*!< GPIO_PRT INTR_CFG: EDGE4_SEL (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_INTR_CFG_EDGE5_SEL_Pos (10UL) /*!< GPIO_PRT INTR_CFG: EDGE5_SEL (Bit 10) */ +#define GPIO_PRT_INTR_CFG_EDGE5_SEL_Msk (0xc00UL) /*!< GPIO_PRT INTR_CFG: EDGE5_SEL (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_INTR_CFG_EDGE6_SEL_Pos (12UL) /*!< GPIO_PRT INTR_CFG: EDGE6_SEL (Bit 12) */ +#define GPIO_PRT_INTR_CFG_EDGE6_SEL_Msk (0x3000UL) /*!< GPIO_PRT INTR_CFG: EDGE6_SEL (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_INTR_CFG_EDGE7_SEL_Pos (14UL) /*!< GPIO_PRT INTR_CFG: EDGE7_SEL (Bit 14) */ +#define GPIO_PRT_INTR_CFG_EDGE7_SEL_Msk (0xc000UL) /*!< GPIO_PRT INTR_CFG: EDGE7_SEL (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_INTR_CFG_FLT_EDGE_SEL_Pos (16UL) /*!< GPIO_PRT INTR_CFG: FLT_EDGE_SEL (Bit 16) */ +#define GPIO_PRT_INTR_CFG_FLT_EDGE_SEL_Msk (0x30000UL) /*!< GPIO_PRT INTR_CFG: FLT_EDGE_SEL (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_INTR_CFG_FLT_SEL_Pos (18UL) /*!< GPIO_PRT INTR_CFG: FLT_SEL (Bit 18) */ +#define GPIO_PRT_INTR_CFG_FLT_SEL_Msk (0x1c0000UL) /*!< GPIO_PRT INTR_CFG: FLT_SEL (Bitfield-Mask: 0x07) */ +/* ===================================================== GPIO_PRT.CFG ====================================================== */ +#define GPIO_PRT_CFG_DRIVE_MODE0_Pos (0UL) /*!< GPIO_PRT CFG: DRIVE_MODE0 (Bit 0) */ +#define GPIO_PRT_CFG_DRIVE_MODE0_Msk (0x7UL) /*!< GPIO_PRT CFG: DRIVE_MODE0 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_IN_EN0_Pos (3UL) /*!< GPIO_PRT CFG: IN_EN0 (Bit 3) */ +#define GPIO_PRT_CFG_IN_EN0_Msk (0x8UL) /*!< GPIO_PRT CFG: IN_EN0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_DRIVE_MODE1_Pos (4UL) /*!< GPIO_PRT CFG: DRIVE_MODE1 (Bit 4) */ +#define GPIO_PRT_CFG_DRIVE_MODE1_Msk (0x70UL) /*!< GPIO_PRT CFG: DRIVE_MODE1 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_IN_EN1_Pos (7UL) /*!< GPIO_PRT CFG: IN_EN1 (Bit 7) */ +#define GPIO_PRT_CFG_IN_EN1_Msk (0x80UL) /*!< GPIO_PRT CFG: IN_EN1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_DRIVE_MODE2_Pos (8UL) /*!< GPIO_PRT CFG: DRIVE_MODE2 (Bit 8) */ +#define GPIO_PRT_CFG_DRIVE_MODE2_Msk (0x700UL) /*!< GPIO_PRT CFG: DRIVE_MODE2 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_IN_EN2_Pos (11UL) /*!< GPIO_PRT CFG: IN_EN2 (Bit 11) */ +#define GPIO_PRT_CFG_IN_EN2_Msk (0x800UL) /*!< GPIO_PRT CFG: IN_EN2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_DRIVE_MODE3_Pos (12UL) /*!< GPIO_PRT CFG: DRIVE_MODE3 (Bit 12) */ +#define GPIO_PRT_CFG_DRIVE_MODE3_Msk (0x7000UL) /*!< GPIO_PRT CFG: DRIVE_MODE3 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_IN_EN3_Pos (15UL) /*!< GPIO_PRT CFG: IN_EN3 (Bit 15) */ +#define GPIO_PRT_CFG_IN_EN3_Msk (0x8000UL) /*!< GPIO_PRT CFG: IN_EN3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_DRIVE_MODE4_Pos (16UL) /*!< GPIO_PRT CFG: DRIVE_MODE4 (Bit 16) */ +#define GPIO_PRT_CFG_DRIVE_MODE4_Msk (0x70000UL) /*!< GPIO_PRT CFG: DRIVE_MODE4 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_IN_EN4_Pos (19UL) /*!< GPIO_PRT CFG: IN_EN4 (Bit 19) */ +#define GPIO_PRT_CFG_IN_EN4_Msk (0x80000UL) /*!< GPIO_PRT CFG: IN_EN4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_DRIVE_MODE5_Pos (20UL) /*!< GPIO_PRT CFG: DRIVE_MODE5 (Bit 20) */ +#define GPIO_PRT_CFG_DRIVE_MODE5_Msk (0x700000UL) /*!< GPIO_PRT CFG: DRIVE_MODE5 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_IN_EN5_Pos (23UL) /*!< GPIO_PRT CFG: IN_EN5 (Bit 23) */ +#define GPIO_PRT_CFG_IN_EN5_Msk (0x800000UL) /*!< GPIO_PRT CFG: IN_EN5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_DRIVE_MODE6_Pos (24UL) /*!< GPIO_PRT CFG: DRIVE_MODE6 (Bit 24) */ +#define GPIO_PRT_CFG_DRIVE_MODE6_Msk (0x7000000UL) /*!< GPIO_PRT CFG: DRIVE_MODE6 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_IN_EN6_Pos (27UL) /*!< GPIO_PRT CFG: IN_EN6 (Bit 27) */ +#define GPIO_PRT_CFG_IN_EN6_Msk (0x8000000UL) /*!< GPIO_PRT CFG: IN_EN6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_DRIVE_MODE7_Pos (28UL) /*!< GPIO_PRT CFG: DRIVE_MODE7 (Bit 28) */ +#define GPIO_PRT_CFG_DRIVE_MODE7_Msk (0x70000000UL) /*!< GPIO_PRT CFG: DRIVE_MODE7 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_IN_EN7_Pos (31UL) /*!< GPIO_PRT CFG: IN_EN7 (Bit 31) */ +#define GPIO_PRT_CFG_IN_EN7_Msk (0x80000000UL) /*!< GPIO_PRT CFG: IN_EN7 (Bitfield-Mask: 0x01) */ +/* ==================================================== GPIO_PRT.CFG_IN ==================================================== */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL0_0_Pos (0UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL0_0 (Bit 0) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL0_0_Msk (0x1UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL0_0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL1_0_Pos (1UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL1_0 (Bit 1) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL1_0_Msk (0x2UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL1_0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL2_0_Pos (2UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL2_0 (Bit 2) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL2_0_Msk (0x4UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL2_0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL3_0_Pos (3UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL3_0 (Bit 3) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL3_0_Msk (0x8UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL3_0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL4_0_Pos (4UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL4_0 (Bit 4) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL4_0_Msk (0x10UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL4_0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL5_0_Pos (5UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL5_0 (Bit 5) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL5_0_Msk (0x20UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL5_0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL6_0_Pos (6UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL6_0 (Bit 6) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL6_0_Msk (0x40UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL6_0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL7_0_Pos (7UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL7_0 (Bit 7) */ +#define GPIO_PRT_CFG_IN_VTRIP_SEL7_0_Msk (0x80UL) /*!< GPIO_PRT CFG_IN: VTRIP_SEL7_0 (Bitfield-Mask: 0x01) */ +/* =================================================== GPIO_PRT.CFG_OUT ==================================================== */ +#define GPIO_PRT_CFG_OUT_SLOW0_Pos (0UL) /*!< GPIO_PRT CFG_OUT: SLOW0 (Bit 0) */ +#define GPIO_PRT_CFG_OUT_SLOW0_Msk (0x1UL) /*!< GPIO_PRT CFG_OUT: SLOW0 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_OUT_SLOW1_Pos (1UL) /*!< GPIO_PRT CFG_OUT: SLOW1 (Bit 1) */ +#define GPIO_PRT_CFG_OUT_SLOW1_Msk (0x2UL) /*!< GPIO_PRT CFG_OUT: SLOW1 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_OUT_SLOW2_Pos (2UL) /*!< GPIO_PRT CFG_OUT: SLOW2 (Bit 2) */ +#define GPIO_PRT_CFG_OUT_SLOW2_Msk (0x4UL) /*!< GPIO_PRT CFG_OUT: SLOW2 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_OUT_SLOW3_Pos (3UL) /*!< GPIO_PRT CFG_OUT: SLOW3 (Bit 3) */ +#define GPIO_PRT_CFG_OUT_SLOW3_Msk (0x8UL) /*!< GPIO_PRT CFG_OUT: SLOW3 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_OUT_SLOW4_Pos (4UL) /*!< GPIO_PRT CFG_OUT: SLOW4 (Bit 4) */ +#define GPIO_PRT_CFG_OUT_SLOW4_Msk (0x10UL) /*!< GPIO_PRT CFG_OUT: SLOW4 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_OUT_SLOW5_Pos (5UL) /*!< GPIO_PRT CFG_OUT: SLOW5 (Bit 5) */ +#define GPIO_PRT_CFG_OUT_SLOW5_Msk (0x20UL) /*!< GPIO_PRT CFG_OUT: SLOW5 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_OUT_SLOW6_Pos (6UL) /*!< GPIO_PRT CFG_OUT: SLOW6 (Bit 6) */ +#define GPIO_PRT_CFG_OUT_SLOW6_Msk (0x40UL) /*!< GPIO_PRT CFG_OUT: SLOW6 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_OUT_SLOW7_Pos (7UL) /*!< GPIO_PRT CFG_OUT: SLOW7 (Bit 7) */ +#define GPIO_PRT_CFG_OUT_SLOW7_Msk (0x80UL) /*!< GPIO_PRT CFG_OUT: SLOW7 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL0_Pos (16UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL0 (Bit 16) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL0_Msk (0x30000UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL0 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL1_Pos (18UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL1 (Bit 18) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL1_Msk (0xc0000UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL1 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL2_Pos (20UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL2 (Bit 20) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL2_Msk (0x300000UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL2 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL3_Pos (22UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL3 (Bit 22) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL3_Msk (0xc00000UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL3 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL4_Pos (24UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL4 (Bit 24) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL4_Msk (0x3000000UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL4 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL5_Pos (26UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL5 (Bit 26) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL5_Msk (0xc000000UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL5 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL6_Pos (28UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL6 (Bit 28) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL6_Msk (0x30000000UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL6 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL7_Pos (30UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL7 (Bit 30) */ +#define GPIO_PRT_CFG_OUT_DRIVE_SEL7_Msk (0xc0000000UL) /*!< GPIO_PRT CFG_OUT: DRIVE_SEL7 (Bitfield-Mask: 0x03) */ +/* =================================================== GPIO_PRT.CFG_SIO ==================================================== */ +#define GPIO_PRT_CFG_SIO_VREG_EN01_Pos (0UL) /*!< GPIO_PRT CFG_SIO: VREG_EN01 (Bit 0) */ +#define GPIO_PRT_CFG_SIO_VREG_EN01_Msk (0x1UL) /*!< GPIO_PRT CFG_SIO: VREG_EN01 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_IBUF_SEL01_Pos (1UL) /*!< GPIO_PRT CFG_SIO: IBUF_SEL01 (Bit 1) */ +#define GPIO_PRT_CFG_SIO_IBUF_SEL01_Msk (0x2UL) /*!< GPIO_PRT CFG_SIO: IBUF_SEL01 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_VTRIP_SEL01_Pos (2UL) /*!< GPIO_PRT CFG_SIO: VTRIP_SEL01 (Bit 2) */ +#define GPIO_PRT_CFG_SIO_VTRIP_SEL01_Msk (0x4UL) /*!< GPIO_PRT CFG_SIO: VTRIP_SEL01 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_VREF_SEL01_Pos (3UL) /*!< GPIO_PRT CFG_SIO: VREF_SEL01 (Bit 3) */ +#define GPIO_PRT_CFG_SIO_VREF_SEL01_Msk (0x18UL) /*!< GPIO_PRT CFG_SIO: VREF_SEL01 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_SIO_VOH_SEL01_Pos (5UL) /*!< GPIO_PRT CFG_SIO: VOH_SEL01 (Bit 5) */ +#define GPIO_PRT_CFG_SIO_VOH_SEL01_Msk (0xe0UL) /*!< GPIO_PRT CFG_SIO: VOH_SEL01 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_SIO_VREG_EN23_Pos (8UL) /*!< GPIO_PRT CFG_SIO: VREG_EN23 (Bit 8) */ +#define GPIO_PRT_CFG_SIO_VREG_EN23_Msk (0x100UL) /*!< GPIO_PRT CFG_SIO: VREG_EN23 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_IBUF_SEL23_Pos (9UL) /*!< GPIO_PRT CFG_SIO: IBUF_SEL23 (Bit 9) */ +#define GPIO_PRT_CFG_SIO_IBUF_SEL23_Msk (0x200UL) /*!< GPIO_PRT CFG_SIO: IBUF_SEL23 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_VTRIP_SEL23_Pos (10UL) /*!< GPIO_PRT CFG_SIO: VTRIP_SEL23 (Bit 10) */ +#define GPIO_PRT_CFG_SIO_VTRIP_SEL23_Msk (0x400UL) /*!< GPIO_PRT CFG_SIO: VTRIP_SEL23 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_VREF_SEL23_Pos (11UL) /*!< GPIO_PRT CFG_SIO: VREF_SEL23 (Bit 11) */ +#define GPIO_PRT_CFG_SIO_VREF_SEL23_Msk (0x1800UL) /*!< GPIO_PRT CFG_SIO: VREF_SEL23 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_SIO_VOH_SEL23_Pos (13UL) /*!< GPIO_PRT CFG_SIO: VOH_SEL23 (Bit 13) */ +#define GPIO_PRT_CFG_SIO_VOH_SEL23_Msk (0xe000UL) /*!< GPIO_PRT CFG_SIO: VOH_SEL23 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_SIO_VREG_EN45_Pos (16UL) /*!< GPIO_PRT CFG_SIO: VREG_EN45 (Bit 16) */ +#define GPIO_PRT_CFG_SIO_VREG_EN45_Msk (0x10000UL) /*!< GPIO_PRT CFG_SIO: VREG_EN45 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_IBUF_SEL45_Pos (17UL) /*!< GPIO_PRT CFG_SIO: IBUF_SEL45 (Bit 17) */ +#define GPIO_PRT_CFG_SIO_IBUF_SEL45_Msk (0x20000UL) /*!< GPIO_PRT CFG_SIO: IBUF_SEL45 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_VTRIP_SEL45_Pos (18UL) /*!< GPIO_PRT CFG_SIO: VTRIP_SEL45 (Bit 18) */ +#define GPIO_PRT_CFG_SIO_VTRIP_SEL45_Msk (0x40000UL) /*!< GPIO_PRT CFG_SIO: VTRIP_SEL45 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_VREF_SEL45_Pos (19UL) /*!< GPIO_PRT CFG_SIO: VREF_SEL45 (Bit 19) */ +#define GPIO_PRT_CFG_SIO_VREF_SEL45_Msk (0x180000UL) /*!< GPIO_PRT CFG_SIO: VREF_SEL45 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_SIO_VOH_SEL45_Pos (21UL) /*!< GPIO_PRT CFG_SIO: VOH_SEL45 (Bit 21) */ +#define GPIO_PRT_CFG_SIO_VOH_SEL45_Msk (0xe00000UL) /*!< GPIO_PRT CFG_SIO: VOH_SEL45 (Bitfield-Mask: 0x07) */ +#define GPIO_PRT_CFG_SIO_VREG_EN67_Pos (24UL) /*!< GPIO_PRT CFG_SIO: VREG_EN67 (Bit 24) */ +#define GPIO_PRT_CFG_SIO_VREG_EN67_Msk (0x1000000UL) /*!< GPIO_PRT CFG_SIO: VREG_EN67 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_IBUF_SEL67_Pos (25UL) /*!< GPIO_PRT CFG_SIO: IBUF_SEL67 (Bit 25) */ +#define GPIO_PRT_CFG_SIO_IBUF_SEL67_Msk (0x2000000UL) /*!< GPIO_PRT CFG_SIO: IBUF_SEL67 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_VTRIP_SEL67_Pos (26UL) /*!< GPIO_PRT CFG_SIO: VTRIP_SEL67 (Bit 26) */ +#define GPIO_PRT_CFG_SIO_VTRIP_SEL67_Msk (0x4000000UL) /*!< GPIO_PRT CFG_SIO: VTRIP_SEL67 (Bitfield-Mask: 0x01) */ +#define GPIO_PRT_CFG_SIO_VREF_SEL67_Pos (27UL) /*!< GPIO_PRT CFG_SIO: VREF_SEL67 (Bit 27) */ +#define GPIO_PRT_CFG_SIO_VREF_SEL67_Msk (0x18000000UL) /*!< GPIO_PRT CFG_SIO: VREF_SEL67 (Bitfield-Mask: 0x03) */ +#define GPIO_PRT_CFG_SIO_VOH_SEL67_Pos (29UL) /*!< GPIO_PRT CFG_SIO: VOH_SEL67 (Bit 29) */ +#define GPIO_PRT_CFG_SIO_VOH_SEL67_Msk (0xe0000000UL) /*!< GPIO_PRT CFG_SIO: VOH_SEL67 (Bitfield-Mask: 0x07) */ +/* ================================================ GPIO_PRT.CFG_IN_GPIO5V ================================================= */ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL0_1_Pos (0UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL0_1 (Bit 0) */ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL0_1_Msk (0x1UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL0_1 (Bitfield-Mask: 0x01)*/ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL1_1_Pos (1UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL1_1 (Bit 1) */ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL1_1_Msk (0x2UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL1_1 (Bitfield-Mask: 0x01)*/ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL2_1_Pos (2UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL2_1 (Bit 2) */ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL2_1_Msk (0x4UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL2_1 (Bitfield-Mask: 0x01)*/ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL3_1_Pos (3UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL3_1 (Bit 3) */ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL3_1_Msk (0x8UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL3_1 (Bitfield-Mask: 0x01)*/ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL4_1_Pos (4UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL4_1 (Bit 4) */ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL4_1_Msk (0x10UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL4_1 (Bitfield-Mask: 0x01)*/ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL5_1_Pos (5UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL5_1 (Bit 5) */ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL5_1_Msk (0x20UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL5_1 (Bitfield-Mask: 0x01)*/ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL6_1_Pos (6UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL6_1 (Bit 6) */ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL6_1_Msk (0x40UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL6_1 (Bitfield-Mask: 0x01)*/ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL7_1_Pos (7UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL7_1 (Bit 7) */ +#define GPIO_PRT_CFG_IN_GPIO5V_VTRIP_SEL7_1_Msk (0x80UL) /*!< GPIO_PRT CFG_IN_GPIO5V: VTRIP_SEL7_1 (Bitfield-Mask: 0x01)*/ + + +/* =================================================== GPIO.INTR_CAUSE0 ==================================================== */ +#define GPIO_INTR_CAUSE0_PORT_INT_Pos (0UL) /*!< GPIO INTR_CAUSE0: PORT_INT (Bit 0) */ +#define GPIO_INTR_CAUSE0_PORT_INT_Msk (0xffffffffUL) /*!< GPIO INTR_CAUSE0: PORT_INT (Bitfield-Mask: 0xffffffff) */ +/* =================================================== GPIO.INTR_CAUSE1 ==================================================== */ +#define GPIO_INTR_CAUSE1_PORT_INT_Pos (0UL) /*!< GPIO INTR_CAUSE1: PORT_INT (Bit 0) */ +#define GPIO_INTR_CAUSE1_PORT_INT_Msk (0xffffffffUL) /*!< GPIO INTR_CAUSE1: PORT_INT (Bitfield-Mask: 0xffffffff) */ +/* =================================================== GPIO.INTR_CAUSE2 ==================================================== */ +#define GPIO_INTR_CAUSE2_PORT_INT_Pos (0UL) /*!< GPIO INTR_CAUSE2: PORT_INT (Bit 0) */ +#define GPIO_INTR_CAUSE2_PORT_INT_Msk (0xffffffffUL) /*!< GPIO INTR_CAUSE2: PORT_INT (Bitfield-Mask: 0xffffffff) */ +/* =================================================== GPIO.INTR_CAUSE3 ==================================================== */ +#define GPIO_INTR_CAUSE3_PORT_INT_Pos (0UL) /*!< GPIO INTR_CAUSE3: PORT_INT (Bit 0) */ +#define GPIO_INTR_CAUSE3_PORT_INT_Msk (0xffffffffUL) /*!< GPIO INTR_CAUSE3: PORT_INT (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== GPIO.VDD_ACTIVE ==================================================== */ +#define GPIO_VDD_ACTIVE_VDDIO_ACTIVE_Pos (0UL) /*!< GPIO VDD_ACTIVE: VDDIO_ACTIVE (Bit 0) */ +#define GPIO_VDD_ACTIVE_VDDIO_ACTIVE_Msk (0xffffUL) /*!< GPIO VDD_ACTIVE: VDDIO_ACTIVE (Bitfield-Mask: 0xffff) */ +#define GPIO_VDD_ACTIVE_VDDA_ACTIVE_Pos (30UL) /*!< GPIO VDD_ACTIVE: VDDA_ACTIVE (Bit 30) */ +#define GPIO_VDD_ACTIVE_VDDA_ACTIVE_Msk (0x40000000UL) /*!< GPIO VDD_ACTIVE: VDDA_ACTIVE (Bitfield-Mask: 0x01) */ +#define GPIO_VDD_ACTIVE_VDDD_ACTIVE_Pos (31UL) /*!< GPIO VDD_ACTIVE: VDDD_ACTIVE (Bit 31) */ +#define GPIO_VDD_ACTIVE_VDDD_ACTIVE_Msk (0x80000000UL) /*!< GPIO VDD_ACTIVE: VDDD_ACTIVE (Bitfield-Mask: 0x01) */ +/* ===================================================== GPIO.VDD_INTR ===================================================== */ +#define GPIO_VDD_INTR_VDDIO_ACTIVE_Pos (0UL) /*!< GPIO VDD_INTR: VDDIO_ACTIVE (Bit 0) */ +#define GPIO_VDD_INTR_VDDIO_ACTIVE_Msk (0xffffUL) /*!< GPIO VDD_INTR: VDDIO_ACTIVE (Bitfield-Mask: 0xffff) */ +#define GPIO_VDD_INTR_VDDA_ACTIVE_Pos (30UL) /*!< GPIO VDD_INTR: VDDA_ACTIVE (Bit 30) */ +#define GPIO_VDD_INTR_VDDA_ACTIVE_Msk (0x40000000UL) /*!< GPIO VDD_INTR: VDDA_ACTIVE (Bitfield-Mask: 0x01) */ +#define GPIO_VDD_INTR_VDDD_ACTIVE_Pos (31UL) /*!< GPIO VDD_INTR: VDDD_ACTIVE (Bit 31) */ +#define GPIO_VDD_INTR_VDDD_ACTIVE_Msk (0x80000000UL) /*!< GPIO VDD_INTR: VDDD_ACTIVE (Bitfield-Mask: 0x01) */ +/* ================================================== GPIO.VDD_INTR_MASK =================================================== */ +#define GPIO_VDD_INTR_MASK_VDDIO_ACTIVE_Pos (0UL) /*!< GPIO VDD_INTR_MASK: VDDIO_ACTIVE (Bit 0) */ +#define GPIO_VDD_INTR_MASK_VDDIO_ACTIVE_Msk (0xffffUL) /*!< GPIO VDD_INTR_MASK: VDDIO_ACTIVE (Bitfield-Mask: 0xffff) */ +#define GPIO_VDD_INTR_MASK_VDDA_ACTIVE_Pos (30UL) /*!< GPIO VDD_INTR_MASK: VDDA_ACTIVE (Bit 30) */ +#define GPIO_VDD_INTR_MASK_VDDA_ACTIVE_Msk (0x40000000UL) /*!< GPIO VDD_INTR_MASK: VDDA_ACTIVE (Bitfield-Mask: 0x01) */ +#define GPIO_VDD_INTR_MASK_VDDD_ACTIVE_Pos (31UL) /*!< GPIO VDD_INTR_MASK: VDDD_ACTIVE (Bit 31) */ +#define GPIO_VDD_INTR_MASK_VDDD_ACTIVE_Msk (0x80000000UL) /*!< GPIO VDD_INTR_MASK: VDDD_ACTIVE (Bitfield-Mask: 0x01) */ +/* ================================================= GPIO.VDD_INTR_MASKED ================================================== */ +#define GPIO_VDD_INTR_MASKED_VDDIO_ACTIVE_Pos (0UL) /*!< GPIO VDD_INTR_MASKED: VDDIO_ACTIVE (Bit 0) */ +#define GPIO_VDD_INTR_MASKED_VDDIO_ACTIVE_Msk (0xffffUL) /*!< GPIO VDD_INTR_MASKED: VDDIO_ACTIVE (Bitfield-Mask: 0xffff)*/ +#define GPIO_VDD_INTR_MASKED_VDDA_ACTIVE_Pos (30UL) /*!< GPIO VDD_INTR_MASKED: VDDA_ACTIVE (Bit 30) */ +#define GPIO_VDD_INTR_MASKED_VDDA_ACTIVE_Msk (0x40000000UL) /*!< GPIO VDD_INTR_MASKED: VDDA_ACTIVE (Bitfield-Mask: 0x01) */ +#define GPIO_VDD_INTR_MASKED_VDDD_ACTIVE_Pos (31UL) /*!< GPIO VDD_INTR_MASKED: VDDD_ACTIVE (Bit 31) */ +#define GPIO_VDD_INTR_MASKED_VDDD_ACTIVE_Msk (0x80000000UL) /*!< GPIO VDD_INTR_MASKED: VDDD_ACTIVE (Bitfield-Mask: 0x01) */ +/* =================================================== GPIO.VDD_INTR_SET =================================================== */ +#define GPIO_VDD_INTR_SET_VDDIO_ACTIVE_Pos (0UL) /*!< GPIO VDD_INTR_SET: VDDIO_ACTIVE (Bit 0) */ +#define GPIO_VDD_INTR_SET_VDDIO_ACTIVE_Msk (0xffffUL) /*!< GPIO VDD_INTR_SET: VDDIO_ACTIVE (Bitfield-Mask: 0xffff) */ +#define GPIO_VDD_INTR_SET_VDDA_ACTIVE_Pos (30UL) /*!< GPIO VDD_INTR_SET: VDDA_ACTIVE (Bit 30) */ +#define GPIO_VDD_INTR_SET_VDDA_ACTIVE_Msk (0x40000000UL) /*!< GPIO VDD_INTR_SET: VDDA_ACTIVE (Bitfield-Mask: 0x01) */ +#define GPIO_VDD_INTR_SET_VDDD_ACTIVE_Pos (31UL) /*!< GPIO VDD_INTR_SET: VDDD_ACTIVE (Bit 31) */ +#define GPIO_VDD_INTR_SET_VDDD_ACTIVE_Msk (0x80000000UL) /*!< GPIO VDD_INTR_SET: VDDD_ACTIVE (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_GPIO_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_headers.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_headers.h new file mode 100644 index 0000000000..36458cc81b --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_headers.h @@ -0,0 +1,31 @@ +/***************************************************************************//** +* \file cyip_headers.h +* +* \brief +* Common header file to be included by all IP definition headers +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_HEADERS_H_ +#define _CYIP_HEADERS_H_ + +#include + +#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined (__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3))) +#include "core_cm0plus.h" +#else +#include "core_cm4.h" +#endif + +#endif /* _CYIP_HEADERS_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_hsiom.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_hsiom.h new file mode 100644 index 0000000000..aae2c67796 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_hsiom.h @@ -0,0 +1,88 @@ +/***************************************************************************//** +* \file cyip_hsiom.h +* +* \brief +* HSIOM IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_HSIOM_H_ +#define _CYIP_HSIOM_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ HSIOM ================ */ +/* =========================================================================================================================== */ + +#define HSIOM_PRT_SECTION_SIZE 0x00000010UL +#define HSIOM_SECTION_SIZE 0x00004000UL + +/** + * \brief HSIOM port registers (HSIOM_PRT) + */ +typedef struct { + __IOM uint32_t PORT_SEL0; /*!< 0x00000000 Port selection 0 */ + __IOM uint32_t PORT_SEL1; /*!< 0x00000004 Port selection 1 */ + __IM uint32_t RESERVED[2]; +} HSIOM_PRT_Type; /*!< Size = 8 (0x8) */ + +/** + * \brief High Speed IO Matrix (HSIOM) (HSIOM) + */ +typedef struct { /*!< HSIOM Structure */ + HSIOM_PRT_Type PRT[128]; /*!< 0x00000000 HSIOM port registers */ + __IM uint32_t RESERVED[1536]; + __IOM uint32_t AMUX_SPLIT_CTL[64]; /*!< 0x00002000 AMUX splitter cell control */ +} HSIOM_Type; /*!< Size = 8448 (0x2100) */ + + +/* ================================================== HSIOM_PRT.PORT_SEL0 ================================================== */ +#define HSIOM_PRT_PORT_SEL0_IO0_SEL_Pos (0UL) /*!< HSIOM_PRT PORT_SEL0: IO0_SEL (Bit 0) */ +#define HSIOM_PRT_PORT_SEL0_IO0_SEL_Msk (0x1fUL) /*!< HSIOM_PRT PORT_SEL0: IO0_SEL (Bitfield-Mask: 0x1f) */ +#define HSIOM_PRT_PORT_SEL0_IO1_SEL_Pos (8UL) /*!< HSIOM_PRT PORT_SEL0: IO1_SEL (Bit 8) */ +#define HSIOM_PRT_PORT_SEL0_IO1_SEL_Msk (0x1f00UL) /*!< HSIOM_PRT PORT_SEL0: IO1_SEL (Bitfield-Mask: 0x1f) */ +#define HSIOM_PRT_PORT_SEL0_IO2_SEL_Pos (16UL) /*!< HSIOM_PRT PORT_SEL0: IO2_SEL (Bit 16) */ +#define HSIOM_PRT_PORT_SEL0_IO2_SEL_Msk (0x1f0000UL) /*!< HSIOM_PRT PORT_SEL0: IO2_SEL (Bitfield-Mask: 0x1f) */ +#define HSIOM_PRT_PORT_SEL0_IO3_SEL_Pos (24UL) /*!< HSIOM_PRT PORT_SEL0: IO3_SEL (Bit 24) */ +#define HSIOM_PRT_PORT_SEL0_IO3_SEL_Msk (0x1f000000UL) /*!< HSIOM_PRT PORT_SEL0: IO3_SEL (Bitfield-Mask: 0x1f) */ +/* ================================================== HSIOM_PRT.PORT_SEL1 ================================================== */ +#define HSIOM_PRT_PORT_SEL1_IO4_SEL_Pos (0UL) /*!< HSIOM_PRT PORT_SEL1: IO4_SEL (Bit 0) */ +#define HSIOM_PRT_PORT_SEL1_IO4_SEL_Msk (0x1fUL) /*!< HSIOM_PRT PORT_SEL1: IO4_SEL (Bitfield-Mask: 0x1f) */ +#define HSIOM_PRT_PORT_SEL1_IO5_SEL_Pos (8UL) /*!< HSIOM_PRT PORT_SEL1: IO5_SEL (Bit 8) */ +#define HSIOM_PRT_PORT_SEL1_IO5_SEL_Msk (0x1f00UL) /*!< HSIOM_PRT PORT_SEL1: IO5_SEL (Bitfield-Mask: 0x1f) */ +#define HSIOM_PRT_PORT_SEL1_IO6_SEL_Pos (16UL) /*!< HSIOM_PRT PORT_SEL1: IO6_SEL (Bit 16) */ +#define HSIOM_PRT_PORT_SEL1_IO6_SEL_Msk (0x1f0000UL) /*!< HSIOM_PRT PORT_SEL1: IO6_SEL (Bitfield-Mask: 0x1f) */ +#define HSIOM_PRT_PORT_SEL1_IO7_SEL_Pos (24UL) /*!< HSIOM_PRT PORT_SEL1: IO7_SEL (Bit 24) */ +#define HSIOM_PRT_PORT_SEL1_IO7_SEL_Msk (0x1f000000UL) /*!< HSIOM_PRT PORT_SEL1: IO7_SEL (Bitfield-Mask: 0x1f) */ + + +/* ================================================= HSIOM.AMUX_SPLIT_CTL ================================================== */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SL_Pos (0UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_AA_SL (Bit 0) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SL_Msk (0x1UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_AA_SL (Bitfield-Mask: 0x01) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SR_Pos (1UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_AA_SR (Bit 1) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SR_Msk (0x2UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_AA_SR (Bitfield-Mask: 0x01) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_S0_Pos (2UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_AA_S0 (Bit 2) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_S0_Msk (0x4UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_AA_S0 (Bitfield-Mask: 0x01) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SL_Pos (4UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_BB_SL (Bit 4) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SL_Msk (0x10UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_BB_SL (Bitfield-Mask: 0x01) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SR_Pos (5UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_BB_SR (Bit 5) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SR_Msk (0x20UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_BB_SR (Bitfield-Mask: 0x01) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_S0_Pos (6UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_BB_S0 (Bit 6) */ +#define HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_S0_Msk (0x40UL) /*!< HSIOM AMUX_SPLIT_CTL: SWITCH_BB_S0 (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_HSIOM_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_i2s.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_i2s.h new file mode 100644 index 0000000000..9228a2fcc4 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_i2s.h @@ -0,0 +1,280 @@ +/***************************************************************************//** +* \file cyip_i2s.h +* +* \brief +* I2S IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_I2S_H_ +#define _CYIP_I2S_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ I2S ================ */ +/* =========================================================================================================================== */ + +#define I2S_SECTION_SIZE 0x00001000UL + +/** + * \brief I2S registers (I2S) + */ +typedef struct { /*!< I2S Structure */ + __IOM uint32_t CTL; /*!< 0x00000000 Control */ + __IM uint32_t RESERVED[3]; + __IOM uint32_t CLOCK_CTL; /*!< 0x00000010 Clock control */ + __IOM uint32_t COMMON_CTL; /*!< 0x00000014 Common control */ + __IM uint32_t RESERVED1[2]; + __IOM uint32_t CMD; /*!< 0x00000020 Command */ + __IM uint32_t RESERVED2[7]; + __IOM uint32_t TR_CTL; /*!< 0x00000040 Trigger control */ + __IM uint32_t RESERVED3[15]; + __IOM uint32_t TX_CTL; /*!< 0x00000080 Transmitter control */ + __IOM uint32_t TX_WATCHDOG; /*!< 0x00000084 Transmitter watchdog */ + __IM uint32_t RESERVED4[6]; + __IOM uint32_t RX_CTL; /*!< 0x000000A0 Receiver control */ + __IOM uint32_t RX_WATCHDOG; /*!< 0x000000A4 Receiver watchdog */ + __IM uint32_t RESERVED5[86]; + __IOM uint32_t TX_FIFO_CTL; /*!< 0x00000200 TX FIFO control */ + __IM uint32_t TX_FIFO_STATUS; /*!< 0x00000204 TX FIFO status */ + __OM uint32_t TX_FIFO_WR; /*!< 0x00000208 TX FIFO write */ + __IM uint32_t RESERVED6[61]; + __IOM uint32_t RX_FIFO_CTL; /*!< 0x00000300 RX FIFO control */ + __IM uint32_t RX_FIFO_STATUS; /*!< 0x00000304 RX FIFO status */ + __IM uint32_t RX_FIFO_RD; /*!< 0x00000308 RX FIFO read */ + __IM uint32_t RX_FIFO_RD_SILENT; /*!< 0x0000030C RX FIFO silent read */ + __IM uint32_t RESERVED7[764]; + __IOM uint32_t INTR; /*!< 0x00000F00 Interrupt register */ + __IOM uint32_t INTR_SET; /*!< 0x00000F04 Interrupt set register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000F08 Interrupt mask register */ + __IM uint32_t INTR_MASKED; /*!< 0x00000F0C Interrupt masked register */ +} I2S_Type; /*!< Size = 3856 (0xF10) */ + + +/* ======================================================== I2S.CTL ======================================================== */ +#define I2S_CTL_TX_ENABLED_Pos (30UL) /*!< I2S CTL: TX_ENABLED (Bit 30) */ +#define I2S_CTL_TX_ENABLED_Msk (0x40000000UL) /*!< I2S CTL: TX_ENABLED (Bitfield-Mask: 0x01) */ +#define I2S_CTL_RX_ENABLED_Pos (31UL) /*!< I2S CTL: RX_ENABLED (Bit 31) */ +#define I2S_CTL_RX_ENABLED_Msk (0x80000000UL) /*!< I2S CTL: RX_ENABLED (Bitfield-Mask: 0x01) */ +/* ===================================================== I2S.CLOCK_CTL ===================================================== */ +#define I2S_CLOCK_CTL_CLOCK_DIV_Pos (0UL) /*!< I2S CLOCK_CTL: CLOCK_DIV (Bit 0) */ +#define I2S_CLOCK_CTL_CLOCK_DIV_Msk (0x3fUL) /*!< I2S CLOCK_CTL: CLOCK_DIV (Bitfield-Mask: 0x3f) */ +#define I2S_CLOCK_CTL_CLOCK_SEL_Pos (8UL) /*!< I2S CLOCK_CTL: CLOCK_SEL (Bit 8) */ +#define I2S_CLOCK_CTL_CLOCK_SEL_Msk (0x100UL) /*!< I2S CLOCK_CTL: CLOCK_SEL (Bitfield-Mask: 0x01) */ +/* ==================================================== I2S.COMMON_CTL ===================================================== */ +#define I2S_COMMON_CTL_LOOPBACK_Pos (0UL) /*!< I2S COMMON_CTL: LOOPBACK (Bit 0) */ +#define I2S_COMMON_CTL_LOOPBACK_Msk (0x1UL) /*!< I2S COMMON_CTL: LOOPBACK (Bitfield-Mask: 0x01) */ +/* ======================================================== I2S.CMD ======================================================== */ +#define I2S_CMD_TX_START_Pos (0UL) /*!< I2S CMD: TX_START (Bit 0) */ +#define I2S_CMD_TX_START_Msk (0x1UL) /*!< I2S CMD: TX_START (Bitfield-Mask: 0x01) */ +#define I2S_CMD_TX_PAUSE_Pos (8UL) /*!< I2S CMD: TX_PAUSE (Bit 8) */ +#define I2S_CMD_TX_PAUSE_Msk (0x100UL) /*!< I2S CMD: TX_PAUSE (Bitfield-Mask: 0x01) */ +#define I2S_CMD_RX_START_Pos (16UL) /*!< I2S CMD: RX_START (Bit 16) */ +#define I2S_CMD_RX_START_Msk (0x10000UL) /*!< I2S CMD: RX_START (Bitfield-Mask: 0x01) */ +/* ====================================================== I2S.TR_CTL ======================================================= */ +#define I2S_TR_CTL_TX_REQ_EN_Pos (0UL) /*!< I2S TR_CTL: TX_REQ_EN (Bit 0) */ +#define I2S_TR_CTL_TX_REQ_EN_Msk (0x1UL) /*!< I2S TR_CTL: TX_REQ_EN (Bitfield-Mask: 0x01) */ +#define I2S_TR_CTL_RX_REQ_EN_Pos (16UL) /*!< I2S TR_CTL: RX_REQ_EN (Bit 16) */ +#define I2S_TR_CTL_RX_REQ_EN_Msk (0x10000UL) /*!< I2S TR_CTL: RX_REQ_EN (Bitfield-Mask: 0x01) */ +/* ====================================================== I2S.TX_CTL ======================================================= */ +#define I2S_TX_CTL_M_CLOCK_DIV_Pos (0UL) /*!< I2S TX_CTL: M_CLOCK_DIV (Bit 0) */ +#define I2S_TX_CTL_M_CLOCK_DIV_Msk (0x7UL) /*!< I2S TX_CTL: M_CLOCK_DIV (Bitfield-Mask: 0x07) */ +#define I2S_TX_CTL_B_CLOCK_INV_Pos (3UL) /*!< I2S TX_CTL: B_CLOCK_INV (Bit 3) */ +#define I2S_TX_CTL_B_CLOCK_INV_Msk (0x8UL) /*!< I2S TX_CTL: B_CLOCK_INV (Bitfield-Mask: 0x01) */ +#define I2S_TX_CTL_CH_NR_Pos (4UL) /*!< I2S TX_CTL: CH_NR (Bit 4) */ +#define I2S_TX_CTL_CH_NR_Msk (0x70UL) /*!< I2S TX_CTL: CH_NR (Bitfield-Mask: 0x07) */ +#define I2S_TX_CTL_MS_Pos (7UL) /*!< I2S TX_CTL: MS (Bit 7) */ +#define I2S_TX_CTL_MS_Msk (0x80UL) /*!< I2S TX_CTL: MS (Bitfield-Mask: 0x01) */ +#define I2S_TX_CTL_I2S_MODE_Pos (8UL) /*!< I2S TX_CTL: I2S_MODE (Bit 8) */ +#define I2S_TX_CTL_I2S_MODE_Msk (0x300UL) /*!< I2S TX_CTL: I2S_MODE (Bitfield-Mask: 0x03) */ +#define I2S_TX_CTL_WS_PULSE_Pos (10UL) /*!< I2S TX_CTL: WS_PULSE (Bit 10) */ +#define I2S_TX_CTL_WS_PULSE_Msk (0x400UL) /*!< I2S TX_CTL: WS_PULSE (Bitfield-Mask: 0x01) */ +#define I2S_TX_CTL_OVHDATA_Pos (12UL) /*!< I2S TX_CTL: OVHDATA (Bit 12) */ +#define I2S_TX_CTL_OVHDATA_Msk (0x1000UL) /*!< I2S TX_CTL: OVHDATA (Bitfield-Mask: 0x01) */ +#define I2S_TX_CTL_WD_EN_Pos (13UL) /*!< I2S TX_CTL: WD_EN (Bit 13) */ +#define I2S_TX_CTL_WD_EN_Msk (0x2000UL) /*!< I2S TX_CTL: WD_EN (Bitfield-Mask: 0x01) */ +#define I2S_TX_CTL_CH_LEN_Pos (16UL) /*!< I2S TX_CTL: CH_LEN (Bit 16) */ +#define I2S_TX_CTL_CH_LEN_Msk (0x70000UL) /*!< I2S TX_CTL: CH_LEN (Bitfield-Mask: 0x07) */ +#define I2S_TX_CTL_WORD_LEN_Pos (20UL) /*!< I2S TX_CTL: WORD_LEN (Bit 20) */ +#define I2S_TX_CTL_WORD_LEN_Msk (0x700000UL) /*!< I2S TX_CTL: WORD_LEN (Bitfield-Mask: 0x07) */ +/* ==================================================== I2S.TX_WATCHDOG ==================================================== */ +#define I2S_TX_WATCHDOG_WD_COUNTER_Pos (0UL) /*!< I2S TX_WATCHDOG: WD_COUNTER (Bit 0) */ +#define I2S_TX_WATCHDOG_WD_COUNTER_Msk (0xffffffffUL) /*!< I2S TX_WATCHDOG: WD_COUNTER (Bitfield-Mask: 0xffffffff) */ +/* ====================================================== I2S.RX_CTL ======================================================= */ +#define I2S_RX_CTL_M_CLOCK_DIV_Pos (0UL) /*!< I2S RX_CTL: M_CLOCK_DIV (Bit 0) */ +#define I2S_RX_CTL_M_CLOCK_DIV_Msk (0x7UL) /*!< I2S RX_CTL: M_CLOCK_DIV (Bitfield-Mask: 0x07) */ +#define I2S_RX_CTL_B_CLOCK_INV_Pos (3UL) /*!< I2S RX_CTL: B_CLOCK_INV (Bit 3) */ +#define I2S_RX_CTL_B_CLOCK_INV_Msk (0x8UL) /*!< I2S RX_CTL: B_CLOCK_INV (Bitfield-Mask: 0x01) */ +#define I2S_RX_CTL_CH_NR_Pos (4UL) /*!< I2S RX_CTL: CH_NR (Bit 4) */ +#define I2S_RX_CTL_CH_NR_Msk (0x70UL) /*!< I2S RX_CTL: CH_NR (Bitfield-Mask: 0x07) */ +#define I2S_RX_CTL_MS_Pos (7UL) /*!< I2S RX_CTL: MS (Bit 7) */ +#define I2S_RX_CTL_MS_Msk (0x80UL) /*!< I2S RX_CTL: MS (Bitfield-Mask: 0x01) */ +#define I2S_RX_CTL_I2S_MODE_Pos (8UL) /*!< I2S RX_CTL: I2S_MODE (Bit 8) */ +#define I2S_RX_CTL_I2S_MODE_Msk (0x300UL) /*!< I2S RX_CTL: I2S_MODE (Bitfield-Mask: 0x03) */ +#define I2S_RX_CTL_WS_PULSE_Pos (10UL) /*!< I2S RX_CTL: WS_PULSE (Bit 10) */ +#define I2S_RX_CTL_WS_PULSE_Msk (0x400UL) /*!< I2S RX_CTL: WS_PULSE (Bitfield-Mask: 0x01) */ +#define I2S_RX_CTL_WD_EN_Pos (13UL) /*!< I2S RX_CTL: WD_EN (Bit 13) */ +#define I2S_RX_CTL_WD_EN_Msk (0x2000UL) /*!< I2S RX_CTL: WD_EN (Bitfield-Mask: 0x01) */ +#define I2S_RX_CTL_CH_LEN_Pos (16UL) /*!< I2S RX_CTL: CH_LEN (Bit 16) */ +#define I2S_RX_CTL_CH_LEN_Msk (0x70000UL) /*!< I2S RX_CTL: CH_LEN (Bitfield-Mask: 0x07) */ +#define I2S_RX_CTL_WORD_LEN_Pos (20UL) /*!< I2S RX_CTL: WORD_LEN (Bit 20) */ +#define I2S_RX_CTL_WORD_LEN_Msk (0x700000UL) /*!< I2S RX_CTL: WORD_LEN (Bitfield-Mask: 0x07) */ +#define I2S_RX_CTL_BIT_EXTENSION_Pos (23UL) /*!< I2S RX_CTL: BIT_EXTENSION (Bit 23) */ +#define I2S_RX_CTL_BIT_EXTENSION_Msk (0x800000UL) /*!< I2S RX_CTL: BIT_EXTENSION (Bitfield-Mask: 0x01) */ +/* ==================================================== I2S.RX_WATCHDOG ==================================================== */ +#define I2S_RX_WATCHDOG_WD_COUNTER_Pos (0UL) /*!< I2S RX_WATCHDOG: WD_COUNTER (Bit 0) */ +#define I2S_RX_WATCHDOG_WD_COUNTER_Msk (0xffffffffUL) /*!< I2S RX_WATCHDOG: WD_COUNTER (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== I2S.TX_FIFO_CTL ==================================================== */ +#define I2S_TX_FIFO_CTL_TRIGGER_LEVEL_Pos (0UL) /*!< I2S TX_FIFO_CTL: TRIGGER_LEVEL (Bit 0) */ +#define I2S_TX_FIFO_CTL_TRIGGER_LEVEL_Msk (0xffUL) /*!< I2S TX_FIFO_CTL: TRIGGER_LEVEL (Bitfield-Mask: 0xff) */ +#define I2S_TX_FIFO_CTL_CLEAR_Pos (16UL) /*!< I2S TX_FIFO_CTL: CLEAR (Bit 16) */ +#define I2S_TX_FIFO_CTL_CLEAR_Msk (0x10000UL) /*!< I2S TX_FIFO_CTL: CLEAR (Bitfield-Mask: 0x01) */ +#define I2S_TX_FIFO_CTL_FREEZE_Pos (17UL) /*!< I2S TX_FIFO_CTL: FREEZE (Bit 17) */ +#define I2S_TX_FIFO_CTL_FREEZE_Msk (0x20000UL) /*!< I2S TX_FIFO_CTL: FREEZE (Bitfield-Mask: 0x01) */ +/* ================================================== I2S.TX_FIFO_STATUS =================================================== */ +#define I2S_TX_FIFO_STATUS_USED_Pos (0UL) /*!< I2S TX_FIFO_STATUS: USED (Bit 0) */ +#define I2S_TX_FIFO_STATUS_USED_Msk (0x1ffUL) /*!< I2S TX_FIFO_STATUS: USED (Bitfield-Mask: 0x1ff) */ +#define I2S_TX_FIFO_STATUS_RD_PTR_Pos (16UL) /*!< I2S TX_FIFO_STATUS: RD_PTR (Bit 16) */ +#define I2S_TX_FIFO_STATUS_RD_PTR_Msk (0xff0000UL) /*!< I2S TX_FIFO_STATUS: RD_PTR (Bitfield-Mask: 0xff) */ +#define I2S_TX_FIFO_STATUS_WR_PTR_Pos (24UL) /*!< I2S TX_FIFO_STATUS: WR_PTR (Bit 24) */ +#define I2S_TX_FIFO_STATUS_WR_PTR_Msk (0xff000000UL) /*!< I2S TX_FIFO_STATUS: WR_PTR (Bitfield-Mask: 0xff) */ +/* ==================================================== I2S.TX_FIFO_WR ===================================================== */ +#define I2S_TX_FIFO_WR_DATA_Pos (0UL) /*!< I2S TX_FIFO_WR: DATA (Bit 0) */ +#define I2S_TX_FIFO_WR_DATA_Msk (0xffffffffUL) /*!< I2S TX_FIFO_WR: DATA (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== I2S.RX_FIFO_CTL ==================================================== */ +#define I2S_RX_FIFO_CTL_TRIGGER_LEVEL_Pos (0UL) /*!< I2S RX_FIFO_CTL: TRIGGER_LEVEL (Bit 0) */ +#define I2S_RX_FIFO_CTL_TRIGGER_LEVEL_Msk (0xffUL) /*!< I2S RX_FIFO_CTL: TRIGGER_LEVEL (Bitfield-Mask: 0xff) */ +#define I2S_RX_FIFO_CTL_CLEAR_Pos (16UL) /*!< I2S RX_FIFO_CTL: CLEAR (Bit 16) */ +#define I2S_RX_FIFO_CTL_CLEAR_Msk (0x10000UL) /*!< I2S RX_FIFO_CTL: CLEAR (Bitfield-Mask: 0x01) */ +#define I2S_RX_FIFO_CTL_FREEZE_Pos (17UL) /*!< I2S RX_FIFO_CTL: FREEZE (Bit 17) */ +#define I2S_RX_FIFO_CTL_FREEZE_Msk (0x20000UL) /*!< I2S RX_FIFO_CTL: FREEZE (Bitfield-Mask: 0x01) */ +/* ================================================== I2S.RX_FIFO_STATUS =================================================== */ +#define I2S_RX_FIFO_STATUS_USED_Pos (0UL) /*!< I2S RX_FIFO_STATUS: USED (Bit 0) */ +#define I2S_RX_FIFO_STATUS_USED_Msk (0x1ffUL) /*!< I2S RX_FIFO_STATUS: USED (Bitfield-Mask: 0x1ff) */ +#define I2S_RX_FIFO_STATUS_RD_PTR_Pos (16UL) /*!< I2S RX_FIFO_STATUS: RD_PTR (Bit 16) */ +#define I2S_RX_FIFO_STATUS_RD_PTR_Msk (0xff0000UL) /*!< I2S RX_FIFO_STATUS: RD_PTR (Bitfield-Mask: 0xff) */ +#define I2S_RX_FIFO_STATUS_WR_PTR_Pos (24UL) /*!< I2S RX_FIFO_STATUS: WR_PTR (Bit 24) */ +#define I2S_RX_FIFO_STATUS_WR_PTR_Msk (0xff000000UL) /*!< I2S RX_FIFO_STATUS: WR_PTR (Bitfield-Mask: 0xff) */ +/* ==================================================== I2S.RX_FIFO_RD ===================================================== */ +#define I2S_RX_FIFO_RD_DATA_Pos (0UL) /*!< I2S RX_FIFO_RD: DATA (Bit 0) */ +#define I2S_RX_FIFO_RD_DATA_Msk (0xffffffffUL) /*!< I2S RX_FIFO_RD: DATA (Bitfield-Mask: 0xffffffff) */ +/* ================================================= I2S.RX_FIFO_RD_SILENT ================================================= */ +#define I2S_RX_FIFO_RD_SILENT_DATA_Pos (0UL) /*!< I2S RX_FIFO_RD_SILENT: DATA (Bit 0) */ +#define I2S_RX_FIFO_RD_SILENT_DATA_Msk (0xffffffffUL) /*!< I2S RX_FIFO_RD_SILENT: DATA (Bitfield-Mask: 0xffffffff) */ +/* ======================================================= I2S.INTR ======================================================== */ +#define I2S_INTR_TX_TRIGGER_Pos (0UL) /*!< I2S INTR: TX_TRIGGER (Bit 0) */ +#define I2S_INTR_TX_TRIGGER_Msk (0x1UL) /*!< I2S INTR: TX_TRIGGER (Bitfield-Mask: 0x01) */ +#define I2S_INTR_TX_NOT_FULL_Pos (1UL) /*!< I2S INTR: TX_NOT_FULL (Bit 1) */ +#define I2S_INTR_TX_NOT_FULL_Msk (0x2UL) /*!< I2S INTR: TX_NOT_FULL (Bitfield-Mask: 0x01) */ +#define I2S_INTR_TX_EMPTY_Pos (4UL) /*!< I2S INTR: TX_EMPTY (Bit 4) */ +#define I2S_INTR_TX_EMPTY_Msk (0x10UL) /*!< I2S INTR: TX_EMPTY (Bitfield-Mask: 0x01) */ +#define I2S_INTR_TX_OVERFLOW_Pos (5UL) /*!< I2S INTR: TX_OVERFLOW (Bit 5) */ +#define I2S_INTR_TX_OVERFLOW_Msk (0x20UL) /*!< I2S INTR: TX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_TX_UNDERFLOW_Pos (6UL) /*!< I2S INTR: TX_UNDERFLOW (Bit 6) */ +#define I2S_INTR_TX_UNDERFLOW_Msk (0x40UL) /*!< I2S INTR: TX_UNDERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_TX_WD_Pos (8UL) /*!< I2S INTR: TX_WD (Bit 8) */ +#define I2S_INTR_TX_WD_Msk (0x100UL) /*!< I2S INTR: TX_WD (Bitfield-Mask: 0x01) */ +#define I2S_INTR_RX_TRIGGER_Pos (16UL) /*!< I2S INTR: RX_TRIGGER (Bit 16) */ +#define I2S_INTR_RX_TRIGGER_Msk (0x10000UL) /*!< I2S INTR: RX_TRIGGER (Bitfield-Mask: 0x01) */ +#define I2S_INTR_RX_NOT_EMPTY_Pos (18UL) /*!< I2S INTR: RX_NOT_EMPTY (Bit 18) */ +#define I2S_INTR_RX_NOT_EMPTY_Msk (0x40000UL) /*!< I2S INTR: RX_NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define I2S_INTR_RX_FULL_Pos (19UL) /*!< I2S INTR: RX_FULL (Bit 19) */ +#define I2S_INTR_RX_FULL_Msk (0x80000UL) /*!< I2S INTR: RX_FULL (Bitfield-Mask: 0x01) */ +#define I2S_INTR_RX_OVERFLOW_Pos (21UL) /*!< I2S INTR: RX_OVERFLOW (Bit 21) */ +#define I2S_INTR_RX_OVERFLOW_Msk (0x200000UL) /*!< I2S INTR: RX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_RX_UNDERFLOW_Pos (22UL) /*!< I2S INTR: RX_UNDERFLOW (Bit 22) */ +#define I2S_INTR_RX_UNDERFLOW_Msk (0x400000UL) /*!< I2S INTR: RX_UNDERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_RX_WD_Pos (24UL) /*!< I2S INTR: RX_WD (Bit 24) */ +#define I2S_INTR_RX_WD_Msk (0x1000000UL) /*!< I2S INTR: RX_WD (Bitfield-Mask: 0x01) */ +/* ===================================================== I2S.INTR_SET ====================================================== */ +#define I2S_INTR_SET_TX_TRIGGER_Pos (0UL) /*!< I2S INTR_SET: TX_TRIGGER (Bit 0) */ +#define I2S_INTR_SET_TX_TRIGGER_Msk (0x1UL) /*!< I2S INTR_SET: TX_TRIGGER (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_TX_NOT_FULL_Pos (1UL) /*!< I2S INTR_SET: TX_NOT_FULL (Bit 1) */ +#define I2S_INTR_SET_TX_NOT_FULL_Msk (0x2UL) /*!< I2S INTR_SET: TX_NOT_FULL (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_TX_EMPTY_Pos (4UL) /*!< I2S INTR_SET: TX_EMPTY (Bit 4) */ +#define I2S_INTR_SET_TX_EMPTY_Msk (0x10UL) /*!< I2S INTR_SET: TX_EMPTY (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_TX_OVERFLOW_Pos (5UL) /*!< I2S INTR_SET: TX_OVERFLOW (Bit 5) */ +#define I2S_INTR_SET_TX_OVERFLOW_Msk (0x20UL) /*!< I2S INTR_SET: TX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_TX_UNDERFLOW_Pos (6UL) /*!< I2S INTR_SET: TX_UNDERFLOW (Bit 6) */ +#define I2S_INTR_SET_TX_UNDERFLOW_Msk (0x40UL) /*!< I2S INTR_SET: TX_UNDERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_TX_WD_Pos (8UL) /*!< I2S INTR_SET: TX_WD (Bit 8) */ +#define I2S_INTR_SET_TX_WD_Msk (0x100UL) /*!< I2S INTR_SET: TX_WD (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_RX_TRIGGER_Pos (16UL) /*!< I2S INTR_SET: RX_TRIGGER (Bit 16) */ +#define I2S_INTR_SET_RX_TRIGGER_Msk (0x10000UL) /*!< I2S INTR_SET: RX_TRIGGER (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_RX_NOT_EMPTY_Pos (18UL) /*!< I2S INTR_SET: RX_NOT_EMPTY (Bit 18) */ +#define I2S_INTR_SET_RX_NOT_EMPTY_Msk (0x40000UL) /*!< I2S INTR_SET: RX_NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_RX_FULL_Pos (19UL) /*!< I2S INTR_SET: RX_FULL (Bit 19) */ +#define I2S_INTR_SET_RX_FULL_Msk (0x80000UL) /*!< I2S INTR_SET: RX_FULL (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_RX_OVERFLOW_Pos (21UL) /*!< I2S INTR_SET: RX_OVERFLOW (Bit 21) */ +#define I2S_INTR_SET_RX_OVERFLOW_Msk (0x200000UL) /*!< I2S INTR_SET: RX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_RX_UNDERFLOW_Pos (22UL) /*!< I2S INTR_SET: RX_UNDERFLOW (Bit 22) */ +#define I2S_INTR_SET_RX_UNDERFLOW_Msk (0x400000UL) /*!< I2S INTR_SET: RX_UNDERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_SET_RX_WD_Pos (24UL) /*!< I2S INTR_SET: RX_WD (Bit 24) */ +#define I2S_INTR_SET_RX_WD_Msk (0x1000000UL) /*!< I2S INTR_SET: RX_WD (Bitfield-Mask: 0x01) */ +/* ===================================================== I2S.INTR_MASK ===================================================== */ +#define I2S_INTR_MASK_TX_TRIGGER_Pos (0UL) /*!< I2S INTR_MASK: TX_TRIGGER (Bit 0) */ +#define I2S_INTR_MASK_TX_TRIGGER_Msk (0x1UL) /*!< I2S INTR_MASK: TX_TRIGGER (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_TX_NOT_FULL_Pos (1UL) /*!< I2S INTR_MASK: TX_NOT_FULL (Bit 1) */ +#define I2S_INTR_MASK_TX_NOT_FULL_Msk (0x2UL) /*!< I2S INTR_MASK: TX_NOT_FULL (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_TX_EMPTY_Pos (4UL) /*!< I2S INTR_MASK: TX_EMPTY (Bit 4) */ +#define I2S_INTR_MASK_TX_EMPTY_Msk (0x10UL) /*!< I2S INTR_MASK: TX_EMPTY (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_TX_OVERFLOW_Pos (5UL) /*!< I2S INTR_MASK: TX_OVERFLOW (Bit 5) */ +#define I2S_INTR_MASK_TX_OVERFLOW_Msk (0x20UL) /*!< I2S INTR_MASK: TX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_TX_UNDERFLOW_Pos (6UL) /*!< I2S INTR_MASK: TX_UNDERFLOW (Bit 6) */ +#define I2S_INTR_MASK_TX_UNDERFLOW_Msk (0x40UL) /*!< I2S INTR_MASK: TX_UNDERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_TX_WD_Pos (8UL) /*!< I2S INTR_MASK: TX_WD (Bit 8) */ +#define I2S_INTR_MASK_TX_WD_Msk (0x100UL) /*!< I2S INTR_MASK: TX_WD (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_RX_TRIGGER_Pos (16UL) /*!< I2S INTR_MASK: RX_TRIGGER (Bit 16) */ +#define I2S_INTR_MASK_RX_TRIGGER_Msk (0x10000UL) /*!< I2S INTR_MASK: RX_TRIGGER (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_RX_NOT_EMPTY_Pos (18UL) /*!< I2S INTR_MASK: RX_NOT_EMPTY (Bit 18) */ +#define I2S_INTR_MASK_RX_NOT_EMPTY_Msk (0x40000UL) /*!< I2S INTR_MASK: RX_NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_RX_FULL_Pos (19UL) /*!< I2S INTR_MASK: RX_FULL (Bit 19) */ +#define I2S_INTR_MASK_RX_FULL_Msk (0x80000UL) /*!< I2S INTR_MASK: RX_FULL (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_RX_OVERFLOW_Pos (21UL) /*!< I2S INTR_MASK: RX_OVERFLOW (Bit 21) */ +#define I2S_INTR_MASK_RX_OVERFLOW_Msk (0x200000UL) /*!< I2S INTR_MASK: RX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_RX_UNDERFLOW_Pos (22UL) /*!< I2S INTR_MASK: RX_UNDERFLOW (Bit 22) */ +#define I2S_INTR_MASK_RX_UNDERFLOW_Msk (0x400000UL) /*!< I2S INTR_MASK: RX_UNDERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASK_RX_WD_Pos (24UL) /*!< I2S INTR_MASK: RX_WD (Bit 24) */ +#define I2S_INTR_MASK_RX_WD_Msk (0x1000000UL) /*!< I2S INTR_MASK: RX_WD (Bitfield-Mask: 0x01) */ +/* ==================================================== I2S.INTR_MASKED ==================================================== */ +#define I2S_INTR_MASKED_TX_TRIGGER_Pos (0UL) /*!< I2S INTR_MASKED: TX_TRIGGER (Bit 0) */ +#define I2S_INTR_MASKED_TX_TRIGGER_Msk (0x1UL) /*!< I2S INTR_MASKED: TX_TRIGGER (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_TX_NOT_FULL_Pos (1UL) /*!< I2S INTR_MASKED: TX_NOT_FULL (Bit 1) */ +#define I2S_INTR_MASKED_TX_NOT_FULL_Msk (0x2UL) /*!< I2S INTR_MASKED: TX_NOT_FULL (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_TX_EMPTY_Pos (4UL) /*!< I2S INTR_MASKED: TX_EMPTY (Bit 4) */ +#define I2S_INTR_MASKED_TX_EMPTY_Msk (0x10UL) /*!< I2S INTR_MASKED: TX_EMPTY (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_TX_OVERFLOW_Pos (5UL) /*!< I2S INTR_MASKED: TX_OVERFLOW (Bit 5) */ +#define I2S_INTR_MASKED_TX_OVERFLOW_Msk (0x20UL) /*!< I2S INTR_MASKED: TX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_TX_UNDERFLOW_Pos (6UL) /*!< I2S INTR_MASKED: TX_UNDERFLOW (Bit 6) */ +#define I2S_INTR_MASKED_TX_UNDERFLOW_Msk (0x40UL) /*!< I2S INTR_MASKED: TX_UNDERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_TX_WD_Pos (8UL) /*!< I2S INTR_MASKED: TX_WD (Bit 8) */ +#define I2S_INTR_MASKED_TX_WD_Msk (0x100UL) /*!< I2S INTR_MASKED: TX_WD (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_RX_TRIGGER_Pos (16UL) /*!< I2S INTR_MASKED: RX_TRIGGER (Bit 16) */ +#define I2S_INTR_MASKED_RX_TRIGGER_Msk (0x10000UL) /*!< I2S INTR_MASKED: RX_TRIGGER (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_RX_NOT_EMPTY_Pos (18UL) /*!< I2S INTR_MASKED: RX_NOT_EMPTY (Bit 18) */ +#define I2S_INTR_MASKED_RX_NOT_EMPTY_Msk (0x40000UL) /*!< I2S INTR_MASKED: RX_NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_RX_FULL_Pos (19UL) /*!< I2S INTR_MASKED: RX_FULL (Bit 19) */ +#define I2S_INTR_MASKED_RX_FULL_Msk (0x80000UL) /*!< I2S INTR_MASKED: RX_FULL (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_RX_OVERFLOW_Pos (21UL) /*!< I2S INTR_MASKED: RX_OVERFLOW (Bit 21) */ +#define I2S_INTR_MASKED_RX_OVERFLOW_Msk (0x200000UL) /*!< I2S INTR_MASKED: RX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_RX_UNDERFLOW_Pos (22UL) /*!< I2S INTR_MASKED: RX_UNDERFLOW (Bit 22) */ +#define I2S_INTR_MASKED_RX_UNDERFLOW_Msk (0x400000UL) /*!< I2S INTR_MASKED: RX_UNDERFLOW (Bitfield-Mask: 0x01) */ +#define I2S_INTR_MASKED_RX_WD_Pos (24UL) /*!< I2S INTR_MASKED: RX_WD (Bit 24) */ +#define I2S_INTR_MASKED_RX_WD_Msk (0x1000000UL) /*!< I2S INTR_MASKED: RX_WD (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_I2S_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ipc.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ipc.h new file mode 100644 index 0000000000..7b77442ab6 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ipc.h @@ -0,0 +1,123 @@ +/***************************************************************************//** +* \file cyip_ipc.h +* +* \brief +* IPC IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_IPC_H_ +#define _CYIP_IPC_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ IPC ================ */ +/* =========================================================================================================================== */ + +#define IPC_STRUCT_SECTION_SIZE 0x00000020UL +#define IPC_INTR_STRUCT_SECTION_SIZE 0x00000020UL +#define IPC_SECTION_SIZE 0x00010000UL + +/** + * \brief IPC structure (IPC_STRUCT) + */ +typedef struct { + __IM uint32_t ACQUIRE; /*!< 0x00000000 IPC acquire */ + __OM uint32_t RELEASE; /*!< 0x00000004 IPC release */ + __OM uint32_t NOTIFY; /*!< 0x00000008 IPC notification */ + __IOM uint32_t DATA; /*!< 0x0000000C IPC data */ + __IM uint32_t LOCK_STATUS; /*!< 0x00000010 IPC lock status */ + __IM uint32_t RESERVED[3]; +} IPC_STRUCT_Type; /*!< Size = 20 (0x14) */ + +/** + * \brief IPC interrupt structure (IPC_INTR_STRUCT) + */ +typedef struct { + __IOM uint32_t INTR; /*!< 0x00000000 Interrupt */ + __IOM uint32_t INTR_SET; /*!< 0x00000004 Interrupt set */ + __IOM uint32_t INTR_MASK; /*!< 0x00000008 Interrupt mask */ + __IM uint32_t INTR_MASKED; /*!< 0x0000000C Interrupt masked */ + __IM uint32_t RESERVED[4]; +} IPC_INTR_STRUCT_Type; /*!< Size = 16 (0x10) */ + +/** + * \brief IPC (IPC) + */ +typedef struct { /*!< IPC Structure */ + IPC_STRUCT_Type STRUCT[16]; /*!< 0x00000000 IPC structure */ + __IM uint32_t RESERVED[896]; + IPC_INTR_STRUCT_Type INTR_STRUCT[16]; /*!< 0x00001000 IPC interrupt structure */ +} IPC_Type; /*!< Size = 4608 (0x1200) */ + + +/* ================================================== IPC_STRUCT.ACQUIRE =================================================== */ +#define IPC_STRUCT_ACQUIRE_P_Pos (0UL) /*!< IPC_STRUCT ACQUIRE: P (Bit 0) */ +#define IPC_STRUCT_ACQUIRE_P_Msk (0x1UL) /*!< IPC_STRUCT ACQUIRE: P (Bitfield-Mask: 0x01) */ +#define IPC_STRUCT_ACQUIRE_NS_Pos (1UL) /*!< IPC_STRUCT ACQUIRE: NS (Bit 1) */ +#define IPC_STRUCT_ACQUIRE_NS_Msk (0x2UL) /*!< IPC_STRUCT ACQUIRE: NS (Bitfield-Mask: 0x01) */ +#define IPC_STRUCT_ACQUIRE_PC_Pos (4UL) /*!< IPC_STRUCT ACQUIRE: PC (Bit 4) */ +#define IPC_STRUCT_ACQUIRE_PC_Msk (0xf0UL) /*!< IPC_STRUCT ACQUIRE: PC (Bitfield-Mask: 0x0f) */ +#define IPC_STRUCT_ACQUIRE_MS_Pos (8UL) /*!< IPC_STRUCT ACQUIRE: MS (Bit 8) */ +#define IPC_STRUCT_ACQUIRE_MS_Msk (0xf00UL) /*!< IPC_STRUCT ACQUIRE: MS (Bitfield-Mask: 0x0f) */ +#define IPC_STRUCT_ACQUIRE_SUCCESS_Pos (31UL) /*!< IPC_STRUCT ACQUIRE: SUCCESS (Bit 31) */ +#define IPC_STRUCT_ACQUIRE_SUCCESS_Msk (0x80000000UL) /*!< IPC_STRUCT ACQUIRE: SUCCESS (Bitfield-Mask: 0x01) */ +/* ================================================== IPC_STRUCT.RELEASE =================================================== */ +#define IPC_STRUCT_RELEASE_INTR_RELEASE_Pos (0UL) /*!< IPC_STRUCT RELEASE: INTR_RELEASE (Bit 0) */ +#define IPC_STRUCT_RELEASE_INTR_RELEASE_Msk (0xffffUL) /*!< IPC_STRUCT RELEASE: INTR_RELEASE (Bitfield-Mask: 0xffff) */ +/* =================================================== IPC_STRUCT.NOTIFY =================================================== */ +#define IPC_STRUCT_NOTIFY_INTR_NOTIFY_Pos (0UL) /*!< IPC_STRUCT NOTIFY: INTR_NOTIFY (Bit 0) */ +#define IPC_STRUCT_NOTIFY_INTR_NOTIFY_Msk (0xffffUL) /*!< IPC_STRUCT NOTIFY: INTR_NOTIFY (Bitfield-Mask: 0xffff) */ +/* ==================================================== IPC_STRUCT.DATA ==================================================== */ +#define IPC_STRUCT_DATA_DATA_Pos (0UL) /*!< IPC_STRUCT DATA: DATA (Bit 0) */ +#define IPC_STRUCT_DATA_DATA_Msk (0xffffffffUL) /*!< IPC_STRUCT DATA: DATA (Bitfield-Mask: 0xffffffff) */ +/* ================================================ IPC_STRUCT.LOCK_STATUS ================================================= */ +#define IPC_STRUCT_LOCK_STATUS_P_Pos (0UL) /*!< IPC_STRUCT LOCK_STATUS: P (Bit 0) */ +#define IPC_STRUCT_LOCK_STATUS_P_Msk (0x1UL) /*!< IPC_STRUCT LOCK_STATUS: P (Bitfield-Mask: 0x01) */ +#define IPC_STRUCT_LOCK_STATUS_NS_Pos (1UL) /*!< IPC_STRUCT LOCK_STATUS: NS (Bit 1) */ +#define IPC_STRUCT_LOCK_STATUS_NS_Msk (0x2UL) /*!< IPC_STRUCT LOCK_STATUS: NS (Bitfield-Mask: 0x01) */ +#define IPC_STRUCT_LOCK_STATUS_PC_Pos (4UL) /*!< IPC_STRUCT LOCK_STATUS: PC (Bit 4) */ +#define IPC_STRUCT_LOCK_STATUS_PC_Msk (0xf0UL) /*!< IPC_STRUCT LOCK_STATUS: PC (Bitfield-Mask: 0x0f) */ +#define IPC_STRUCT_LOCK_STATUS_MS_Pos (8UL) /*!< IPC_STRUCT LOCK_STATUS: MS (Bit 8) */ +#define IPC_STRUCT_LOCK_STATUS_MS_Msk (0xf00UL) /*!< IPC_STRUCT LOCK_STATUS: MS (Bitfield-Mask: 0x0f) */ +#define IPC_STRUCT_LOCK_STATUS_ACQUIRED_Pos (31UL) /*!< IPC_STRUCT LOCK_STATUS: ACQUIRED (Bit 31) */ +#define IPC_STRUCT_LOCK_STATUS_ACQUIRED_Msk (0x80000000UL) /*!< IPC_STRUCT LOCK_STATUS: ACQUIRED (Bitfield-Mask: 0x01) */ + + +/* ================================================= IPC_INTR_STRUCT.INTR ================================================== */ +#define IPC_INTR_STRUCT_INTR_RELEASE_Pos (0UL) /*!< IPC_INTR_STRUCT INTR: RELEASE (Bit 0) */ +#define IPC_INTR_STRUCT_INTR_RELEASE_Msk (0xffffUL) /*!< IPC_INTR_STRUCT INTR: RELEASE (Bitfield-Mask: 0xffff) */ +#define IPC_INTR_STRUCT_INTR_NOTIFY_Pos (16UL) /*!< IPC_INTR_STRUCT INTR: NOTIFY (Bit 16) */ +#define IPC_INTR_STRUCT_INTR_NOTIFY_Msk (0xffff0000UL) /*!< IPC_INTR_STRUCT INTR: NOTIFY (Bitfield-Mask: 0xffff) */ +/* =============================================== IPC_INTR_STRUCT.INTR_SET ================================================ */ +#define IPC_INTR_STRUCT_INTR_SET_RELEASE_Pos (0UL) /*!< IPC_INTR_STRUCT INTR_SET: RELEASE (Bit 0) */ +#define IPC_INTR_STRUCT_INTR_SET_RELEASE_Msk (0xffffUL) /*!< IPC_INTR_STRUCT INTR_SET: RELEASE (Bitfield-Mask: 0xffff) */ +#define IPC_INTR_STRUCT_INTR_SET_NOTIFY_Pos (16UL) /*!< IPC_INTR_STRUCT INTR_SET: NOTIFY (Bit 16) */ +#define IPC_INTR_STRUCT_INTR_SET_NOTIFY_Msk (0xffff0000UL) /*!< IPC_INTR_STRUCT INTR_SET: NOTIFY (Bitfield-Mask: 0xffff) */ +/* =============================================== IPC_INTR_STRUCT.INTR_MASK =============================================== */ +#define IPC_INTR_STRUCT_INTR_MASK_RELEASE_Pos (0UL) /*!< IPC_INTR_STRUCT INTR_MASK: RELEASE (Bit 0) */ +#define IPC_INTR_STRUCT_INTR_MASK_RELEASE_Msk (0xffffUL) /*!< IPC_INTR_STRUCT INTR_MASK: RELEASE (Bitfield-Mask: 0xffff)*/ +#define IPC_INTR_STRUCT_INTR_MASK_NOTIFY_Pos (16UL) /*!< IPC_INTR_STRUCT INTR_MASK: NOTIFY (Bit 16) */ +#define IPC_INTR_STRUCT_INTR_MASK_NOTIFY_Msk (0xffff0000UL) /*!< IPC_INTR_STRUCT INTR_MASK: NOTIFY (Bitfield-Mask: 0xffff) */ +/* ============================================== IPC_INTR_STRUCT.INTR_MASKED ============================================== */ +#define IPC_INTR_STRUCT_INTR_MASKED_RELEASE_Pos (0UL) /*!< IPC_INTR_STRUCT INTR_MASKED: RELEASE (Bit 0) */ +#define IPC_INTR_STRUCT_INTR_MASKED_RELEASE_Msk (0xffffUL) /*!< IPC_INTR_STRUCT INTR_MASKED: RELEASE (Bitfield-Mask: 0xffff)*/ +#define IPC_INTR_STRUCT_INTR_MASKED_NOTIFY_Pos (16UL) /*!< IPC_INTR_STRUCT INTR_MASKED: NOTIFY (Bit 16) */ +#define IPC_INTR_STRUCT_INTR_MASKED_NOTIFY_Msk (0xffff0000UL) /*!< IPC_INTR_STRUCT INTR_MASKED: NOTIFY (Bitfield-Mask: 0xffff)*/ + + +#endif /* _CYIP_IPC_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_lcd.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_lcd.h new file mode 100644 index 0000000000..d0b63983bb --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_lcd.h @@ -0,0 +1,92 @@ +/***************************************************************************//** +* \file cyip_lcd.h +* +* \brief +* LCD IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_LCD_H_ +#define _CYIP_LCD_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ LCD ================ */ +/* =========================================================================================================================== */ + +#define LCD_SECTION_SIZE 0x00010000UL + +/** + * \brief LCD Controller Block (LCD) + */ +typedef struct { /*!< LCD Structure */ + __IM uint32_t ID; /*!< 0x00000000 ID & Revision */ + __IOM uint32_t DIVIDER; /*!< 0x00000004 LCD Divider Register */ + __IOM uint32_t CONTROL; /*!< 0x00000008 LCD Configuration Register */ + __IM uint32_t RESERVED[61]; + __IOM uint32_t DATA0[8]; /*!< 0x00000100 LCD Pin Data Registers */ + __IM uint32_t RESERVED1[56]; + __IOM uint32_t DATA1[8]; /*!< 0x00000200 LCD Pin Data Registers */ + __IM uint32_t RESERVED2[56]; + __IOM uint32_t DATA2[8]; /*!< 0x00000300 LCD Pin Data Registers */ + __IM uint32_t RESERVED3[56]; + __IOM uint32_t DATA3[8]; /*!< 0x00000400 LCD Pin Data Registers */ +} LCD_Type; /*!< Size = 1056 (0x420) */ + + +/* ======================================================== LCD.ID ========================================================= */ +#define LCD_ID_ID_Pos (0UL) /*!< LCD ID: ID (Bit 0) */ +#define LCD_ID_ID_Msk (0xffffUL) /*!< LCD ID: ID (Bitfield-Mask: 0xffff) */ +#define LCD_ID_REVISION_Pos (16UL) /*!< LCD ID: REVISION (Bit 16) */ +#define LCD_ID_REVISION_Msk (0xffff0000UL) /*!< LCD ID: REVISION (Bitfield-Mask: 0xffff) */ +/* ====================================================== LCD.DIVIDER ====================================================== */ +#define LCD_DIVIDER_SUBFR_DIV_Pos (0UL) /*!< LCD DIVIDER: SUBFR_DIV (Bit 0) */ +#define LCD_DIVIDER_SUBFR_DIV_Msk (0xffffUL) /*!< LCD DIVIDER: SUBFR_DIV (Bitfield-Mask: 0xffff) */ +#define LCD_DIVIDER_DEAD_DIV_Pos (16UL) /*!< LCD DIVIDER: DEAD_DIV (Bit 16) */ +#define LCD_DIVIDER_DEAD_DIV_Msk (0xffff0000UL) /*!< LCD DIVIDER: DEAD_DIV (Bitfield-Mask: 0xffff) */ +/* ====================================================== LCD.CONTROL ====================================================== */ +#define LCD_CONTROL_LS_EN_Pos (0UL) /*!< LCD CONTROL: LS_EN (Bit 0) */ +#define LCD_CONTROL_LS_EN_Msk (0x1UL) /*!< LCD CONTROL: LS_EN (Bitfield-Mask: 0x01) */ +#define LCD_CONTROL_HS_EN_Pos (1UL) /*!< LCD CONTROL: HS_EN (Bit 1) */ +#define LCD_CONTROL_HS_EN_Msk (0x2UL) /*!< LCD CONTROL: HS_EN (Bitfield-Mask: 0x01) */ +#define LCD_CONTROL_LCD_MODE_Pos (2UL) /*!< LCD CONTROL: LCD_MODE (Bit 2) */ +#define LCD_CONTROL_LCD_MODE_Msk (0x4UL) /*!< LCD CONTROL: LCD_MODE (Bitfield-Mask: 0x01) */ +#define LCD_CONTROL_TYPE_Pos (3UL) /*!< LCD CONTROL: TYPE (Bit 3) */ +#define LCD_CONTROL_TYPE_Msk (0x8UL) /*!< LCD CONTROL: TYPE (Bitfield-Mask: 0x01) */ +#define LCD_CONTROL_OP_MODE_Pos (4UL) /*!< LCD CONTROL: OP_MODE (Bit 4) */ +#define LCD_CONTROL_OP_MODE_Msk (0x10UL) /*!< LCD CONTROL: OP_MODE (Bitfield-Mask: 0x01) */ +#define LCD_CONTROL_BIAS_Pos (5UL) /*!< LCD CONTROL: BIAS (Bit 5) */ +#define LCD_CONTROL_BIAS_Msk (0x60UL) /*!< LCD CONTROL: BIAS (Bitfield-Mask: 0x03) */ +#define LCD_CONTROL_COM_NUM_Pos (8UL) /*!< LCD CONTROL: COM_NUM (Bit 8) */ +#define LCD_CONTROL_COM_NUM_Msk (0xf00UL) /*!< LCD CONTROL: COM_NUM (Bitfield-Mask: 0x0f) */ +#define LCD_CONTROL_LS_EN_STAT_Pos (31UL) /*!< LCD CONTROL: LS_EN_STAT (Bit 31) */ +#define LCD_CONTROL_LS_EN_STAT_Msk (0x80000000UL) /*!< LCD CONTROL: LS_EN_STAT (Bitfield-Mask: 0x01) */ +/* ======================================================= LCD.DATA0 ======================================================= */ +#define LCD_DATA0_DATA_Pos (0UL) /*!< LCD DATA0: DATA (Bit 0) */ +#define LCD_DATA0_DATA_Msk (0xffffffffUL) /*!< LCD DATA0: DATA (Bitfield-Mask: 0xffffffff) */ +/* ======================================================= LCD.DATA1 ======================================================= */ +#define LCD_DATA1_DATA_Pos (0UL) /*!< LCD DATA1: DATA (Bit 0) */ +#define LCD_DATA1_DATA_Msk (0xffffffffUL) /*!< LCD DATA1: DATA (Bitfield-Mask: 0xffffffff) */ +/* ======================================================= LCD.DATA2 ======================================================= */ +#define LCD_DATA2_DATA_Pos (0UL) /*!< LCD DATA2: DATA (Bit 0) */ +#define LCD_DATA2_DATA_Msk (0xffffffffUL) /*!< LCD DATA2: DATA (Bitfield-Mask: 0xffffffff) */ +/* ======================================================= LCD.DATA3 ======================================================= */ +#define LCD_DATA3_DATA_Pos (0UL) /*!< LCD DATA3: DATA (Bit 0) */ +#define LCD_DATA3_DATA_Msk (0xffffffffUL) /*!< LCD DATA3: DATA (Bitfield-Mask: 0xffffffff) */ + + +#endif /* _CYIP_LCD_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_lpcomp.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_lpcomp.h new file mode 100644 index 0000000000..a34e5605dd --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_lpcomp.h @@ -0,0 +1,171 @@ +/***************************************************************************//** +* \file cyip_lpcomp.h +* +* \brief +* LPCOMP IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_LPCOMP_H_ +#define _CYIP_LPCOMP_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ LPCOMP ================ */ +/* =========================================================================================================================== */ + +#define LPCOMP_SECTION_SIZE 0x00010000UL + +/** + * \brief Low Power Comparators (LPCOMP) + */ +typedef struct { /*!< LPCOMP Structure */ + __IOM uint32_t CONFIG; /*!< 0x00000000 LPCOMP Configuration Register */ + __IM uint32_t STATUS; /*!< 0x00000004 LPCOMP Status Register */ + __IM uint32_t RESERVED[2]; + __IOM uint32_t INTR; /*!< 0x00000010 LPCOMP Interrupt request register */ + __IOM uint32_t INTR_SET; /*!< 0x00000014 LPCOMP Interrupt set register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000018 LPCOMP Interrupt request mask */ + __IM uint32_t INTR_MASKED; /*!< 0x0000001C LPCOMP Interrupt request masked */ + __IM uint32_t RESERVED1[8]; + __IOM uint32_t CMP0_CTRL; /*!< 0x00000040 Comparator 0 control Register */ + __IM uint32_t RESERVED2[3]; + __IOM uint32_t CMP0_SW; /*!< 0x00000050 Comparator 0 switch control */ + __IOM uint32_t CMP0_SW_CLEAR; /*!< 0x00000054 Comparator 0 switch control clear */ + __IM uint32_t RESERVED3[10]; + __IOM uint32_t CMP1_CTRL; /*!< 0x00000080 Comparator 1 control Register */ + __IM uint32_t RESERVED4[3]; + __IOM uint32_t CMP1_SW; /*!< 0x00000090 Comparator 1 switch control */ + __IOM uint32_t CMP1_SW_CLEAR; /*!< 0x00000094 Comparator 1 switch control clear */ +} LPCOMP_Type; /*!< Size = 152 (0x98) */ + + +/* ===================================================== LPCOMP.CONFIG ===================================================== */ +#define LPCOMP_CONFIG_LPREF_EN_Pos (30UL) /*!< LPCOMP CONFIG: LPREF_EN (Bit 30) */ +#define LPCOMP_CONFIG_LPREF_EN_Msk (0x40000000UL) /*!< LPCOMP CONFIG: LPREF_EN (Bitfield-Mask: 0x01) */ +#define LPCOMP_CONFIG_ENABLED_Pos (31UL) /*!< LPCOMP CONFIG: ENABLED (Bit 31) */ +#define LPCOMP_CONFIG_ENABLED_Msk (0x80000000UL) /*!< LPCOMP CONFIG: ENABLED (Bitfield-Mask: 0x01) */ +/* ===================================================== LPCOMP.STATUS ===================================================== */ +#define LPCOMP_STATUS_OUT0_Pos (0UL) /*!< LPCOMP STATUS: OUT0 (Bit 0) */ +#define LPCOMP_STATUS_OUT0_Msk (0x1UL) /*!< LPCOMP STATUS: OUT0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_STATUS_OUT1_Pos (16UL) /*!< LPCOMP STATUS: OUT1 (Bit 16) */ +#define LPCOMP_STATUS_OUT1_Msk (0x10000UL) /*!< LPCOMP STATUS: OUT1 (Bitfield-Mask: 0x01) */ +/* ====================================================== LPCOMP.INTR ====================================================== */ +#define LPCOMP_INTR_COMP0_Pos (0UL) /*!< LPCOMP INTR: COMP0 (Bit 0) */ +#define LPCOMP_INTR_COMP0_Msk (0x1UL) /*!< LPCOMP INTR: COMP0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_INTR_COMP1_Pos (1UL) /*!< LPCOMP INTR: COMP1 (Bit 1) */ +#define LPCOMP_INTR_COMP1_Msk (0x2UL) /*!< LPCOMP INTR: COMP1 (Bitfield-Mask: 0x01) */ +/* ==================================================== LPCOMP.INTR_SET ==================================================== */ +#define LPCOMP_INTR_SET_COMP0_Pos (0UL) /*!< LPCOMP INTR_SET: COMP0 (Bit 0) */ +#define LPCOMP_INTR_SET_COMP0_Msk (0x1UL) /*!< LPCOMP INTR_SET: COMP0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_INTR_SET_COMP1_Pos (1UL) /*!< LPCOMP INTR_SET: COMP1 (Bit 1) */ +#define LPCOMP_INTR_SET_COMP1_Msk (0x2UL) /*!< LPCOMP INTR_SET: COMP1 (Bitfield-Mask: 0x01) */ +/* =================================================== LPCOMP.INTR_MASK ==================================================== */ +#define LPCOMP_INTR_MASK_COMP0_MASK_Pos (0UL) /*!< LPCOMP INTR_MASK: COMP0_MASK (Bit 0) */ +#define LPCOMP_INTR_MASK_COMP0_MASK_Msk (0x1UL) /*!< LPCOMP INTR_MASK: COMP0_MASK (Bitfield-Mask: 0x01) */ +#define LPCOMP_INTR_MASK_COMP1_MASK_Pos (1UL) /*!< LPCOMP INTR_MASK: COMP1_MASK (Bit 1) */ +#define LPCOMP_INTR_MASK_COMP1_MASK_Msk (0x2UL) /*!< LPCOMP INTR_MASK: COMP1_MASK (Bitfield-Mask: 0x01) */ +/* ================================================== LPCOMP.INTR_MASKED =================================================== */ +#define LPCOMP_INTR_MASKED_COMP0_MASKED_Pos (0UL) /*!< LPCOMP INTR_MASKED: COMP0_MASKED (Bit 0) */ +#define LPCOMP_INTR_MASKED_COMP0_MASKED_Msk (0x1UL) /*!< LPCOMP INTR_MASKED: COMP0_MASKED (Bitfield-Mask: 0x01) */ +#define LPCOMP_INTR_MASKED_COMP1_MASKED_Pos (1UL) /*!< LPCOMP INTR_MASKED: COMP1_MASKED (Bit 1) */ +#define LPCOMP_INTR_MASKED_COMP1_MASKED_Msk (0x2UL) /*!< LPCOMP INTR_MASKED: COMP1_MASKED (Bitfield-Mask: 0x01) */ +/* =================================================== LPCOMP.CMP0_CTRL ==================================================== */ +#define LPCOMP_CMP0_CTRL_MODE0_Pos (0UL) /*!< LPCOMP CMP0_CTRL: MODE0 (Bit 0) */ +#define LPCOMP_CMP0_CTRL_MODE0_Msk (0x3UL) /*!< LPCOMP CMP0_CTRL: MODE0 (Bitfield-Mask: 0x03) */ +#define LPCOMP_CMP0_CTRL_HYST0_Pos (5UL) /*!< LPCOMP CMP0_CTRL: HYST0 (Bit 5) */ +#define LPCOMP_CMP0_CTRL_HYST0_Msk (0x20UL) /*!< LPCOMP CMP0_CTRL: HYST0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_CTRL_INTTYPE0_Pos (6UL) /*!< LPCOMP CMP0_CTRL: INTTYPE0 (Bit 6) */ +#define LPCOMP_CMP0_CTRL_INTTYPE0_Msk (0xc0UL) /*!< LPCOMP CMP0_CTRL: INTTYPE0 (Bitfield-Mask: 0x03) */ +#define LPCOMP_CMP0_CTRL_DSI_BYPASS0_Pos (10UL) /*!< LPCOMP CMP0_CTRL: DSI_BYPASS0 (Bit 10) */ +#define LPCOMP_CMP0_CTRL_DSI_BYPASS0_Msk (0x400UL) /*!< LPCOMP CMP0_CTRL: DSI_BYPASS0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_CTRL_DSI_LEVEL0_Pos (11UL) /*!< LPCOMP CMP0_CTRL: DSI_LEVEL0 (Bit 11) */ +#define LPCOMP_CMP0_CTRL_DSI_LEVEL0_Msk (0x800UL) /*!< LPCOMP CMP0_CTRL: DSI_LEVEL0 (Bitfield-Mask: 0x01) */ +/* ==================================================== LPCOMP.CMP0_SW ===================================================== */ +#define LPCOMP_CMP0_SW_CMP0_IP0_Pos (0UL) /*!< LPCOMP CMP0_SW: CMP0_IP0 (Bit 0) */ +#define LPCOMP_CMP0_SW_CMP0_IP0_Msk (0x1UL) /*!< LPCOMP CMP0_SW: CMP0_IP0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CMP0_AP0_Pos (1UL) /*!< LPCOMP CMP0_SW: CMP0_AP0 (Bit 1) */ +#define LPCOMP_CMP0_SW_CMP0_AP0_Msk (0x2UL) /*!< LPCOMP CMP0_SW: CMP0_AP0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CMP0_BP0_Pos (2UL) /*!< LPCOMP CMP0_SW: CMP0_BP0 (Bit 2) */ +#define LPCOMP_CMP0_SW_CMP0_BP0_Msk (0x4UL) /*!< LPCOMP CMP0_SW: CMP0_BP0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CMP0_IN0_Pos (4UL) /*!< LPCOMP CMP0_SW: CMP0_IN0 (Bit 4) */ +#define LPCOMP_CMP0_SW_CMP0_IN0_Msk (0x10UL) /*!< LPCOMP CMP0_SW: CMP0_IN0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CMP0_AN0_Pos (5UL) /*!< LPCOMP CMP0_SW: CMP0_AN0 (Bit 5) */ +#define LPCOMP_CMP0_SW_CMP0_AN0_Msk (0x20UL) /*!< LPCOMP CMP0_SW: CMP0_AN0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CMP0_BN0_Pos (6UL) /*!< LPCOMP CMP0_SW: CMP0_BN0 (Bit 6) */ +#define LPCOMP_CMP0_SW_CMP0_BN0_Msk (0x40UL) /*!< LPCOMP CMP0_SW: CMP0_BN0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CMP0_VN0_Pos (7UL) /*!< LPCOMP CMP0_SW: CMP0_VN0 (Bit 7) */ +#define LPCOMP_CMP0_SW_CMP0_VN0_Msk (0x80UL) /*!< LPCOMP CMP0_SW: CMP0_VN0 (Bitfield-Mask: 0x01) */ +/* ================================================= LPCOMP.CMP0_SW_CLEAR ================================================== */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_IP0_Pos (0UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_IP0 (Bit 0) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_IP0_Msk (0x1UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_IP0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_AP0_Pos (1UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_AP0 (Bit 1) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_AP0_Msk (0x2UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_AP0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_BP0_Pos (2UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_BP0 (Bit 2) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_BP0_Msk (0x4UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_BP0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_IN0_Pos (4UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_IN0 (Bit 4) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_IN0_Msk (0x10UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_IN0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_AN0_Pos (5UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_AN0 (Bit 5) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_AN0_Msk (0x20UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_AN0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_BN0_Pos (6UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_BN0 (Bit 6) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_BN0_Msk (0x40UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_BN0 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_VN0_Pos (7UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_VN0 (Bit 7) */ +#define LPCOMP_CMP0_SW_CLEAR_CMP0_VN0_Msk (0x80UL) /*!< LPCOMP CMP0_SW_CLEAR: CMP0_VN0 (Bitfield-Mask: 0x01) */ +/* =================================================== LPCOMP.CMP1_CTRL ==================================================== */ +#define LPCOMP_CMP1_CTRL_MODE1_Pos (0UL) /*!< LPCOMP CMP1_CTRL: MODE1 (Bit 0) */ +#define LPCOMP_CMP1_CTRL_MODE1_Msk (0x3UL) /*!< LPCOMP CMP1_CTRL: MODE1 (Bitfield-Mask: 0x03) */ +#define LPCOMP_CMP1_CTRL_HYST1_Pos (5UL) /*!< LPCOMP CMP1_CTRL: HYST1 (Bit 5) */ +#define LPCOMP_CMP1_CTRL_HYST1_Msk (0x20UL) /*!< LPCOMP CMP1_CTRL: HYST1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_CTRL_INTTYPE1_Pos (6UL) /*!< LPCOMP CMP1_CTRL: INTTYPE1 (Bit 6) */ +#define LPCOMP_CMP1_CTRL_INTTYPE1_Msk (0xc0UL) /*!< LPCOMP CMP1_CTRL: INTTYPE1 (Bitfield-Mask: 0x03) */ +#define LPCOMP_CMP1_CTRL_DSI_BYPASS1_Pos (10UL) /*!< LPCOMP CMP1_CTRL: DSI_BYPASS1 (Bit 10) */ +#define LPCOMP_CMP1_CTRL_DSI_BYPASS1_Msk (0x400UL) /*!< LPCOMP CMP1_CTRL: DSI_BYPASS1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_CTRL_DSI_LEVEL1_Pos (11UL) /*!< LPCOMP CMP1_CTRL: DSI_LEVEL1 (Bit 11) */ +#define LPCOMP_CMP1_CTRL_DSI_LEVEL1_Msk (0x800UL) /*!< LPCOMP CMP1_CTRL: DSI_LEVEL1 (Bitfield-Mask: 0x01) */ +/* ==================================================== LPCOMP.CMP1_SW ===================================================== */ +#define LPCOMP_CMP1_SW_CMP1_IP1_Pos (0UL) /*!< LPCOMP CMP1_SW: CMP1_IP1 (Bit 0) */ +#define LPCOMP_CMP1_SW_CMP1_IP1_Msk (0x1UL) /*!< LPCOMP CMP1_SW: CMP1_IP1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CMP1_AP1_Pos (1UL) /*!< LPCOMP CMP1_SW: CMP1_AP1 (Bit 1) */ +#define LPCOMP_CMP1_SW_CMP1_AP1_Msk (0x2UL) /*!< LPCOMP CMP1_SW: CMP1_AP1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CMP1_BP1_Pos (2UL) /*!< LPCOMP CMP1_SW: CMP1_BP1 (Bit 2) */ +#define LPCOMP_CMP1_SW_CMP1_BP1_Msk (0x4UL) /*!< LPCOMP CMP1_SW: CMP1_BP1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CMP1_IN1_Pos (4UL) /*!< LPCOMP CMP1_SW: CMP1_IN1 (Bit 4) */ +#define LPCOMP_CMP1_SW_CMP1_IN1_Msk (0x10UL) /*!< LPCOMP CMP1_SW: CMP1_IN1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CMP1_AN1_Pos (5UL) /*!< LPCOMP CMP1_SW: CMP1_AN1 (Bit 5) */ +#define LPCOMP_CMP1_SW_CMP1_AN1_Msk (0x20UL) /*!< LPCOMP CMP1_SW: CMP1_AN1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CMP1_BN1_Pos (6UL) /*!< LPCOMP CMP1_SW: CMP1_BN1 (Bit 6) */ +#define LPCOMP_CMP1_SW_CMP1_BN1_Msk (0x40UL) /*!< LPCOMP CMP1_SW: CMP1_BN1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CMP1_VN1_Pos (7UL) /*!< LPCOMP CMP1_SW: CMP1_VN1 (Bit 7) */ +#define LPCOMP_CMP1_SW_CMP1_VN1_Msk (0x80UL) /*!< LPCOMP CMP1_SW: CMP1_VN1 (Bitfield-Mask: 0x01) */ +/* ================================================= LPCOMP.CMP1_SW_CLEAR ================================================== */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_IP1_Pos (0UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_IP1 (Bit 0) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_IP1_Msk (0x1UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_IP1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_AP1_Pos (1UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_AP1 (Bit 1) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_AP1_Msk (0x2UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_AP1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_BP1_Pos (2UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_BP1 (Bit 2) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_BP1_Msk (0x4UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_BP1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_IN1_Pos (4UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_IN1 (Bit 4) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_IN1_Msk (0x10UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_IN1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_AN1_Pos (5UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_AN1 (Bit 5) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_AN1_Msk (0x20UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_AN1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_BN1_Pos (6UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_BN1 (Bit 6) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_BN1_Msk (0x40UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_BN1 (Bitfield-Mask: 0x01) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_VN1_Pos (7UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_VN1 (Bit 7) */ +#define LPCOMP_CMP1_SW_CLEAR_CMP1_VN1_Msk (0x80UL) /*!< LPCOMP CMP1_SW_CLEAR: CMP1_VN1 (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_LPCOMP_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_pass.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_pass.h new file mode 100644 index 0000000000..89082a4854 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_pass.h @@ -0,0 +1,130 @@ +/***************************************************************************//** +* \file cyip_pass.h +* +* \brief +* PASS IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_PASS_H_ +#define _CYIP_PASS_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ PASS ================ */ +/* =========================================================================================================================== */ + +#define PASS_AREF_SECTION_SIZE 0x00000100UL +#define PASS_SECTION_SIZE 0x00010000UL + +/** + * \brief AREF configuration (PASS_AREF) + */ +typedef struct { + __IOM uint32_t AREF_CTRL; /*!< 0x00000000 global AREF control */ + __IM uint32_t RESERVED[63]; +} PASS_AREF_Type; /*!< Size = 4 (0x4) */ + +/** + * \brief PASS top-level MMIO (DSABv2, INTR) (PASS) + */ +typedef struct { /*!< PASS Structure */ + __IM uint32_t INTR_CAUSE; /*!< 0x00000000 Interrupt cause register */ + __IM uint32_t RESERVED[895]; + PASS_AREF_Type AREF; /*!< 0x00000E00 AREF configuration */ + __IOM uint32_t VREF_TRIM0; /*!< 0x00000F00 VREF Trim bits */ + __IOM uint32_t VREF_TRIM1; /*!< 0x00000F04 VREF Trim bits */ + __IOM uint32_t VREF_TRIM2; /*!< 0x00000F08 VREF Trim bits */ + __IOM uint32_t VREF_TRIM3; /*!< 0x00000F0C VREF Trim bits */ + __IOM uint32_t IZTAT_TRIM0; /*!< 0x00000F10 IZTAT Trim bits */ + __IOM uint32_t IZTAT_TRIM1; /*!< 0x00000F14 IZTAT Trim bits */ + __IOM uint32_t IPTAT_TRIM0; /*!< 0x00000F18 IPTAT Trim bits */ + __IOM uint32_t ICTAT_TRIM0; /*!< 0x00000F1C ICTAT Trim bits */ +} PASS_Type; /*!< Size = 3872 (0xF20) */ + + +/* ================================================== PASS_AREF.AREF_CTRL ================================================== */ +#define PASS_AREF_AREF_CTRL_AREF_MODE_Pos (0UL) /*!< PASS_AREF AREF_CTRL: AREF_MODE (Bit 0) */ +#define PASS_AREF_AREF_CTRL_AREF_MODE_Msk (0x1UL) /*!< PASS_AREF AREF_CTRL: AREF_MODE (Bitfield-Mask: 0x01) */ +#define PASS_AREF_AREF_CTRL_AREF_BIAS_SCALE_Pos (2UL) /*!< PASS_AREF AREF_CTRL: AREF_BIAS_SCALE (Bit 2) */ +#define PASS_AREF_AREF_CTRL_AREF_BIAS_SCALE_Msk (0xcUL) /*!< PASS_AREF AREF_CTRL: AREF_BIAS_SCALE (Bitfield-Mask: 0x03)*/ +#define PASS_AREF_AREF_CTRL_AREF_RMB_Pos (4UL) /*!< PASS_AREF AREF_CTRL: AREF_RMB (Bit 4) */ +#define PASS_AREF_AREF_CTRL_AREF_RMB_Msk (0x70UL) /*!< PASS_AREF AREF_CTRL: AREF_RMB (Bitfield-Mask: 0x07) */ +#define PASS_AREF_AREF_CTRL_CTB_IPTAT_SCALE_Pos (7UL) /*!< PASS_AREF AREF_CTRL: CTB_IPTAT_SCALE (Bit 7) */ +#define PASS_AREF_AREF_CTRL_CTB_IPTAT_SCALE_Msk (0x80UL) /*!< PASS_AREF AREF_CTRL: CTB_IPTAT_SCALE (Bitfield-Mask: 0x01)*/ +#define PASS_AREF_AREF_CTRL_CTB_IPTAT_REDIRECT_Pos (8UL) /*!< PASS_AREF AREF_CTRL: CTB_IPTAT_REDIRECT (Bit 8) */ +#define PASS_AREF_AREF_CTRL_CTB_IPTAT_REDIRECT_Msk (0xff00UL) /*!< PASS_AREF AREF_CTRL: CTB_IPTAT_REDIRECT (Bitfield-Mask: 0xff)*/ +#define PASS_AREF_AREF_CTRL_IZTAT_SEL_Pos (16UL) /*!< PASS_AREF AREF_CTRL: IZTAT_SEL (Bit 16) */ +#define PASS_AREF_AREF_CTRL_IZTAT_SEL_Msk (0x10000UL) /*!< PASS_AREF AREF_CTRL: IZTAT_SEL (Bitfield-Mask: 0x01) */ +#define PASS_AREF_AREF_CTRL_CLOCK_PUMP_PERI_SEL_Pos (19UL) /*!< PASS_AREF AREF_CTRL: CLOCK_PUMP_PERI_SEL (Bit 19) */ +#define PASS_AREF_AREF_CTRL_CLOCK_PUMP_PERI_SEL_Msk (0x80000UL) /*!< PASS_AREF AREF_CTRL: CLOCK_PUMP_PERI_SEL (Bitfield-Mask: 0x01)*/ +#define PASS_AREF_AREF_CTRL_VREF_SEL_Pos (20UL) /*!< PASS_AREF AREF_CTRL: VREF_SEL (Bit 20) */ +#define PASS_AREF_AREF_CTRL_VREF_SEL_Msk (0x300000UL) /*!< PASS_AREF AREF_CTRL: VREF_SEL (Bitfield-Mask: 0x03) */ +#define PASS_AREF_AREF_CTRL_DEEPSLEEP_MODE_Pos (28UL) /*!< PASS_AREF AREF_CTRL: DEEPSLEEP_MODE (Bit 28) */ +#define PASS_AREF_AREF_CTRL_DEEPSLEEP_MODE_Msk (0x30000000UL) /*!< PASS_AREF AREF_CTRL: DEEPSLEEP_MODE (Bitfield-Mask: 0x03) */ +#define PASS_AREF_AREF_CTRL_DEEPSLEEP_ON_Pos (30UL) /*!< PASS_AREF AREF_CTRL: DEEPSLEEP_ON (Bit 30) */ +#define PASS_AREF_AREF_CTRL_DEEPSLEEP_ON_Msk (0x40000000UL) /*!< PASS_AREF AREF_CTRL: DEEPSLEEP_ON (Bitfield-Mask: 0x01) */ +#define PASS_AREF_AREF_CTRL_ENABLED_Pos (31UL) /*!< PASS_AREF AREF_CTRL: ENABLED (Bit 31) */ +#define PASS_AREF_AREF_CTRL_ENABLED_Msk (0x80000000UL) /*!< PASS_AREF AREF_CTRL: ENABLED (Bitfield-Mask: 0x01) */ + + +/* ==================================================== PASS.INTR_CAUSE ==================================================== */ +#define PASS_INTR_CAUSE_CTB0_INT_Pos (0UL) /*!< PASS INTR_CAUSE: CTB0_INT (Bit 0) */ +#define PASS_INTR_CAUSE_CTB0_INT_Msk (0x1UL) /*!< PASS INTR_CAUSE: CTB0_INT (Bitfield-Mask: 0x01) */ +#define PASS_INTR_CAUSE_CTB1_INT_Pos (1UL) /*!< PASS INTR_CAUSE: CTB1_INT (Bit 1) */ +#define PASS_INTR_CAUSE_CTB1_INT_Msk (0x2UL) /*!< PASS INTR_CAUSE: CTB1_INT (Bitfield-Mask: 0x01) */ +#define PASS_INTR_CAUSE_CTB2_INT_Pos (2UL) /*!< PASS INTR_CAUSE: CTB2_INT (Bit 2) */ +#define PASS_INTR_CAUSE_CTB2_INT_Msk (0x4UL) /*!< PASS INTR_CAUSE: CTB2_INT (Bitfield-Mask: 0x01) */ +#define PASS_INTR_CAUSE_CTB3_INT_Pos (3UL) /*!< PASS INTR_CAUSE: CTB3_INT (Bit 3) */ +#define PASS_INTR_CAUSE_CTB3_INT_Msk (0x8UL) /*!< PASS INTR_CAUSE: CTB3_INT (Bitfield-Mask: 0x01) */ +#define PASS_INTR_CAUSE_CTDAC0_INT_Pos (4UL) /*!< PASS INTR_CAUSE: CTDAC0_INT (Bit 4) */ +#define PASS_INTR_CAUSE_CTDAC0_INT_Msk (0x10UL) /*!< PASS INTR_CAUSE: CTDAC0_INT (Bitfield-Mask: 0x01) */ +#define PASS_INTR_CAUSE_CTDAC1_INT_Pos (5UL) /*!< PASS INTR_CAUSE: CTDAC1_INT (Bit 5) */ +#define PASS_INTR_CAUSE_CTDAC1_INT_Msk (0x20UL) /*!< PASS INTR_CAUSE: CTDAC1_INT (Bitfield-Mask: 0x01) */ +#define PASS_INTR_CAUSE_CTDAC2_INT_Pos (6UL) /*!< PASS INTR_CAUSE: CTDAC2_INT (Bit 6) */ +#define PASS_INTR_CAUSE_CTDAC2_INT_Msk (0x40UL) /*!< PASS INTR_CAUSE: CTDAC2_INT (Bitfield-Mask: 0x01) */ +#define PASS_INTR_CAUSE_CTDAC3_INT_Pos (7UL) /*!< PASS INTR_CAUSE: CTDAC3_INT (Bit 7) */ +#define PASS_INTR_CAUSE_CTDAC3_INT_Msk (0x80UL) /*!< PASS INTR_CAUSE: CTDAC3_INT (Bitfield-Mask: 0x01) */ +/* ==================================================== PASS.VREF_TRIM0 ==================================================== */ +#define PASS_VREF_TRIM0_VREF_ABS_TRIM_Pos (0UL) /*!< PASS VREF_TRIM0: VREF_ABS_TRIM (Bit 0) */ +#define PASS_VREF_TRIM0_VREF_ABS_TRIM_Msk (0xffUL) /*!< PASS VREF_TRIM0: VREF_ABS_TRIM (Bitfield-Mask: 0xff) */ +/* ==================================================== PASS.VREF_TRIM1 ==================================================== */ +#define PASS_VREF_TRIM1_VREF_TEMPCO_TRIM_Pos (0UL) /*!< PASS VREF_TRIM1: VREF_TEMPCO_TRIM (Bit 0) */ +#define PASS_VREF_TRIM1_VREF_TEMPCO_TRIM_Msk (0xffUL) /*!< PASS VREF_TRIM1: VREF_TEMPCO_TRIM (Bitfield-Mask: 0xff) */ +/* ==================================================== PASS.VREF_TRIM2 ==================================================== */ +#define PASS_VREF_TRIM2_VREF_CURV_TRIM_Pos (0UL) /*!< PASS VREF_TRIM2: VREF_CURV_TRIM (Bit 0) */ +#define PASS_VREF_TRIM2_VREF_CURV_TRIM_Msk (0xffUL) /*!< PASS VREF_TRIM2: VREF_CURV_TRIM (Bitfield-Mask: 0xff) */ +/* ==================================================== PASS.VREF_TRIM3 ==================================================== */ +#define PASS_VREF_TRIM3_VREF_ATTEN_TRIM_Pos (0UL) /*!< PASS VREF_TRIM3: VREF_ATTEN_TRIM (Bit 0) */ +#define PASS_VREF_TRIM3_VREF_ATTEN_TRIM_Msk (0xfUL) /*!< PASS VREF_TRIM3: VREF_ATTEN_TRIM (Bitfield-Mask: 0x0f) */ +/* =================================================== PASS.IZTAT_TRIM0 ==================================================== */ +#define PASS_IZTAT_TRIM0_IZTAT_ABS_TRIM_Pos (0UL) /*!< PASS IZTAT_TRIM0: IZTAT_ABS_TRIM (Bit 0) */ +#define PASS_IZTAT_TRIM0_IZTAT_ABS_TRIM_Msk (0xffUL) /*!< PASS IZTAT_TRIM0: IZTAT_ABS_TRIM (Bitfield-Mask: 0xff) */ +/* =================================================== PASS.IZTAT_TRIM1 ==================================================== */ +#define PASS_IZTAT_TRIM1_IZTAT_TC_TRIM_Pos (0UL) /*!< PASS IZTAT_TRIM1: IZTAT_TC_TRIM (Bit 0) */ +#define PASS_IZTAT_TRIM1_IZTAT_TC_TRIM_Msk (0xffUL) /*!< PASS IZTAT_TRIM1: IZTAT_TC_TRIM (Bitfield-Mask: 0xff) */ +/* =================================================== PASS.IPTAT_TRIM0 ==================================================== */ +#define PASS_IPTAT_TRIM0_IPTAT_CORE_TRIM_Pos (0UL) /*!< PASS IPTAT_TRIM0: IPTAT_CORE_TRIM (Bit 0) */ +#define PASS_IPTAT_TRIM0_IPTAT_CORE_TRIM_Msk (0xfUL) /*!< PASS IPTAT_TRIM0: IPTAT_CORE_TRIM (Bitfield-Mask: 0x0f) */ +#define PASS_IPTAT_TRIM0_IPTAT_CTBM_TRIM_Pos (4UL) /*!< PASS IPTAT_TRIM0: IPTAT_CTBM_TRIM (Bit 4) */ +#define PASS_IPTAT_TRIM0_IPTAT_CTBM_TRIM_Msk (0xf0UL) /*!< PASS IPTAT_TRIM0: IPTAT_CTBM_TRIM (Bitfield-Mask: 0x0f) */ +/* =================================================== PASS.ICTAT_TRIM0 ==================================================== */ +#define PASS_ICTAT_TRIM0_ICTAT_TRIM_Pos (0UL) /*!< PASS ICTAT_TRIM0: ICTAT_TRIM (Bit 0) */ +#define PASS_ICTAT_TRIM0_ICTAT_TRIM_Msk (0xfUL) /*!< PASS ICTAT_TRIM0: ICTAT_TRIM (Bitfield-Mask: 0x0f) */ + + +#endif /* _CYIP_PASS_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_pdm.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_pdm.h new file mode 100644 index 0000000000..0bff6de5ca --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_pdm.h @@ -0,0 +1,169 @@ +/***************************************************************************//** +* \file cyip_pdm.h +* +* \brief +* PDM IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_PDM_H_ +#define _CYIP_PDM_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ PDM ================ */ +/* =========================================================================================================================== */ + +#define PDM_SECTION_SIZE 0x00001000UL + +/** + * \brief PDM registers (PDM) + */ +typedef struct { /*!< PDM Structure */ + __IOM uint32_t CTL; /*!< 0x00000000 Control */ + __IM uint32_t RESERVED[3]; + __IOM uint32_t CLOCK_CTL; /*!< 0x00000010 Clock control */ + __IOM uint32_t MODE_CTL; /*!< 0x00000014 Mode control */ + __IOM uint32_t DATA_CTL; /*!< 0x00000018 Data control */ + __IM uint32_t RESERVED1; + __IOM uint32_t CMD; /*!< 0x00000020 Command */ + __IM uint32_t RESERVED2[7]; + __IOM uint32_t TR_CTL; /*!< 0x00000040 Trigger control */ + __IM uint32_t RESERVED3[175]; + __IOM uint32_t RX_FIFO_CTL; /*!< 0x00000300 RX FIFO control */ + __IM uint32_t RX_FIFO_STATUS; /*!< 0x00000304 RX FIFO status */ + __IM uint32_t RX_FIFO_RD; /*!< 0x00000308 RX FIFO read */ + __IM uint32_t RX_FIFO_RD_SILENT; /*!< 0x0000030C RX FIFO silent read */ + __IM uint32_t RESERVED4[764]; + __IOM uint32_t INTR; /*!< 0x00000F00 Interrupt register */ + __IOM uint32_t INTR_SET; /*!< 0x00000F04 Interrupt set register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000F08 Interrupt mask register */ + __IM uint32_t INTR_MASKED; /*!< 0x00000F0C Interrupt masked register */ +} PDM_Type; /*!< Size = 3856 (0xF10) */ + + +/* ======================================================== PDM.CTL ======================================================== */ +#define PDM_CTL_PGA_R_Pos (0UL) /*!< PDM CTL: PGA_R (Bit 0) */ +#define PDM_CTL_PGA_R_Msk (0xfUL) /*!< PDM CTL: PGA_R (Bitfield-Mask: 0x0f) */ +#define PDM_CTL_PGA_L_Pos (8UL) /*!< PDM CTL: PGA_L (Bit 8) */ +#define PDM_CTL_PGA_L_Msk (0xf00UL) /*!< PDM CTL: PGA_L (Bitfield-Mask: 0x0f) */ +#define PDM_CTL_SOFT_MUTE_Pos (16UL) /*!< PDM CTL: SOFT_MUTE (Bit 16) */ +#define PDM_CTL_SOFT_MUTE_Msk (0x10000UL) /*!< PDM CTL: SOFT_MUTE (Bitfield-Mask: 0x01) */ +#define PDM_CTL_STEP_SEL_Pos (17UL) /*!< PDM CTL: STEP_SEL (Bit 17) */ +#define PDM_CTL_STEP_SEL_Msk (0x20000UL) /*!< PDM CTL: STEP_SEL (Bitfield-Mask: 0x01) */ +#define PDM_CTL_ENABLED_Pos (31UL) /*!< PDM CTL: ENABLED (Bit 31) */ +#define PDM_CTL_ENABLED_Msk (0x80000000UL) /*!< PDM CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ===================================================== PDM.CLOCK_CTL ===================================================== */ +#define PDM_CLOCK_CTL_CLK_CLOCK_DIV_Pos (0UL) /*!< PDM CLOCK_CTL: CLK_CLOCK_DIV (Bit 0) */ +#define PDM_CLOCK_CTL_CLK_CLOCK_DIV_Msk (0x3UL) /*!< PDM CLOCK_CTL: CLK_CLOCK_DIV (Bitfield-Mask: 0x03) */ +#define PDM_CLOCK_CTL_MCLKQ_CLOCK_DIV_Pos (4UL) /*!< PDM CLOCK_CTL: MCLKQ_CLOCK_DIV (Bit 4) */ +#define PDM_CLOCK_CTL_MCLKQ_CLOCK_DIV_Msk (0x30UL) /*!< PDM CLOCK_CTL: MCLKQ_CLOCK_DIV (Bitfield-Mask: 0x03) */ +#define PDM_CLOCK_CTL_CKO_CLOCK_DIV_Pos (8UL) /*!< PDM CLOCK_CTL: CKO_CLOCK_DIV (Bit 8) */ +#define PDM_CLOCK_CTL_CKO_CLOCK_DIV_Msk (0xf00UL) /*!< PDM CLOCK_CTL: CKO_CLOCK_DIV (Bitfield-Mask: 0x0f) */ +#define PDM_CLOCK_CTL_SINC_RATE_Pos (16UL) /*!< PDM CLOCK_CTL: SINC_RATE (Bit 16) */ +#define PDM_CLOCK_CTL_SINC_RATE_Msk (0x7f0000UL) /*!< PDM CLOCK_CTL: SINC_RATE (Bitfield-Mask: 0x7f) */ +/* ===================================================== PDM.MODE_CTL ====================================================== */ +#define PDM_MODE_CTL_PCM_CH_SET_Pos (0UL) /*!< PDM MODE_CTL: PCM_CH_SET (Bit 0) */ +#define PDM_MODE_CTL_PCM_CH_SET_Msk (0x3UL) /*!< PDM MODE_CTL: PCM_CH_SET (Bitfield-Mask: 0x03) */ +#define PDM_MODE_CTL_SWAP_LR_Pos (2UL) /*!< PDM MODE_CTL: SWAP_LR (Bit 2) */ +#define PDM_MODE_CTL_SWAP_LR_Msk (0x4UL) /*!< PDM MODE_CTL: SWAP_LR (Bitfield-Mask: 0x01) */ +#define PDM_MODE_CTL_S_CYCLES_Pos (8UL) /*!< PDM MODE_CTL: S_CYCLES (Bit 8) */ +#define PDM_MODE_CTL_S_CYCLES_Msk (0x700UL) /*!< PDM MODE_CTL: S_CYCLES (Bitfield-Mask: 0x07) */ +#define PDM_MODE_CTL_CKO_DELAY_Pos (16UL) /*!< PDM MODE_CTL: CKO_DELAY (Bit 16) */ +#define PDM_MODE_CTL_CKO_DELAY_Msk (0x70000UL) /*!< PDM MODE_CTL: CKO_DELAY (Bitfield-Mask: 0x07) */ +#define PDM_MODE_CTL_HPF_GAIN_Pos (24UL) /*!< PDM MODE_CTL: HPF_GAIN (Bit 24) */ +#define PDM_MODE_CTL_HPF_GAIN_Msk (0xf000000UL) /*!< PDM MODE_CTL: HPF_GAIN (Bitfield-Mask: 0x0f) */ +#define PDM_MODE_CTL_HPF_EN_N_Pos (28UL) /*!< PDM MODE_CTL: HPF_EN_N (Bit 28) */ +#define PDM_MODE_CTL_HPF_EN_N_Msk (0x10000000UL) /*!< PDM MODE_CTL: HPF_EN_N (Bitfield-Mask: 0x01) */ +/* ===================================================== PDM.DATA_CTL ====================================================== */ +#define PDM_DATA_CTL_WORD_LEN_Pos (0UL) /*!< PDM DATA_CTL: WORD_LEN (Bit 0) */ +#define PDM_DATA_CTL_WORD_LEN_Msk (0x3UL) /*!< PDM DATA_CTL: WORD_LEN (Bitfield-Mask: 0x03) */ +#define PDM_DATA_CTL_BIT_EXTENSION_Pos (8UL) /*!< PDM DATA_CTL: BIT_EXTENSION (Bit 8) */ +#define PDM_DATA_CTL_BIT_EXTENSION_Msk (0x100UL) /*!< PDM DATA_CTL: BIT_EXTENSION (Bitfield-Mask: 0x01) */ +/* ======================================================== PDM.CMD ======================================================== */ +#define PDM_CMD_STREAM_EN_Pos (0UL) /*!< PDM CMD: STREAM_EN (Bit 0) */ +#define PDM_CMD_STREAM_EN_Msk (0x1UL) /*!< PDM CMD: STREAM_EN (Bitfield-Mask: 0x01) */ +/* ====================================================== PDM.TR_CTL ======================================================= */ +#define PDM_TR_CTL_RX_REQ_EN_Pos (16UL) /*!< PDM TR_CTL: RX_REQ_EN (Bit 16) */ +#define PDM_TR_CTL_RX_REQ_EN_Msk (0x10000UL) /*!< PDM TR_CTL: RX_REQ_EN (Bitfield-Mask: 0x01) */ +/* ==================================================== PDM.RX_FIFO_CTL ==================================================== */ +#define PDM_RX_FIFO_CTL_TRIGGER_LEVEL_Pos (0UL) /*!< PDM RX_FIFO_CTL: TRIGGER_LEVEL (Bit 0) */ +#define PDM_RX_FIFO_CTL_TRIGGER_LEVEL_Msk (0xffUL) /*!< PDM RX_FIFO_CTL: TRIGGER_LEVEL (Bitfield-Mask: 0xff) */ +#define PDM_RX_FIFO_CTL_CLEAR_Pos (16UL) /*!< PDM RX_FIFO_CTL: CLEAR (Bit 16) */ +#define PDM_RX_FIFO_CTL_CLEAR_Msk (0x10000UL) /*!< PDM RX_FIFO_CTL: CLEAR (Bitfield-Mask: 0x01) */ +#define PDM_RX_FIFO_CTL_FREEZE_Pos (17UL) /*!< PDM RX_FIFO_CTL: FREEZE (Bit 17) */ +#define PDM_RX_FIFO_CTL_FREEZE_Msk (0x20000UL) /*!< PDM RX_FIFO_CTL: FREEZE (Bitfield-Mask: 0x01) */ +/* ================================================== PDM.RX_FIFO_STATUS =================================================== */ +#define PDM_RX_FIFO_STATUS_USED_Pos (0UL) /*!< PDM RX_FIFO_STATUS: USED (Bit 0) */ +#define PDM_RX_FIFO_STATUS_USED_Msk (0x1ffUL) /*!< PDM RX_FIFO_STATUS: USED (Bitfield-Mask: 0x1ff) */ +#define PDM_RX_FIFO_STATUS_RD_PTR_Pos (16UL) /*!< PDM RX_FIFO_STATUS: RD_PTR (Bit 16) */ +#define PDM_RX_FIFO_STATUS_RD_PTR_Msk (0xff0000UL) /*!< PDM RX_FIFO_STATUS: RD_PTR (Bitfield-Mask: 0xff) */ +#define PDM_RX_FIFO_STATUS_WR_PTR_Pos (24UL) /*!< PDM RX_FIFO_STATUS: WR_PTR (Bit 24) */ +#define PDM_RX_FIFO_STATUS_WR_PTR_Msk (0xff000000UL) /*!< PDM RX_FIFO_STATUS: WR_PTR (Bitfield-Mask: 0xff) */ +/* ==================================================== PDM.RX_FIFO_RD ===================================================== */ +#define PDM_RX_FIFO_RD_DATA_Pos (0UL) /*!< PDM RX_FIFO_RD: DATA (Bit 0) */ +#define PDM_RX_FIFO_RD_DATA_Msk (0xffffffffUL) /*!< PDM RX_FIFO_RD: DATA (Bitfield-Mask: 0xffffffff) */ +/* ================================================= PDM.RX_FIFO_RD_SILENT ================================================= */ +#define PDM_RX_FIFO_RD_SILENT_DATA_Pos (0UL) /*!< PDM RX_FIFO_RD_SILENT: DATA (Bit 0) */ +#define PDM_RX_FIFO_RD_SILENT_DATA_Msk (0xffffffffUL) /*!< PDM RX_FIFO_RD_SILENT: DATA (Bitfield-Mask: 0xffffffff) */ +/* ======================================================= PDM.INTR ======================================================== */ +#define PDM_INTR_RX_TRIGGER_Pos (16UL) /*!< PDM INTR: RX_TRIGGER (Bit 16) */ +#define PDM_INTR_RX_TRIGGER_Msk (0x10000UL) /*!< PDM INTR: RX_TRIGGER (Bitfield-Mask: 0x01) */ +#define PDM_INTR_RX_NOT_EMPTY_Pos (18UL) /*!< PDM INTR: RX_NOT_EMPTY (Bit 18) */ +#define PDM_INTR_RX_NOT_EMPTY_Msk (0x40000UL) /*!< PDM INTR: RX_NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define PDM_INTR_RX_FULL_Pos (19UL) /*!< PDM INTR: RX_FULL (Bit 19) */ +#define PDM_INTR_RX_FULL_Msk (0x80000UL) /*!< PDM INTR: RX_FULL (Bitfield-Mask: 0x01) */ +#define PDM_INTR_RX_OVERFLOW_Pos (21UL) /*!< PDM INTR: RX_OVERFLOW (Bit 21) */ +#define PDM_INTR_RX_OVERFLOW_Msk (0x200000UL) /*!< PDM INTR: RX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define PDM_INTR_RX_UNDERFLOW_Pos (22UL) /*!< PDM INTR: RX_UNDERFLOW (Bit 22) */ +#define PDM_INTR_RX_UNDERFLOW_Msk (0x400000UL) /*!< PDM INTR: RX_UNDERFLOW (Bitfield-Mask: 0x01) */ +/* ===================================================== PDM.INTR_SET ====================================================== */ +#define PDM_INTR_SET_RX_TRIGGER_Pos (16UL) /*!< PDM INTR_SET: RX_TRIGGER (Bit 16) */ +#define PDM_INTR_SET_RX_TRIGGER_Msk (0x10000UL) /*!< PDM INTR_SET: RX_TRIGGER (Bitfield-Mask: 0x01) */ +#define PDM_INTR_SET_RX_NOT_EMPTY_Pos (18UL) /*!< PDM INTR_SET: RX_NOT_EMPTY (Bit 18) */ +#define PDM_INTR_SET_RX_NOT_EMPTY_Msk (0x40000UL) /*!< PDM INTR_SET: RX_NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define PDM_INTR_SET_RX_FULL_Pos (19UL) /*!< PDM INTR_SET: RX_FULL (Bit 19) */ +#define PDM_INTR_SET_RX_FULL_Msk (0x80000UL) /*!< PDM INTR_SET: RX_FULL (Bitfield-Mask: 0x01) */ +#define PDM_INTR_SET_RX_OVERFLOW_Pos (21UL) /*!< PDM INTR_SET: RX_OVERFLOW (Bit 21) */ +#define PDM_INTR_SET_RX_OVERFLOW_Msk (0x200000UL) /*!< PDM INTR_SET: RX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define PDM_INTR_SET_RX_UNDERFLOW_Pos (22UL) /*!< PDM INTR_SET: RX_UNDERFLOW (Bit 22) */ +#define PDM_INTR_SET_RX_UNDERFLOW_Msk (0x400000UL) /*!< PDM INTR_SET: RX_UNDERFLOW (Bitfield-Mask: 0x01) */ +/* ===================================================== PDM.INTR_MASK ===================================================== */ +#define PDM_INTR_MASK_RX_TRIGGER_Pos (16UL) /*!< PDM INTR_MASK: RX_TRIGGER (Bit 16) */ +#define PDM_INTR_MASK_RX_TRIGGER_Msk (0x10000UL) /*!< PDM INTR_MASK: RX_TRIGGER (Bitfield-Mask: 0x01) */ +#define PDM_INTR_MASK_RX_NOT_EMPTY_Pos (18UL) /*!< PDM INTR_MASK: RX_NOT_EMPTY (Bit 18) */ +#define PDM_INTR_MASK_RX_NOT_EMPTY_Msk (0x40000UL) /*!< PDM INTR_MASK: RX_NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define PDM_INTR_MASK_RX_FULL_Pos (19UL) /*!< PDM INTR_MASK: RX_FULL (Bit 19) */ +#define PDM_INTR_MASK_RX_FULL_Msk (0x80000UL) /*!< PDM INTR_MASK: RX_FULL (Bitfield-Mask: 0x01) */ +#define PDM_INTR_MASK_RX_OVERFLOW_Pos (21UL) /*!< PDM INTR_MASK: RX_OVERFLOW (Bit 21) */ +#define PDM_INTR_MASK_RX_OVERFLOW_Msk (0x200000UL) /*!< PDM INTR_MASK: RX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define PDM_INTR_MASK_RX_UNDERFLOW_Pos (22UL) /*!< PDM INTR_MASK: RX_UNDERFLOW (Bit 22) */ +#define PDM_INTR_MASK_RX_UNDERFLOW_Msk (0x400000UL) /*!< PDM INTR_MASK: RX_UNDERFLOW (Bitfield-Mask: 0x01) */ +/* ==================================================== PDM.INTR_MASKED ==================================================== */ +#define PDM_INTR_MASKED_RX_TRIGGER_Pos (16UL) /*!< PDM INTR_MASKED: RX_TRIGGER (Bit 16) */ +#define PDM_INTR_MASKED_RX_TRIGGER_Msk (0x10000UL) /*!< PDM INTR_MASKED: RX_TRIGGER (Bitfield-Mask: 0x01) */ +#define PDM_INTR_MASKED_RX_NOT_EMPTY_Pos (18UL) /*!< PDM INTR_MASKED: RX_NOT_EMPTY (Bit 18) */ +#define PDM_INTR_MASKED_RX_NOT_EMPTY_Msk (0x40000UL) /*!< PDM INTR_MASKED: RX_NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define PDM_INTR_MASKED_RX_FULL_Pos (19UL) /*!< PDM INTR_MASKED: RX_FULL (Bit 19) */ +#define PDM_INTR_MASKED_RX_FULL_Msk (0x80000UL) /*!< PDM INTR_MASKED: RX_FULL (Bitfield-Mask: 0x01) */ +#define PDM_INTR_MASKED_RX_OVERFLOW_Pos (21UL) /*!< PDM INTR_MASKED: RX_OVERFLOW (Bit 21) */ +#define PDM_INTR_MASKED_RX_OVERFLOW_Msk (0x200000UL) /*!< PDM INTR_MASKED: RX_OVERFLOW (Bitfield-Mask: 0x01) */ +#define PDM_INTR_MASKED_RX_UNDERFLOW_Pos (22UL) /*!< PDM INTR_MASKED: RX_UNDERFLOW (Bit 22) */ +#define PDM_INTR_MASKED_RX_UNDERFLOW_Msk (0x400000UL) /*!< PDM INTR_MASKED: RX_UNDERFLOW (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_PDM_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_peri.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_peri.h new file mode 100644 index 0000000000..67ac5c35eb --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_peri.h @@ -0,0 +1,482 @@ +/***************************************************************************//** +* \file cyip_peri.h +* +* \brief +* PERI IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_PERI_H_ +#define _CYIP_PERI_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ PERI ================ */ +/* =========================================================================================================================== */ + +#define PERI_GR_SECTION_SIZE 0x00000040UL +#define PERI_TR_GR_SECTION_SIZE 0x00000200UL +#define PERI_PPU_PR_SECTION_SIZE 0x00000040UL +#define PERI_PPU_GR_SECTION_SIZE 0x00000040UL +#define PERI_GR_PPU_SL_SECTION_SIZE 0x00000040UL +#define PERI_GR_PPU_RG_SECTION_SIZE 0x00000040UL +#define PERI_SECTION_SIZE 0x00010000UL + +/** + * \brief Peripheral group structure (PERI_GR) + */ +typedef struct { + __IOM uint32_t CLOCK_CTL; /*!< 0x00000000 Clock control */ + __IM uint32_t RESERVED[7]; + __IOM uint32_t SL_CTL; /*!< 0x00000020 Slave control */ + __IOM uint32_t TIMEOUT_CTL; /*!< 0x00000024 Timeout control */ + __IM uint32_t RESERVED1[6]; +} PERI_GR_Type; /*!< Size = 40 (0x28) */ + +/** + * \brief Trigger group (PERI_TR_GR) + */ +typedef struct { + __IOM uint32_t TR_OUT_CTL[128]; /*!< 0x00000000 Trigger control register */ +} PERI_TR_GR_Type; /*!< Size = 512 (0x200) */ + +/** + * \brief PPU structure with programmable address (PERI_PPU_PR) + */ +typedef struct { + __IOM uint32_t ADDR0; /*!< 0x00000000 PPU region address 0 (slave structure) */ + __IOM uint32_t ATT0; /*!< 0x00000004 PPU region attributes 0 (slave structure) */ + __IM uint32_t RESERVED[6]; + __IM uint32_t ADDR1; /*!< 0x00000020 PPU region address 1 (master structure) */ + __IOM uint32_t ATT1; /*!< 0x00000024 PPU region attributes 1 (master structure) */ + __IM uint32_t RESERVED1[6]; +} PERI_PPU_PR_Type; /*!< Size = 40 (0x28) */ + +/** + * \brief PPU structure with fixed/constant address for a peripheral group (PERI_PPU_GR) + */ +typedef struct { + __IM uint32_t ADDR0; /*!< 0x00000000 PPU region address 0 (slave structure) */ + __IOM uint32_t ATT0; /*!< 0x00000004 PPU region attributes 0 (slave structure) */ + __IM uint32_t RESERVED[6]; + __IM uint32_t ADDR1; /*!< 0x00000020 PPU region address 1 (master structure) */ + __IOM uint32_t ATT1; /*!< 0x00000024 PPU region attributes 1 (master structure) */ + __IM uint32_t RESERVED1[6]; +} PERI_PPU_GR_Type; /*!< Size = 40 (0x28) */ + +/** + * \brief PPU structure with fixed/constant address for a specific slave (PERI_GR_PPU_SL) + */ +typedef struct { + __IM uint32_t ADDR0; /*!< 0x00000000 PPU region address 0 (slave structure) */ + __IOM uint32_t ATT0; /*!< 0x00000004 PPU region attributes 0 (slave structure) */ + __IM uint32_t RESERVED[6]; + __IM uint32_t ADDR1; /*!< 0x00000020 PPU region address 1 (master structure) */ + __IOM uint32_t ATT1; /*!< 0x00000024 PPU region attributes 1 (master structure) */ + __IM uint32_t RESERVED1[6]; +} PERI_GR_PPU_SL_Type; /*!< Size = 40 (0x28) */ + +/** + * \brief PPU structure with fixed/constant address for a specific region (PERI_GR_PPU_RG) + */ +typedef struct { + __IM uint32_t ADDR0; /*!< 0x00000000 PPU region address 0 (slave structure) */ + __IOM uint32_t ATT0; /*!< 0x00000004 PPU region attributes 0 (slave structure) */ + __IM uint32_t RESERVED[6]; + __IM uint32_t ADDR1; /*!< 0x00000020 PPU region address 1 (master structure) */ + __IOM uint32_t ATT1; /*!< 0x00000024 PPU region attributes 1 (master structure) */ + __IM uint32_t RESERVED1[6]; +} PERI_GR_PPU_RG_Type; /*!< Size = 40 (0x28) */ + +/** + * \brief Peripheral interconnect (PERI) + */ +typedef struct { /*!< PERI Structure */ + PERI_GR_Type GR[16]; /*!< 0x00000000 Peripheral group structure */ + __IOM uint32_t DIV_CMD; /*!< 0x00000400 Divider command register */ + __IM uint32_t RESERVED[255]; + __IOM uint32_t DIV_8_CTL[64]; /*!< 0x00000800 Divider control register (for 8.0 divider) */ + __IOM uint32_t DIV_16_CTL[64]; /*!< 0x00000900 Divider control register (for 16.0 divider) */ + __IOM uint32_t DIV_16_5_CTL[64]; /*!< 0x00000A00 Divider control register (for 16.5 divider) */ + __IOM uint32_t DIV_24_5_CTL[63]; /*!< 0x00000B00 Divider control register (for 24.5 divider) */ + __IM uint32_t RESERVED1; + __IOM uint32_t CLOCK_CTL[128]; /*!< 0x00000C00 Clock control register */ + __IM uint32_t RESERVED2[128]; + __IOM uint32_t TR_CMD; /*!< 0x00001000 Trigger command register */ + __IM uint32_t RESERVED3[1023]; + PERI_TR_GR_Type TR_GR[16]; /*!< 0x00002000 Trigger group */ + PERI_PPU_PR_Type PPU_PR[32]; /*!< 0x00004000 PPU structure with programmable address */ + __IM uint32_t RESERVED4[512]; + PERI_PPU_GR_Type PPU_GR[16]; /*!< 0x00005000 PPU structure with fixed/constant address for a peripheral + group */ +} PERI_Type; /*!< Size = 21504 (0x5400) */ + + +/* =================================================== PERI_GR.CLOCK_CTL =================================================== */ +#define PERI_GR_CLOCK_CTL_INT8_DIV_Pos (8UL) /*!< PERI_GR CLOCK_CTL: INT8_DIV (Bit 8) */ +#define PERI_GR_CLOCK_CTL_INT8_DIV_Msk (0xff00UL) /*!< PERI_GR CLOCK_CTL: INT8_DIV (Bitfield-Mask: 0xff) */ +/* ==================================================== PERI_GR.SL_CTL ===================================================== */ +#define PERI_GR_SL_CTL_ENABLED_0_Pos (0UL) /*!< PERI_GR SL_CTL: ENABLED_0 (Bit 0) */ +#define PERI_GR_SL_CTL_ENABLED_0_Msk (0x1UL) /*!< PERI_GR SL_CTL: ENABLED_0 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_1_Pos (1UL) /*!< PERI_GR SL_CTL: ENABLED_1 (Bit 1) */ +#define PERI_GR_SL_CTL_ENABLED_1_Msk (0x2UL) /*!< PERI_GR SL_CTL: ENABLED_1 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_2_Pos (2UL) /*!< PERI_GR SL_CTL: ENABLED_2 (Bit 2) */ +#define PERI_GR_SL_CTL_ENABLED_2_Msk (0x4UL) /*!< PERI_GR SL_CTL: ENABLED_2 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_3_Pos (3UL) /*!< PERI_GR SL_CTL: ENABLED_3 (Bit 3) */ +#define PERI_GR_SL_CTL_ENABLED_3_Msk (0x8UL) /*!< PERI_GR SL_CTL: ENABLED_3 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_4_Pos (4UL) /*!< PERI_GR SL_CTL: ENABLED_4 (Bit 4) */ +#define PERI_GR_SL_CTL_ENABLED_4_Msk (0x10UL) /*!< PERI_GR SL_CTL: ENABLED_4 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_5_Pos (5UL) /*!< PERI_GR SL_CTL: ENABLED_5 (Bit 5) */ +#define PERI_GR_SL_CTL_ENABLED_5_Msk (0x20UL) /*!< PERI_GR SL_CTL: ENABLED_5 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_6_Pos (6UL) /*!< PERI_GR SL_CTL: ENABLED_6 (Bit 6) */ +#define PERI_GR_SL_CTL_ENABLED_6_Msk (0x40UL) /*!< PERI_GR SL_CTL: ENABLED_6 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_7_Pos (7UL) /*!< PERI_GR SL_CTL: ENABLED_7 (Bit 7) */ +#define PERI_GR_SL_CTL_ENABLED_7_Msk (0x80UL) /*!< PERI_GR SL_CTL: ENABLED_7 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_8_Pos (8UL) /*!< PERI_GR SL_CTL: ENABLED_8 (Bit 8) */ +#define PERI_GR_SL_CTL_ENABLED_8_Msk (0x100UL) /*!< PERI_GR SL_CTL: ENABLED_8 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_9_Pos (9UL) /*!< PERI_GR SL_CTL: ENABLED_9 (Bit 9) */ +#define PERI_GR_SL_CTL_ENABLED_9_Msk (0x200UL) /*!< PERI_GR SL_CTL: ENABLED_9 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_10_Pos (10UL) /*!< PERI_GR SL_CTL: ENABLED_10 (Bit 10) */ +#define PERI_GR_SL_CTL_ENABLED_10_Msk (0x400UL) /*!< PERI_GR SL_CTL: ENABLED_10 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_11_Pos (11UL) /*!< PERI_GR SL_CTL: ENABLED_11 (Bit 11) */ +#define PERI_GR_SL_CTL_ENABLED_11_Msk (0x800UL) /*!< PERI_GR SL_CTL: ENABLED_11 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_12_Pos (12UL) /*!< PERI_GR SL_CTL: ENABLED_12 (Bit 12) */ +#define PERI_GR_SL_CTL_ENABLED_12_Msk (0x1000UL) /*!< PERI_GR SL_CTL: ENABLED_12 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_13_Pos (13UL) /*!< PERI_GR SL_CTL: ENABLED_13 (Bit 13) */ +#define PERI_GR_SL_CTL_ENABLED_13_Msk (0x2000UL) /*!< PERI_GR SL_CTL: ENABLED_13 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_14_Pos (14UL) /*!< PERI_GR SL_CTL: ENABLED_14 (Bit 14) */ +#define PERI_GR_SL_CTL_ENABLED_14_Msk (0x4000UL) /*!< PERI_GR SL_CTL: ENABLED_14 (Bitfield-Mask: 0x01) */ +#define PERI_GR_SL_CTL_ENABLED_15_Pos (15UL) /*!< PERI_GR SL_CTL: ENABLED_15 (Bit 15) */ +#define PERI_GR_SL_CTL_ENABLED_15_Msk (0x8000UL) /*!< PERI_GR SL_CTL: ENABLED_15 (Bitfield-Mask: 0x01) */ +/* ================================================== PERI_GR.TIMEOUT_CTL ================================================== */ +#define PERI_GR_TIMEOUT_CTL_TIMEOUT_Pos (0UL) /*!< PERI_GR TIMEOUT_CTL: TIMEOUT (Bit 0) */ +#define PERI_GR_TIMEOUT_CTL_TIMEOUT_Msk (0xffffUL) /*!< PERI_GR TIMEOUT_CTL: TIMEOUT (Bitfield-Mask: 0xffff) */ + + +/* ================================================= PERI_TR_GR.TR_OUT_CTL ================================================= */ +#define PERI_TR_GR_TR_OUT_CTL_TR_SEL_Pos (0UL) /*!< PERI_TR_GR TR_OUT_CTL: TR_SEL (Bit 0) */ +#define PERI_TR_GR_TR_OUT_CTL_TR_SEL_Msk (0x7fUL) /*!< PERI_TR_GR TR_OUT_CTL: TR_SEL (Bitfield-Mask: 0x7f) */ +#define PERI_TR_GR_TR_OUT_CTL_TR_INV_Pos (8UL) /*!< PERI_TR_GR TR_OUT_CTL: TR_INV (Bit 8) */ +#define PERI_TR_GR_TR_OUT_CTL_TR_INV_Msk (0x100UL) /*!< PERI_TR_GR TR_OUT_CTL: TR_INV (Bitfield-Mask: 0x01) */ +#define PERI_TR_GR_TR_OUT_CTL_TR_EDGE_Pos (9UL) /*!< PERI_TR_GR TR_OUT_CTL: TR_EDGE (Bit 9) */ +#define PERI_TR_GR_TR_OUT_CTL_TR_EDGE_Msk (0x200UL) /*!< PERI_TR_GR TR_OUT_CTL: TR_EDGE (Bitfield-Mask: 0x01) */ + + +/* =================================================== PERI_PPU_PR.ADDR0 =================================================== */ +#define PERI_PPU_PR_ADDR0_SUBREGION_DISABLE_Pos (0UL) /*!< PERI_PPU_PR ADDR0: SUBREGION_DISABLE (Bit 0) */ +#define PERI_PPU_PR_ADDR0_SUBREGION_DISABLE_Msk (0xffUL) /*!< PERI_PPU_PR ADDR0: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PERI_PPU_PR_ADDR0_ADDR24_Pos (8UL) /*!< PERI_PPU_PR ADDR0: ADDR24 (Bit 8) */ +#define PERI_PPU_PR_ADDR0_ADDR24_Msk (0xffffff00UL) /*!< PERI_PPU_PR ADDR0: ADDR24 (Bitfield-Mask: 0xffffff) */ +/* =================================================== PERI_PPU_PR.ATT0 ==================================================== */ +#define PERI_PPU_PR_ATT0_UR_Pos (0UL) /*!< PERI_PPU_PR ATT0: UR (Bit 0) */ +#define PERI_PPU_PR_ATT0_UR_Msk (0x1UL) /*!< PERI_PPU_PR ATT0: UR (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT0_UW_Pos (1UL) /*!< PERI_PPU_PR ATT0: UW (Bit 1) */ +#define PERI_PPU_PR_ATT0_UW_Msk (0x2UL) /*!< PERI_PPU_PR ATT0: UW (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT0_UX_Pos (2UL) /*!< PERI_PPU_PR ATT0: UX (Bit 2) */ +#define PERI_PPU_PR_ATT0_UX_Msk (0x4UL) /*!< PERI_PPU_PR ATT0: UX (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT0_PR_Pos (3UL) /*!< PERI_PPU_PR ATT0: PR (Bit 3) */ +#define PERI_PPU_PR_ATT0_PR_Msk (0x8UL) /*!< PERI_PPU_PR ATT0: PR (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT0_PW_Pos (4UL) /*!< PERI_PPU_PR ATT0: PW (Bit 4) */ +#define PERI_PPU_PR_ATT0_PW_Msk (0x10UL) /*!< PERI_PPU_PR ATT0: PW (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT0_PX_Pos (5UL) /*!< PERI_PPU_PR ATT0: PX (Bit 5) */ +#define PERI_PPU_PR_ATT0_PX_Msk (0x20UL) /*!< PERI_PPU_PR ATT0: PX (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT0_NS_Pos (6UL) /*!< PERI_PPU_PR ATT0: NS (Bit 6) */ +#define PERI_PPU_PR_ATT0_NS_Msk (0x40UL) /*!< PERI_PPU_PR ATT0: NS (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT0_PC_MASK_0_Pos (8UL) /*!< PERI_PPU_PR ATT0: PC_MASK_0 (Bit 8) */ +#define PERI_PPU_PR_ATT0_PC_MASK_0_Msk (0x100UL) /*!< PERI_PPU_PR ATT0: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT0_PC_MASK_15_TO_1_Pos (9UL) /*!< PERI_PPU_PR ATT0: PC_MASK_15_TO_1 (Bit 9) */ +#define PERI_PPU_PR_ATT0_PC_MASK_15_TO_1_Msk (0xfffe00UL) /*!< PERI_PPU_PR ATT0: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff) */ +#define PERI_PPU_PR_ATT0_REGION_SIZE_Pos (24UL) /*!< PERI_PPU_PR ATT0: REGION_SIZE (Bit 24) */ +#define PERI_PPU_PR_ATT0_REGION_SIZE_Msk (0x1f000000UL) /*!< PERI_PPU_PR ATT0: REGION_SIZE (Bitfield-Mask: 0x1f) */ +#define PERI_PPU_PR_ATT0_PC_MATCH_Pos (30UL) /*!< PERI_PPU_PR ATT0: PC_MATCH (Bit 30) */ +#define PERI_PPU_PR_ATT0_PC_MATCH_Msk (0x40000000UL) /*!< PERI_PPU_PR ATT0: PC_MATCH (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT0_ENABLED_Pos (31UL) /*!< PERI_PPU_PR ATT0: ENABLED (Bit 31) */ +#define PERI_PPU_PR_ATT0_ENABLED_Msk (0x80000000UL) /*!< PERI_PPU_PR ATT0: ENABLED (Bitfield-Mask: 0x01) */ +/* =================================================== PERI_PPU_PR.ADDR1 =================================================== */ +#define PERI_PPU_PR_ADDR1_SUBREGION_DISABLE_Pos (0UL) /*!< PERI_PPU_PR ADDR1: SUBREGION_DISABLE (Bit 0) */ +#define PERI_PPU_PR_ADDR1_SUBREGION_DISABLE_Msk (0xffUL) /*!< PERI_PPU_PR ADDR1: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PERI_PPU_PR_ADDR1_ADDR24_Pos (8UL) /*!< PERI_PPU_PR ADDR1: ADDR24 (Bit 8) */ +#define PERI_PPU_PR_ADDR1_ADDR24_Msk (0xffffff00UL) /*!< PERI_PPU_PR ADDR1: ADDR24 (Bitfield-Mask: 0xffffff) */ +/* =================================================== PERI_PPU_PR.ATT1 ==================================================== */ +#define PERI_PPU_PR_ATT1_UR_Pos (0UL) /*!< PERI_PPU_PR ATT1: UR (Bit 0) */ +#define PERI_PPU_PR_ATT1_UR_Msk (0x1UL) /*!< PERI_PPU_PR ATT1: UR (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT1_UW_Pos (1UL) /*!< PERI_PPU_PR ATT1: UW (Bit 1) */ +#define PERI_PPU_PR_ATT1_UW_Msk (0x2UL) /*!< PERI_PPU_PR ATT1: UW (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT1_UX_Pos (2UL) /*!< PERI_PPU_PR ATT1: UX (Bit 2) */ +#define PERI_PPU_PR_ATT1_UX_Msk (0x4UL) /*!< PERI_PPU_PR ATT1: UX (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT1_PR_Pos (3UL) /*!< PERI_PPU_PR ATT1: PR (Bit 3) */ +#define PERI_PPU_PR_ATT1_PR_Msk (0x8UL) /*!< PERI_PPU_PR ATT1: PR (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT1_PW_Pos (4UL) /*!< PERI_PPU_PR ATT1: PW (Bit 4) */ +#define PERI_PPU_PR_ATT1_PW_Msk (0x10UL) /*!< PERI_PPU_PR ATT1: PW (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT1_PX_Pos (5UL) /*!< PERI_PPU_PR ATT1: PX (Bit 5) */ +#define PERI_PPU_PR_ATT1_PX_Msk (0x20UL) /*!< PERI_PPU_PR ATT1: PX (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT1_NS_Pos (6UL) /*!< PERI_PPU_PR ATT1: NS (Bit 6) */ +#define PERI_PPU_PR_ATT1_NS_Msk (0x40UL) /*!< PERI_PPU_PR ATT1: NS (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT1_PC_MASK_0_Pos (8UL) /*!< PERI_PPU_PR ATT1: PC_MASK_0 (Bit 8) */ +#define PERI_PPU_PR_ATT1_PC_MASK_0_Msk (0x100UL) /*!< PERI_PPU_PR ATT1: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT1_PC_MASK_15_TO_1_Pos (9UL) /*!< PERI_PPU_PR ATT1: PC_MASK_15_TO_1 (Bit 9) */ +#define PERI_PPU_PR_ATT1_PC_MASK_15_TO_1_Msk (0xfffe00UL) /*!< PERI_PPU_PR ATT1: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff) */ +#define PERI_PPU_PR_ATT1_REGION_SIZE_Pos (24UL) /*!< PERI_PPU_PR ATT1: REGION_SIZE (Bit 24) */ +#define PERI_PPU_PR_ATT1_REGION_SIZE_Msk (0x1f000000UL) /*!< PERI_PPU_PR ATT1: REGION_SIZE (Bitfield-Mask: 0x1f) */ +#define PERI_PPU_PR_ATT1_PC_MATCH_Pos (30UL) /*!< PERI_PPU_PR ATT1: PC_MATCH (Bit 30) */ +#define PERI_PPU_PR_ATT1_PC_MATCH_Msk (0x40000000UL) /*!< PERI_PPU_PR ATT1: PC_MATCH (Bitfield-Mask: 0x01) */ +#define PERI_PPU_PR_ATT1_ENABLED_Pos (31UL) /*!< PERI_PPU_PR ATT1: ENABLED (Bit 31) */ +#define PERI_PPU_PR_ATT1_ENABLED_Msk (0x80000000UL) /*!< PERI_PPU_PR ATT1: ENABLED (Bitfield-Mask: 0x01) */ + + +/* =================================================== PERI_PPU_GR.ADDR0 =================================================== */ +#define PERI_PPU_GR_ADDR0_SUBREGION_DISABLE_Pos (0UL) /*!< PERI_PPU_GR ADDR0: SUBREGION_DISABLE (Bit 0) */ +#define PERI_PPU_GR_ADDR0_SUBREGION_DISABLE_Msk (0xffUL) /*!< PERI_PPU_GR ADDR0: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PERI_PPU_GR_ADDR0_ADDR24_Pos (8UL) /*!< PERI_PPU_GR ADDR0: ADDR24 (Bit 8) */ +#define PERI_PPU_GR_ADDR0_ADDR24_Msk (0xffffff00UL) /*!< PERI_PPU_GR ADDR0: ADDR24 (Bitfield-Mask: 0xffffff) */ +/* =================================================== PERI_PPU_GR.ATT0 ==================================================== */ +#define PERI_PPU_GR_ATT0_UR_Pos (0UL) /*!< PERI_PPU_GR ATT0: UR (Bit 0) */ +#define PERI_PPU_GR_ATT0_UR_Msk (0x1UL) /*!< PERI_PPU_GR ATT0: UR (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT0_UW_Pos (1UL) /*!< PERI_PPU_GR ATT0: UW (Bit 1) */ +#define PERI_PPU_GR_ATT0_UW_Msk (0x2UL) /*!< PERI_PPU_GR ATT0: UW (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT0_UX_Pos (2UL) /*!< PERI_PPU_GR ATT0: UX (Bit 2) */ +#define PERI_PPU_GR_ATT0_UX_Msk (0x4UL) /*!< PERI_PPU_GR ATT0: UX (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT0_PR_Pos (3UL) /*!< PERI_PPU_GR ATT0: PR (Bit 3) */ +#define PERI_PPU_GR_ATT0_PR_Msk (0x8UL) /*!< PERI_PPU_GR ATT0: PR (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT0_PW_Pos (4UL) /*!< PERI_PPU_GR ATT0: PW (Bit 4) */ +#define PERI_PPU_GR_ATT0_PW_Msk (0x10UL) /*!< PERI_PPU_GR ATT0: PW (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT0_PX_Pos (5UL) /*!< PERI_PPU_GR ATT0: PX (Bit 5) */ +#define PERI_PPU_GR_ATT0_PX_Msk (0x20UL) /*!< PERI_PPU_GR ATT0: PX (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT0_NS_Pos (6UL) /*!< PERI_PPU_GR ATT0: NS (Bit 6) */ +#define PERI_PPU_GR_ATT0_NS_Msk (0x40UL) /*!< PERI_PPU_GR ATT0: NS (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT0_PC_MASK_0_Pos (8UL) /*!< PERI_PPU_GR ATT0: PC_MASK_0 (Bit 8) */ +#define PERI_PPU_GR_ATT0_PC_MASK_0_Msk (0x100UL) /*!< PERI_PPU_GR ATT0: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT0_PC_MASK_15_TO_1_Pos (9UL) /*!< PERI_PPU_GR ATT0: PC_MASK_15_TO_1 (Bit 9) */ +#define PERI_PPU_GR_ATT0_PC_MASK_15_TO_1_Msk (0xfffe00UL) /*!< PERI_PPU_GR ATT0: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff) */ +#define PERI_PPU_GR_ATT0_REGION_SIZE_Pos (24UL) /*!< PERI_PPU_GR ATT0: REGION_SIZE (Bit 24) */ +#define PERI_PPU_GR_ATT0_REGION_SIZE_Msk (0x1f000000UL) /*!< PERI_PPU_GR ATT0: REGION_SIZE (Bitfield-Mask: 0x1f) */ +#define PERI_PPU_GR_ATT0_PC_MATCH_Pos (30UL) /*!< PERI_PPU_GR ATT0: PC_MATCH (Bit 30) */ +#define PERI_PPU_GR_ATT0_PC_MATCH_Msk (0x40000000UL) /*!< PERI_PPU_GR ATT0: PC_MATCH (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT0_ENABLED_Pos (31UL) /*!< PERI_PPU_GR ATT0: ENABLED (Bit 31) */ +#define PERI_PPU_GR_ATT0_ENABLED_Msk (0x80000000UL) /*!< PERI_PPU_GR ATT0: ENABLED (Bitfield-Mask: 0x01) */ +/* =================================================== PERI_PPU_GR.ADDR1 =================================================== */ +#define PERI_PPU_GR_ADDR1_SUBREGION_DISABLE_Pos (0UL) /*!< PERI_PPU_GR ADDR1: SUBREGION_DISABLE (Bit 0) */ +#define PERI_PPU_GR_ADDR1_SUBREGION_DISABLE_Msk (0xffUL) /*!< PERI_PPU_GR ADDR1: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PERI_PPU_GR_ADDR1_ADDR24_Pos (8UL) /*!< PERI_PPU_GR ADDR1: ADDR24 (Bit 8) */ +#define PERI_PPU_GR_ADDR1_ADDR24_Msk (0xffffff00UL) /*!< PERI_PPU_GR ADDR1: ADDR24 (Bitfield-Mask: 0xffffff) */ +/* =================================================== PERI_PPU_GR.ATT1 ==================================================== */ +#define PERI_PPU_GR_ATT1_UR_Pos (0UL) /*!< PERI_PPU_GR ATT1: UR (Bit 0) */ +#define PERI_PPU_GR_ATT1_UR_Msk (0x1UL) /*!< PERI_PPU_GR ATT1: UR (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT1_UW_Pos (1UL) /*!< PERI_PPU_GR ATT1: UW (Bit 1) */ +#define PERI_PPU_GR_ATT1_UW_Msk (0x2UL) /*!< PERI_PPU_GR ATT1: UW (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT1_UX_Pos (2UL) /*!< PERI_PPU_GR ATT1: UX (Bit 2) */ +#define PERI_PPU_GR_ATT1_UX_Msk (0x4UL) /*!< PERI_PPU_GR ATT1: UX (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT1_PR_Pos (3UL) /*!< PERI_PPU_GR ATT1: PR (Bit 3) */ +#define PERI_PPU_GR_ATT1_PR_Msk (0x8UL) /*!< PERI_PPU_GR ATT1: PR (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT1_PW_Pos (4UL) /*!< PERI_PPU_GR ATT1: PW (Bit 4) */ +#define PERI_PPU_GR_ATT1_PW_Msk (0x10UL) /*!< PERI_PPU_GR ATT1: PW (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT1_PX_Pos (5UL) /*!< PERI_PPU_GR ATT1: PX (Bit 5) */ +#define PERI_PPU_GR_ATT1_PX_Msk (0x20UL) /*!< PERI_PPU_GR ATT1: PX (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT1_NS_Pos (6UL) /*!< PERI_PPU_GR ATT1: NS (Bit 6) */ +#define PERI_PPU_GR_ATT1_NS_Msk (0x40UL) /*!< PERI_PPU_GR ATT1: NS (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT1_PC_MASK_0_Pos (8UL) /*!< PERI_PPU_GR ATT1: PC_MASK_0 (Bit 8) */ +#define PERI_PPU_GR_ATT1_PC_MASK_0_Msk (0x100UL) /*!< PERI_PPU_GR ATT1: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT1_PC_MASK_15_TO_1_Pos (9UL) /*!< PERI_PPU_GR ATT1: PC_MASK_15_TO_1 (Bit 9) */ +#define PERI_PPU_GR_ATT1_PC_MASK_15_TO_1_Msk (0xfffe00UL) /*!< PERI_PPU_GR ATT1: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff) */ +#define PERI_PPU_GR_ATT1_REGION_SIZE_Pos (24UL) /*!< PERI_PPU_GR ATT1: REGION_SIZE (Bit 24) */ +#define PERI_PPU_GR_ATT1_REGION_SIZE_Msk (0x1f000000UL) /*!< PERI_PPU_GR ATT1: REGION_SIZE (Bitfield-Mask: 0x1f) */ +#define PERI_PPU_GR_ATT1_PC_MATCH_Pos (30UL) /*!< PERI_PPU_GR ATT1: PC_MATCH (Bit 30) */ +#define PERI_PPU_GR_ATT1_PC_MATCH_Msk (0x40000000UL) /*!< PERI_PPU_GR ATT1: PC_MATCH (Bitfield-Mask: 0x01) */ +#define PERI_PPU_GR_ATT1_ENABLED_Pos (31UL) /*!< PERI_PPU_GR ATT1: ENABLED (Bit 31) */ +#define PERI_PPU_GR_ATT1_ENABLED_Msk (0x80000000UL) /*!< PERI_PPU_GR ATT1: ENABLED (Bitfield-Mask: 0x01) */ + + +/* ================================================= PERI_GR_PPU_SL.ADDR0 ================================================== */ +#define PERI_GR_PPU_SL_ADDR0_SUBREGION_DISABLE_Pos (0UL) /*!< PERI_GR_PPU_SL ADDR0: SUBREGION_DISABLE (Bit 0) */ +#define PERI_GR_PPU_SL_ADDR0_SUBREGION_DISABLE_Msk (0xffUL) /*!< PERI_GR_PPU_SL ADDR0: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PERI_GR_PPU_SL_ADDR0_ADDR24_Pos (8UL) /*!< PERI_GR_PPU_SL ADDR0: ADDR24 (Bit 8) */ +#define PERI_GR_PPU_SL_ADDR0_ADDR24_Msk (0xffffff00UL) /*!< PERI_GR_PPU_SL ADDR0: ADDR24 (Bitfield-Mask: 0xffffff) */ +/* ================================================== PERI_GR_PPU_SL.ATT0 ================================================== */ +#define PERI_GR_PPU_SL_ATT0_UR_Pos (0UL) /*!< PERI_GR_PPU_SL ATT0: UR (Bit 0) */ +#define PERI_GR_PPU_SL_ATT0_UR_Msk (0x1UL) /*!< PERI_GR_PPU_SL ATT0: UR (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT0_UW_Pos (1UL) /*!< PERI_GR_PPU_SL ATT0: UW (Bit 1) */ +#define PERI_GR_PPU_SL_ATT0_UW_Msk (0x2UL) /*!< PERI_GR_PPU_SL ATT0: UW (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT0_UX_Pos (2UL) /*!< PERI_GR_PPU_SL ATT0: UX (Bit 2) */ +#define PERI_GR_PPU_SL_ATT0_UX_Msk (0x4UL) /*!< PERI_GR_PPU_SL ATT0: UX (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT0_PR_Pos (3UL) /*!< PERI_GR_PPU_SL ATT0: PR (Bit 3) */ +#define PERI_GR_PPU_SL_ATT0_PR_Msk (0x8UL) /*!< PERI_GR_PPU_SL ATT0: PR (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT0_PW_Pos (4UL) /*!< PERI_GR_PPU_SL ATT0: PW (Bit 4) */ +#define PERI_GR_PPU_SL_ATT0_PW_Msk (0x10UL) /*!< PERI_GR_PPU_SL ATT0: PW (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT0_PX_Pos (5UL) /*!< PERI_GR_PPU_SL ATT0: PX (Bit 5) */ +#define PERI_GR_PPU_SL_ATT0_PX_Msk (0x20UL) /*!< PERI_GR_PPU_SL ATT0: PX (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT0_NS_Pos (6UL) /*!< PERI_GR_PPU_SL ATT0: NS (Bit 6) */ +#define PERI_GR_PPU_SL_ATT0_NS_Msk (0x40UL) /*!< PERI_GR_PPU_SL ATT0: NS (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT0_PC_MASK_0_Pos (8UL) /*!< PERI_GR_PPU_SL ATT0: PC_MASK_0 (Bit 8) */ +#define PERI_GR_PPU_SL_ATT0_PC_MASK_0_Msk (0x100UL) /*!< PERI_GR_PPU_SL ATT0: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT0_PC_MASK_15_TO_1_Pos (9UL) /*!< PERI_GR_PPU_SL ATT0: PC_MASK_15_TO_1 (Bit 9) */ +#define PERI_GR_PPU_SL_ATT0_PC_MASK_15_TO_1_Msk (0xfffe00UL) /*!< PERI_GR_PPU_SL ATT0: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +#define PERI_GR_PPU_SL_ATT0_REGION_SIZE_Pos (24UL) /*!< PERI_GR_PPU_SL ATT0: REGION_SIZE (Bit 24) */ +#define PERI_GR_PPU_SL_ATT0_REGION_SIZE_Msk (0x1f000000UL) /*!< PERI_GR_PPU_SL ATT0: REGION_SIZE (Bitfield-Mask: 0x1f) */ +#define PERI_GR_PPU_SL_ATT0_PC_MATCH_Pos (30UL) /*!< PERI_GR_PPU_SL ATT0: PC_MATCH (Bit 30) */ +#define PERI_GR_PPU_SL_ATT0_PC_MATCH_Msk (0x40000000UL) /*!< PERI_GR_PPU_SL ATT0: PC_MATCH (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT0_ENABLED_Pos (31UL) /*!< PERI_GR_PPU_SL ATT0: ENABLED (Bit 31) */ +#define PERI_GR_PPU_SL_ATT0_ENABLED_Msk (0x80000000UL) /*!< PERI_GR_PPU_SL ATT0: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================= PERI_GR_PPU_SL.ADDR1 ================================================== */ +#define PERI_GR_PPU_SL_ADDR1_SUBREGION_DISABLE_Pos (0UL) /*!< PERI_GR_PPU_SL ADDR1: SUBREGION_DISABLE (Bit 0) */ +#define PERI_GR_PPU_SL_ADDR1_SUBREGION_DISABLE_Msk (0xffUL) /*!< PERI_GR_PPU_SL ADDR1: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PERI_GR_PPU_SL_ADDR1_ADDR24_Pos (8UL) /*!< PERI_GR_PPU_SL ADDR1: ADDR24 (Bit 8) */ +#define PERI_GR_PPU_SL_ADDR1_ADDR24_Msk (0xffffff00UL) /*!< PERI_GR_PPU_SL ADDR1: ADDR24 (Bitfield-Mask: 0xffffff) */ +/* ================================================== PERI_GR_PPU_SL.ATT1 ================================================== */ +#define PERI_GR_PPU_SL_ATT1_UR_Pos (0UL) /*!< PERI_GR_PPU_SL ATT1: UR (Bit 0) */ +#define PERI_GR_PPU_SL_ATT1_UR_Msk (0x1UL) /*!< PERI_GR_PPU_SL ATT1: UR (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT1_UW_Pos (1UL) /*!< PERI_GR_PPU_SL ATT1: UW (Bit 1) */ +#define PERI_GR_PPU_SL_ATT1_UW_Msk (0x2UL) /*!< PERI_GR_PPU_SL ATT1: UW (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT1_UX_Pos (2UL) /*!< PERI_GR_PPU_SL ATT1: UX (Bit 2) */ +#define PERI_GR_PPU_SL_ATT1_UX_Msk (0x4UL) /*!< PERI_GR_PPU_SL ATT1: UX (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT1_PR_Pos (3UL) /*!< PERI_GR_PPU_SL ATT1: PR (Bit 3) */ +#define PERI_GR_PPU_SL_ATT1_PR_Msk (0x8UL) /*!< PERI_GR_PPU_SL ATT1: PR (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT1_PW_Pos (4UL) /*!< PERI_GR_PPU_SL ATT1: PW (Bit 4) */ +#define PERI_GR_PPU_SL_ATT1_PW_Msk (0x10UL) /*!< PERI_GR_PPU_SL ATT1: PW (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT1_PX_Pos (5UL) /*!< PERI_GR_PPU_SL ATT1: PX (Bit 5) */ +#define PERI_GR_PPU_SL_ATT1_PX_Msk (0x20UL) /*!< PERI_GR_PPU_SL ATT1: PX (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT1_NS_Pos (6UL) /*!< PERI_GR_PPU_SL ATT1: NS (Bit 6) */ +#define PERI_GR_PPU_SL_ATT1_NS_Msk (0x40UL) /*!< PERI_GR_PPU_SL ATT1: NS (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT1_PC_MASK_0_Pos (8UL) /*!< PERI_GR_PPU_SL ATT1: PC_MASK_0 (Bit 8) */ +#define PERI_GR_PPU_SL_ATT1_PC_MASK_0_Msk (0x100UL) /*!< PERI_GR_PPU_SL ATT1: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT1_PC_MASK_15_TO_1_Pos (9UL) /*!< PERI_GR_PPU_SL ATT1: PC_MASK_15_TO_1 (Bit 9) */ +#define PERI_GR_PPU_SL_ATT1_PC_MASK_15_TO_1_Msk (0xfffe00UL) /*!< PERI_GR_PPU_SL ATT1: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +#define PERI_GR_PPU_SL_ATT1_REGION_SIZE_Pos (24UL) /*!< PERI_GR_PPU_SL ATT1: REGION_SIZE (Bit 24) */ +#define PERI_GR_PPU_SL_ATT1_REGION_SIZE_Msk (0x1f000000UL) /*!< PERI_GR_PPU_SL ATT1: REGION_SIZE (Bitfield-Mask: 0x1f) */ +#define PERI_GR_PPU_SL_ATT1_PC_MATCH_Pos (30UL) /*!< PERI_GR_PPU_SL ATT1: PC_MATCH (Bit 30) */ +#define PERI_GR_PPU_SL_ATT1_PC_MATCH_Msk (0x40000000UL) /*!< PERI_GR_PPU_SL ATT1: PC_MATCH (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_SL_ATT1_ENABLED_Pos (31UL) /*!< PERI_GR_PPU_SL ATT1: ENABLED (Bit 31) */ +#define PERI_GR_PPU_SL_ATT1_ENABLED_Msk (0x80000000UL) /*!< PERI_GR_PPU_SL ATT1: ENABLED (Bitfield-Mask: 0x01) */ + + +/* ================================================= PERI_GR_PPU_RG.ADDR0 ================================================== */ +#define PERI_GR_PPU_RG_ADDR0_SUBREGION_DISABLE_Pos (0UL) /*!< PERI_GR_PPU_RG ADDR0: SUBREGION_DISABLE (Bit 0) */ +#define PERI_GR_PPU_RG_ADDR0_SUBREGION_DISABLE_Msk (0xffUL) /*!< PERI_GR_PPU_RG ADDR0: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PERI_GR_PPU_RG_ADDR0_ADDR24_Pos (8UL) /*!< PERI_GR_PPU_RG ADDR0: ADDR24 (Bit 8) */ +#define PERI_GR_PPU_RG_ADDR0_ADDR24_Msk (0xffffff00UL) /*!< PERI_GR_PPU_RG ADDR0: ADDR24 (Bitfield-Mask: 0xffffff) */ +/* ================================================== PERI_GR_PPU_RG.ATT0 ================================================== */ +#define PERI_GR_PPU_RG_ATT0_UR_Pos (0UL) /*!< PERI_GR_PPU_RG ATT0: UR (Bit 0) */ +#define PERI_GR_PPU_RG_ATT0_UR_Msk (0x1UL) /*!< PERI_GR_PPU_RG ATT0: UR (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT0_UW_Pos (1UL) /*!< PERI_GR_PPU_RG ATT0: UW (Bit 1) */ +#define PERI_GR_PPU_RG_ATT0_UW_Msk (0x2UL) /*!< PERI_GR_PPU_RG ATT0: UW (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT0_UX_Pos (2UL) /*!< PERI_GR_PPU_RG ATT0: UX (Bit 2) */ +#define PERI_GR_PPU_RG_ATT0_UX_Msk (0x4UL) /*!< PERI_GR_PPU_RG ATT0: UX (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT0_PR_Pos (3UL) /*!< PERI_GR_PPU_RG ATT0: PR (Bit 3) */ +#define PERI_GR_PPU_RG_ATT0_PR_Msk (0x8UL) /*!< PERI_GR_PPU_RG ATT0: PR (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT0_PW_Pos (4UL) /*!< PERI_GR_PPU_RG ATT0: PW (Bit 4) */ +#define PERI_GR_PPU_RG_ATT0_PW_Msk (0x10UL) /*!< PERI_GR_PPU_RG ATT0: PW (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT0_PX_Pos (5UL) /*!< PERI_GR_PPU_RG ATT0: PX (Bit 5) */ +#define PERI_GR_PPU_RG_ATT0_PX_Msk (0x20UL) /*!< PERI_GR_PPU_RG ATT0: PX (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT0_NS_Pos (6UL) /*!< PERI_GR_PPU_RG ATT0: NS (Bit 6) */ +#define PERI_GR_PPU_RG_ATT0_NS_Msk (0x40UL) /*!< PERI_GR_PPU_RG ATT0: NS (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT0_PC_MASK_0_Pos (8UL) /*!< PERI_GR_PPU_RG ATT0: PC_MASK_0 (Bit 8) */ +#define PERI_GR_PPU_RG_ATT0_PC_MASK_0_Msk (0x100UL) /*!< PERI_GR_PPU_RG ATT0: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT0_PC_MASK_15_TO_1_Pos (9UL) /*!< PERI_GR_PPU_RG ATT0: PC_MASK_15_TO_1 (Bit 9) */ +#define PERI_GR_PPU_RG_ATT0_PC_MASK_15_TO_1_Msk (0xfffe00UL) /*!< PERI_GR_PPU_RG ATT0: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +#define PERI_GR_PPU_RG_ATT0_REGION_SIZE_Pos (24UL) /*!< PERI_GR_PPU_RG ATT0: REGION_SIZE (Bit 24) */ +#define PERI_GR_PPU_RG_ATT0_REGION_SIZE_Msk (0x1f000000UL) /*!< PERI_GR_PPU_RG ATT0: REGION_SIZE (Bitfield-Mask: 0x1f) */ +#define PERI_GR_PPU_RG_ATT0_PC_MATCH_Pos (30UL) /*!< PERI_GR_PPU_RG ATT0: PC_MATCH (Bit 30) */ +#define PERI_GR_PPU_RG_ATT0_PC_MATCH_Msk (0x40000000UL) /*!< PERI_GR_PPU_RG ATT0: PC_MATCH (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT0_ENABLED_Pos (31UL) /*!< PERI_GR_PPU_RG ATT0: ENABLED (Bit 31) */ +#define PERI_GR_PPU_RG_ATT0_ENABLED_Msk (0x80000000UL) /*!< PERI_GR_PPU_RG ATT0: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================= PERI_GR_PPU_RG.ADDR1 ================================================== */ +#define PERI_GR_PPU_RG_ADDR1_SUBREGION_DISABLE_Pos (0UL) /*!< PERI_GR_PPU_RG ADDR1: SUBREGION_DISABLE (Bit 0) */ +#define PERI_GR_PPU_RG_ADDR1_SUBREGION_DISABLE_Msk (0xffUL) /*!< PERI_GR_PPU_RG ADDR1: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PERI_GR_PPU_RG_ADDR1_ADDR24_Pos (8UL) /*!< PERI_GR_PPU_RG ADDR1: ADDR24 (Bit 8) */ +#define PERI_GR_PPU_RG_ADDR1_ADDR24_Msk (0xffffff00UL) /*!< PERI_GR_PPU_RG ADDR1: ADDR24 (Bitfield-Mask: 0xffffff) */ +/* ================================================== PERI_GR_PPU_RG.ATT1 ================================================== */ +#define PERI_GR_PPU_RG_ATT1_UR_Pos (0UL) /*!< PERI_GR_PPU_RG ATT1: UR (Bit 0) */ +#define PERI_GR_PPU_RG_ATT1_UR_Msk (0x1UL) /*!< PERI_GR_PPU_RG ATT1: UR (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT1_UW_Pos (1UL) /*!< PERI_GR_PPU_RG ATT1: UW (Bit 1) */ +#define PERI_GR_PPU_RG_ATT1_UW_Msk (0x2UL) /*!< PERI_GR_PPU_RG ATT1: UW (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT1_UX_Pos (2UL) /*!< PERI_GR_PPU_RG ATT1: UX (Bit 2) */ +#define PERI_GR_PPU_RG_ATT1_UX_Msk (0x4UL) /*!< PERI_GR_PPU_RG ATT1: UX (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT1_PR_Pos (3UL) /*!< PERI_GR_PPU_RG ATT1: PR (Bit 3) */ +#define PERI_GR_PPU_RG_ATT1_PR_Msk (0x8UL) /*!< PERI_GR_PPU_RG ATT1: PR (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT1_PW_Pos (4UL) /*!< PERI_GR_PPU_RG ATT1: PW (Bit 4) */ +#define PERI_GR_PPU_RG_ATT1_PW_Msk (0x10UL) /*!< PERI_GR_PPU_RG ATT1: PW (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT1_PX_Pos (5UL) /*!< PERI_GR_PPU_RG ATT1: PX (Bit 5) */ +#define PERI_GR_PPU_RG_ATT1_PX_Msk (0x20UL) /*!< PERI_GR_PPU_RG ATT1: PX (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT1_NS_Pos (6UL) /*!< PERI_GR_PPU_RG ATT1: NS (Bit 6) */ +#define PERI_GR_PPU_RG_ATT1_NS_Msk (0x40UL) /*!< PERI_GR_PPU_RG ATT1: NS (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT1_PC_MASK_0_Pos (8UL) /*!< PERI_GR_PPU_RG ATT1: PC_MASK_0 (Bit 8) */ +#define PERI_GR_PPU_RG_ATT1_PC_MASK_0_Msk (0x100UL) /*!< PERI_GR_PPU_RG ATT1: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT1_PC_MASK_15_TO_1_Pos (9UL) /*!< PERI_GR_PPU_RG ATT1: PC_MASK_15_TO_1 (Bit 9) */ +#define PERI_GR_PPU_RG_ATT1_PC_MASK_15_TO_1_Msk (0xfffe00UL) /*!< PERI_GR_PPU_RG ATT1: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +#define PERI_GR_PPU_RG_ATT1_REGION_SIZE_Pos (24UL) /*!< PERI_GR_PPU_RG ATT1: REGION_SIZE (Bit 24) */ +#define PERI_GR_PPU_RG_ATT1_REGION_SIZE_Msk (0x1f000000UL) /*!< PERI_GR_PPU_RG ATT1: REGION_SIZE (Bitfield-Mask: 0x1f) */ +#define PERI_GR_PPU_RG_ATT1_PC_MATCH_Pos (30UL) /*!< PERI_GR_PPU_RG ATT1: PC_MATCH (Bit 30) */ +#define PERI_GR_PPU_RG_ATT1_PC_MATCH_Msk (0x40000000UL) /*!< PERI_GR_PPU_RG ATT1: PC_MATCH (Bitfield-Mask: 0x01) */ +#define PERI_GR_PPU_RG_ATT1_ENABLED_Pos (31UL) /*!< PERI_GR_PPU_RG ATT1: ENABLED (Bit 31) */ +#define PERI_GR_PPU_RG_ATT1_ENABLED_Msk (0x80000000UL) /*!< PERI_GR_PPU_RG ATT1: ENABLED (Bitfield-Mask: 0x01) */ + + +/* ===================================================== PERI.DIV_CMD ====================================================== */ +#define PERI_DIV_CMD_DIV_SEL_Pos (0UL) /*!< PERI DIV_CMD: DIV_SEL (Bit 0) */ +#define PERI_DIV_CMD_DIV_SEL_Msk (0x3fUL) /*!< PERI DIV_CMD: DIV_SEL (Bitfield-Mask: 0x3f) */ +#define PERI_DIV_CMD_TYPE_SEL_Pos (6UL) /*!< PERI DIV_CMD: TYPE_SEL (Bit 6) */ +#define PERI_DIV_CMD_TYPE_SEL_Msk (0xc0UL) /*!< PERI DIV_CMD: TYPE_SEL (Bitfield-Mask: 0x03) */ +#define PERI_DIV_CMD_PA_DIV_SEL_Pos (8UL) /*!< PERI DIV_CMD: PA_DIV_SEL (Bit 8) */ +#define PERI_DIV_CMD_PA_DIV_SEL_Msk (0x3f00UL) /*!< PERI DIV_CMD: PA_DIV_SEL (Bitfield-Mask: 0x3f) */ +#define PERI_DIV_CMD_PA_TYPE_SEL_Pos (14UL) /*!< PERI DIV_CMD: PA_TYPE_SEL (Bit 14) */ +#define PERI_DIV_CMD_PA_TYPE_SEL_Msk (0xc000UL) /*!< PERI DIV_CMD: PA_TYPE_SEL (Bitfield-Mask: 0x03) */ +#define PERI_DIV_CMD_DISABLE_Pos (30UL) /*!< PERI DIV_CMD: DISABLE (Bit 30) */ +#define PERI_DIV_CMD_DISABLE_Msk (0x40000000UL) /*!< PERI DIV_CMD: DISABLE (Bitfield-Mask: 0x01) */ +#define PERI_DIV_CMD_ENABLE_Pos (31UL) /*!< PERI DIV_CMD: ENABLE (Bit 31) */ +#define PERI_DIV_CMD_ENABLE_Msk (0x80000000UL) /*!< PERI DIV_CMD: ENABLE (Bitfield-Mask: 0x01) */ +/* ==================================================== PERI.DIV_8_CTL ===================================================== */ +#define PERI_DIV_8_CTL_EN_Pos (0UL) /*!< PERI DIV_8_CTL: EN (Bit 0) */ +#define PERI_DIV_8_CTL_EN_Msk (0x1UL) /*!< PERI DIV_8_CTL: EN (Bitfield-Mask: 0x01) */ +#define PERI_DIV_8_CTL_INT8_DIV_Pos (8UL) /*!< PERI DIV_8_CTL: INT8_DIV (Bit 8) */ +#define PERI_DIV_8_CTL_INT8_DIV_Msk (0xff00UL) /*!< PERI DIV_8_CTL: INT8_DIV (Bitfield-Mask: 0xff) */ +/* ==================================================== PERI.DIV_16_CTL ==================================================== */ +#define PERI_DIV_16_CTL_EN_Pos (0UL) /*!< PERI DIV_16_CTL: EN (Bit 0) */ +#define PERI_DIV_16_CTL_EN_Msk (0x1UL) /*!< PERI DIV_16_CTL: EN (Bitfield-Mask: 0x01) */ +#define PERI_DIV_16_CTL_INT16_DIV_Pos (8UL) /*!< PERI DIV_16_CTL: INT16_DIV (Bit 8) */ +#define PERI_DIV_16_CTL_INT16_DIV_Msk (0xffff00UL) /*!< PERI DIV_16_CTL: INT16_DIV (Bitfield-Mask: 0xffff) */ +/* =================================================== PERI.DIV_16_5_CTL =================================================== */ +#define PERI_DIV_16_5_CTL_EN_Pos (0UL) /*!< PERI DIV_16_5_CTL: EN (Bit 0) */ +#define PERI_DIV_16_5_CTL_EN_Msk (0x1UL) /*!< PERI DIV_16_5_CTL: EN (Bitfield-Mask: 0x01) */ +#define PERI_DIV_16_5_CTL_FRAC5_DIV_Pos (3UL) /*!< PERI DIV_16_5_CTL: FRAC5_DIV (Bit 3) */ +#define PERI_DIV_16_5_CTL_FRAC5_DIV_Msk (0xf8UL) /*!< PERI DIV_16_5_CTL: FRAC5_DIV (Bitfield-Mask: 0x1f) */ +#define PERI_DIV_16_5_CTL_INT16_DIV_Pos (8UL) /*!< PERI DIV_16_5_CTL: INT16_DIV (Bit 8) */ +#define PERI_DIV_16_5_CTL_INT16_DIV_Msk (0xffff00UL) /*!< PERI DIV_16_5_CTL: INT16_DIV (Bitfield-Mask: 0xffff) */ +/* =================================================== PERI.DIV_24_5_CTL =================================================== */ +#define PERI_DIV_24_5_CTL_EN_Pos (0UL) /*!< PERI DIV_24_5_CTL: EN (Bit 0) */ +#define PERI_DIV_24_5_CTL_EN_Msk (0x1UL) /*!< PERI DIV_24_5_CTL: EN (Bitfield-Mask: 0x01) */ +#define PERI_DIV_24_5_CTL_FRAC5_DIV_Pos (3UL) /*!< PERI DIV_24_5_CTL: FRAC5_DIV (Bit 3) */ +#define PERI_DIV_24_5_CTL_FRAC5_DIV_Msk (0xf8UL) /*!< PERI DIV_24_5_CTL: FRAC5_DIV (Bitfield-Mask: 0x1f) */ +#define PERI_DIV_24_5_CTL_INT24_DIV_Pos (8UL) /*!< PERI DIV_24_5_CTL: INT24_DIV (Bit 8) */ +#define PERI_DIV_24_5_CTL_INT24_DIV_Msk (0xffffff00UL) /*!< PERI DIV_24_5_CTL: INT24_DIV (Bitfield-Mask: 0xffffff) */ +/* ==================================================== PERI.CLOCK_CTL ===================================================== */ +#define PERI_CLOCK_CTL_DIV_SEL_Pos (0UL) /*!< PERI CLOCK_CTL: DIV_SEL (Bit 0) */ +#define PERI_CLOCK_CTL_DIV_SEL_Msk (0x3fUL) /*!< PERI CLOCK_CTL: DIV_SEL (Bitfield-Mask: 0x3f) */ +#define PERI_CLOCK_CTL_TYPE_SEL_Pos (6UL) /*!< PERI CLOCK_CTL: TYPE_SEL (Bit 6) */ +#define PERI_CLOCK_CTL_TYPE_SEL_Msk (0xc0UL) /*!< PERI CLOCK_CTL: TYPE_SEL (Bitfield-Mask: 0x03) */ +/* ====================================================== PERI.TR_CMD ====================================================== */ +#define PERI_TR_CMD_TR_SEL_Pos (0UL) /*!< PERI TR_CMD: TR_SEL (Bit 0) */ +#define PERI_TR_CMD_TR_SEL_Msk (0x7fUL) /*!< PERI TR_CMD: TR_SEL (Bitfield-Mask: 0x7f) */ +#define PERI_TR_CMD_GROUP_SEL_Pos (8UL) /*!< PERI TR_CMD: GROUP_SEL (Bit 8) */ +#define PERI_TR_CMD_GROUP_SEL_Msk (0xf00UL) /*!< PERI TR_CMD: GROUP_SEL (Bitfield-Mask: 0x0f) */ +#define PERI_TR_CMD_COUNT_Pos (16UL) /*!< PERI TR_CMD: COUNT (Bit 16) */ +#define PERI_TR_CMD_COUNT_Msk (0xff0000UL) /*!< PERI TR_CMD: COUNT (Bitfield-Mask: 0xff) */ +#define PERI_TR_CMD_OUT_SEL_Pos (30UL) /*!< PERI TR_CMD: OUT_SEL (Bit 30) */ +#define PERI_TR_CMD_OUT_SEL_Msk (0x40000000UL) /*!< PERI TR_CMD: OUT_SEL (Bitfield-Mask: 0x01) */ +#define PERI_TR_CMD_ACTIVATE_Pos (31UL) /*!< PERI TR_CMD: ACTIVATE (Bit 31) */ +#define PERI_TR_CMD_ACTIVATE_Msk (0x80000000UL) /*!< PERI TR_CMD: ACTIVATE (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_PERI_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_profile.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_profile.h new file mode 100644 index 0000000000..24b504e6df --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_profile.h @@ -0,0 +1,105 @@ +/***************************************************************************//** +* \file cyip_profile.h +* +* \brief +* PROFILE IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_PROFILE_H_ +#define _CYIP_PROFILE_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ PROFILE ================ */ +/* =========================================================================================================================== */ + +#define PROFILE_CNT_STRUCT_SECTION_SIZE 0x00000010UL +#define PROFILE_SECTION_SIZE 0x00010000UL + +/** + * \brief Profile counter structure (PROFILE_CNT_STRUCT) + */ +typedef struct { + __IOM uint32_t CTL; /*!< 0x00000000 Profile counter configuration */ + __IM uint32_t RESERVED; + __IOM uint32_t CNT; /*!< 0x00000008 Profile counter value */ + __IM uint32_t RESERVED1; +} PROFILE_CNT_STRUCT_Type; /*!< Size = 12 (0xC) */ + +/** + * \brief Energy Profiler IP (PROFILE) + */ +typedef struct { /*!< PROFILE Structure */ + __IOM uint32_t CTL; /*!< 0x00000000 Profile control */ + __IM uint32_t STATUS; /*!< 0x00000004 Profile status */ + __IM uint32_t RESERVED[2]; + __IOM uint32_t CMD; /*!< 0x00000010 Profile command */ + __IM uint32_t RESERVED1[491]; + __IOM uint32_t INTR; /*!< 0x000007C0 Profile interrupt */ + __IOM uint32_t INTR_SET; /*!< 0x000007C4 Profile interrupt set */ + __IOM uint32_t INTR_MASK; /*!< 0x000007C8 Profile interrupt mask */ + __IM uint32_t INTR_MASKED; /*!< 0x000007CC Profile interrupt masked */ + __IM uint32_t RESERVED2[12]; + PROFILE_CNT_STRUCT_Type CNT_STRUCT[16]; /*!< 0x00000800 Profile counter structure */ +} PROFILE_Type; /*!< Size = 2304 (0x900) */ + + +/* ================================================ PROFILE_CNT_STRUCT.CTL ================================================= */ +#define PROFILE_CNT_STRUCT_CTL_CNT_DURATION_Pos (0UL) /*!< PROFILE_CNT_STRUCT CTL: CNT_DURATION (Bit 0) */ +#define PROFILE_CNT_STRUCT_CTL_CNT_DURATION_Msk (0x1UL) /*!< PROFILE_CNT_STRUCT CTL: CNT_DURATION (Bitfield-Mask: 0x01)*/ +#define PROFILE_CNT_STRUCT_CTL_REF_CLK_SEL_Pos (4UL) /*!< PROFILE_CNT_STRUCT CTL: REF_CLK_SEL (Bit 4) */ +#define PROFILE_CNT_STRUCT_CTL_REF_CLK_SEL_Msk (0x70UL) /*!< PROFILE_CNT_STRUCT CTL: REF_CLK_SEL (Bitfield-Mask: 0x07) */ +#define PROFILE_CNT_STRUCT_CTL_MON_SEL_Pos (16UL) /*!< PROFILE_CNT_STRUCT CTL: MON_SEL (Bit 16) */ +#define PROFILE_CNT_STRUCT_CTL_MON_SEL_Msk (0x7f0000UL) /*!< PROFILE_CNT_STRUCT CTL: MON_SEL (Bitfield-Mask: 0x7f) */ +#define PROFILE_CNT_STRUCT_CTL_ENABLED_Pos (31UL) /*!< PROFILE_CNT_STRUCT CTL: ENABLED (Bit 31) */ +#define PROFILE_CNT_STRUCT_CTL_ENABLED_Msk (0x80000000UL) /*!< PROFILE_CNT_STRUCT CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================ PROFILE_CNT_STRUCT.CNT ================================================= */ +#define PROFILE_CNT_STRUCT_CNT_CNT_Pos (0UL) /*!< PROFILE_CNT_STRUCT CNT: CNT (Bit 0) */ +#define PROFILE_CNT_STRUCT_CNT_CNT_Msk (0xffffffffUL) /*!< PROFILE_CNT_STRUCT CNT: CNT (Bitfield-Mask: 0xffffffff) */ + + +/* ====================================================== PROFILE.CTL ====================================================== */ +#define PROFILE_CTL_WIN_MODE_Pos (0UL) /*!< PROFILE CTL: WIN_MODE (Bit 0) */ +#define PROFILE_CTL_WIN_MODE_Msk (0x1UL) /*!< PROFILE CTL: WIN_MODE (Bitfield-Mask: 0x01) */ +#define PROFILE_CTL_ENABLED_Pos (31UL) /*!< PROFILE CTL: ENABLED (Bit 31) */ +#define PROFILE_CTL_ENABLED_Msk (0x80000000UL) /*!< PROFILE CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ==================================================== PROFILE.STATUS ===================================================== */ +#define PROFILE_STATUS_WIN_ACTIVE_Pos (0UL) /*!< PROFILE STATUS: WIN_ACTIVE (Bit 0) */ +#define PROFILE_STATUS_WIN_ACTIVE_Msk (0x1UL) /*!< PROFILE STATUS: WIN_ACTIVE (Bitfield-Mask: 0x01) */ +/* ====================================================== PROFILE.CMD ====================================================== */ +#define PROFILE_CMD_START_TR_Pos (0UL) /*!< PROFILE CMD: START_TR (Bit 0) */ +#define PROFILE_CMD_START_TR_Msk (0x1UL) /*!< PROFILE CMD: START_TR (Bitfield-Mask: 0x01) */ +#define PROFILE_CMD_STOP_TR_Pos (1UL) /*!< PROFILE CMD: STOP_TR (Bit 1) */ +#define PROFILE_CMD_STOP_TR_Msk (0x2UL) /*!< PROFILE CMD: STOP_TR (Bitfield-Mask: 0x01) */ +#define PROFILE_CMD_CLR_ALL_CNT_Pos (8UL) /*!< PROFILE CMD: CLR_ALL_CNT (Bit 8) */ +#define PROFILE_CMD_CLR_ALL_CNT_Msk (0x100UL) /*!< PROFILE CMD: CLR_ALL_CNT (Bitfield-Mask: 0x01) */ +/* ===================================================== PROFILE.INTR ====================================================== */ +#define PROFILE_INTR_CNT_OVFLW_Pos (0UL) /*!< PROFILE INTR: CNT_OVFLW (Bit 0) */ +#define PROFILE_INTR_CNT_OVFLW_Msk (0xffffffffUL) /*!< PROFILE INTR: CNT_OVFLW (Bitfield-Mask: 0xffffffff) */ +/* =================================================== PROFILE.INTR_SET ==================================================== */ +#define PROFILE_INTR_SET_CNT_OVFLW_Pos (0UL) /*!< PROFILE INTR_SET: CNT_OVFLW (Bit 0) */ +#define PROFILE_INTR_SET_CNT_OVFLW_Msk (0xffffffffUL) /*!< PROFILE INTR_SET: CNT_OVFLW (Bitfield-Mask: 0xffffffff) */ +/* =================================================== PROFILE.INTR_MASK =================================================== */ +#define PROFILE_INTR_MASK_CNT_OVFLW_Pos (0UL) /*!< PROFILE INTR_MASK: CNT_OVFLW (Bit 0) */ +#define PROFILE_INTR_MASK_CNT_OVFLW_Msk (0xffffffffUL) /*!< PROFILE INTR_MASK: CNT_OVFLW (Bitfield-Mask: 0xffffffff) */ +/* ================================================== PROFILE.INTR_MASKED ================================================== */ +#define PROFILE_INTR_MASKED_CNT_OVFLW_Pos (0UL) /*!< PROFILE INTR_MASKED: CNT_OVFLW (Bit 0) */ +#define PROFILE_INTR_MASKED_CNT_OVFLW_Msk (0xffffffffUL) /*!< PROFILE INTR_MASKED: CNT_OVFLW (Bitfield-Mask: 0xffffffff)*/ + + +#endif /* _CYIP_PROFILE_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_prot.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_prot.h new file mode 100644 index 0000000000..3d8cc5843d --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_prot.h @@ -0,0 +1,374 @@ +/***************************************************************************//** +* \file cyip_prot.h +* +* \brief +* PROT IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_PROT_H_ +#define _CYIP_PROT_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ PROT ================ */ +/* =========================================================================================================================== */ + +#define PROT_SMPU_SMPU_STRUCT_SECTION_SIZE 0x00000040UL +#define PROT_SMPU_SECTION_SIZE 0x00004000UL +#define PROT_MPU_MPU_STRUCT_SECTION_SIZE 0x00000020UL +#define PROT_MPU_SECTION_SIZE 0x00000400UL +#define PROT_SECTION_SIZE 0x00010000UL + +/** + * \brief SMPU structure (PROT_SMPU_SMPU_STRUCT) + */ +typedef struct { + __IOM uint32_t ADDR0; /*!< 0x00000000 SMPU region address 0 (slave structure) */ + __IOM uint32_t ATT0; /*!< 0x00000004 SMPU region attributes 0 (slave structure) */ + __IM uint32_t RESERVED[6]; + __IM uint32_t ADDR1; /*!< 0x00000020 SMPU region address 1 (master structure) */ + __IOM uint32_t ATT1; /*!< 0x00000024 SMPU region attributes 1 (master structure) */ + __IM uint32_t RESERVED1[6]; +} PROT_SMPU_SMPU_STRUCT_Type; /*!< Size = 40 (0x28) */ + +/** + * \brief SMPU (PROT_SMPU) + */ +typedef struct { + __IOM uint32_t MS0_CTL; /*!< 0x00000000 Master 0 protection context control */ + __IOM uint32_t MS1_CTL; /*!< 0x00000004 Master 1 protection context control */ + __IOM uint32_t MS2_CTL; /*!< 0x00000008 Master 2 protection context control */ + __IOM uint32_t MS3_CTL; /*!< 0x0000000C Master 3 protection context control */ + __IOM uint32_t MS4_CTL; /*!< 0x00000010 Master 4 protection context control */ + __IOM uint32_t MS5_CTL; /*!< 0x00000014 Master 5 protection context control */ + __IOM uint32_t MS6_CTL; /*!< 0x00000018 Master 6 protection context control */ + __IOM uint32_t MS7_CTL; /*!< 0x0000001C Master 7 protection context control */ + __IOM uint32_t MS8_CTL; /*!< 0x00000020 Master 8 protection context control */ + __IOM uint32_t MS9_CTL; /*!< 0x00000024 Master 9 protection context control */ + __IOM uint32_t MS10_CTL; /*!< 0x00000028 Master 10 protection context control */ + __IOM uint32_t MS11_CTL; /*!< 0x0000002C Master 11 protection context control */ + __IOM uint32_t MS12_CTL; /*!< 0x00000030 Master 12 protection context control */ + __IOM uint32_t MS13_CTL; /*!< 0x00000034 Master 13 protection context control */ + __IOM uint32_t MS14_CTL; /*!< 0x00000038 Master 14 protection context control */ + __IOM uint32_t MS15_CTL; /*!< 0x0000003C Master 15 protection context control */ + __IM uint32_t RESERVED[2032]; + PROT_SMPU_SMPU_STRUCT_Type SMPU_STRUCT[32]; /*!< 0x00002000 SMPU structure */ + __IM uint32_t RESERVED1[1536]; +} PROT_SMPU_Type; /*!< Size = 10240 (0x2800) */ + +/** + * \brief MPU structure (PROT_MPU_MPU_STRUCT) + */ +typedef struct { + __IOM uint32_t ADDR; /*!< 0x00000000 MPU region address */ + __IOM uint32_t ATT; /*!< 0x00000004 MPU region attrributes */ + __IM uint32_t RESERVED[6]; +} PROT_MPU_MPU_STRUCT_Type; /*!< Size = 8 (0x8) */ + +/** + * \brief MPU (PROT_MPU) + */ +typedef struct { + __IOM uint32_t MS_CTL; /*!< 0x00000000 Master control */ + __IM uint32_t RESERVED[127]; + PROT_MPU_MPU_STRUCT_Type MPU_STRUCT[16]; /*!< 0x00000200 MPU structure */ +} PROT_MPU_Type; /*!< Size = 1024 (0x400) */ + +/** + * \brief Protection (PROT) + */ +typedef struct { /*!< PROT Structure */ + PROT_SMPU_Type SMPU; /*!< 0x00000000 SMPU */ + PROT_MPU_Type CYMPU[16]; /*!< 0x00004000 MPU */ +} PROT_Type; /*!< Size = 32768 (0x8000) */ + + +/* ============================================== PROT_SMPU_SMPU_STRUCT.ADDR0 ============================================== */ +#define PROT_SMPU_SMPU_STRUCT_ADDR0_SUBREGION_DISABLE_Pos (0UL) /*!< PROT_SMPU_SMPU_STRUCT ADDR0: SUBREGION_DISABLE (Bit 0) */ +#define PROT_SMPU_SMPU_STRUCT_ADDR0_SUBREGION_DISABLE_Msk (0xffUL) /*!< PROT_SMPU_SMPU_STRUCT ADDR0: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PROT_SMPU_SMPU_STRUCT_ADDR0_ADDR24_Pos (8UL) /*!< PROT_SMPU_SMPU_STRUCT ADDR0: ADDR24 (Bit 8) */ +#define PROT_SMPU_SMPU_STRUCT_ADDR0_ADDR24_Msk (0xffffff00UL) /*!< PROT_SMPU_SMPU_STRUCT ADDR0: ADDR24 (Bitfield-Mask: 0xffffff)*/ +/* ============================================== PROT_SMPU_SMPU_STRUCT.ATT0 =============================================== */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_UR_Pos (0UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: UR (Bit 0) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_UR_Msk (0x1UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: UR (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_UW_Pos (1UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: UW (Bit 1) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_UW_Msk (0x2UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: UW (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_UX_Pos (2UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: UX (Bit 2) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_UX_Msk (0x4UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: UX (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PR_Pos (3UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PR (Bit 3) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PR_Msk (0x8UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PR (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PW_Pos (4UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PW (Bit 4) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PW_Msk (0x10UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PW (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PX_Pos (5UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PX (Bit 5) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PX_Msk (0x20UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PX (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_NS_Pos (6UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: NS (Bit 6) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_NS_Msk (0x40UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PC_MASK_0_Pos (8UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PC_MASK_0 (Bit 8) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PC_MASK_0_Msk (0x100UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PC_MASK_0 (Bitfield-Mask: 0x01)*/ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PC_MASK_15_TO_1_Pos (9UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PC_MASK_15_TO_1 (Bit 9) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PC_MASK_15_TO_1_Msk (0xfffe00UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +#define PROT_SMPU_SMPU_STRUCT_ATT0_REGION_SIZE_Pos (24UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: REGION_SIZE (Bit 24) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_REGION_SIZE_Msk (0x1f000000UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: REGION_SIZE (Bitfield-Mask: 0x1f)*/ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PC_MATCH_Pos (30UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PC_MATCH (Bit 30) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_PC_MATCH_Msk (0x40000000UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: PC_MATCH (Bitfield-Mask: 0x01)*/ +#define PROT_SMPU_SMPU_STRUCT_ATT0_ENABLED_Pos (31UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: ENABLED (Bit 31) */ +#define PROT_SMPU_SMPU_STRUCT_ATT0_ENABLED_Msk (0x80000000UL) /*!< PROT_SMPU_SMPU_STRUCT ATT0: ENABLED (Bitfield-Mask: 0x01) */ +/* ============================================== PROT_SMPU_SMPU_STRUCT.ADDR1 ============================================== */ +#define PROT_SMPU_SMPU_STRUCT_ADDR1_SUBREGION_DISABLE_Pos (0UL) /*!< PROT_SMPU_SMPU_STRUCT ADDR1: SUBREGION_DISABLE (Bit 0) */ +#define PROT_SMPU_SMPU_STRUCT_ADDR1_SUBREGION_DISABLE_Msk (0xffUL) /*!< PROT_SMPU_SMPU_STRUCT ADDR1: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PROT_SMPU_SMPU_STRUCT_ADDR1_ADDR24_Pos (8UL) /*!< PROT_SMPU_SMPU_STRUCT ADDR1: ADDR24 (Bit 8) */ +#define PROT_SMPU_SMPU_STRUCT_ADDR1_ADDR24_Msk (0xffffff00UL) /*!< PROT_SMPU_SMPU_STRUCT ADDR1: ADDR24 (Bitfield-Mask: 0xffffff)*/ +/* ============================================== PROT_SMPU_SMPU_STRUCT.ATT1 =============================================== */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_UR_Pos (0UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: UR (Bit 0) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_UR_Msk (0x1UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: UR (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_UW_Pos (1UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: UW (Bit 1) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_UW_Msk (0x2UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: UW (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_UX_Pos (2UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: UX (Bit 2) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_UX_Msk (0x4UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: UX (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PR_Pos (3UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PR (Bit 3) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PR_Msk (0x8UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PR (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PW_Pos (4UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PW (Bit 4) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PW_Msk (0x10UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PW (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PX_Pos (5UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PX (Bit 5) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PX_Msk (0x20UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PX (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_NS_Pos (6UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: NS (Bit 6) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_NS_Msk (0x40UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PC_MASK_0_Pos (8UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PC_MASK_0 (Bit 8) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PC_MASK_0_Msk (0x100UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PC_MASK_0 (Bitfield-Mask: 0x01)*/ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PC_MASK_15_TO_1_Pos (9UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PC_MASK_15_TO_1 (Bit 9) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PC_MASK_15_TO_1_Msk (0xfffe00UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +#define PROT_SMPU_SMPU_STRUCT_ATT1_REGION_SIZE_Pos (24UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: REGION_SIZE (Bit 24) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_REGION_SIZE_Msk (0x1f000000UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: REGION_SIZE (Bitfield-Mask: 0x1f)*/ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PC_MATCH_Pos (30UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PC_MATCH (Bit 30) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_PC_MATCH_Msk (0x40000000UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: PC_MATCH (Bitfield-Mask: 0x01)*/ +#define PROT_SMPU_SMPU_STRUCT_ATT1_ENABLED_Pos (31UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: ENABLED (Bit 31) */ +#define PROT_SMPU_SMPU_STRUCT_ATT1_ENABLED_Msk (0x80000000UL) /*!< PROT_SMPU_SMPU_STRUCT ATT1: ENABLED (Bitfield-Mask: 0x01) */ + + +/* =================================================== PROT_SMPU.MS0_CTL =================================================== */ +#define PROT_SMPU_MS0_CTL_P_Pos (0UL) /*!< PROT_SMPU MS0_CTL: P (Bit 0) */ +#define PROT_SMPU_MS0_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS0_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS0_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS0_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS0_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS0_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS0_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS0_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS0_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS0_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS0_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS0_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS0_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS0_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS0_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS0_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS0_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS0_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* =================================================== PROT_SMPU.MS1_CTL =================================================== */ +#define PROT_SMPU_MS1_CTL_P_Pos (0UL) /*!< PROT_SMPU MS1_CTL: P (Bit 0) */ +#define PROT_SMPU_MS1_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS1_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS1_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS1_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS1_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS1_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS1_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS1_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS1_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS1_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS1_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS1_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS1_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS1_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS1_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS1_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS1_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS1_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* =================================================== PROT_SMPU.MS2_CTL =================================================== */ +#define PROT_SMPU_MS2_CTL_P_Pos (0UL) /*!< PROT_SMPU MS2_CTL: P (Bit 0) */ +#define PROT_SMPU_MS2_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS2_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS2_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS2_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS2_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS2_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS2_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS2_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS2_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS2_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS2_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS2_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS2_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS2_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS2_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS2_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS2_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS2_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* =================================================== PROT_SMPU.MS3_CTL =================================================== */ +#define PROT_SMPU_MS3_CTL_P_Pos (0UL) /*!< PROT_SMPU MS3_CTL: P (Bit 0) */ +#define PROT_SMPU_MS3_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS3_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS3_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS3_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS3_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS3_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS3_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS3_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS3_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS3_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS3_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS3_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS3_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS3_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS3_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS3_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS3_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS3_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* =================================================== PROT_SMPU.MS4_CTL =================================================== */ +#define PROT_SMPU_MS4_CTL_P_Pos (0UL) /*!< PROT_SMPU MS4_CTL: P (Bit 0) */ +#define PROT_SMPU_MS4_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS4_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS4_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS4_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS4_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS4_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS4_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS4_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS4_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS4_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS4_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS4_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS4_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS4_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS4_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS4_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS4_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS4_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* =================================================== PROT_SMPU.MS5_CTL =================================================== */ +#define PROT_SMPU_MS5_CTL_P_Pos (0UL) /*!< PROT_SMPU MS5_CTL: P (Bit 0) */ +#define PROT_SMPU_MS5_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS5_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS5_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS5_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS5_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS5_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS5_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS5_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS5_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS5_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS5_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS5_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS5_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS5_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS5_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS5_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS5_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS5_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* =================================================== PROT_SMPU.MS6_CTL =================================================== */ +#define PROT_SMPU_MS6_CTL_P_Pos (0UL) /*!< PROT_SMPU MS6_CTL: P (Bit 0) */ +#define PROT_SMPU_MS6_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS6_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS6_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS6_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS6_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS6_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS6_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS6_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS6_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS6_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS6_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS6_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS6_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS6_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS6_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS6_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS6_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS6_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* =================================================== PROT_SMPU.MS7_CTL =================================================== */ +#define PROT_SMPU_MS7_CTL_P_Pos (0UL) /*!< PROT_SMPU MS7_CTL: P (Bit 0) */ +#define PROT_SMPU_MS7_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS7_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS7_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS7_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS7_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS7_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS7_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS7_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS7_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS7_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS7_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS7_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS7_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS7_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS7_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS7_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS7_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS7_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* =================================================== PROT_SMPU.MS8_CTL =================================================== */ +#define PROT_SMPU_MS8_CTL_P_Pos (0UL) /*!< PROT_SMPU MS8_CTL: P (Bit 0) */ +#define PROT_SMPU_MS8_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS8_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS8_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS8_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS8_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS8_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS8_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS8_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS8_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS8_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS8_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS8_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS8_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS8_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS8_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS8_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS8_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS8_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* =================================================== PROT_SMPU.MS9_CTL =================================================== */ +#define PROT_SMPU_MS9_CTL_P_Pos (0UL) /*!< PROT_SMPU MS9_CTL: P (Bit 0) */ +#define PROT_SMPU_MS9_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS9_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS9_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS9_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS9_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS9_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS9_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS9_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS9_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS9_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS9_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS9_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS9_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS9_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS9_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS9_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS9_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS9_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* ================================================== PROT_SMPU.MS10_CTL =================================================== */ +#define PROT_SMPU_MS10_CTL_P_Pos (0UL) /*!< PROT_SMPU MS10_CTL: P (Bit 0) */ +#define PROT_SMPU_MS10_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS10_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS10_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS10_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS10_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS10_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS10_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS10_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS10_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS10_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS10_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS10_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS10_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS10_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS10_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS10_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS10_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS10_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* ================================================== PROT_SMPU.MS11_CTL =================================================== */ +#define PROT_SMPU_MS11_CTL_P_Pos (0UL) /*!< PROT_SMPU MS11_CTL: P (Bit 0) */ +#define PROT_SMPU_MS11_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS11_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS11_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS11_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS11_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS11_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS11_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS11_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS11_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS11_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS11_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS11_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS11_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS11_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS11_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS11_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS11_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS11_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* ================================================== PROT_SMPU.MS12_CTL =================================================== */ +#define PROT_SMPU_MS12_CTL_P_Pos (0UL) /*!< PROT_SMPU MS12_CTL: P (Bit 0) */ +#define PROT_SMPU_MS12_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS12_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS12_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS12_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS12_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS12_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS12_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS12_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS12_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS12_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS12_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS12_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS12_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS12_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS12_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS12_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS12_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS12_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* ================================================== PROT_SMPU.MS13_CTL =================================================== */ +#define PROT_SMPU_MS13_CTL_P_Pos (0UL) /*!< PROT_SMPU MS13_CTL: P (Bit 0) */ +#define PROT_SMPU_MS13_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS13_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS13_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS13_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS13_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS13_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS13_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS13_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS13_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS13_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS13_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS13_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS13_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS13_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS13_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS13_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS13_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS13_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* ================================================== PROT_SMPU.MS14_CTL =================================================== */ +#define PROT_SMPU_MS14_CTL_P_Pos (0UL) /*!< PROT_SMPU MS14_CTL: P (Bit 0) */ +#define PROT_SMPU_MS14_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS14_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS14_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS14_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS14_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS14_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS14_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS14_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS14_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS14_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS14_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS14_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS14_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS14_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS14_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS14_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS14_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS14_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ +/* ================================================== PROT_SMPU.MS15_CTL =================================================== */ +#define PROT_SMPU_MS15_CTL_P_Pos (0UL) /*!< PROT_SMPU MS15_CTL: P (Bit 0) */ +#define PROT_SMPU_MS15_CTL_P_Msk (0x1UL) /*!< PROT_SMPU MS15_CTL: P (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS15_CTL_NS_Pos (1UL) /*!< PROT_SMPU MS15_CTL: NS (Bit 1) */ +#define PROT_SMPU_MS15_CTL_NS_Msk (0x2UL) /*!< PROT_SMPU MS15_CTL: NS (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS15_CTL_PRIO_Pos (8UL) /*!< PROT_SMPU MS15_CTL: PRIO (Bit 8) */ +#define PROT_SMPU_MS15_CTL_PRIO_Msk (0x300UL) /*!< PROT_SMPU MS15_CTL: PRIO (Bitfield-Mask: 0x03) */ +#define PROT_SMPU_MS15_CTL_PC_MASK_0_Pos (16UL) /*!< PROT_SMPU MS15_CTL: PC_MASK_0 (Bit 16) */ +#define PROT_SMPU_MS15_CTL_PC_MASK_0_Msk (0x10000UL) /*!< PROT_SMPU MS15_CTL: PC_MASK_0 (Bitfield-Mask: 0x01) */ +#define PROT_SMPU_MS15_CTL_PC_MASK_15_TO_1_Pos (17UL) /*!< PROT_SMPU MS15_CTL: PC_MASK_15_TO_1 (Bit 17) */ +#define PROT_SMPU_MS15_CTL_PC_MASK_15_TO_1_Msk (0xfffe0000UL) /*!< PROT_SMPU MS15_CTL: PC_MASK_15_TO_1 (Bitfield-Mask: 0x7fff)*/ + + +/* =============================================== PROT_MPU_MPU_STRUCT.ADDR ================================================ */ +#define PROT_MPU_MPU_STRUCT_ADDR_SUBREGION_DISABLE_Pos (0UL) /*!< PROT_MPU_MPU_STRUCT ADDR: SUBREGION_DISABLE (Bit 0) */ +#define PROT_MPU_MPU_STRUCT_ADDR_SUBREGION_DISABLE_Msk (0xffUL) /*!< PROT_MPU_MPU_STRUCT ADDR: SUBREGION_DISABLE (Bitfield-Mask: 0xff)*/ +#define PROT_MPU_MPU_STRUCT_ADDR_ADDR24_Pos (8UL) /*!< PROT_MPU_MPU_STRUCT ADDR: ADDR24 (Bit 8) */ +#define PROT_MPU_MPU_STRUCT_ADDR_ADDR24_Msk (0xffffff00UL) /*!< PROT_MPU_MPU_STRUCT ADDR: ADDR24 (Bitfield-Mask: 0xffffff)*/ +/* ================================================ PROT_MPU_MPU_STRUCT.ATT ================================================ */ +#define PROT_MPU_MPU_STRUCT_ATT_UR_Pos (0UL) /*!< PROT_MPU_MPU_STRUCT ATT: UR (Bit 0) */ +#define PROT_MPU_MPU_STRUCT_ATT_UR_Msk (0x1UL) /*!< PROT_MPU_MPU_STRUCT ATT: UR (Bitfield-Mask: 0x01) */ +#define PROT_MPU_MPU_STRUCT_ATT_UW_Pos (1UL) /*!< PROT_MPU_MPU_STRUCT ATT: UW (Bit 1) */ +#define PROT_MPU_MPU_STRUCT_ATT_UW_Msk (0x2UL) /*!< PROT_MPU_MPU_STRUCT ATT: UW (Bitfield-Mask: 0x01) */ +#define PROT_MPU_MPU_STRUCT_ATT_UX_Pos (2UL) /*!< PROT_MPU_MPU_STRUCT ATT: UX (Bit 2) */ +#define PROT_MPU_MPU_STRUCT_ATT_UX_Msk (0x4UL) /*!< PROT_MPU_MPU_STRUCT ATT: UX (Bitfield-Mask: 0x01) */ +#define PROT_MPU_MPU_STRUCT_ATT_PR_Pos (3UL) /*!< PROT_MPU_MPU_STRUCT ATT: PR (Bit 3) */ +#define PROT_MPU_MPU_STRUCT_ATT_PR_Msk (0x8UL) /*!< PROT_MPU_MPU_STRUCT ATT: PR (Bitfield-Mask: 0x01) */ +#define PROT_MPU_MPU_STRUCT_ATT_PW_Pos (4UL) /*!< PROT_MPU_MPU_STRUCT ATT: PW (Bit 4) */ +#define PROT_MPU_MPU_STRUCT_ATT_PW_Msk (0x10UL) /*!< PROT_MPU_MPU_STRUCT ATT: PW (Bitfield-Mask: 0x01) */ +#define PROT_MPU_MPU_STRUCT_ATT_PX_Pos (5UL) /*!< PROT_MPU_MPU_STRUCT ATT: PX (Bit 5) */ +#define PROT_MPU_MPU_STRUCT_ATT_PX_Msk (0x20UL) /*!< PROT_MPU_MPU_STRUCT ATT: PX (Bitfield-Mask: 0x01) */ +#define PROT_MPU_MPU_STRUCT_ATT_NS_Pos (6UL) /*!< PROT_MPU_MPU_STRUCT ATT: NS (Bit 6) */ +#define PROT_MPU_MPU_STRUCT_ATT_NS_Msk (0x40UL) /*!< PROT_MPU_MPU_STRUCT ATT: NS (Bitfield-Mask: 0x01) */ +#define PROT_MPU_MPU_STRUCT_ATT_REGION_SIZE_Pos (24UL) /*!< PROT_MPU_MPU_STRUCT ATT: REGION_SIZE (Bit 24) */ +#define PROT_MPU_MPU_STRUCT_ATT_REGION_SIZE_Msk (0x1f000000UL) /*!< PROT_MPU_MPU_STRUCT ATT: REGION_SIZE (Bitfield-Mask: 0x1f)*/ +#define PROT_MPU_MPU_STRUCT_ATT_ENABLED_Pos (31UL) /*!< PROT_MPU_MPU_STRUCT ATT: ENABLED (Bit 31) */ +#define PROT_MPU_MPU_STRUCT_ATT_ENABLED_Msk (0x80000000UL) /*!< PROT_MPU_MPU_STRUCT ATT: ENABLED (Bitfield-Mask: 0x01) */ + + +/* ==================================================== PROT_MPU.MS_CTL ==================================================== */ +#define PROT_MPU_MS_CTL_PC_Pos (0UL) /*!< PROT_MPU MS_CTL: PC (Bit 0) */ +#define PROT_MPU_MS_CTL_PC_Msk (0xfUL) /*!< PROT_MPU MS_CTL: PC (Bitfield-Mask: 0x0f) */ +#define PROT_MPU_MS_CTL_PC_SAVED_Pos (16UL) /*!< PROT_MPU MS_CTL: PC_SAVED (Bit 16) */ +#define PROT_MPU_MS_CTL_PC_SAVED_Msk (0xf0000UL) /*!< PROT_MPU MS_CTL: PC_SAVED (Bitfield-Mask: 0x0f) */ + + +#endif /* _CYIP_PROT_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_sar.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_sar.h new file mode 100644 index 0000000000..d07d89d564 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_sar.h @@ -0,0 +1,627 @@ +/***************************************************************************//** +* \file cyip_sar.h +* +* \brief +* SAR IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_SAR_H_ +#define _CYIP_SAR_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ SAR ================ */ +/* =========================================================================================================================== */ + +#define SAR_SECTION_SIZE 0x00010000UL + +/** + * \brief SAR ADC with Sequencer (SAR) + */ +typedef struct { /*!< SAR Structure */ + __IOM uint32_t CTRL; /*!< 0x00000000 Analog control register. */ + __IOM uint32_t SAMPLE_CTRL; /*!< 0x00000004 Sample control register. */ + __IM uint32_t RESERVED[2]; + __IOM uint32_t SAMPLE_TIME01; /*!< 0x00000010 Sample time specification ST0 and ST1 */ + __IOM uint32_t SAMPLE_TIME23; /*!< 0x00000014 Sample time specification ST2 and ST3 */ + __IOM uint32_t RANGE_THRES; /*!< 0x00000018 Global range detect threshold register. */ + __IOM uint32_t RANGE_COND; /*!< 0x0000001C Global range detect mode register. */ + __IOM uint32_t CHAN_EN; /*!< 0x00000020 Enable bits for the channels */ + __IOM uint32_t START_CTRL; /*!< 0x00000024 Start control register (firmware trigger). */ + __IM uint32_t RESERVED1[22]; + __IOM uint32_t CHAN_CONFIG[16]; /*!< 0x00000080 Channel configuration register. */ + __IM uint32_t RESERVED2[16]; + __IM uint32_t CHAN_WORK[16]; /*!< 0x00000100 Channel working data register */ + __IM uint32_t RESERVED3[16]; + __IM uint32_t CHAN_RESULT[16]; /*!< 0x00000180 Channel result data register */ + __IM uint32_t RESERVED4[16]; + __IM uint32_t CHAN_WORK_UPDATED; /*!< 0x00000200 Channel working data register 'updated' bits */ + __IM uint32_t CHAN_RESULT_UPDATED; /*!< 0x00000204 Channel result data register 'updated' bits */ + __IM uint32_t CHAN_WORK_NEWVALUE; /*!< 0x00000208 Channel working data register 'new value' bits */ + __IM uint32_t CHAN_RESULT_NEWVALUE; /*!< 0x0000020C Channel result data register 'new value' bits */ + __IOM uint32_t INTR; /*!< 0x00000210 Interrupt request register. */ + __IOM uint32_t INTR_SET; /*!< 0x00000214 Interrupt set request register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000218 Interrupt mask register. */ + __IM uint32_t INTR_MASKED; /*!< 0x0000021C Interrupt masked request register */ + __IOM uint32_t SATURATE_INTR; /*!< 0x00000220 Saturate interrupt request register. */ + __IOM uint32_t SATURATE_INTR_SET; /*!< 0x00000224 Saturate interrupt set request register */ + __IOM uint32_t SATURATE_INTR_MASK; /*!< 0x00000228 Saturate interrupt mask register. */ + __IM uint32_t SATURATE_INTR_MASKED; /*!< 0x0000022C Saturate interrupt masked request register */ + __IOM uint32_t RANGE_INTR; /*!< 0x00000230 Range detect interrupt request register. */ + __IOM uint32_t RANGE_INTR_SET; /*!< 0x00000234 Range detect interrupt set request register */ + __IOM uint32_t RANGE_INTR_MASK; /*!< 0x00000238 Range detect interrupt mask register. */ + __IM uint32_t RANGE_INTR_MASKED; /*!< 0x0000023C Range interrupt masked request register */ + __IM uint32_t INTR_CAUSE; /*!< 0x00000240 Interrupt cause register */ + __IM uint32_t RESERVED5[15]; + __IOM uint32_t INJ_CHAN_CONFIG; /*!< 0x00000280 Injection channel configuration register. */ + __IM uint32_t RESERVED6[3]; + __IM uint32_t INJ_RESULT; /*!< 0x00000290 Injection channel result register */ + __IM uint32_t RESERVED7[3]; + __IM uint32_t STATUS; /*!< 0x000002A0 Current status of internal SAR registers (mostly for debug) */ + __IM uint32_t AVG_STAT; /*!< 0x000002A4 Current averaging status (for debug) */ + __IM uint32_t RESERVED8[22]; + __IOM uint32_t MUX_SWITCH0; /*!< 0x00000300 SARMUX Firmware switch controls */ + __IOM uint32_t MUX_SWITCH_CLEAR0; /*!< 0x00000304 SARMUX Firmware switch control clear */ + __IM uint32_t RESERVED9[14]; + __IOM uint32_t MUX_SWITCH_DS_CTRL; /*!< 0x00000340 SARMUX switch DSI control */ + __IOM uint32_t MUX_SWITCH_SQ_CTRL; /*!< 0x00000344 SARMUX switch Sar Sequencer control */ + __IM uint32_t MUX_SWITCH_STATUS; /*!< 0x00000348 SARMUX switch status */ + __IM uint32_t RESERVED10[749]; + __IOM uint32_t ANA_TRIM0; /*!< 0x00000F00 Analog trim register. */ + __IOM uint32_t ANA_TRIM1; /*!< 0x00000F04 Analog trim register. */ +} SAR_Type; /*!< Size = 3848 (0xF08) */ + + +/* ======================================================= SAR.CTRL ======================================================== */ +#define SAR_CTRL_PWR_CTRL_VREF_Pos (0UL) /*!< SAR CTRL: PWR_CTRL_VREF (Bit 0) */ +#define SAR_CTRL_PWR_CTRL_VREF_Msk (0x7UL) /*!< SAR CTRL: PWR_CTRL_VREF (Bitfield-Mask: 0x07) */ +#define SAR_CTRL_VREF_SEL_Pos (4UL) /*!< SAR CTRL: VREF_SEL (Bit 4) */ +#define SAR_CTRL_VREF_SEL_Msk (0x70UL) /*!< SAR CTRL: VREF_SEL (Bitfield-Mask: 0x07) */ +#define SAR_CTRL_VREF_BYP_CAP_EN_Pos (7UL) /*!< SAR CTRL: VREF_BYP_CAP_EN (Bit 7) */ +#define SAR_CTRL_VREF_BYP_CAP_EN_Msk (0x80UL) /*!< SAR CTRL: VREF_BYP_CAP_EN (Bitfield-Mask: 0x01) */ +#define SAR_CTRL_NEG_SEL_Pos (9UL) /*!< SAR CTRL: NEG_SEL (Bit 9) */ +#define SAR_CTRL_NEG_SEL_Msk (0xe00UL) /*!< SAR CTRL: NEG_SEL (Bitfield-Mask: 0x07) */ +#define SAR_CTRL_SAR_HW_CTRL_NEGVREF_Pos (13UL) /*!< SAR CTRL: SAR_HW_CTRL_NEGVREF (Bit 13) */ +#define SAR_CTRL_SAR_HW_CTRL_NEGVREF_Msk (0x2000UL) /*!< SAR CTRL: SAR_HW_CTRL_NEGVREF (Bitfield-Mask: 0x01) */ +#define SAR_CTRL_COMP_DLY_Pos (14UL) /*!< SAR CTRL: COMP_DLY (Bit 14) */ +#define SAR_CTRL_COMP_DLY_Msk (0xc000UL) /*!< SAR CTRL: COMP_DLY (Bitfield-Mask: 0x03) */ +#define SAR_CTRL_SPARE_Pos (16UL) /*!< SAR CTRL: SPARE (Bit 16) */ +#define SAR_CTRL_SPARE_Msk (0xf0000UL) /*!< SAR CTRL: SPARE (Bitfield-Mask: 0x0f) */ +#define SAR_CTRL_BOOSTPUMP_EN_Pos (20UL) /*!< SAR CTRL: BOOSTPUMP_EN (Bit 20) */ +#define SAR_CTRL_BOOSTPUMP_EN_Msk (0x100000UL) /*!< SAR CTRL: BOOSTPUMP_EN (Bitfield-Mask: 0x01) */ +#define SAR_CTRL_REFBUF_EN_Pos (21UL) /*!< SAR CTRL: REFBUF_EN (Bit 21) */ +#define SAR_CTRL_REFBUF_EN_Msk (0x200000UL) /*!< SAR CTRL: REFBUF_EN (Bitfield-Mask: 0x01) */ +#define SAR_CTRL_COMP_PWR_Pos (24UL) /*!< SAR CTRL: COMP_PWR (Bit 24) */ +#define SAR_CTRL_COMP_PWR_Msk (0x7000000UL) /*!< SAR CTRL: COMP_PWR (Bitfield-Mask: 0x07) */ +#define SAR_CTRL_DEEPSLEEP_ON_Pos (27UL) /*!< SAR CTRL: DEEPSLEEP_ON (Bit 27) */ +#define SAR_CTRL_DEEPSLEEP_ON_Msk (0x8000000UL) /*!< SAR CTRL: DEEPSLEEP_ON (Bitfield-Mask: 0x01) */ +#define SAR_CTRL_DSI_SYNC_CONFIG_Pos (28UL) /*!< SAR CTRL: DSI_SYNC_CONFIG (Bit 28) */ +#define SAR_CTRL_DSI_SYNC_CONFIG_Msk (0x10000000UL) /*!< SAR CTRL: DSI_SYNC_CONFIG (Bitfield-Mask: 0x01) */ +#define SAR_CTRL_DSI_MODE_Pos (29UL) /*!< SAR CTRL: DSI_MODE (Bit 29) */ +#define SAR_CTRL_DSI_MODE_Msk (0x20000000UL) /*!< SAR CTRL: DSI_MODE (Bitfield-Mask: 0x01) */ +#define SAR_CTRL_SWITCH_DISABLE_Pos (30UL) /*!< SAR CTRL: SWITCH_DISABLE (Bit 30) */ +#define SAR_CTRL_SWITCH_DISABLE_Msk (0x40000000UL) /*!< SAR CTRL: SWITCH_DISABLE (Bitfield-Mask: 0x01) */ +#define SAR_CTRL_ENABLED_Pos (31UL) /*!< SAR CTRL: ENABLED (Bit 31) */ +#define SAR_CTRL_ENABLED_Msk (0x80000000UL) /*!< SAR CTRL: ENABLED (Bitfield-Mask: 0x01) */ +/* ==================================================== SAR.SAMPLE_CTRL ==================================================== */ +#define SAR_SAMPLE_CTRL_LEFT_ALIGN_Pos (1UL) /*!< SAR SAMPLE_CTRL: LEFT_ALIGN (Bit 1) */ +#define SAR_SAMPLE_CTRL_LEFT_ALIGN_Msk (0x2UL) /*!< SAR SAMPLE_CTRL: LEFT_ALIGN (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_SINGLE_ENDED_SIGNED_Pos (2UL) /*!< SAR SAMPLE_CTRL: SINGLE_ENDED_SIGNED (Bit 2) */ +#define SAR_SAMPLE_CTRL_SINGLE_ENDED_SIGNED_Msk (0x4UL) /*!< SAR SAMPLE_CTRL: SINGLE_ENDED_SIGNED (Bitfield-Mask: 0x01)*/ +#define SAR_SAMPLE_CTRL_DIFFERENTIAL_SIGNED_Pos (3UL) /*!< SAR SAMPLE_CTRL: DIFFERENTIAL_SIGNED (Bit 3) */ +#define SAR_SAMPLE_CTRL_DIFFERENTIAL_SIGNED_Msk (0x8UL) /*!< SAR SAMPLE_CTRL: DIFFERENTIAL_SIGNED (Bitfield-Mask: 0x01)*/ +#define SAR_SAMPLE_CTRL_AVG_CNT_Pos (4UL) /*!< SAR SAMPLE_CTRL: AVG_CNT (Bit 4) */ +#define SAR_SAMPLE_CTRL_AVG_CNT_Msk (0x70UL) /*!< SAR SAMPLE_CTRL: AVG_CNT (Bitfield-Mask: 0x07) */ +#define SAR_SAMPLE_CTRL_AVG_SHIFT_Pos (7UL) /*!< SAR SAMPLE_CTRL: AVG_SHIFT (Bit 7) */ +#define SAR_SAMPLE_CTRL_AVG_SHIFT_Msk (0x80UL) /*!< SAR SAMPLE_CTRL: AVG_SHIFT (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_AVG_MODE_Pos (8UL) /*!< SAR SAMPLE_CTRL: AVG_MODE (Bit 8) */ +#define SAR_SAMPLE_CTRL_AVG_MODE_Msk (0x100UL) /*!< SAR SAMPLE_CTRL: AVG_MODE (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_CONTINUOUS_Pos (16UL) /*!< SAR SAMPLE_CTRL: CONTINUOUS (Bit 16) */ +#define SAR_SAMPLE_CTRL_CONTINUOUS_Msk (0x10000UL) /*!< SAR SAMPLE_CTRL: CONTINUOUS (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_DSI_TRIGGER_EN_Pos (17UL) /*!< SAR SAMPLE_CTRL: DSI_TRIGGER_EN (Bit 17) */ +#define SAR_SAMPLE_CTRL_DSI_TRIGGER_EN_Msk (0x20000UL) /*!< SAR SAMPLE_CTRL: DSI_TRIGGER_EN (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_DSI_TRIGGER_LEVEL_Pos (18UL) /*!< SAR SAMPLE_CTRL: DSI_TRIGGER_LEVEL (Bit 18) */ +#define SAR_SAMPLE_CTRL_DSI_TRIGGER_LEVEL_Msk (0x40000UL) /*!< SAR SAMPLE_CTRL: DSI_TRIGGER_LEVEL (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_DSI_SYNC_TRIGGER_Pos (19UL) /*!< SAR SAMPLE_CTRL: DSI_SYNC_TRIGGER (Bit 19) */ +#define SAR_SAMPLE_CTRL_DSI_SYNC_TRIGGER_Msk (0x80000UL) /*!< SAR SAMPLE_CTRL: DSI_SYNC_TRIGGER (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_UAB_SCAN_MODE_Pos (22UL) /*!< SAR SAMPLE_CTRL: UAB_SCAN_MODE (Bit 22) */ +#define SAR_SAMPLE_CTRL_UAB_SCAN_MODE_Msk (0x400000UL) /*!< SAR SAMPLE_CTRL: UAB_SCAN_MODE (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_REPEAT_INVALID_Pos (23UL) /*!< SAR SAMPLE_CTRL: REPEAT_INVALID (Bit 23) */ +#define SAR_SAMPLE_CTRL_REPEAT_INVALID_Msk (0x800000UL) /*!< SAR SAMPLE_CTRL: REPEAT_INVALID (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_VALID_SEL_Pos (24UL) /*!< SAR SAMPLE_CTRL: VALID_SEL (Bit 24) */ +#define SAR_SAMPLE_CTRL_VALID_SEL_Msk (0x7000000UL) /*!< SAR SAMPLE_CTRL: VALID_SEL (Bitfield-Mask: 0x07) */ +#define SAR_SAMPLE_CTRL_VALID_SEL_EN_Pos (27UL) /*!< SAR SAMPLE_CTRL: VALID_SEL_EN (Bit 27) */ +#define SAR_SAMPLE_CTRL_VALID_SEL_EN_Msk (0x8000000UL) /*!< SAR SAMPLE_CTRL: VALID_SEL_EN (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_VALID_IGNORE_Pos (28UL) /*!< SAR SAMPLE_CTRL: VALID_IGNORE (Bit 28) */ +#define SAR_SAMPLE_CTRL_VALID_IGNORE_Msk (0x10000000UL) /*!< SAR SAMPLE_CTRL: VALID_IGNORE (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_TRIGGER_OUT_EN_Pos (30UL) /*!< SAR SAMPLE_CTRL: TRIGGER_OUT_EN (Bit 30) */ +#define SAR_SAMPLE_CTRL_TRIGGER_OUT_EN_Msk (0x40000000UL) /*!< SAR SAMPLE_CTRL: TRIGGER_OUT_EN (Bitfield-Mask: 0x01) */ +#define SAR_SAMPLE_CTRL_EOS_DSI_OUT_EN_Pos (31UL) /*!< SAR SAMPLE_CTRL: EOS_DSI_OUT_EN (Bit 31) */ +#define SAR_SAMPLE_CTRL_EOS_DSI_OUT_EN_Msk (0x80000000UL) /*!< SAR SAMPLE_CTRL: EOS_DSI_OUT_EN (Bitfield-Mask: 0x01) */ +/* =================================================== SAR.SAMPLE_TIME01 =================================================== */ +#define SAR_SAMPLE_TIME01_SAMPLE_TIME0_Pos (0UL) /*!< SAR SAMPLE_TIME01: SAMPLE_TIME0 (Bit 0) */ +#define SAR_SAMPLE_TIME01_SAMPLE_TIME0_Msk (0x3ffUL) /*!< SAR SAMPLE_TIME01: SAMPLE_TIME0 (Bitfield-Mask: 0x3ff) */ +#define SAR_SAMPLE_TIME01_SAMPLE_TIME1_Pos (16UL) /*!< SAR SAMPLE_TIME01: SAMPLE_TIME1 (Bit 16) */ +#define SAR_SAMPLE_TIME01_SAMPLE_TIME1_Msk (0x3ff0000UL) /*!< SAR SAMPLE_TIME01: SAMPLE_TIME1 (Bitfield-Mask: 0x3ff) */ +/* =================================================== SAR.SAMPLE_TIME23 =================================================== */ +#define SAR_SAMPLE_TIME23_SAMPLE_TIME2_Pos (0UL) /*!< SAR SAMPLE_TIME23: SAMPLE_TIME2 (Bit 0) */ +#define SAR_SAMPLE_TIME23_SAMPLE_TIME2_Msk (0x3ffUL) /*!< SAR SAMPLE_TIME23: SAMPLE_TIME2 (Bitfield-Mask: 0x3ff) */ +#define SAR_SAMPLE_TIME23_SAMPLE_TIME3_Pos (16UL) /*!< SAR SAMPLE_TIME23: SAMPLE_TIME3 (Bit 16) */ +#define SAR_SAMPLE_TIME23_SAMPLE_TIME3_Msk (0x3ff0000UL) /*!< SAR SAMPLE_TIME23: SAMPLE_TIME3 (Bitfield-Mask: 0x3ff) */ +/* ==================================================== SAR.RANGE_THRES ==================================================== */ +#define SAR_RANGE_THRES_RANGE_LOW_Pos (0UL) /*!< SAR RANGE_THRES: RANGE_LOW (Bit 0) */ +#define SAR_RANGE_THRES_RANGE_LOW_Msk (0xffffUL) /*!< SAR RANGE_THRES: RANGE_LOW (Bitfield-Mask: 0xffff) */ +#define SAR_RANGE_THRES_RANGE_HIGH_Pos (16UL) /*!< SAR RANGE_THRES: RANGE_HIGH (Bit 16) */ +#define SAR_RANGE_THRES_RANGE_HIGH_Msk (0xffff0000UL) /*!< SAR RANGE_THRES: RANGE_HIGH (Bitfield-Mask: 0xffff) */ +/* ==================================================== SAR.RANGE_COND ===================================================== */ +#define SAR_RANGE_COND_RANGE_COND_Pos (30UL) /*!< SAR RANGE_COND: RANGE_COND (Bit 30) */ +#define SAR_RANGE_COND_RANGE_COND_Msk (0xc0000000UL) /*!< SAR RANGE_COND: RANGE_COND (Bitfield-Mask: 0x03) */ +/* ====================================================== SAR.CHAN_EN ====================================================== */ +#define SAR_CHAN_EN_CHAN_EN_Pos (0UL) /*!< SAR CHAN_EN: CHAN_EN (Bit 0) */ +#define SAR_CHAN_EN_CHAN_EN_Msk (0xffffUL) /*!< SAR CHAN_EN: CHAN_EN (Bitfield-Mask: 0xffff) */ +/* ==================================================== SAR.START_CTRL ===================================================== */ +#define SAR_START_CTRL_FW_TRIGGER_Pos (0UL) /*!< SAR START_CTRL: FW_TRIGGER (Bit 0) */ +#define SAR_START_CTRL_FW_TRIGGER_Msk (0x1UL) /*!< SAR START_CTRL: FW_TRIGGER (Bitfield-Mask: 0x01) */ +/* ==================================================== SAR.CHAN_CONFIG ==================================================== */ +#define SAR_CHAN_CONFIG_POS_PIN_ADDR_Pos (0UL) /*!< SAR CHAN_CONFIG: POS_PIN_ADDR (Bit 0) */ +#define SAR_CHAN_CONFIG_POS_PIN_ADDR_Msk (0x7UL) /*!< SAR CHAN_CONFIG: POS_PIN_ADDR (Bitfield-Mask: 0x07) */ +#define SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos (4UL) /*!< SAR CHAN_CONFIG: POS_PORT_ADDR (Bit 4) */ +#define SAR_CHAN_CONFIG_POS_PORT_ADDR_Msk (0x70UL) /*!< SAR CHAN_CONFIG: POS_PORT_ADDR (Bitfield-Mask: 0x07) */ +#define SAR_CHAN_CONFIG_DIFFERENTIAL_EN_Pos (8UL) /*!< SAR CHAN_CONFIG: DIFFERENTIAL_EN (Bit 8) */ +#define SAR_CHAN_CONFIG_DIFFERENTIAL_EN_Msk (0x100UL) /*!< SAR CHAN_CONFIG: DIFFERENTIAL_EN (Bitfield-Mask: 0x01) */ +#define SAR_CHAN_CONFIG_AVG_EN_Pos (10UL) /*!< SAR CHAN_CONFIG: AVG_EN (Bit 10) */ +#define SAR_CHAN_CONFIG_AVG_EN_Msk (0x400UL) /*!< SAR CHAN_CONFIG: AVG_EN (Bitfield-Mask: 0x01) */ +#define SAR_CHAN_CONFIG_SAMPLE_TIME_SEL_Pos (12UL) /*!< SAR CHAN_CONFIG: SAMPLE_TIME_SEL (Bit 12) */ +#define SAR_CHAN_CONFIG_SAMPLE_TIME_SEL_Msk (0x3000UL) /*!< SAR CHAN_CONFIG: SAMPLE_TIME_SEL (Bitfield-Mask: 0x03) */ +#define SAR_CHAN_CONFIG_NEG_PIN_ADDR_Pos (16UL) /*!< SAR CHAN_CONFIG: NEG_PIN_ADDR (Bit 16) */ +#define SAR_CHAN_CONFIG_NEG_PIN_ADDR_Msk (0x70000UL) /*!< SAR CHAN_CONFIG: NEG_PIN_ADDR (Bitfield-Mask: 0x07) */ +#define SAR_CHAN_CONFIG_NEG_PORT_ADDR_Pos (20UL) /*!< SAR CHAN_CONFIG: NEG_PORT_ADDR (Bit 20) */ +#define SAR_CHAN_CONFIG_NEG_PORT_ADDR_Msk (0x700000UL) /*!< SAR CHAN_CONFIG: NEG_PORT_ADDR (Bitfield-Mask: 0x07) */ +#define SAR_CHAN_CONFIG_NEG_ADDR_EN_Pos (24UL) /*!< SAR CHAN_CONFIG: NEG_ADDR_EN (Bit 24) */ +#define SAR_CHAN_CONFIG_NEG_ADDR_EN_Msk (0x1000000UL) /*!< SAR CHAN_CONFIG: NEG_ADDR_EN (Bitfield-Mask: 0x01) */ +#define SAR_CHAN_CONFIG_DSI_OUT_EN_Pos (31UL) /*!< SAR CHAN_CONFIG: DSI_OUT_EN (Bit 31) */ +#define SAR_CHAN_CONFIG_DSI_OUT_EN_Msk (0x80000000UL) /*!< SAR CHAN_CONFIG: DSI_OUT_EN (Bitfield-Mask: 0x01) */ +/* ===================================================== SAR.CHAN_WORK ===================================================== */ +#define SAR_CHAN_WORK_WORK_Pos (0UL) /*!< SAR CHAN_WORK: WORK (Bit 0) */ +#define SAR_CHAN_WORK_WORK_Msk (0xffffUL) /*!< SAR CHAN_WORK: WORK (Bitfield-Mask: 0xffff) */ +#define SAR_CHAN_WORK_CHAN_WORK_NEWVALUE_MIR_Pos (27UL) /*!< SAR CHAN_WORK: CHAN_WORK_NEWVALUE_MIR (Bit 27) */ +#define SAR_CHAN_WORK_CHAN_WORK_NEWVALUE_MIR_Msk (0x8000000UL) /*!< SAR CHAN_WORK: CHAN_WORK_NEWVALUE_MIR (Bitfield-Mask: 0x01)*/ +#define SAR_CHAN_WORK_CHAN_WORK_UPDATED_MIR_Pos (31UL) /*!< SAR CHAN_WORK: CHAN_WORK_UPDATED_MIR (Bit 31) */ +#define SAR_CHAN_WORK_CHAN_WORK_UPDATED_MIR_Msk (0x80000000UL) /*!< SAR CHAN_WORK: CHAN_WORK_UPDATED_MIR (Bitfield-Mask: 0x01)*/ +/* ==================================================== SAR.CHAN_RESULT ==================================================== */ +#define SAR_CHAN_RESULT_RESULT_Pos (0UL) /*!< SAR CHAN_RESULT: RESULT (Bit 0) */ +#define SAR_CHAN_RESULT_RESULT_Msk (0xffffUL) /*!< SAR CHAN_RESULT: RESULT (Bitfield-Mask: 0xffff) */ +#define SAR_CHAN_RESULT_CHAN_RESULT_NEWVALUE_MIR_Pos (27UL) /*!< SAR CHAN_RESULT: CHAN_RESULT_NEWVALUE_MIR (Bit 27) */ +#define SAR_CHAN_RESULT_CHAN_RESULT_NEWVALUE_MIR_Msk (0x8000000UL) /*!< SAR CHAN_RESULT: CHAN_RESULT_NEWVALUE_MIR (Bitfield-Mask: 0x01)*/ +#define SAR_CHAN_RESULT_SATURATE_INTR_MIR_Pos (29UL) /*!< SAR CHAN_RESULT: SATURATE_INTR_MIR (Bit 29) */ +#define SAR_CHAN_RESULT_SATURATE_INTR_MIR_Msk (0x20000000UL) /*!< SAR CHAN_RESULT: SATURATE_INTR_MIR (Bitfield-Mask: 0x01) */ +#define SAR_CHAN_RESULT_RANGE_INTR_MIR_Pos (30UL) /*!< SAR CHAN_RESULT: RANGE_INTR_MIR (Bit 30) */ +#define SAR_CHAN_RESULT_RANGE_INTR_MIR_Msk (0x40000000UL) /*!< SAR CHAN_RESULT: RANGE_INTR_MIR (Bitfield-Mask: 0x01) */ +#define SAR_CHAN_RESULT_CHAN_RESULT_UPDATED_MIR_Pos (31UL) /*!< SAR CHAN_RESULT: CHAN_RESULT_UPDATED_MIR (Bit 31) */ +#define SAR_CHAN_RESULT_CHAN_RESULT_UPDATED_MIR_Msk (0x80000000UL) /*!< SAR CHAN_RESULT: CHAN_RESULT_UPDATED_MIR (Bitfield-Mask: 0x01)*/ +/* ================================================= SAR.CHAN_WORK_UPDATED ================================================= */ +#define SAR_CHAN_WORK_UPDATED_CHAN_WORK_UPDATED_Pos (0UL) /*!< SAR CHAN_WORK_UPDATED: CHAN_WORK_UPDATED (Bit 0) */ +#define SAR_CHAN_WORK_UPDATED_CHAN_WORK_UPDATED_Msk (0xffffUL) /*!< SAR CHAN_WORK_UPDATED: CHAN_WORK_UPDATED (Bitfield-Mask: 0xffff)*/ +/* ================================================ SAR.CHAN_RESULT_UPDATED ================================================ */ +#define SAR_CHAN_RESULT_UPDATED_CHAN_RESULT_UPDATED_Pos (0UL) /*!< SAR CHAN_RESULT_UPDATED: CHAN_RESULT_UPDATED (Bit 0) */ +#define SAR_CHAN_RESULT_UPDATED_CHAN_RESULT_UPDATED_Msk (0xffffUL) /*!< SAR CHAN_RESULT_UPDATED: CHAN_RESULT_UPDATED (Bitfield-Mask: 0xffff)*/ +/* ================================================ SAR.CHAN_WORK_NEWVALUE ================================================= */ +#define SAR_CHAN_WORK_NEWVALUE_CHAN_WORK_NEWVALUE_Pos (0UL) /*!< SAR CHAN_WORK_NEWVALUE: CHAN_WORK_NEWVALUE (Bit 0) */ +#define SAR_CHAN_WORK_NEWVALUE_CHAN_WORK_NEWVALUE_Msk (0xffffUL) /*!< SAR CHAN_WORK_NEWVALUE: CHAN_WORK_NEWVALUE (Bitfield-Mask: 0xffff)*/ +/* =============================================== SAR.CHAN_RESULT_NEWVALUE ================================================ */ +#define SAR_CHAN_RESULT_NEWVALUE_CHAN_RESULT_NEWVALUE_Pos (0UL) /*!< SAR CHAN_RESULT_NEWVALUE: CHAN_RESULT_NEWVALUE (Bit 0) */ +#define SAR_CHAN_RESULT_NEWVALUE_CHAN_RESULT_NEWVALUE_Msk (0xffffUL) /*!< SAR CHAN_RESULT_NEWVALUE: CHAN_RESULT_NEWVALUE (Bitfield-Mask: 0xffff)*/ +/* ======================================================= SAR.INTR ======================================================== */ +#define SAR_INTR_EOS_INTR_Pos (0UL) /*!< SAR INTR: EOS_INTR (Bit 0) */ +#define SAR_INTR_EOS_INTR_Msk (0x1UL) /*!< SAR INTR: EOS_INTR (Bitfield-Mask: 0x01) */ +#define SAR_INTR_OVERFLOW_INTR_Pos (1UL) /*!< SAR INTR: OVERFLOW_INTR (Bit 1) */ +#define SAR_INTR_OVERFLOW_INTR_Msk (0x2UL) /*!< SAR INTR: OVERFLOW_INTR (Bitfield-Mask: 0x01) */ +#define SAR_INTR_FW_COLLISION_INTR_Pos (2UL) /*!< SAR INTR: FW_COLLISION_INTR (Bit 2) */ +#define SAR_INTR_FW_COLLISION_INTR_Msk (0x4UL) /*!< SAR INTR: FW_COLLISION_INTR (Bitfield-Mask: 0x01) */ +#define SAR_INTR_DSI_COLLISION_INTR_Pos (3UL) /*!< SAR INTR: DSI_COLLISION_INTR (Bit 3) */ +#define SAR_INTR_DSI_COLLISION_INTR_Msk (0x8UL) /*!< SAR INTR: DSI_COLLISION_INTR (Bitfield-Mask: 0x01) */ +#define SAR_INTR_INJ_EOC_INTR_Pos (4UL) /*!< SAR INTR: INJ_EOC_INTR (Bit 4) */ +#define SAR_INTR_INJ_EOC_INTR_Msk (0x10UL) /*!< SAR INTR: INJ_EOC_INTR (Bitfield-Mask: 0x01) */ +#define SAR_INTR_INJ_SATURATE_INTR_Pos (5UL) /*!< SAR INTR: INJ_SATURATE_INTR (Bit 5) */ +#define SAR_INTR_INJ_SATURATE_INTR_Msk (0x20UL) /*!< SAR INTR: INJ_SATURATE_INTR (Bitfield-Mask: 0x01) */ +#define SAR_INTR_INJ_RANGE_INTR_Pos (6UL) /*!< SAR INTR: INJ_RANGE_INTR (Bit 6) */ +#define SAR_INTR_INJ_RANGE_INTR_Msk (0x40UL) /*!< SAR INTR: INJ_RANGE_INTR (Bitfield-Mask: 0x01) */ +#define SAR_INTR_INJ_COLLISION_INTR_Pos (7UL) /*!< SAR INTR: INJ_COLLISION_INTR (Bit 7) */ +#define SAR_INTR_INJ_COLLISION_INTR_Msk (0x80UL) /*!< SAR INTR: INJ_COLLISION_INTR (Bitfield-Mask: 0x01) */ +/* ===================================================== SAR.INTR_SET ====================================================== */ +#define SAR_INTR_SET_EOS_SET_Pos (0UL) /*!< SAR INTR_SET: EOS_SET (Bit 0) */ +#define SAR_INTR_SET_EOS_SET_Msk (0x1UL) /*!< SAR INTR_SET: EOS_SET (Bitfield-Mask: 0x01) */ +#define SAR_INTR_SET_OVERFLOW_SET_Pos (1UL) /*!< SAR INTR_SET: OVERFLOW_SET (Bit 1) */ +#define SAR_INTR_SET_OVERFLOW_SET_Msk (0x2UL) /*!< SAR INTR_SET: OVERFLOW_SET (Bitfield-Mask: 0x01) */ +#define SAR_INTR_SET_FW_COLLISION_SET_Pos (2UL) /*!< SAR INTR_SET: FW_COLLISION_SET (Bit 2) */ +#define SAR_INTR_SET_FW_COLLISION_SET_Msk (0x4UL) /*!< SAR INTR_SET: FW_COLLISION_SET (Bitfield-Mask: 0x01) */ +#define SAR_INTR_SET_DSI_COLLISION_SET_Pos (3UL) /*!< SAR INTR_SET: DSI_COLLISION_SET (Bit 3) */ +#define SAR_INTR_SET_DSI_COLLISION_SET_Msk (0x8UL) /*!< SAR INTR_SET: DSI_COLLISION_SET (Bitfield-Mask: 0x01) */ +#define SAR_INTR_SET_INJ_EOC_SET_Pos (4UL) /*!< SAR INTR_SET: INJ_EOC_SET (Bit 4) */ +#define SAR_INTR_SET_INJ_EOC_SET_Msk (0x10UL) /*!< SAR INTR_SET: INJ_EOC_SET (Bitfield-Mask: 0x01) */ +#define SAR_INTR_SET_INJ_SATURATE_SET_Pos (5UL) /*!< SAR INTR_SET: INJ_SATURATE_SET (Bit 5) */ +#define SAR_INTR_SET_INJ_SATURATE_SET_Msk (0x20UL) /*!< SAR INTR_SET: INJ_SATURATE_SET (Bitfield-Mask: 0x01) */ +#define SAR_INTR_SET_INJ_RANGE_SET_Pos (6UL) /*!< SAR INTR_SET: INJ_RANGE_SET (Bit 6) */ +#define SAR_INTR_SET_INJ_RANGE_SET_Msk (0x40UL) /*!< SAR INTR_SET: INJ_RANGE_SET (Bitfield-Mask: 0x01) */ +#define SAR_INTR_SET_INJ_COLLISION_SET_Pos (7UL) /*!< SAR INTR_SET: INJ_COLLISION_SET (Bit 7) */ +#define SAR_INTR_SET_INJ_COLLISION_SET_Msk (0x80UL) /*!< SAR INTR_SET: INJ_COLLISION_SET (Bitfield-Mask: 0x01) */ +/* ===================================================== SAR.INTR_MASK ===================================================== */ +#define SAR_INTR_MASK_EOS_MASK_Pos (0UL) /*!< SAR INTR_MASK: EOS_MASK (Bit 0) */ +#define SAR_INTR_MASK_EOS_MASK_Msk (0x1UL) /*!< SAR INTR_MASK: EOS_MASK (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASK_OVERFLOW_MASK_Pos (1UL) /*!< SAR INTR_MASK: OVERFLOW_MASK (Bit 1) */ +#define SAR_INTR_MASK_OVERFLOW_MASK_Msk (0x2UL) /*!< SAR INTR_MASK: OVERFLOW_MASK (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASK_FW_COLLISION_MASK_Pos (2UL) /*!< SAR INTR_MASK: FW_COLLISION_MASK (Bit 2) */ +#define SAR_INTR_MASK_FW_COLLISION_MASK_Msk (0x4UL) /*!< SAR INTR_MASK: FW_COLLISION_MASK (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASK_DSI_COLLISION_MASK_Pos (3UL) /*!< SAR INTR_MASK: DSI_COLLISION_MASK (Bit 3) */ +#define SAR_INTR_MASK_DSI_COLLISION_MASK_Msk (0x8UL) /*!< SAR INTR_MASK: DSI_COLLISION_MASK (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASK_INJ_EOC_MASK_Pos (4UL) /*!< SAR INTR_MASK: INJ_EOC_MASK (Bit 4) */ +#define SAR_INTR_MASK_INJ_EOC_MASK_Msk (0x10UL) /*!< SAR INTR_MASK: INJ_EOC_MASK (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASK_INJ_SATURATE_MASK_Pos (5UL) /*!< SAR INTR_MASK: INJ_SATURATE_MASK (Bit 5) */ +#define SAR_INTR_MASK_INJ_SATURATE_MASK_Msk (0x20UL) /*!< SAR INTR_MASK: INJ_SATURATE_MASK (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASK_INJ_RANGE_MASK_Pos (6UL) /*!< SAR INTR_MASK: INJ_RANGE_MASK (Bit 6) */ +#define SAR_INTR_MASK_INJ_RANGE_MASK_Msk (0x40UL) /*!< SAR INTR_MASK: INJ_RANGE_MASK (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASK_INJ_COLLISION_MASK_Pos (7UL) /*!< SAR INTR_MASK: INJ_COLLISION_MASK (Bit 7) */ +#define SAR_INTR_MASK_INJ_COLLISION_MASK_Msk (0x80UL) /*!< SAR INTR_MASK: INJ_COLLISION_MASK (Bitfield-Mask: 0x01) */ +/* ==================================================== SAR.INTR_MASKED ==================================================== */ +#define SAR_INTR_MASKED_EOS_MASKED_Pos (0UL) /*!< SAR INTR_MASKED: EOS_MASKED (Bit 0) */ +#define SAR_INTR_MASKED_EOS_MASKED_Msk (0x1UL) /*!< SAR INTR_MASKED: EOS_MASKED (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASKED_OVERFLOW_MASKED_Pos (1UL) /*!< SAR INTR_MASKED: OVERFLOW_MASKED (Bit 1) */ +#define SAR_INTR_MASKED_OVERFLOW_MASKED_Msk (0x2UL) /*!< SAR INTR_MASKED: OVERFLOW_MASKED (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASKED_FW_COLLISION_MASKED_Pos (2UL) /*!< SAR INTR_MASKED: FW_COLLISION_MASKED (Bit 2) */ +#define SAR_INTR_MASKED_FW_COLLISION_MASKED_Msk (0x4UL) /*!< SAR INTR_MASKED: FW_COLLISION_MASKED (Bitfield-Mask: 0x01)*/ +#define SAR_INTR_MASKED_DSI_COLLISION_MASKED_Pos (3UL) /*!< SAR INTR_MASKED: DSI_COLLISION_MASKED (Bit 3) */ +#define SAR_INTR_MASKED_DSI_COLLISION_MASKED_Msk (0x8UL) /*!< SAR INTR_MASKED: DSI_COLLISION_MASKED (Bitfield-Mask: 0x01)*/ +#define SAR_INTR_MASKED_INJ_EOC_MASKED_Pos (4UL) /*!< SAR INTR_MASKED: INJ_EOC_MASKED (Bit 4) */ +#define SAR_INTR_MASKED_INJ_EOC_MASKED_Msk (0x10UL) /*!< SAR INTR_MASKED: INJ_EOC_MASKED (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASKED_INJ_SATURATE_MASKED_Pos (5UL) /*!< SAR INTR_MASKED: INJ_SATURATE_MASKED (Bit 5) */ +#define SAR_INTR_MASKED_INJ_SATURATE_MASKED_Msk (0x20UL) /*!< SAR INTR_MASKED: INJ_SATURATE_MASKED (Bitfield-Mask: 0x01)*/ +#define SAR_INTR_MASKED_INJ_RANGE_MASKED_Pos (6UL) /*!< SAR INTR_MASKED: INJ_RANGE_MASKED (Bit 6) */ +#define SAR_INTR_MASKED_INJ_RANGE_MASKED_Msk (0x40UL) /*!< SAR INTR_MASKED: INJ_RANGE_MASKED (Bitfield-Mask: 0x01) */ +#define SAR_INTR_MASKED_INJ_COLLISION_MASKED_Pos (7UL) /*!< SAR INTR_MASKED: INJ_COLLISION_MASKED (Bit 7) */ +#define SAR_INTR_MASKED_INJ_COLLISION_MASKED_Msk (0x80UL) /*!< SAR INTR_MASKED: INJ_COLLISION_MASKED (Bitfield-Mask: 0x01)*/ +/* =================================================== SAR.SATURATE_INTR =================================================== */ +#define SAR_SATURATE_INTR_SATURATE_INTR_Pos (0UL) /*!< SAR SATURATE_INTR: SATURATE_INTR (Bit 0) */ +#define SAR_SATURATE_INTR_SATURATE_INTR_Msk (0xffffUL) /*!< SAR SATURATE_INTR: SATURATE_INTR (Bitfield-Mask: 0xffff) */ +/* ================================================= SAR.SATURATE_INTR_SET ================================================= */ +#define SAR_SATURATE_INTR_SET_SATURATE_SET_Pos (0UL) /*!< SAR SATURATE_INTR_SET: SATURATE_SET (Bit 0) */ +#define SAR_SATURATE_INTR_SET_SATURATE_SET_Msk (0xffffUL) /*!< SAR SATURATE_INTR_SET: SATURATE_SET (Bitfield-Mask: 0xffff)*/ +/* ================================================ SAR.SATURATE_INTR_MASK ================================================= */ +#define SAR_SATURATE_INTR_MASK_SATURATE_MASK_Pos (0UL) /*!< SAR SATURATE_INTR_MASK: SATURATE_MASK (Bit 0) */ +#define SAR_SATURATE_INTR_MASK_SATURATE_MASK_Msk (0xffffUL) /*!< SAR SATURATE_INTR_MASK: SATURATE_MASK (Bitfield-Mask: 0xffff)*/ +/* =============================================== SAR.SATURATE_INTR_MASKED ================================================ */ +#define SAR_SATURATE_INTR_MASKED_SATURATE_MASKED_Pos (0UL) /*!< SAR SATURATE_INTR_MASKED: SATURATE_MASKED (Bit 0) */ +#define SAR_SATURATE_INTR_MASKED_SATURATE_MASKED_Msk (0xffffUL) /*!< SAR SATURATE_INTR_MASKED: SATURATE_MASKED (Bitfield-Mask: 0xffff)*/ +/* ==================================================== SAR.RANGE_INTR ===================================================== */ +#define SAR_RANGE_INTR_RANGE_INTR_Pos (0UL) /*!< SAR RANGE_INTR: RANGE_INTR (Bit 0) */ +#define SAR_RANGE_INTR_RANGE_INTR_Msk (0xffffUL) /*!< SAR RANGE_INTR: RANGE_INTR (Bitfield-Mask: 0xffff) */ +/* ================================================== SAR.RANGE_INTR_SET =================================================== */ +#define SAR_RANGE_INTR_SET_RANGE_SET_Pos (0UL) /*!< SAR RANGE_INTR_SET: RANGE_SET (Bit 0) */ +#define SAR_RANGE_INTR_SET_RANGE_SET_Msk (0xffffUL) /*!< SAR RANGE_INTR_SET: RANGE_SET (Bitfield-Mask: 0xffff) */ +/* ================================================== SAR.RANGE_INTR_MASK ================================================== */ +#define SAR_RANGE_INTR_MASK_RANGE_MASK_Pos (0UL) /*!< SAR RANGE_INTR_MASK: RANGE_MASK (Bit 0) */ +#define SAR_RANGE_INTR_MASK_RANGE_MASK_Msk (0xffffUL) /*!< SAR RANGE_INTR_MASK: RANGE_MASK (Bitfield-Mask: 0xffff) */ +/* ================================================= SAR.RANGE_INTR_MASKED ================================================= */ +#define SAR_RANGE_INTR_MASKED_RANGE_MASKED_Pos (0UL) /*!< SAR RANGE_INTR_MASKED: RANGE_MASKED (Bit 0) */ +#define SAR_RANGE_INTR_MASKED_RANGE_MASKED_Msk (0xffffUL) /*!< SAR RANGE_INTR_MASKED: RANGE_MASKED (Bitfield-Mask: 0xffff)*/ +/* ==================================================== SAR.INTR_CAUSE ===================================================== */ +#define SAR_INTR_CAUSE_EOS_MASKED_MIR_Pos (0UL) /*!< SAR INTR_CAUSE: EOS_MASKED_MIR (Bit 0) */ +#define SAR_INTR_CAUSE_EOS_MASKED_MIR_Msk (0x1UL) /*!< SAR INTR_CAUSE: EOS_MASKED_MIR (Bitfield-Mask: 0x01) */ +#define SAR_INTR_CAUSE_OVERFLOW_MASKED_MIR_Pos (1UL) /*!< SAR INTR_CAUSE: OVERFLOW_MASKED_MIR (Bit 1) */ +#define SAR_INTR_CAUSE_OVERFLOW_MASKED_MIR_Msk (0x2UL) /*!< SAR INTR_CAUSE: OVERFLOW_MASKED_MIR (Bitfield-Mask: 0x01) */ +#define SAR_INTR_CAUSE_FW_COLLISION_MASKED_MIR_Pos (2UL) /*!< SAR INTR_CAUSE: FW_COLLISION_MASKED_MIR (Bit 2) */ +#define SAR_INTR_CAUSE_FW_COLLISION_MASKED_MIR_Msk (0x4UL) /*!< SAR INTR_CAUSE: FW_COLLISION_MASKED_MIR (Bitfield-Mask: 0x01)*/ +#define SAR_INTR_CAUSE_DSI_COLLISION_MASKED_MIR_Pos (3UL) /*!< SAR INTR_CAUSE: DSI_COLLISION_MASKED_MIR (Bit 3) */ +#define SAR_INTR_CAUSE_DSI_COLLISION_MASKED_MIR_Msk (0x8UL) /*!< SAR INTR_CAUSE: DSI_COLLISION_MASKED_MIR (Bitfield-Mask: 0x01)*/ +#define SAR_INTR_CAUSE_INJ_EOC_MASKED_MIR_Pos (4UL) /*!< SAR INTR_CAUSE: INJ_EOC_MASKED_MIR (Bit 4) */ +#define SAR_INTR_CAUSE_INJ_EOC_MASKED_MIR_Msk (0x10UL) /*!< SAR INTR_CAUSE: INJ_EOC_MASKED_MIR (Bitfield-Mask: 0x01) */ +#define SAR_INTR_CAUSE_INJ_SATURATE_MASKED_MIR_Pos (5UL) /*!< SAR INTR_CAUSE: INJ_SATURATE_MASKED_MIR (Bit 5) */ +#define SAR_INTR_CAUSE_INJ_SATURATE_MASKED_MIR_Msk (0x20UL) /*!< SAR INTR_CAUSE: INJ_SATURATE_MASKED_MIR (Bitfield-Mask: 0x01)*/ +#define SAR_INTR_CAUSE_INJ_RANGE_MASKED_MIR_Pos (6UL) /*!< SAR INTR_CAUSE: INJ_RANGE_MASKED_MIR (Bit 6) */ +#define SAR_INTR_CAUSE_INJ_RANGE_MASKED_MIR_Msk (0x40UL) /*!< SAR INTR_CAUSE: INJ_RANGE_MASKED_MIR (Bitfield-Mask: 0x01)*/ +#define SAR_INTR_CAUSE_INJ_COLLISION_MASKED_MIR_Pos (7UL) /*!< SAR INTR_CAUSE: INJ_COLLISION_MASKED_MIR (Bit 7) */ +#define SAR_INTR_CAUSE_INJ_COLLISION_MASKED_MIR_Msk (0x80UL) /*!< SAR INTR_CAUSE: INJ_COLLISION_MASKED_MIR (Bitfield-Mask: 0x01)*/ +#define SAR_INTR_CAUSE_SATURATE_MASKED_RED_Pos (30UL) /*!< SAR INTR_CAUSE: SATURATE_MASKED_RED (Bit 30) */ +#define SAR_INTR_CAUSE_SATURATE_MASKED_RED_Msk (0x40000000UL) /*!< SAR INTR_CAUSE: SATURATE_MASKED_RED (Bitfield-Mask: 0x01) */ +#define SAR_INTR_CAUSE_RANGE_MASKED_RED_Pos (31UL) /*!< SAR INTR_CAUSE: RANGE_MASKED_RED (Bit 31) */ +#define SAR_INTR_CAUSE_RANGE_MASKED_RED_Msk (0x80000000UL) /*!< SAR INTR_CAUSE: RANGE_MASKED_RED (Bitfield-Mask: 0x01) */ +/* ================================================== SAR.INJ_CHAN_CONFIG ================================================== */ +#define SAR_INJ_CHAN_CONFIG_INJ_PIN_ADDR_Pos (0UL) /*!< SAR INJ_CHAN_CONFIG: INJ_PIN_ADDR (Bit 0) */ +#define SAR_INJ_CHAN_CONFIG_INJ_PIN_ADDR_Msk (0x7UL) /*!< SAR INJ_CHAN_CONFIG: INJ_PIN_ADDR (Bitfield-Mask: 0x07) */ +#define SAR_INJ_CHAN_CONFIG_INJ_PORT_ADDR_Pos (4UL) /*!< SAR INJ_CHAN_CONFIG: INJ_PORT_ADDR (Bit 4) */ +#define SAR_INJ_CHAN_CONFIG_INJ_PORT_ADDR_Msk (0x70UL) /*!< SAR INJ_CHAN_CONFIG: INJ_PORT_ADDR (Bitfield-Mask: 0x07) */ +#define SAR_INJ_CHAN_CONFIG_INJ_DIFFERENTIAL_EN_Pos (8UL) /*!< SAR INJ_CHAN_CONFIG: INJ_DIFFERENTIAL_EN (Bit 8) */ +#define SAR_INJ_CHAN_CONFIG_INJ_DIFFERENTIAL_EN_Msk (0x100UL) /*!< SAR INJ_CHAN_CONFIG: INJ_DIFFERENTIAL_EN (Bitfield-Mask: 0x01)*/ +#define SAR_INJ_CHAN_CONFIG_INJ_AVG_EN_Pos (10UL) /*!< SAR INJ_CHAN_CONFIG: INJ_AVG_EN (Bit 10) */ +#define SAR_INJ_CHAN_CONFIG_INJ_AVG_EN_Msk (0x400UL) /*!< SAR INJ_CHAN_CONFIG: INJ_AVG_EN (Bitfield-Mask: 0x01) */ +#define SAR_INJ_CHAN_CONFIG_INJ_SAMPLE_TIME_SEL_Pos (12UL) /*!< SAR INJ_CHAN_CONFIG: INJ_SAMPLE_TIME_SEL (Bit 12) */ +#define SAR_INJ_CHAN_CONFIG_INJ_SAMPLE_TIME_SEL_Msk (0x3000UL) /*!< SAR INJ_CHAN_CONFIG: INJ_SAMPLE_TIME_SEL (Bitfield-Mask: 0x03)*/ +#define SAR_INJ_CHAN_CONFIG_INJ_TAILGATING_Pos (30UL) /*!< SAR INJ_CHAN_CONFIG: INJ_TAILGATING (Bit 30) */ +#define SAR_INJ_CHAN_CONFIG_INJ_TAILGATING_Msk (0x40000000UL) /*!< SAR INJ_CHAN_CONFIG: INJ_TAILGATING (Bitfield-Mask: 0x01) */ +#define SAR_INJ_CHAN_CONFIG_INJ_START_EN_Pos (31UL) /*!< SAR INJ_CHAN_CONFIG: INJ_START_EN (Bit 31) */ +#define SAR_INJ_CHAN_CONFIG_INJ_START_EN_Msk (0x80000000UL) /*!< SAR INJ_CHAN_CONFIG: INJ_START_EN (Bitfield-Mask: 0x01) */ +/* ==================================================== SAR.INJ_RESULT ===================================================== */ +#define SAR_INJ_RESULT_INJ_RESULT_Pos (0UL) /*!< SAR INJ_RESULT: INJ_RESULT (Bit 0) */ +#define SAR_INJ_RESULT_INJ_RESULT_Msk (0xffffUL) /*!< SAR INJ_RESULT: INJ_RESULT (Bitfield-Mask: 0xffff) */ +#define SAR_INJ_RESULT_INJ_NEWVALUE_Pos (27UL) /*!< SAR INJ_RESULT: INJ_NEWVALUE (Bit 27) */ +#define SAR_INJ_RESULT_INJ_NEWVALUE_Msk (0x8000000UL) /*!< SAR INJ_RESULT: INJ_NEWVALUE (Bitfield-Mask: 0x01) */ +#define SAR_INJ_RESULT_INJ_COLLISION_INTR_MIR_Pos (28UL) /*!< SAR INJ_RESULT: INJ_COLLISION_INTR_MIR (Bit 28) */ +#define SAR_INJ_RESULT_INJ_COLLISION_INTR_MIR_Msk (0x10000000UL) /*!< SAR INJ_RESULT: INJ_COLLISION_INTR_MIR (Bitfield-Mask: 0x01)*/ +#define SAR_INJ_RESULT_INJ_SATURATE_INTR_MIR_Pos (29UL) /*!< SAR INJ_RESULT: INJ_SATURATE_INTR_MIR (Bit 29) */ +#define SAR_INJ_RESULT_INJ_SATURATE_INTR_MIR_Msk (0x20000000UL) /*!< SAR INJ_RESULT: INJ_SATURATE_INTR_MIR (Bitfield-Mask: 0x01)*/ +#define SAR_INJ_RESULT_INJ_RANGE_INTR_MIR_Pos (30UL) /*!< SAR INJ_RESULT: INJ_RANGE_INTR_MIR (Bit 30) */ +#define SAR_INJ_RESULT_INJ_RANGE_INTR_MIR_Msk (0x40000000UL) /*!< SAR INJ_RESULT: INJ_RANGE_INTR_MIR (Bitfield-Mask: 0x01) */ +#define SAR_INJ_RESULT_INJ_EOC_INTR_MIR_Pos (31UL) /*!< SAR INJ_RESULT: INJ_EOC_INTR_MIR (Bit 31) */ +#define SAR_INJ_RESULT_INJ_EOC_INTR_MIR_Msk (0x80000000UL) /*!< SAR INJ_RESULT: INJ_EOC_INTR_MIR (Bitfield-Mask: 0x01) */ +/* ====================================================== SAR.STATUS ======================================================= */ +#define SAR_STATUS_CUR_CHAN_Pos (0UL) /*!< SAR STATUS: CUR_CHAN (Bit 0) */ +#define SAR_STATUS_CUR_CHAN_Msk (0x1fUL) /*!< SAR STATUS: CUR_CHAN (Bitfield-Mask: 0x1f) */ +#define SAR_STATUS_SW_VREF_NEG_Pos (30UL) /*!< SAR STATUS: SW_VREF_NEG (Bit 30) */ +#define SAR_STATUS_SW_VREF_NEG_Msk (0x40000000UL) /*!< SAR STATUS: SW_VREF_NEG (Bitfield-Mask: 0x01) */ +#define SAR_STATUS_BUSY_Pos (31UL) /*!< SAR STATUS: BUSY (Bit 31) */ +#define SAR_STATUS_BUSY_Msk (0x80000000UL) /*!< SAR STATUS: BUSY (Bitfield-Mask: 0x01) */ +/* ===================================================== SAR.AVG_STAT ====================================================== */ +#define SAR_AVG_STAT_CUR_AVG_ACCU_Pos (0UL) /*!< SAR AVG_STAT: CUR_AVG_ACCU (Bit 0) */ +#define SAR_AVG_STAT_CUR_AVG_ACCU_Msk (0xfffffUL) /*!< SAR AVG_STAT: CUR_AVG_ACCU (Bitfield-Mask: 0xfffff) */ +#define SAR_AVG_STAT_INTRLV_BUSY_Pos (23UL) /*!< SAR AVG_STAT: INTRLV_BUSY (Bit 23) */ +#define SAR_AVG_STAT_INTRLV_BUSY_Msk (0x800000UL) /*!< SAR AVG_STAT: INTRLV_BUSY (Bitfield-Mask: 0x01) */ +#define SAR_AVG_STAT_CUR_AVG_CNT_Pos (24UL) /*!< SAR AVG_STAT: CUR_AVG_CNT (Bit 24) */ +#define SAR_AVG_STAT_CUR_AVG_CNT_Msk (0xff000000UL) /*!< SAR AVG_STAT: CUR_AVG_CNT (Bitfield-Mask: 0xff) */ +/* ==================================================== SAR.MUX_SWITCH0 ==================================================== */ +#define SAR_MUX_SWITCH0_MUX_FW_P0_VPLUS_Pos (0UL) /*!< SAR MUX_SWITCH0: MUX_FW_P0_VPLUS (Bit 0) */ +#define SAR_MUX_SWITCH0_MUX_FW_P0_VPLUS_Msk (0x1UL) /*!< SAR MUX_SWITCH0: MUX_FW_P0_VPLUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P1_VPLUS_Pos (1UL) /*!< SAR MUX_SWITCH0: MUX_FW_P1_VPLUS (Bit 1) */ +#define SAR_MUX_SWITCH0_MUX_FW_P1_VPLUS_Msk (0x2UL) /*!< SAR MUX_SWITCH0: MUX_FW_P1_VPLUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P2_VPLUS_Pos (2UL) /*!< SAR MUX_SWITCH0: MUX_FW_P2_VPLUS (Bit 2) */ +#define SAR_MUX_SWITCH0_MUX_FW_P2_VPLUS_Msk (0x4UL) /*!< SAR MUX_SWITCH0: MUX_FW_P2_VPLUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P3_VPLUS_Pos (3UL) /*!< SAR MUX_SWITCH0: MUX_FW_P3_VPLUS (Bit 3) */ +#define SAR_MUX_SWITCH0_MUX_FW_P3_VPLUS_Msk (0x8UL) /*!< SAR MUX_SWITCH0: MUX_FW_P3_VPLUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P4_VPLUS_Pos (4UL) /*!< SAR MUX_SWITCH0: MUX_FW_P4_VPLUS (Bit 4) */ +#define SAR_MUX_SWITCH0_MUX_FW_P4_VPLUS_Msk (0x10UL) /*!< SAR MUX_SWITCH0: MUX_FW_P4_VPLUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P5_VPLUS_Pos (5UL) /*!< SAR MUX_SWITCH0: MUX_FW_P5_VPLUS (Bit 5) */ +#define SAR_MUX_SWITCH0_MUX_FW_P5_VPLUS_Msk (0x20UL) /*!< SAR MUX_SWITCH0: MUX_FW_P5_VPLUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P6_VPLUS_Pos (6UL) /*!< SAR MUX_SWITCH0: MUX_FW_P6_VPLUS (Bit 6) */ +#define SAR_MUX_SWITCH0_MUX_FW_P6_VPLUS_Msk (0x40UL) /*!< SAR MUX_SWITCH0: MUX_FW_P6_VPLUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P7_VPLUS_Pos (7UL) /*!< SAR MUX_SWITCH0: MUX_FW_P7_VPLUS (Bit 7) */ +#define SAR_MUX_SWITCH0_MUX_FW_P7_VPLUS_Msk (0x80UL) /*!< SAR MUX_SWITCH0: MUX_FW_P7_VPLUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P0_VMINUS_Pos (8UL) /*!< SAR MUX_SWITCH0: MUX_FW_P0_VMINUS (Bit 8) */ +#define SAR_MUX_SWITCH0_MUX_FW_P0_VMINUS_Msk (0x100UL) /*!< SAR MUX_SWITCH0: MUX_FW_P0_VMINUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P1_VMINUS_Pos (9UL) /*!< SAR MUX_SWITCH0: MUX_FW_P1_VMINUS (Bit 9) */ +#define SAR_MUX_SWITCH0_MUX_FW_P1_VMINUS_Msk (0x200UL) /*!< SAR MUX_SWITCH0: MUX_FW_P1_VMINUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P2_VMINUS_Pos (10UL) /*!< SAR MUX_SWITCH0: MUX_FW_P2_VMINUS (Bit 10) */ +#define SAR_MUX_SWITCH0_MUX_FW_P2_VMINUS_Msk (0x400UL) /*!< SAR MUX_SWITCH0: MUX_FW_P2_VMINUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P3_VMINUS_Pos (11UL) /*!< SAR MUX_SWITCH0: MUX_FW_P3_VMINUS (Bit 11) */ +#define SAR_MUX_SWITCH0_MUX_FW_P3_VMINUS_Msk (0x800UL) /*!< SAR MUX_SWITCH0: MUX_FW_P3_VMINUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P4_VMINUS_Pos (12UL) /*!< SAR MUX_SWITCH0: MUX_FW_P4_VMINUS (Bit 12) */ +#define SAR_MUX_SWITCH0_MUX_FW_P4_VMINUS_Msk (0x1000UL) /*!< SAR MUX_SWITCH0: MUX_FW_P4_VMINUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P5_VMINUS_Pos (13UL) /*!< SAR MUX_SWITCH0: MUX_FW_P5_VMINUS (Bit 13) */ +#define SAR_MUX_SWITCH0_MUX_FW_P5_VMINUS_Msk (0x2000UL) /*!< SAR MUX_SWITCH0: MUX_FW_P5_VMINUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P6_VMINUS_Pos (14UL) /*!< SAR MUX_SWITCH0: MUX_FW_P6_VMINUS (Bit 14) */ +#define SAR_MUX_SWITCH0_MUX_FW_P6_VMINUS_Msk (0x4000UL) /*!< SAR MUX_SWITCH0: MUX_FW_P6_VMINUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P7_VMINUS_Pos (15UL) /*!< SAR MUX_SWITCH0: MUX_FW_P7_VMINUS (Bit 15) */ +#define SAR_MUX_SWITCH0_MUX_FW_P7_VMINUS_Msk (0x8000UL) /*!< SAR MUX_SWITCH0: MUX_FW_P7_VMINUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_VSSA_VMINUS_Pos (16UL) /*!< SAR MUX_SWITCH0: MUX_FW_VSSA_VMINUS (Bit 16) */ +#define SAR_MUX_SWITCH0_MUX_FW_VSSA_VMINUS_Msk (0x10000UL) /*!< SAR MUX_SWITCH0: MUX_FW_VSSA_VMINUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_TEMP_VPLUS_Pos (17UL) /*!< SAR MUX_SWITCH0: MUX_FW_TEMP_VPLUS (Bit 17) */ +#define SAR_MUX_SWITCH0_MUX_FW_TEMP_VPLUS_Msk (0x20000UL) /*!< SAR MUX_SWITCH0: MUX_FW_TEMP_VPLUS (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_AMUXBUSA_VPLUS_Pos (18UL) /*!< SAR MUX_SWITCH0: MUX_FW_AMUXBUSA_VPLUS (Bit 18) */ +#define SAR_MUX_SWITCH0_MUX_FW_AMUXBUSA_VPLUS_Msk (0x40000UL) /*!< SAR MUX_SWITCH0: MUX_FW_AMUXBUSA_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH0_MUX_FW_AMUXBUSB_VPLUS_Pos (19UL) /*!< SAR MUX_SWITCH0: MUX_FW_AMUXBUSB_VPLUS (Bit 19) */ +#define SAR_MUX_SWITCH0_MUX_FW_AMUXBUSB_VPLUS_Msk (0x80000UL) /*!< SAR MUX_SWITCH0: MUX_FW_AMUXBUSB_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH0_MUX_FW_AMUXBUSA_VMINUS_Pos (20UL) /*!< SAR MUX_SWITCH0: MUX_FW_AMUXBUSA_VMINUS (Bit 20) */ +#define SAR_MUX_SWITCH0_MUX_FW_AMUXBUSA_VMINUS_Msk (0x100000UL) /*!< SAR MUX_SWITCH0: MUX_FW_AMUXBUSA_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH0_MUX_FW_AMUXBUSB_VMINUS_Pos (21UL) /*!< SAR MUX_SWITCH0: MUX_FW_AMUXBUSB_VMINUS (Bit 21) */ +#define SAR_MUX_SWITCH0_MUX_FW_AMUXBUSB_VMINUS_Msk (0x200000UL) /*!< SAR MUX_SWITCH0: MUX_FW_AMUXBUSB_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH0_MUX_FW_SARBUS0_VPLUS_Pos (22UL) /*!< SAR MUX_SWITCH0: MUX_FW_SARBUS0_VPLUS (Bit 22) */ +#define SAR_MUX_SWITCH0_MUX_FW_SARBUS0_VPLUS_Msk (0x400000UL) /*!< SAR MUX_SWITCH0: MUX_FW_SARBUS0_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH0_MUX_FW_SARBUS1_VPLUS_Pos (23UL) /*!< SAR MUX_SWITCH0: MUX_FW_SARBUS1_VPLUS (Bit 23) */ +#define SAR_MUX_SWITCH0_MUX_FW_SARBUS1_VPLUS_Msk (0x800000UL) /*!< SAR MUX_SWITCH0: MUX_FW_SARBUS1_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH0_MUX_FW_SARBUS0_VMINUS_Pos (24UL) /*!< SAR MUX_SWITCH0: MUX_FW_SARBUS0_VMINUS (Bit 24) */ +#define SAR_MUX_SWITCH0_MUX_FW_SARBUS0_VMINUS_Msk (0x1000000UL) /*!< SAR MUX_SWITCH0: MUX_FW_SARBUS0_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH0_MUX_FW_SARBUS1_VMINUS_Pos (25UL) /*!< SAR MUX_SWITCH0: MUX_FW_SARBUS1_VMINUS (Bit 25) */ +#define SAR_MUX_SWITCH0_MUX_FW_SARBUS1_VMINUS_Msk (0x2000000UL) /*!< SAR MUX_SWITCH0: MUX_FW_SARBUS1_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH0_MUX_FW_P4_COREIO0_Pos (26UL) /*!< SAR MUX_SWITCH0: MUX_FW_P4_COREIO0 (Bit 26) */ +#define SAR_MUX_SWITCH0_MUX_FW_P4_COREIO0_Msk (0x4000000UL) /*!< SAR MUX_SWITCH0: MUX_FW_P4_COREIO0 (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P5_COREIO1_Pos (27UL) /*!< SAR MUX_SWITCH0: MUX_FW_P5_COREIO1 (Bit 27) */ +#define SAR_MUX_SWITCH0_MUX_FW_P5_COREIO1_Msk (0x8000000UL) /*!< SAR MUX_SWITCH0: MUX_FW_P5_COREIO1 (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P6_COREIO2_Pos (28UL) /*!< SAR MUX_SWITCH0: MUX_FW_P6_COREIO2 (Bit 28) */ +#define SAR_MUX_SWITCH0_MUX_FW_P6_COREIO2_Msk (0x10000000UL) /*!< SAR MUX_SWITCH0: MUX_FW_P6_COREIO2 (Bitfield-Mask: 0x01) */ +#define SAR_MUX_SWITCH0_MUX_FW_P7_COREIO3_Pos (29UL) /*!< SAR MUX_SWITCH0: MUX_FW_P7_COREIO3 (Bit 29) */ +#define SAR_MUX_SWITCH0_MUX_FW_P7_COREIO3_Msk (0x20000000UL) /*!< SAR MUX_SWITCH0: MUX_FW_P7_COREIO3 (Bitfield-Mask: 0x01) */ +/* ================================================= SAR.MUX_SWITCH_CLEAR0 ================================================= */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P0_VPLUS_Pos (0UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P0_VPLUS (Bit 0) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P0_VPLUS_Msk (0x1UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P0_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P1_VPLUS_Pos (1UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P1_VPLUS (Bit 1) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P1_VPLUS_Msk (0x2UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P1_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P2_VPLUS_Pos (2UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P2_VPLUS (Bit 2) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P2_VPLUS_Msk (0x4UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P2_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P3_VPLUS_Pos (3UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P3_VPLUS (Bit 3) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P3_VPLUS_Msk (0x8UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P3_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P4_VPLUS_Pos (4UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P4_VPLUS (Bit 4) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P4_VPLUS_Msk (0x10UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P4_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P5_VPLUS_Pos (5UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P5_VPLUS (Bit 5) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P5_VPLUS_Msk (0x20UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P5_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P6_VPLUS_Pos (6UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P6_VPLUS (Bit 6) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P6_VPLUS_Msk (0x40UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P6_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P7_VPLUS_Pos (7UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P7_VPLUS (Bit 7) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P7_VPLUS_Msk (0x80UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P7_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P0_VMINUS_Pos (8UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P0_VMINUS (Bit 8) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P0_VMINUS_Msk (0x100UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P0_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P1_VMINUS_Pos (9UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P1_VMINUS (Bit 9) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P1_VMINUS_Msk (0x200UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P1_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P2_VMINUS_Pos (10UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P2_VMINUS (Bit 10) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P2_VMINUS_Msk (0x400UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P2_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P3_VMINUS_Pos (11UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P3_VMINUS (Bit 11) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P3_VMINUS_Msk (0x800UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P3_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P4_VMINUS_Pos (12UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P4_VMINUS (Bit 12) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P4_VMINUS_Msk (0x1000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P4_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P5_VMINUS_Pos (13UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P5_VMINUS (Bit 13) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P5_VMINUS_Msk (0x2000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P5_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P6_VMINUS_Pos (14UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P6_VMINUS (Bit 14) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P6_VMINUS_Msk (0x4000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P6_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P7_VMINUS_Pos (15UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P7_VMINUS (Bit 15) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P7_VMINUS_Msk (0x8000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P7_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_VSSA_VMINUS_Pos (16UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_VSSA_VMINUS (Bit 16) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_VSSA_VMINUS_Msk (0x10000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_VSSA_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_TEMP_VPLUS_Pos (17UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_TEMP_VPLUS (Bit 17) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_TEMP_VPLUS_Msk (0x20000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_TEMP_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_AMUXBUSA_VPLUS_Pos (18UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_AMUXBUSA_VPLUS (Bit 18) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_AMUXBUSA_VPLUS_Msk (0x40000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_AMUXBUSA_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_AMUXBUSB_VPLUS_Pos (19UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_AMUXBUSB_VPLUS (Bit 19) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_AMUXBUSB_VPLUS_Msk (0x80000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_AMUXBUSB_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_AMUXBUSA_VMINUS_Pos (20UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_AMUXBUSA_VMINUS (Bit 20) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_AMUXBUSA_VMINUS_Msk (0x100000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_AMUXBUSA_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_AMUXBUSB_VMINUS_Pos (21UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_AMUXBUSB_VMINUS (Bit 21) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_AMUXBUSB_VMINUS_Msk (0x200000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_AMUXBUSB_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_SARBUS0_VPLUS_Pos (22UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_SARBUS0_VPLUS (Bit 22) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_SARBUS0_VPLUS_Msk (0x400000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_SARBUS0_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_SARBUS1_VPLUS_Pos (23UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_SARBUS1_VPLUS (Bit 23) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_SARBUS1_VPLUS_Msk (0x800000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_SARBUS1_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_SARBUS0_VMINUS_Pos (24UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_SARBUS0_VMINUS (Bit 24) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_SARBUS0_VMINUS_Msk (0x1000000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_SARBUS0_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_SARBUS1_VMINUS_Pos (25UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_SARBUS1_VMINUS (Bit 25) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_SARBUS1_VMINUS_Msk (0x2000000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_SARBUS1_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P4_COREIO0_Pos (26UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P4_COREIO0 (Bit 26) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P4_COREIO0_Msk (0x4000000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P4_COREIO0 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P5_COREIO1_Pos (27UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P5_COREIO1 (Bit 27) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P5_COREIO1_Msk (0x8000000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P5_COREIO1 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P6_COREIO2_Pos (28UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P6_COREIO2 (Bit 28) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P6_COREIO2_Msk (0x10000000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P6_COREIO2 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P7_COREIO3_Pos (29UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P7_COREIO3 (Bit 29) */ +#define SAR_MUX_SWITCH_CLEAR0_MUX_FW_P7_COREIO3_Msk (0x20000000UL) /*!< SAR MUX_SWITCH_CLEAR0: MUX_FW_P7_COREIO3 (Bitfield-Mask: 0x01)*/ +/* ================================================ SAR.MUX_SWITCH_DS_CTRL ================================================= */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P0_Pos (0UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P0 (Bit 0) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P0_Msk (0x1UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P0 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P1_Pos (1UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P1 (Bit 1) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P1_Msk (0x2UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P1 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P2_Pos (2UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P2 (Bit 2) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P2_Msk (0x4UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P2 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P3_Pos (3UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P3 (Bit 3) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P3_Msk (0x8UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P3 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P4_Pos (4UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P4 (Bit 4) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P4_Msk (0x10UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P4 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P5_Pos (5UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P5 (Bit 5) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P5_Msk (0x20UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P5 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P6_Pos (6UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P6 (Bit 6) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P6_Msk (0x40UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P6 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P7_Pos (7UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P7 (Bit 7) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_P7_Msk (0x80UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_P7 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_VSSA_Pos (16UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_VSSA (Bit 16) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_VSSA_Msk (0x10000UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_VSSA (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_TEMP_Pos (17UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_TEMP (Bit 17) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_TEMP_Msk (0x20000UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_TEMP (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_AMUXBUSA_Pos (18UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_AMUXBUSA (Bit 18) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_AMUXBUSA_Msk (0x40000UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_AMUXBUSA (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_AMUXBUSB_Pos (19UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_AMUXBUSB (Bit 19) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_AMUXBUSB_Msk (0x80000UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_AMUXBUSB (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_SARBUS0_Pos (22UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_SARBUS0 (Bit 22) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_SARBUS0_Msk (0x400000UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_SARBUS0 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_SARBUS1_Pos (23UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_SARBUS1 (Bit 23) */ +#define SAR_MUX_SWITCH_DS_CTRL_MUX_DS_CTRL_SARBUS1_Msk (0x800000UL) /*!< SAR MUX_SWITCH_DS_CTRL: MUX_DS_CTRL_SARBUS1 (Bitfield-Mask: 0x01)*/ +/* ================================================ SAR.MUX_SWITCH_SQ_CTRL ================================================= */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P0_Pos (0UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P0 (Bit 0) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P0_Msk (0x1UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P0 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P1_Pos (1UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P1 (Bit 1) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P1_Msk (0x2UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P1 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P2_Pos (2UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P2 (Bit 2) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P2_Msk (0x4UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P2 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P3_Pos (3UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P3 (Bit 3) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P3_Msk (0x8UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P3 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P4_Pos (4UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P4 (Bit 4) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P4_Msk (0x10UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P4 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P5_Pos (5UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P5 (Bit 5) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P5_Msk (0x20UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P5 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P6_Pos (6UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P6 (Bit 6) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P6_Msk (0x40UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P6 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P7_Pos (7UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P7 (Bit 7) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P7_Msk (0x80UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_P7 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_VSSA_Pos (16UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_VSSA (Bit 16) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_VSSA_Msk (0x10000UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_VSSA (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_TEMP_Pos (17UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_TEMP (Bit 17) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_TEMP_Msk (0x20000UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_TEMP (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_AMUXBUSA_Pos (18UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_AMUXBUSA (Bit 18) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_AMUXBUSA_Msk (0x40000UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_AMUXBUSA (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_AMUXBUSB_Pos (19UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_AMUXBUSB (Bit 19) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_AMUXBUSB_Msk (0x80000UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_AMUXBUSB (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_SARBUS0_Pos (22UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_SARBUS0 (Bit 22) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_SARBUS0_Msk (0x400000UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_SARBUS0 (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_SARBUS1_Pos (23UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_SARBUS1 (Bit 23) */ +#define SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_SARBUS1_Msk (0x800000UL) /*!< SAR MUX_SWITCH_SQ_CTRL: MUX_SQ_CTRL_SARBUS1 (Bitfield-Mask: 0x01)*/ +/* ================================================= SAR.MUX_SWITCH_STATUS ================================================= */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P0_VPLUS_Pos (0UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P0_VPLUS (Bit 0) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P0_VPLUS_Msk (0x1UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P0_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P1_VPLUS_Pos (1UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P1_VPLUS (Bit 1) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P1_VPLUS_Msk (0x2UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P1_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P2_VPLUS_Pos (2UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P2_VPLUS (Bit 2) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P2_VPLUS_Msk (0x4UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P2_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P3_VPLUS_Pos (3UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P3_VPLUS (Bit 3) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P3_VPLUS_Msk (0x8UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P3_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P4_VPLUS_Pos (4UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P4_VPLUS (Bit 4) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P4_VPLUS_Msk (0x10UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P4_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P5_VPLUS_Pos (5UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P5_VPLUS (Bit 5) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P5_VPLUS_Msk (0x20UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P5_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P6_VPLUS_Pos (6UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P6_VPLUS (Bit 6) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P6_VPLUS_Msk (0x40UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P6_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P7_VPLUS_Pos (7UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P7_VPLUS (Bit 7) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P7_VPLUS_Msk (0x80UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P7_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P0_VMINUS_Pos (8UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P0_VMINUS (Bit 8) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P0_VMINUS_Msk (0x100UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P0_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P1_VMINUS_Pos (9UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P1_VMINUS (Bit 9) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P1_VMINUS_Msk (0x200UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P1_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P2_VMINUS_Pos (10UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P2_VMINUS (Bit 10) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P2_VMINUS_Msk (0x400UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P2_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P3_VMINUS_Pos (11UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P3_VMINUS (Bit 11) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P3_VMINUS_Msk (0x800UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P3_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P4_VMINUS_Pos (12UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P4_VMINUS (Bit 12) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P4_VMINUS_Msk (0x1000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P4_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P5_VMINUS_Pos (13UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P5_VMINUS (Bit 13) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P5_VMINUS_Msk (0x2000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P5_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P6_VMINUS_Pos (14UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P6_VMINUS (Bit 14) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P6_VMINUS_Msk (0x4000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P6_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P7_VMINUS_Pos (15UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P7_VMINUS (Bit 15) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_P7_VMINUS_Msk (0x8000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_P7_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_VSSA_VMINUS_Pos (16UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_VSSA_VMINUS (Bit 16) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_VSSA_VMINUS_Msk (0x10000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_VSSA_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_TEMP_VPLUS_Pos (17UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_TEMP_VPLUS (Bit 17) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_TEMP_VPLUS_Msk (0x20000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_TEMP_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_AMUXBUSA_VPLUS_Pos (18UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_AMUXBUSA_VPLUS (Bit 18) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_AMUXBUSA_VPLUS_Msk (0x40000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_AMUXBUSA_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_AMUXBUSB_VPLUS_Pos (19UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_AMUXBUSB_VPLUS (Bit 19) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_AMUXBUSB_VPLUS_Msk (0x80000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_AMUXBUSB_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_AMUXBUSA_VMINUS_Pos (20UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_AMUXBUSA_VMINUS (Bit 20) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_AMUXBUSA_VMINUS_Msk (0x100000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_AMUXBUSA_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_AMUXBUSB_VMINUS_Pos (21UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_AMUXBUSB_VMINUS (Bit 21) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_AMUXBUSB_VMINUS_Msk (0x200000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_AMUXBUSB_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_SARBUS0_VPLUS_Pos (22UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_SARBUS0_VPLUS (Bit 22) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_SARBUS0_VPLUS_Msk (0x400000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_SARBUS0_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_SARBUS1_VPLUS_Pos (23UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_SARBUS1_VPLUS (Bit 23) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_SARBUS1_VPLUS_Msk (0x800000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_SARBUS1_VPLUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_SARBUS0_VMINUS_Pos (24UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_SARBUS0_VMINUS (Bit 24) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_SARBUS0_VMINUS_Msk (0x1000000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_SARBUS0_VMINUS (Bitfield-Mask: 0x01)*/ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_SARBUS1_VMINUS_Pos (25UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_SARBUS1_VMINUS (Bit 25) */ +#define SAR_MUX_SWITCH_STATUS_MUX_FW_SARBUS1_VMINUS_Msk (0x2000000UL) /*!< SAR MUX_SWITCH_STATUS: MUX_FW_SARBUS1_VMINUS (Bitfield-Mask: 0x01)*/ +/* ===================================================== SAR.ANA_TRIM0 ===================================================== */ +#define SAR_ANA_TRIM0_CAP_TRIM_Pos (0UL) /*!< SAR ANA_TRIM0: CAP_TRIM (Bit 0) */ +#define SAR_ANA_TRIM0_CAP_TRIM_Msk (0x1fUL) /*!< SAR ANA_TRIM0: CAP_TRIM (Bitfield-Mask: 0x1f) */ +#define SAR_ANA_TRIM0_TRIMUNIT_Pos (5UL) /*!< SAR ANA_TRIM0: TRIMUNIT (Bit 5) */ +#define SAR_ANA_TRIM0_TRIMUNIT_Msk (0x20UL) /*!< SAR ANA_TRIM0: TRIMUNIT (Bitfield-Mask: 0x01) */ +/* ===================================================== SAR.ANA_TRIM1 ===================================================== */ +#define SAR_ANA_TRIM1_SAR_REF_BUF_TRIM_Pos (0UL) /*!< SAR ANA_TRIM1: SAR_REF_BUF_TRIM (Bit 0) */ +#define SAR_ANA_TRIM1_SAR_REF_BUF_TRIM_Msk (0x3fUL) /*!< SAR ANA_TRIM1: SAR_REF_BUF_TRIM (Bitfield-Mask: 0x3f) */ + + +#endif /* _CYIP_SAR_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_scb.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_scb.h new file mode 100644 index 0000000000..4af1c623a6 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_scb.h @@ -0,0 +1,755 @@ +/***************************************************************************//** +* \file cyip_scb.h +* +* \brief +* SCB IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_SCB_H_ +#define _CYIP_SCB_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ SCB ================ */ +/* =========================================================================================================================== */ + +#define SCB_SECTION_SIZE 0x00010000UL + +/** + * \brief Serial Communications Block (SPI/UART/I2C) (CySCB) + */ +typedef struct { /*!< CySCB Structure */ + __IOM uint32_t CTRL; /*!< 0x00000000 Generic control */ + __IM uint32_t STATUS; /*!< 0x00000004 Generic status */ + __IOM uint32_t CMD_RESP_CTRL; /*!< 0x00000008 Command/response control */ + __IM uint32_t CMD_RESP_STATUS; /*!< 0x0000000C Command/response status */ + __IM uint32_t RESERVED[4]; + __IOM uint32_t SPI_CTRL; /*!< 0x00000020 SPI control */ + __IM uint32_t SPI_STATUS; /*!< 0x00000024 SPI status */ + __IM uint32_t RESERVED1[6]; + __IOM uint32_t UART_CTRL; /*!< 0x00000040 UART control */ + __IOM uint32_t UART_TX_CTRL; /*!< 0x00000044 UART transmitter control */ + __IOM uint32_t UART_RX_CTRL; /*!< 0x00000048 UART receiver control */ + __IM uint32_t UART_RX_STATUS; /*!< 0x0000004C UART receiver status */ + __IOM uint32_t UART_FLOW_CTRL; /*!< 0x00000050 UART flow control */ + __IM uint32_t RESERVED2[3]; + __IOM uint32_t I2C_CTRL; /*!< 0x00000060 I2C control */ + __IM uint32_t I2C_STATUS; /*!< 0x00000064 I2C status */ + __IOM uint32_t I2C_M_CMD; /*!< 0x00000068 I2C master command */ + __IOM uint32_t I2C_S_CMD; /*!< 0x0000006C I2C slave command */ + __IOM uint32_t I2C_CFG; /*!< 0x00000070 I2C configuration */ + __IM uint32_t RESERVED3[35]; + __IOM uint32_t DDFT_CTRL; /*!< 0x00000100 Digital DfT control */ + __IM uint32_t RESERVED4[63]; + __IOM uint32_t TX_CTRL; /*!< 0x00000200 Transmitter control */ + __IOM uint32_t TX_FIFO_CTRL; /*!< 0x00000204 Transmitter FIFO control */ + __IM uint32_t TX_FIFO_STATUS; /*!< 0x00000208 Transmitter FIFO status */ + __IM uint32_t RESERVED5[13]; + __OM uint32_t TX_FIFO_WR; /*!< 0x00000240 Transmitter FIFO write */ + __IM uint32_t RESERVED6[47]; + __IOM uint32_t RX_CTRL; /*!< 0x00000300 Receiver control */ + __IOM uint32_t RX_FIFO_CTRL; /*!< 0x00000304 Receiver FIFO control */ + __IM uint32_t RX_FIFO_STATUS; /*!< 0x00000308 Receiver FIFO status */ + __IM uint32_t RESERVED7; + __IOM uint32_t RX_MATCH; /*!< 0x00000310 Slave address and mask */ + __IM uint32_t RESERVED8[11]; + __IM uint32_t RX_FIFO_RD; /*!< 0x00000340 Receiver FIFO read */ + __IM uint32_t RX_FIFO_RD_SILENT; /*!< 0x00000344 Receiver FIFO read silent */ + __IM uint32_t RESERVED9[46]; + __IOM uint32_t EZ_DATA[512]; /*!< 0x00000400 Memory buffer */ + __IM uint32_t RESERVED10[128]; + __IM uint32_t INTR_CAUSE; /*!< 0x00000E00 Active clocked interrupt signal */ + __IM uint32_t RESERVED11[31]; + __IOM uint32_t INTR_I2C_EC; /*!< 0x00000E80 Externally clocked I2C interrupt request */ + __IM uint32_t RESERVED12; + __IOM uint32_t INTR_I2C_EC_MASK; /*!< 0x00000E88 Externally clocked I2C interrupt mask */ + __IM uint32_t INTR_I2C_EC_MASKED; /*!< 0x00000E8C Externally clocked I2C interrupt masked */ + __IM uint32_t RESERVED13[12]; + __IOM uint32_t INTR_SPI_EC; /*!< 0x00000EC0 Externally clocked SPI interrupt request */ + __IM uint32_t RESERVED14; + __IOM uint32_t INTR_SPI_EC_MASK; /*!< 0x00000EC8 Externally clocked SPI interrupt mask */ + __IM uint32_t INTR_SPI_EC_MASKED; /*!< 0x00000ECC Externally clocked SPI interrupt masked */ + __IM uint32_t RESERVED15[12]; + __IOM uint32_t INTR_M; /*!< 0x00000F00 Master interrupt request */ + __IOM uint32_t INTR_M_SET; /*!< 0x00000F04 Master interrupt set request */ + __IOM uint32_t INTR_M_MASK; /*!< 0x00000F08 Master interrupt mask */ + __IM uint32_t INTR_M_MASKED; /*!< 0x00000F0C Master interrupt masked request */ + __IM uint32_t RESERVED16[12]; + __IOM uint32_t INTR_S; /*!< 0x00000F40 Slave interrupt request */ + __IOM uint32_t INTR_S_SET; /*!< 0x00000F44 Slave interrupt set request */ + __IOM uint32_t INTR_S_MASK; /*!< 0x00000F48 Slave interrupt mask */ + __IM uint32_t INTR_S_MASKED; /*!< 0x00000F4C Slave interrupt masked request */ + __IM uint32_t RESERVED17[12]; + __IOM uint32_t INTR_TX; /*!< 0x00000F80 Transmitter interrupt request */ + __IOM uint32_t INTR_TX_SET; /*!< 0x00000F84 Transmitter interrupt set request */ + __IOM uint32_t INTR_TX_MASK; /*!< 0x00000F88 Transmitter interrupt mask */ + __IM uint32_t INTR_TX_MASKED; /*!< 0x00000F8C Transmitter interrupt masked request */ + __IM uint32_t RESERVED18[12]; + __IOM uint32_t INTR_RX; /*!< 0x00000FC0 Receiver interrupt request */ + __IOM uint32_t INTR_RX_SET; /*!< 0x00000FC4 Receiver interrupt set request */ + __IOM uint32_t INTR_RX_MASK; /*!< 0x00000FC8 Receiver interrupt mask */ + __IM uint32_t INTR_RX_MASKED; /*!< 0x00000FCC Receiver interrupt masked request */ +} CySCB_Type; /*!< Size = 4048 (0xFD0) */ + + +/* ======================================================= SCB.CTRL ======================================================== */ +#define SCB_CTRL_OVS_Pos (0UL) /*!< SCB CTRL: OVS (Bit 0) */ +#define SCB_CTRL_OVS_Msk (0xfUL) /*!< SCB CTRL: OVS (Bitfield-Mask: 0x0f) */ +#define SCB_CTRL_EC_AM_MODE_Pos (8UL) /*!< SCB CTRL: EC_AM_MODE (Bit 8) */ +#define SCB_CTRL_EC_AM_MODE_Msk (0x100UL) /*!< SCB CTRL: EC_AM_MODE (Bitfield-Mask: 0x01) */ +#define SCB_CTRL_EC_OP_MODE_Pos (9UL) /*!< SCB CTRL: EC_OP_MODE (Bit 9) */ +#define SCB_CTRL_EC_OP_MODE_Msk (0x200UL) /*!< SCB CTRL: EC_OP_MODE (Bitfield-Mask: 0x01) */ +#define SCB_CTRL_EZ_MODE_Pos (10UL) /*!< SCB CTRL: EZ_MODE (Bit 10) */ +#define SCB_CTRL_EZ_MODE_Msk (0x400UL) /*!< SCB CTRL: EZ_MODE (Bitfield-Mask: 0x01) */ +#define SCB_CTRL_BYTE_MODE_Pos (11UL) /*!< SCB CTRL: BYTE_MODE (Bit 11) */ +#define SCB_CTRL_BYTE_MODE_Msk (0x800UL) /*!< SCB CTRL: BYTE_MODE (Bitfield-Mask: 0x01) */ +#define SCB_CTRL_CMD_RESP_MODE_Pos (12UL) /*!< SCB CTRL: CMD_RESP_MODE (Bit 12) */ +#define SCB_CTRL_CMD_RESP_MODE_Msk (0x1000UL) /*!< SCB CTRL: CMD_RESP_MODE (Bitfield-Mask: 0x01) */ +#define SCB_CTRL_ADDR_ACCEPT_Pos (16UL) /*!< SCB CTRL: ADDR_ACCEPT (Bit 16) */ +#define SCB_CTRL_ADDR_ACCEPT_Msk (0x10000UL) /*!< SCB CTRL: ADDR_ACCEPT (Bitfield-Mask: 0x01) */ +#define SCB_CTRL_BLOCK_Pos (17UL) /*!< SCB CTRL: BLOCK (Bit 17) */ +#define SCB_CTRL_BLOCK_Msk (0x20000UL) /*!< SCB CTRL: BLOCK (Bitfield-Mask: 0x01) */ +#define SCB_CTRL_MODE_Pos (24UL) /*!< SCB CTRL: MODE (Bit 24) */ +#define SCB_CTRL_MODE_Msk (0x3000000UL) /*!< SCB CTRL: MODE (Bitfield-Mask: 0x03) */ +#define SCB_CTRL_ENABLED_Pos (31UL) /*!< SCB CTRL: ENABLED (Bit 31) */ +#define SCB_CTRL_ENABLED_Msk (0x80000000UL) /*!< SCB CTRL: ENABLED (Bitfield-Mask: 0x01) */ +/* ====================================================== SCB.STATUS ======================================================= */ +#define SCB_STATUS_EC_BUSY_Pos (0UL) /*!< SCB STATUS: EC_BUSY (Bit 0) */ +#define SCB_STATUS_EC_BUSY_Msk (0x1UL) /*!< SCB STATUS: EC_BUSY (Bitfield-Mask: 0x01) */ +/* =================================================== SCB.CMD_RESP_CTRL =================================================== */ +#define SCB_CMD_RESP_CTRL_BASE_RD_ADDR_Pos (0UL) /*!< SCB CMD_RESP_CTRL: BASE_RD_ADDR (Bit 0) */ +#define SCB_CMD_RESP_CTRL_BASE_RD_ADDR_Msk (0x1ffUL) /*!< SCB CMD_RESP_CTRL: BASE_RD_ADDR (Bitfield-Mask: 0x1ff) */ +#define SCB_CMD_RESP_CTRL_BASE_WR_ADDR_Pos (16UL) /*!< SCB CMD_RESP_CTRL: BASE_WR_ADDR (Bit 16) */ +#define SCB_CMD_RESP_CTRL_BASE_WR_ADDR_Msk (0x1ff0000UL) /*!< SCB CMD_RESP_CTRL: BASE_WR_ADDR (Bitfield-Mask: 0x1ff) */ +/* ================================================== SCB.CMD_RESP_STATUS ================================================== */ +#define SCB_CMD_RESP_STATUS_CURR_RD_ADDR_Pos (0UL) /*!< SCB CMD_RESP_STATUS: CURR_RD_ADDR (Bit 0) */ +#define SCB_CMD_RESP_STATUS_CURR_RD_ADDR_Msk (0x1ffUL) /*!< SCB CMD_RESP_STATUS: CURR_RD_ADDR (Bitfield-Mask: 0x1ff) */ +#define SCB_CMD_RESP_STATUS_CURR_WR_ADDR_Pos (16UL) /*!< SCB CMD_RESP_STATUS: CURR_WR_ADDR (Bit 16) */ +#define SCB_CMD_RESP_STATUS_CURR_WR_ADDR_Msk (0x1ff0000UL) /*!< SCB CMD_RESP_STATUS: CURR_WR_ADDR (Bitfield-Mask: 0x1ff) */ +#define SCB_CMD_RESP_STATUS_CMD_RESP_EC_BUS_BUSY_Pos (30UL) /*!< SCB CMD_RESP_STATUS: CMD_RESP_EC_BUS_BUSY (Bit 30) */ +#define SCB_CMD_RESP_STATUS_CMD_RESP_EC_BUS_BUSY_Msk (0x40000000UL) /*!< SCB CMD_RESP_STATUS: CMD_RESP_EC_BUS_BUSY (Bitfield-Mask: 0x01)*/ +#define SCB_CMD_RESP_STATUS_CMD_RESP_EC_BUSY_Pos (31UL) /*!< SCB CMD_RESP_STATUS: CMD_RESP_EC_BUSY (Bit 31) */ +#define SCB_CMD_RESP_STATUS_CMD_RESP_EC_BUSY_Msk (0x80000000UL) /*!< SCB CMD_RESP_STATUS: CMD_RESP_EC_BUSY (Bitfield-Mask: 0x01)*/ +/* ===================================================== SCB.SPI_CTRL ====================================================== */ +#define SCB_SPI_CTRL_SSEL_CONTINUOUS_Pos (0UL) /*!< SCB SPI_CTRL: SSEL_CONTINUOUS (Bit 0) */ +#define SCB_SPI_CTRL_SSEL_CONTINUOUS_Msk (0x1UL) /*!< SCB SPI_CTRL: SSEL_CONTINUOUS (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_SELECT_PRECEDE_Pos (1UL) /*!< SCB SPI_CTRL: SELECT_PRECEDE (Bit 1) */ +#define SCB_SPI_CTRL_SELECT_PRECEDE_Msk (0x2UL) /*!< SCB SPI_CTRL: SELECT_PRECEDE (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_CPHA_Pos (2UL) /*!< SCB SPI_CTRL: CPHA (Bit 2) */ +#define SCB_SPI_CTRL_CPHA_Msk (0x4UL) /*!< SCB SPI_CTRL: CPHA (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_CPOL_Pos (3UL) /*!< SCB SPI_CTRL: CPOL (Bit 3) */ +#define SCB_SPI_CTRL_CPOL_Msk (0x8UL) /*!< SCB SPI_CTRL: CPOL (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_LATE_MISO_SAMPLE_Pos (4UL) /*!< SCB SPI_CTRL: LATE_MISO_SAMPLE (Bit 4) */ +#define SCB_SPI_CTRL_LATE_MISO_SAMPLE_Msk (0x10UL) /*!< SCB SPI_CTRL: LATE_MISO_SAMPLE (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_SCLK_CONTINUOUS_Pos (5UL) /*!< SCB SPI_CTRL: SCLK_CONTINUOUS (Bit 5) */ +#define SCB_SPI_CTRL_SCLK_CONTINUOUS_Msk (0x20UL) /*!< SCB SPI_CTRL: SCLK_CONTINUOUS (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_SSEL_POLARITY0_Pos (8UL) /*!< SCB SPI_CTRL: SSEL_POLARITY0 (Bit 8) */ +#define SCB_SPI_CTRL_SSEL_POLARITY0_Msk (0x100UL) /*!< SCB SPI_CTRL: SSEL_POLARITY0 (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_SSEL_POLARITY1_Pos (9UL) /*!< SCB SPI_CTRL: SSEL_POLARITY1 (Bit 9) */ +#define SCB_SPI_CTRL_SSEL_POLARITY1_Msk (0x200UL) /*!< SCB SPI_CTRL: SSEL_POLARITY1 (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_SSEL_POLARITY2_Pos (10UL) /*!< SCB SPI_CTRL: SSEL_POLARITY2 (Bit 10) */ +#define SCB_SPI_CTRL_SSEL_POLARITY2_Msk (0x400UL) /*!< SCB SPI_CTRL: SSEL_POLARITY2 (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_SSEL_POLARITY3_Pos (11UL) /*!< SCB SPI_CTRL: SSEL_POLARITY3 (Bit 11) */ +#define SCB_SPI_CTRL_SSEL_POLARITY3_Msk (0x800UL) /*!< SCB SPI_CTRL: SSEL_POLARITY3 (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_LOOPBACK_Pos (16UL) /*!< SCB SPI_CTRL: LOOPBACK (Bit 16) */ +#define SCB_SPI_CTRL_LOOPBACK_Msk (0x10000UL) /*!< SCB SPI_CTRL: LOOPBACK (Bitfield-Mask: 0x01) */ +#define SCB_SPI_CTRL_MODE_Pos (24UL) /*!< SCB SPI_CTRL: MODE (Bit 24) */ +#define SCB_SPI_CTRL_MODE_Msk (0x3000000UL) /*!< SCB SPI_CTRL: MODE (Bitfield-Mask: 0x03) */ +#define SCB_SPI_CTRL_SSEL_Pos (26UL) /*!< SCB SPI_CTRL: SSEL (Bit 26) */ +#define SCB_SPI_CTRL_SSEL_Msk (0xc000000UL) /*!< SCB SPI_CTRL: SSEL (Bitfield-Mask: 0x03) */ +#define SCB_SPI_CTRL_MASTER_MODE_Pos (31UL) /*!< SCB SPI_CTRL: MASTER_MODE (Bit 31) */ +#define SCB_SPI_CTRL_MASTER_MODE_Msk (0x80000000UL) /*!< SCB SPI_CTRL: MASTER_MODE (Bitfield-Mask: 0x01) */ +/* ==================================================== SCB.SPI_STATUS ===================================================== */ +#define SCB_SPI_STATUS_BUS_BUSY_Pos (0UL) /*!< SCB SPI_STATUS: BUS_BUSY (Bit 0) */ +#define SCB_SPI_STATUS_BUS_BUSY_Msk (0x1UL) /*!< SCB SPI_STATUS: BUS_BUSY (Bitfield-Mask: 0x01) */ +#define SCB_SPI_STATUS_SPI_EC_BUSY_Pos (1UL) /*!< SCB SPI_STATUS: SPI_EC_BUSY (Bit 1) */ +#define SCB_SPI_STATUS_SPI_EC_BUSY_Msk (0x2UL) /*!< SCB SPI_STATUS: SPI_EC_BUSY (Bitfield-Mask: 0x01) */ +#define SCB_SPI_STATUS_CURR_EZ_ADDR_Pos (8UL) /*!< SCB SPI_STATUS: CURR_EZ_ADDR (Bit 8) */ +#define SCB_SPI_STATUS_CURR_EZ_ADDR_Msk (0xff00UL) /*!< SCB SPI_STATUS: CURR_EZ_ADDR (Bitfield-Mask: 0xff) */ +#define SCB_SPI_STATUS_BASE_EZ_ADDR_Pos (16UL) /*!< SCB SPI_STATUS: BASE_EZ_ADDR (Bit 16) */ +#define SCB_SPI_STATUS_BASE_EZ_ADDR_Msk (0xff0000UL) /*!< SCB SPI_STATUS: BASE_EZ_ADDR (Bitfield-Mask: 0xff) */ +/* ===================================================== SCB.UART_CTRL ===================================================== */ +#define SCB_UART_CTRL_LOOPBACK_Pos (16UL) /*!< SCB UART_CTRL: LOOPBACK (Bit 16) */ +#define SCB_UART_CTRL_LOOPBACK_Msk (0x10000UL) /*!< SCB UART_CTRL: LOOPBACK (Bitfield-Mask: 0x01) */ +#define SCB_UART_CTRL_MODE_Pos (24UL) /*!< SCB UART_CTRL: MODE (Bit 24) */ +#define SCB_UART_CTRL_MODE_Msk (0x3000000UL) /*!< SCB UART_CTRL: MODE (Bitfield-Mask: 0x03) */ +/* =================================================== SCB.UART_TX_CTRL ==================================================== */ +#define SCB_UART_TX_CTRL_STOP_BITS_Pos (0UL) /*!< SCB UART_TX_CTRL: STOP_BITS (Bit 0) */ +#define SCB_UART_TX_CTRL_STOP_BITS_Msk (0x7UL) /*!< SCB UART_TX_CTRL: STOP_BITS (Bitfield-Mask: 0x07) */ +#define SCB_UART_TX_CTRL_PARITY_Pos (4UL) /*!< SCB UART_TX_CTRL: PARITY (Bit 4) */ +#define SCB_UART_TX_CTRL_PARITY_Msk (0x10UL) /*!< SCB UART_TX_CTRL: PARITY (Bitfield-Mask: 0x01) */ +#define SCB_UART_TX_CTRL_PARITY_ENABLED_Pos (5UL) /*!< SCB UART_TX_CTRL: PARITY_ENABLED (Bit 5) */ +#define SCB_UART_TX_CTRL_PARITY_ENABLED_Msk (0x20UL) /*!< SCB UART_TX_CTRL: PARITY_ENABLED (Bitfield-Mask: 0x01) */ +#define SCB_UART_TX_CTRL_RETRY_ON_NACK_Pos (8UL) /*!< SCB UART_TX_CTRL: RETRY_ON_NACK (Bit 8) */ +#define SCB_UART_TX_CTRL_RETRY_ON_NACK_Msk (0x100UL) /*!< SCB UART_TX_CTRL: RETRY_ON_NACK (Bitfield-Mask: 0x01) */ +/* =================================================== SCB.UART_RX_CTRL ==================================================== */ +#define SCB_UART_RX_CTRL_STOP_BITS_Pos (0UL) /*!< SCB UART_RX_CTRL: STOP_BITS (Bit 0) */ +#define SCB_UART_RX_CTRL_STOP_BITS_Msk (0x7UL) /*!< SCB UART_RX_CTRL: STOP_BITS (Bitfield-Mask: 0x07) */ +#define SCB_UART_RX_CTRL_PARITY_Pos (4UL) /*!< SCB UART_RX_CTRL: PARITY (Bit 4) */ +#define SCB_UART_RX_CTRL_PARITY_Msk (0x10UL) /*!< SCB UART_RX_CTRL: PARITY (Bitfield-Mask: 0x01) */ +#define SCB_UART_RX_CTRL_PARITY_ENABLED_Pos (5UL) /*!< SCB UART_RX_CTRL: PARITY_ENABLED (Bit 5) */ +#define SCB_UART_RX_CTRL_PARITY_ENABLED_Msk (0x20UL) /*!< SCB UART_RX_CTRL: PARITY_ENABLED (Bitfield-Mask: 0x01) */ +#define SCB_UART_RX_CTRL_POLARITY_Pos (6UL) /*!< SCB UART_RX_CTRL: POLARITY (Bit 6) */ +#define SCB_UART_RX_CTRL_POLARITY_Msk (0x40UL) /*!< SCB UART_RX_CTRL: POLARITY (Bitfield-Mask: 0x01) */ +#define SCB_UART_RX_CTRL_DROP_ON_PARITY_ERROR_Pos (8UL) /*!< SCB UART_RX_CTRL: DROP_ON_PARITY_ERROR (Bit 8) */ +#define SCB_UART_RX_CTRL_DROP_ON_PARITY_ERROR_Msk (0x100UL) /*!< SCB UART_RX_CTRL: DROP_ON_PARITY_ERROR (Bitfield-Mask: 0x01)*/ +#define SCB_UART_RX_CTRL_DROP_ON_FRAME_ERROR_Pos (9UL) /*!< SCB UART_RX_CTRL: DROP_ON_FRAME_ERROR (Bit 9) */ +#define SCB_UART_RX_CTRL_DROP_ON_FRAME_ERROR_Msk (0x200UL) /*!< SCB UART_RX_CTRL: DROP_ON_FRAME_ERROR (Bitfield-Mask: 0x01)*/ +#define SCB_UART_RX_CTRL_MP_MODE_Pos (10UL) /*!< SCB UART_RX_CTRL: MP_MODE (Bit 10) */ +#define SCB_UART_RX_CTRL_MP_MODE_Msk (0x400UL) /*!< SCB UART_RX_CTRL: MP_MODE (Bitfield-Mask: 0x01) */ +#define SCB_UART_RX_CTRL_LIN_MODE_Pos (12UL) /*!< SCB UART_RX_CTRL: LIN_MODE (Bit 12) */ +#define SCB_UART_RX_CTRL_LIN_MODE_Msk (0x1000UL) /*!< SCB UART_RX_CTRL: LIN_MODE (Bitfield-Mask: 0x01) */ +#define SCB_UART_RX_CTRL_SKIP_START_Pos (13UL) /*!< SCB UART_RX_CTRL: SKIP_START (Bit 13) */ +#define SCB_UART_RX_CTRL_SKIP_START_Msk (0x2000UL) /*!< SCB UART_RX_CTRL: SKIP_START (Bitfield-Mask: 0x01) */ +#define SCB_UART_RX_CTRL_BREAK_WIDTH_Pos (16UL) /*!< SCB UART_RX_CTRL: BREAK_WIDTH (Bit 16) */ +#define SCB_UART_RX_CTRL_BREAK_WIDTH_Msk (0xf0000UL) /*!< SCB UART_RX_CTRL: BREAK_WIDTH (Bitfield-Mask: 0x0f) */ +/* ================================================== SCB.UART_RX_STATUS =================================================== */ +#define SCB_UART_RX_STATUS_BR_COUNTER_Pos (0UL) /*!< SCB UART_RX_STATUS: BR_COUNTER (Bit 0) */ +#define SCB_UART_RX_STATUS_BR_COUNTER_Msk (0xfffUL) /*!< SCB UART_RX_STATUS: BR_COUNTER (Bitfield-Mask: 0xfff) */ +/* ================================================== SCB.UART_FLOW_CTRL =================================================== */ +#define SCB_UART_FLOW_CTRL_TRIGGER_LEVEL_Pos (0UL) /*!< SCB UART_FLOW_CTRL: TRIGGER_LEVEL (Bit 0) */ +#define SCB_UART_FLOW_CTRL_TRIGGER_LEVEL_Msk (0xffUL) /*!< SCB UART_FLOW_CTRL: TRIGGER_LEVEL (Bitfield-Mask: 0xff) */ +#define SCB_UART_FLOW_CTRL_RTS_POLARITY_Pos (16UL) /*!< SCB UART_FLOW_CTRL: RTS_POLARITY (Bit 16) */ +#define SCB_UART_FLOW_CTRL_RTS_POLARITY_Msk (0x10000UL) /*!< SCB UART_FLOW_CTRL: RTS_POLARITY (Bitfield-Mask: 0x01) */ +#define SCB_UART_FLOW_CTRL_CTS_POLARITY_Pos (24UL) /*!< SCB UART_FLOW_CTRL: CTS_POLARITY (Bit 24) */ +#define SCB_UART_FLOW_CTRL_CTS_POLARITY_Msk (0x1000000UL) /*!< SCB UART_FLOW_CTRL: CTS_POLARITY (Bitfield-Mask: 0x01) */ +#define SCB_UART_FLOW_CTRL_CTS_ENABLED_Pos (25UL) /*!< SCB UART_FLOW_CTRL: CTS_ENABLED (Bit 25) */ +#define SCB_UART_FLOW_CTRL_CTS_ENABLED_Msk (0x2000000UL) /*!< SCB UART_FLOW_CTRL: CTS_ENABLED (Bitfield-Mask: 0x01) */ +/* ===================================================== SCB.I2C_CTRL ====================================================== */ +#define SCB_I2C_CTRL_HIGH_PHASE_OVS_Pos (0UL) /*!< SCB I2C_CTRL: HIGH_PHASE_OVS (Bit 0) */ +#define SCB_I2C_CTRL_HIGH_PHASE_OVS_Msk (0xfUL) /*!< SCB I2C_CTRL: HIGH_PHASE_OVS (Bitfield-Mask: 0x0f) */ +#define SCB_I2C_CTRL_LOW_PHASE_OVS_Pos (4UL) /*!< SCB I2C_CTRL: LOW_PHASE_OVS (Bit 4) */ +#define SCB_I2C_CTRL_LOW_PHASE_OVS_Msk (0xf0UL) /*!< SCB I2C_CTRL: LOW_PHASE_OVS (Bitfield-Mask: 0x0f) */ +#define SCB_I2C_CTRL_M_READY_DATA_ACK_Pos (8UL) /*!< SCB I2C_CTRL: M_READY_DATA_ACK (Bit 8) */ +#define SCB_I2C_CTRL_M_READY_DATA_ACK_Msk (0x100UL) /*!< SCB I2C_CTRL: M_READY_DATA_ACK (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CTRL_M_NOT_READY_DATA_NACK_Pos (9UL) /*!< SCB I2C_CTRL: M_NOT_READY_DATA_NACK (Bit 9) */ +#define SCB_I2C_CTRL_M_NOT_READY_DATA_NACK_Msk (0x200UL) /*!< SCB I2C_CTRL: M_NOT_READY_DATA_NACK (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CTRL_S_GENERAL_IGNORE_Pos (11UL) /*!< SCB I2C_CTRL: S_GENERAL_IGNORE (Bit 11) */ +#define SCB_I2C_CTRL_S_GENERAL_IGNORE_Msk (0x800UL) /*!< SCB I2C_CTRL: S_GENERAL_IGNORE (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CTRL_S_READY_ADDR_ACK_Pos (12UL) /*!< SCB I2C_CTRL: S_READY_ADDR_ACK (Bit 12) */ +#define SCB_I2C_CTRL_S_READY_ADDR_ACK_Msk (0x1000UL) /*!< SCB I2C_CTRL: S_READY_ADDR_ACK (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CTRL_S_READY_DATA_ACK_Pos (13UL) /*!< SCB I2C_CTRL: S_READY_DATA_ACK (Bit 13) */ +#define SCB_I2C_CTRL_S_READY_DATA_ACK_Msk (0x2000UL) /*!< SCB I2C_CTRL: S_READY_DATA_ACK (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CTRL_S_NOT_READY_ADDR_NACK_Pos (14UL) /*!< SCB I2C_CTRL: S_NOT_READY_ADDR_NACK (Bit 14) */ +#define SCB_I2C_CTRL_S_NOT_READY_ADDR_NACK_Msk (0x4000UL) /*!< SCB I2C_CTRL: S_NOT_READY_ADDR_NACK (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CTRL_S_NOT_READY_DATA_NACK_Pos (15UL) /*!< SCB I2C_CTRL: S_NOT_READY_DATA_NACK (Bit 15) */ +#define SCB_I2C_CTRL_S_NOT_READY_DATA_NACK_Msk (0x8000UL) /*!< SCB I2C_CTRL: S_NOT_READY_DATA_NACK (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CTRL_LOOPBACK_Pos (16UL) /*!< SCB I2C_CTRL: LOOPBACK (Bit 16) */ +#define SCB_I2C_CTRL_LOOPBACK_Msk (0x10000UL) /*!< SCB I2C_CTRL: LOOPBACK (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CTRL_SLAVE_MODE_Pos (30UL) /*!< SCB I2C_CTRL: SLAVE_MODE (Bit 30) */ +#define SCB_I2C_CTRL_SLAVE_MODE_Msk (0x40000000UL) /*!< SCB I2C_CTRL: SLAVE_MODE (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CTRL_MASTER_MODE_Pos (31UL) /*!< SCB I2C_CTRL: MASTER_MODE (Bit 31) */ +#define SCB_I2C_CTRL_MASTER_MODE_Msk (0x80000000UL) /*!< SCB I2C_CTRL: MASTER_MODE (Bitfield-Mask: 0x01) */ +/* ==================================================== SCB.I2C_STATUS ===================================================== */ +#define SCB_I2C_STATUS_BUS_BUSY_Pos (0UL) /*!< SCB I2C_STATUS: BUS_BUSY (Bit 0) */ +#define SCB_I2C_STATUS_BUS_BUSY_Msk (0x1UL) /*!< SCB I2C_STATUS: BUS_BUSY (Bitfield-Mask: 0x01) */ +#define SCB_I2C_STATUS_I2C_EC_BUSY_Pos (1UL) /*!< SCB I2C_STATUS: I2C_EC_BUSY (Bit 1) */ +#define SCB_I2C_STATUS_I2C_EC_BUSY_Msk (0x2UL) /*!< SCB I2C_STATUS: I2C_EC_BUSY (Bitfield-Mask: 0x01) */ +#define SCB_I2C_STATUS_S_READ_Pos (4UL) /*!< SCB I2C_STATUS: S_READ (Bit 4) */ +#define SCB_I2C_STATUS_S_READ_Msk (0x10UL) /*!< SCB I2C_STATUS: S_READ (Bitfield-Mask: 0x01) */ +#define SCB_I2C_STATUS_M_READ_Pos (5UL) /*!< SCB I2C_STATUS: M_READ (Bit 5) */ +#define SCB_I2C_STATUS_M_READ_Msk (0x20UL) /*!< SCB I2C_STATUS: M_READ (Bitfield-Mask: 0x01) */ +#define SCB_I2C_STATUS_CURR_EZ_ADDR_Pos (8UL) /*!< SCB I2C_STATUS: CURR_EZ_ADDR (Bit 8) */ +#define SCB_I2C_STATUS_CURR_EZ_ADDR_Msk (0xff00UL) /*!< SCB I2C_STATUS: CURR_EZ_ADDR (Bitfield-Mask: 0xff) */ +#define SCB_I2C_STATUS_BASE_EZ_ADDR_Pos (16UL) /*!< SCB I2C_STATUS: BASE_EZ_ADDR (Bit 16) */ +#define SCB_I2C_STATUS_BASE_EZ_ADDR_Msk (0xff0000UL) /*!< SCB I2C_STATUS: BASE_EZ_ADDR (Bitfield-Mask: 0xff) */ +/* ===================================================== SCB.I2C_M_CMD ===================================================== */ +#define SCB_I2C_M_CMD_M_START_Pos (0UL) /*!< SCB I2C_M_CMD: M_START (Bit 0) */ +#define SCB_I2C_M_CMD_M_START_Msk (0x1UL) /*!< SCB I2C_M_CMD: M_START (Bitfield-Mask: 0x01) */ +#define SCB_I2C_M_CMD_M_START_ON_IDLE_Pos (1UL) /*!< SCB I2C_M_CMD: M_START_ON_IDLE (Bit 1) */ +#define SCB_I2C_M_CMD_M_START_ON_IDLE_Msk (0x2UL) /*!< SCB I2C_M_CMD: M_START_ON_IDLE (Bitfield-Mask: 0x01) */ +#define SCB_I2C_M_CMD_M_ACK_Pos (2UL) /*!< SCB I2C_M_CMD: M_ACK (Bit 2) */ +#define SCB_I2C_M_CMD_M_ACK_Msk (0x4UL) /*!< SCB I2C_M_CMD: M_ACK (Bitfield-Mask: 0x01) */ +#define SCB_I2C_M_CMD_M_NACK_Pos (3UL) /*!< SCB I2C_M_CMD: M_NACK (Bit 3) */ +#define SCB_I2C_M_CMD_M_NACK_Msk (0x8UL) /*!< SCB I2C_M_CMD: M_NACK (Bitfield-Mask: 0x01) */ +#define SCB_I2C_M_CMD_M_STOP_Pos (4UL) /*!< SCB I2C_M_CMD: M_STOP (Bit 4) */ +#define SCB_I2C_M_CMD_M_STOP_Msk (0x10UL) /*!< SCB I2C_M_CMD: M_STOP (Bitfield-Mask: 0x01) */ +/* ===================================================== SCB.I2C_S_CMD ===================================================== */ +#define SCB_I2C_S_CMD_S_ACK_Pos (0UL) /*!< SCB I2C_S_CMD: S_ACK (Bit 0) */ +#define SCB_I2C_S_CMD_S_ACK_Msk (0x1UL) /*!< SCB I2C_S_CMD: S_ACK (Bitfield-Mask: 0x01) */ +#define SCB_I2C_S_CMD_S_NACK_Pos (1UL) /*!< SCB I2C_S_CMD: S_NACK (Bit 1) */ +#define SCB_I2C_S_CMD_S_NACK_Msk (0x2UL) /*!< SCB I2C_S_CMD: S_NACK (Bitfield-Mask: 0x01) */ +/* ====================================================== SCB.I2C_CFG ====================================================== */ +#define SCB_I2C_CFG_SDA_IN_FILT_TRIM_Pos (0UL) /*!< SCB I2C_CFG: SDA_IN_FILT_TRIM (Bit 0) */ +#define SCB_I2C_CFG_SDA_IN_FILT_TRIM_Msk (0x3UL) /*!< SCB I2C_CFG: SDA_IN_FILT_TRIM (Bitfield-Mask: 0x03) */ +#define SCB_I2C_CFG_SDA_IN_FILT_SEL_Pos (4UL) /*!< SCB I2C_CFG: SDA_IN_FILT_SEL (Bit 4) */ +#define SCB_I2C_CFG_SDA_IN_FILT_SEL_Msk (0x10UL) /*!< SCB I2C_CFG: SDA_IN_FILT_SEL (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CFG_SCL_IN_FILT_TRIM_Pos (8UL) /*!< SCB I2C_CFG: SCL_IN_FILT_TRIM (Bit 8) */ +#define SCB_I2C_CFG_SCL_IN_FILT_TRIM_Msk (0x300UL) /*!< SCB I2C_CFG: SCL_IN_FILT_TRIM (Bitfield-Mask: 0x03) */ +#define SCB_I2C_CFG_SCL_IN_FILT_SEL_Pos (12UL) /*!< SCB I2C_CFG: SCL_IN_FILT_SEL (Bit 12) */ +#define SCB_I2C_CFG_SCL_IN_FILT_SEL_Msk (0x1000UL) /*!< SCB I2C_CFG: SCL_IN_FILT_SEL (Bitfield-Mask: 0x01) */ +#define SCB_I2C_CFG_SDA_OUT_FILT0_TRIM_Pos (16UL) /*!< SCB I2C_CFG: SDA_OUT_FILT0_TRIM (Bit 16) */ +#define SCB_I2C_CFG_SDA_OUT_FILT0_TRIM_Msk (0x30000UL) /*!< SCB I2C_CFG: SDA_OUT_FILT0_TRIM (Bitfield-Mask: 0x03) */ +#define SCB_I2C_CFG_SDA_OUT_FILT1_TRIM_Pos (18UL) /*!< SCB I2C_CFG: SDA_OUT_FILT1_TRIM (Bit 18) */ +#define SCB_I2C_CFG_SDA_OUT_FILT1_TRIM_Msk (0xc0000UL) /*!< SCB I2C_CFG: SDA_OUT_FILT1_TRIM (Bitfield-Mask: 0x03) */ +#define SCB_I2C_CFG_SDA_OUT_FILT2_TRIM_Pos (20UL) /*!< SCB I2C_CFG: SDA_OUT_FILT2_TRIM (Bit 20) */ +#define SCB_I2C_CFG_SDA_OUT_FILT2_TRIM_Msk (0x300000UL) /*!< SCB I2C_CFG: SDA_OUT_FILT2_TRIM (Bitfield-Mask: 0x03) */ +#define SCB_I2C_CFG_SDA_OUT_FILT_SEL_Pos (28UL) /*!< SCB I2C_CFG: SDA_OUT_FILT_SEL (Bit 28) */ +#define SCB_I2C_CFG_SDA_OUT_FILT_SEL_Msk (0x30000000UL) /*!< SCB I2C_CFG: SDA_OUT_FILT_SEL (Bitfield-Mask: 0x03) */ +/* ===================================================== SCB.DDFT_CTRL ===================================================== */ +#define SCB_DDFT_CTRL_DDFT_IN0_SEL_Pos (0UL) /*!< SCB DDFT_CTRL: DDFT_IN0_SEL (Bit 0) */ +#define SCB_DDFT_CTRL_DDFT_IN0_SEL_Msk (0x1UL) /*!< SCB DDFT_CTRL: DDFT_IN0_SEL (Bitfield-Mask: 0x01) */ +#define SCB_DDFT_CTRL_DDFT_IN1_SEL_Pos (4UL) /*!< SCB DDFT_CTRL: DDFT_IN1_SEL (Bit 4) */ +#define SCB_DDFT_CTRL_DDFT_IN1_SEL_Msk (0x10UL) /*!< SCB DDFT_CTRL: DDFT_IN1_SEL (Bitfield-Mask: 0x01) */ +#define SCB_DDFT_CTRL_DDFT_OUT0_SEL_Pos (16UL) /*!< SCB DDFT_CTRL: DDFT_OUT0_SEL (Bit 16) */ +#define SCB_DDFT_CTRL_DDFT_OUT0_SEL_Msk (0x70000UL) /*!< SCB DDFT_CTRL: DDFT_OUT0_SEL (Bitfield-Mask: 0x07) */ +#define SCB_DDFT_CTRL_DDFT_OUT1_SEL_Pos (20UL) /*!< SCB DDFT_CTRL: DDFT_OUT1_SEL (Bit 20) */ +#define SCB_DDFT_CTRL_DDFT_OUT1_SEL_Msk (0x700000UL) /*!< SCB DDFT_CTRL: DDFT_OUT1_SEL (Bitfield-Mask: 0x07) */ +/* ====================================================== SCB.TX_CTRL ====================================================== */ +#define SCB_TX_CTRL_DATA_WIDTH_Pos (0UL) /*!< SCB TX_CTRL: DATA_WIDTH (Bit 0) */ +#define SCB_TX_CTRL_DATA_WIDTH_Msk (0xfUL) /*!< SCB TX_CTRL: DATA_WIDTH (Bitfield-Mask: 0x0f) */ +#define SCB_TX_CTRL_MSB_FIRST_Pos (8UL) /*!< SCB TX_CTRL: MSB_FIRST (Bit 8) */ +#define SCB_TX_CTRL_MSB_FIRST_Msk (0x100UL) /*!< SCB TX_CTRL: MSB_FIRST (Bitfield-Mask: 0x01) */ +/* =================================================== SCB.TX_FIFO_CTRL ==================================================== */ +#define SCB_TX_FIFO_CTRL_TRIGGER_LEVEL_Pos (0UL) /*!< SCB TX_FIFO_CTRL: TRIGGER_LEVEL (Bit 0) */ +#define SCB_TX_FIFO_CTRL_TRIGGER_LEVEL_Msk (0xffUL) /*!< SCB TX_FIFO_CTRL: TRIGGER_LEVEL (Bitfield-Mask: 0xff) */ +#define SCB_TX_FIFO_CTRL_CLEAR_Pos (16UL) /*!< SCB TX_FIFO_CTRL: CLEAR (Bit 16) */ +#define SCB_TX_FIFO_CTRL_CLEAR_Msk (0x10000UL) /*!< SCB TX_FIFO_CTRL: CLEAR (Bitfield-Mask: 0x01) */ +#define SCB_TX_FIFO_CTRL_FREEZE_Pos (17UL) /*!< SCB TX_FIFO_CTRL: FREEZE (Bit 17) */ +#define SCB_TX_FIFO_CTRL_FREEZE_Msk (0x20000UL) /*!< SCB TX_FIFO_CTRL: FREEZE (Bitfield-Mask: 0x01) */ +/* ================================================== SCB.TX_FIFO_STATUS =================================================== */ +#define SCB_TX_FIFO_STATUS_USED_Pos (0UL) /*!< SCB TX_FIFO_STATUS: USED (Bit 0) */ +#define SCB_TX_FIFO_STATUS_USED_Msk (0x1ffUL) /*!< SCB TX_FIFO_STATUS: USED (Bitfield-Mask: 0x1ff) */ +#define SCB_TX_FIFO_STATUS_SR_VALID_Pos (15UL) /*!< SCB TX_FIFO_STATUS: SR_VALID (Bit 15) */ +#define SCB_TX_FIFO_STATUS_SR_VALID_Msk (0x8000UL) /*!< SCB TX_FIFO_STATUS: SR_VALID (Bitfield-Mask: 0x01) */ +#define SCB_TX_FIFO_STATUS_RD_PTR_Pos (16UL) /*!< SCB TX_FIFO_STATUS: RD_PTR (Bit 16) */ +#define SCB_TX_FIFO_STATUS_RD_PTR_Msk (0xff0000UL) /*!< SCB TX_FIFO_STATUS: RD_PTR (Bitfield-Mask: 0xff) */ +#define SCB_TX_FIFO_STATUS_WR_PTR_Pos (24UL) /*!< SCB TX_FIFO_STATUS: WR_PTR (Bit 24) */ +#define SCB_TX_FIFO_STATUS_WR_PTR_Msk (0xff000000UL) /*!< SCB TX_FIFO_STATUS: WR_PTR (Bitfield-Mask: 0xff) */ +/* ==================================================== SCB.TX_FIFO_WR ===================================================== */ +#define SCB_TX_FIFO_WR_DATA_Pos (0UL) /*!< SCB TX_FIFO_WR: DATA (Bit 0) */ +#define SCB_TX_FIFO_WR_DATA_Msk (0xffffUL) /*!< SCB TX_FIFO_WR: DATA (Bitfield-Mask: 0xffff) */ +/* ====================================================== SCB.RX_CTRL ====================================================== */ +#define SCB_RX_CTRL_DATA_WIDTH_Pos (0UL) /*!< SCB RX_CTRL: DATA_WIDTH (Bit 0) */ +#define SCB_RX_CTRL_DATA_WIDTH_Msk (0xfUL) /*!< SCB RX_CTRL: DATA_WIDTH (Bitfield-Mask: 0x0f) */ +#define SCB_RX_CTRL_MSB_FIRST_Pos (8UL) /*!< SCB RX_CTRL: MSB_FIRST (Bit 8) */ +#define SCB_RX_CTRL_MSB_FIRST_Msk (0x100UL) /*!< SCB RX_CTRL: MSB_FIRST (Bitfield-Mask: 0x01) */ +#define SCB_RX_CTRL_MEDIAN_Pos (9UL) /*!< SCB RX_CTRL: MEDIAN (Bit 9) */ +#define SCB_RX_CTRL_MEDIAN_Msk (0x200UL) /*!< SCB RX_CTRL: MEDIAN (Bitfield-Mask: 0x01) */ +/* =================================================== SCB.RX_FIFO_CTRL ==================================================== */ +#define SCB_RX_FIFO_CTRL_TRIGGER_LEVEL_Pos (0UL) /*!< SCB RX_FIFO_CTRL: TRIGGER_LEVEL (Bit 0) */ +#define SCB_RX_FIFO_CTRL_TRIGGER_LEVEL_Msk (0xffUL) /*!< SCB RX_FIFO_CTRL: TRIGGER_LEVEL (Bitfield-Mask: 0xff) */ +#define SCB_RX_FIFO_CTRL_CLEAR_Pos (16UL) /*!< SCB RX_FIFO_CTRL: CLEAR (Bit 16) */ +#define SCB_RX_FIFO_CTRL_CLEAR_Msk (0x10000UL) /*!< SCB RX_FIFO_CTRL: CLEAR (Bitfield-Mask: 0x01) */ +#define SCB_RX_FIFO_CTRL_FREEZE_Pos (17UL) /*!< SCB RX_FIFO_CTRL: FREEZE (Bit 17) */ +#define SCB_RX_FIFO_CTRL_FREEZE_Msk (0x20000UL) /*!< SCB RX_FIFO_CTRL: FREEZE (Bitfield-Mask: 0x01) */ +/* ================================================== SCB.RX_FIFO_STATUS =================================================== */ +#define SCB_RX_FIFO_STATUS_USED_Pos (0UL) /*!< SCB RX_FIFO_STATUS: USED (Bit 0) */ +#define SCB_RX_FIFO_STATUS_USED_Msk (0x1ffUL) /*!< SCB RX_FIFO_STATUS: USED (Bitfield-Mask: 0x1ff) */ +#define SCB_RX_FIFO_STATUS_SR_VALID_Pos (15UL) /*!< SCB RX_FIFO_STATUS: SR_VALID (Bit 15) */ +#define SCB_RX_FIFO_STATUS_SR_VALID_Msk (0x8000UL) /*!< SCB RX_FIFO_STATUS: SR_VALID (Bitfield-Mask: 0x01) */ +#define SCB_RX_FIFO_STATUS_RD_PTR_Pos (16UL) /*!< SCB RX_FIFO_STATUS: RD_PTR (Bit 16) */ +#define SCB_RX_FIFO_STATUS_RD_PTR_Msk (0xff0000UL) /*!< SCB RX_FIFO_STATUS: RD_PTR (Bitfield-Mask: 0xff) */ +#define SCB_RX_FIFO_STATUS_WR_PTR_Pos (24UL) /*!< SCB RX_FIFO_STATUS: WR_PTR (Bit 24) */ +#define SCB_RX_FIFO_STATUS_WR_PTR_Msk (0xff000000UL) /*!< SCB RX_FIFO_STATUS: WR_PTR (Bitfield-Mask: 0xff) */ +/* ===================================================== SCB.RX_MATCH ====================================================== */ +#define SCB_RX_MATCH_ADDR_Pos (0UL) /*!< SCB RX_MATCH: ADDR (Bit 0) */ +#define SCB_RX_MATCH_ADDR_Msk (0xffUL) /*!< SCB RX_MATCH: ADDR (Bitfield-Mask: 0xff) */ +#define SCB_RX_MATCH_MASK_Pos (16UL) /*!< SCB RX_MATCH: MASK (Bit 16) */ +#define SCB_RX_MATCH_MASK_Msk (0xff0000UL) /*!< SCB RX_MATCH: MASK (Bitfield-Mask: 0xff) */ +/* ==================================================== SCB.RX_FIFO_RD ===================================================== */ +#define SCB_RX_FIFO_RD_DATA_Pos (0UL) /*!< SCB RX_FIFO_RD: DATA (Bit 0) */ +#define SCB_RX_FIFO_RD_DATA_Msk (0xffffUL) /*!< SCB RX_FIFO_RD: DATA (Bitfield-Mask: 0xffff) */ +/* ================================================= SCB.RX_FIFO_RD_SILENT ================================================= */ +#define SCB_RX_FIFO_RD_SILENT_DATA_Pos (0UL) /*!< SCB RX_FIFO_RD_SILENT: DATA (Bit 0) */ +#define SCB_RX_FIFO_RD_SILENT_DATA_Msk (0xffffUL) /*!< SCB RX_FIFO_RD_SILENT: DATA (Bitfield-Mask: 0xffff) */ +/* ====================================================== SCB.EZ_DATA ====================================================== */ +#define SCB_EZ_DATA_EZ_DATA_Pos (0UL) /*!< SCB EZ_DATA: EZ_DATA (Bit 0) */ +#define SCB_EZ_DATA_EZ_DATA_Msk (0xffUL) /*!< SCB EZ_DATA: EZ_DATA (Bitfield-Mask: 0xff) */ +/* ==================================================== SCB.INTR_CAUSE ===================================================== */ +#define SCB_INTR_CAUSE_M_Pos (0UL) /*!< SCB INTR_CAUSE: M (Bit 0) */ +#define SCB_INTR_CAUSE_M_Msk (0x1UL) /*!< SCB INTR_CAUSE: M (Bitfield-Mask: 0x01) */ +#define SCB_INTR_CAUSE_S_Pos (1UL) /*!< SCB INTR_CAUSE: S (Bit 1) */ +#define SCB_INTR_CAUSE_S_Msk (0x2UL) /*!< SCB INTR_CAUSE: S (Bitfield-Mask: 0x01) */ +#define SCB_INTR_CAUSE_TX_Pos (2UL) /*!< SCB INTR_CAUSE: TX (Bit 2) */ +#define SCB_INTR_CAUSE_TX_Msk (0x4UL) /*!< SCB INTR_CAUSE: TX (Bitfield-Mask: 0x01) */ +#define SCB_INTR_CAUSE_RX_Pos (3UL) /*!< SCB INTR_CAUSE: RX (Bit 3) */ +#define SCB_INTR_CAUSE_RX_Msk (0x8UL) /*!< SCB INTR_CAUSE: RX (Bitfield-Mask: 0x01) */ +#define SCB_INTR_CAUSE_I2C_EC_Pos (4UL) /*!< SCB INTR_CAUSE: I2C_EC (Bit 4) */ +#define SCB_INTR_CAUSE_I2C_EC_Msk (0x10UL) /*!< SCB INTR_CAUSE: I2C_EC (Bitfield-Mask: 0x01) */ +#define SCB_INTR_CAUSE_SPI_EC_Pos (5UL) /*!< SCB INTR_CAUSE: SPI_EC (Bit 5) */ +#define SCB_INTR_CAUSE_SPI_EC_Msk (0x20UL) /*!< SCB INTR_CAUSE: SPI_EC (Bitfield-Mask: 0x01) */ +/* ==================================================== SCB.INTR_I2C_EC ==================================================== */ +#define SCB_INTR_I2C_EC_WAKE_UP_Pos (0UL) /*!< SCB INTR_I2C_EC: WAKE_UP (Bit 0) */ +#define SCB_INTR_I2C_EC_WAKE_UP_Msk (0x1UL) /*!< SCB INTR_I2C_EC: WAKE_UP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_I2C_EC_EZ_STOP_Pos (1UL) /*!< SCB INTR_I2C_EC: EZ_STOP (Bit 1) */ +#define SCB_INTR_I2C_EC_EZ_STOP_Msk (0x2UL) /*!< SCB INTR_I2C_EC: EZ_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_I2C_EC_EZ_WRITE_STOP_Pos (2UL) /*!< SCB INTR_I2C_EC: EZ_WRITE_STOP (Bit 2) */ +#define SCB_INTR_I2C_EC_EZ_WRITE_STOP_Msk (0x4UL) /*!< SCB INTR_I2C_EC: EZ_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_I2C_EC_EZ_READ_STOP_Pos (3UL) /*!< SCB INTR_I2C_EC: EZ_READ_STOP (Bit 3) */ +#define SCB_INTR_I2C_EC_EZ_READ_STOP_Msk (0x8UL) /*!< SCB INTR_I2C_EC: EZ_READ_STOP (Bitfield-Mask: 0x01) */ +/* ================================================= SCB.INTR_I2C_EC_MASK ================================================== */ +#define SCB_INTR_I2C_EC_MASK_WAKE_UP_Pos (0UL) /*!< SCB INTR_I2C_EC_MASK: WAKE_UP (Bit 0) */ +#define SCB_INTR_I2C_EC_MASK_WAKE_UP_Msk (0x1UL) /*!< SCB INTR_I2C_EC_MASK: WAKE_UP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_I2C_EC_MASK_EZ_STOP_Pos (1UL) /*!< SCB INTR_I2C_EC_MASK: EZ_STOP (Bit 1) */ +#define SCB_INTR_I2C_EC_MASK_EZ_STOP_Msk (0x2UL) /*!< SCB INTR_I2C_EC_MASK: EZ_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_I2C_EC_MASK_EZ_WRITE_STOP_Pos (2UL) /*!< SCB INTR_I2C_EC_MASK: EZ_WRITE_STOP (Bit 2) */ +#define SCB_INTR_I2C_EC_MASK_EZ_WRITE_STOP_Msk (0x4UL) /*!< SCB INTR_I2C_EC_MASK: EZ_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_I2C_EC_MASK_EZ_READ_STOP_Pos (3UL) /*!< SCB INTR_I2C_EC_MASK: EZ_READ_STOP (Bit 3) */ +#define SCB_INTR_I2C_EC_MASK_EZ_READ_STOP_Msk (0x8UL) /*!< SCB INTR_I2C_EC_MASK: EZ_READ_STOP (Bitfield-Mask: 0x01) */ +/* ================================================ SCB.INTR_I2C_EC_MASKED ================================================= */ +#define SCB_INTR_I2C_EC_MASKED_WAKE_UP_Pos (0UL) /*!< SCB INTR_I2C_EC_MASKED: WAKE_UP (Bit 0) */ +#define SCB_INTR_I2C_EC_MASKED_WAKE_UP_Msk (0x1UL) /*!< SCB INTR_I2C_EC_MASKED: WAKE_UP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_I2C_EC_MASKED_EZ_STOP_Pos (1UL) /*!< SCB INTR_I2C_EC_MASKED: EZ_STOP (Bit 1) */ +#define SCB_INTR_I2C_EC_MASKED_EZ_STOP_Msk (0x2UL) /*!< SCB INTR_I2C_EC_MASKED: EZ_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_I2C_EC_MASKED_EZ_WRITE_STOP_Pos (2UL) /*!< SCB INTR_I2C_EC_MASKED: EZ_WRITE_STOP (Bit 2) */ +#define SCB_INTR_I2C_EC_MASKED_EZ_WRITE_STOP_Msk (0x4UL) /*!< SCB INTR_I2C_EC_MASKED: EZ_WRITE_STOP (Bitfield-Mask: 0x01)*/ +#define SCB_INTR_I2C_EC_MASKED_EZ_READ_STOP_Pos (3UL) /*!< SCB INTR_I2C_EC_MASKED: EZ_READ_STOP (Bit 3) */ +#define SCB_INTR_I2C_EC_MASKED_EZ_READ_STOP_Msk (0x8UL) /*!< SCB INTR_I2C_EC_MASKED: EZ_READ_STOP (Bitfield-Mask: 0x01)*/ +/* ==================================================== SCB.INTR_SPI_EC ==================================================== */ +#define SCB_INTR_SPI_EC_WAKE_UP_Pos (0UL) /*!< SCB INTR_SPI_EC: WAKE_UP (Bit 0) */ +#define SCB_INTR_SPI_EC_WAKE_UP_Msk (0x1UL) /*!< SCB INTR_SPI_EC: WAKE_UP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_SPI_EC_EZ_STOP_Pos (1UL) /*!< SCB INTR_SPI_EC: EZ_STOP (Bit 1) */ +#define SCB_INTR_SPI_EC_EZ_STOP_Msk (0x2UL) /*!< SCB INTR_SPI_EC: EZ_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_SPI_EC_EZ_WRITE_STOP_Pos (2UL) /*!< SCB INTR_SPI_EC: EZ_WRITE_STOP (Bit 2) */ +#define SCB_INTR_SPI_EC_EZ_WRITE_STOP_Msk (0x4UL) /*!< SCB INTR_SPI_EC: EZ_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_SPI_EC_EZ_READ_STOP_Pos (3UL) /*!< SCB INTR_SPI_EC: EZ_READ_STOP (Bit 3) */ +#define SCB_INTR_SPI_EC_EZ_READ_STOP_Msk (0x8UL) /*!< SCB INTR_SPI_EC: EZ_READ_STOP (Bitfield-Mask: 0x01) */ +/* ================================================= SCB.INTR_SPI_EC_MASK ================================================== */ +#define SCB_INTR_SPI_EC_MASK_WAKE_UP_Pos (0UL) /*!< SCB INTR_SPI_EC_MASK: WAKE_UP (Bit 0) */ +#define SCB_INTR_SPI_EC_MASK_WAKE_UP_Msk (0x1UL) /*!< SCB INTR_SPI_EC_MASK: WAKE_UP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_SPI_EC_MASK_EZ_STOP_Pos (1UL) /*!< SCB INTR_SPI_EC_MASK: EZ_STOP (Bit 1) */ +#define SCB_INTR_SPI_EC_MASK_EZ_STOP_Msk (0x2UL) /*!< SCB INTR_SPI_EC_MASK: EZ_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_SPI_EC_MASK_EZ_WRITE_STOP_Pos (2UL) /*!< SCB INTR_SPI_EC_MASK: EZ_WRITE_STOP (Bit 2) */ +#define SCB_INTR_SPI_EC_MASK_EZ_WRITE_STOP_Msk (0x4UL) /*!< SCB INTR_SPI_EC_MASK: EZ_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_SPI_EC_MASK_EZ_READ_STOP_Pos (3UL) /*!< SCB INTR_SPI_EC_MASK: EZ_READ_STOP (Bit 3) */ +#define SCB_INTR_SPI_EC_MASK_EZ_READ_STOP_Msk (0x8UL) /*!< SCB INTR_SPI_EC_MASK: EZ_READ_STOP (Bitfield-Mask: 0x01) */ +/* ================================================ SCB.INTR_SPI_EC_MASKED ================================================= */ +#define SCB_INTR_SPI_EC_MASKED_WAKE_UP_Pos (0UL) /*!< SCB INTR_SPI_EC_MASKED: WAKE_UP (Bit 0) */ +#define SCB_INTR_SPI_EC_MASKED_WAKE_UP_Msk (0x1UL) /*!< SCB INTR_SPI_EC_MASKED: WAKE_UP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_SPI_EC_MASKED_EZ_STOP_Pos (1UL) /*!< SCB INTR_SPI_EC_MASKED: EZ_STOP (Bit 1) */ +#define SCB_INTR_SPI_EC_MASKED_EZ_STOP_Msk (0x2UL) /*!< SCB INTR_SPI_EC_MASKED: EZ_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_SPI_EC_MASKED_EZ_WRITE_STOP_Pos (2UL) /*!< SCB INTR_SPI_EC_MASKED: EZ_WRITE_STOP (Bit 2) */ +#define SCB_INTR_SPI_EC_MASKED_EZ_WRITE_STOP_Msk (0x4UL) /*!< SCB INTR_SPI_EC_MASKED: EZ_WRITE_STOP (Bitfield-Mask: 0x01)*/ +#define SCB_INTR_SPI_EC_MASKED_EZ_READ_STOP_Pos (3UL) /*!< SCB INTR_SPI_EC_MASKED: EZ_READ_STOP (Bit 3) */ +#define SCB_INTR_SPI_EC_MASKED_EZ_READ_STOP_Msk (0x8UL) /*!< SCB INTR_SPI_EC_MASKED: EZ_READ_STOP (Bitfield-Mask: 0x01)*/ +/* ====================================================== SCB.INTR_M ======================================================= */ +#define SCB_INTR_M_I2C_ARB_LOST_Pos (0UL) /*!< SCB INTR_M: I2C_ARB_LOST (Bit 0) */ +#define SCB_INTR_M_I2C_ARB_LOST_Msk (0x1UL) /*!< SCB INTR_M: I2C_ARB_LOST (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_I2C_NACK_Pos (1UL) /*!< SCB INTR_M: I2C_NACK (Bit 1) */ +#define SCB_INTR_M_I2C_NACK_Msk (0x2UL) /*!< SCB INTR_M: I2C_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_I2C_ACK_Pos (2UL) /*!< SCB INTR_M: I2C_ACK (Bit 2) */ +#define SCB_INTR_M_I2C_ACK_Msk (0x4UL) /*!< SCB INTR_M: I2C_ACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_I2C_STOP_Pos (4UL) /*!< SCB INTR_M: I2C_STOP (Bit 4) */ +#define SCB_INTR_M_I2C_STOP_Msk (0x10UL) /*!< SCB INTR_M: I2C_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_I2C_BUS_ERROR_Pos (8UL) /*!< SCB INTR_M: I2C_BUS_ERROR (Bit 8) */ +#define SCB_INTR_M_I2C_BUS_ERROR_Msk (0x100UL) /*!< SCB INTR_M: I2C_BUS_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_SPI_DONE_Pos (9UL) /*!< SCB INTR_M: SPI_DONE (Bit 9) */ +#define SCB_INTR_M_SPI_DONE_Msk (0x200UL) /*!< SCB INTR_M: SPI_DONE (Bitfield-Mask: 0x01) */ +/* ==================================================== SCB.INTR_M_SET ===================================================== */ +#define SCB_INTR_M_SET_I2C_ARB_LOST_Pos (0UL) /*!< SCB INTR_M_SET: I2C_ARB_LOST (Bit 0) */ +#define SCB_INTR_M_SET_I2C_ARB_LOST_Msk (0x1UL) /*!< SCB INTR_M_SET: I2C_ARB_LOST (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_SET_I2C_NACK_Pos (1UL) /*!< SCB INTR_M_SET: I2C_NACK (Bit 1) */ +#define SCB_INTR_M_SET_I2C_NACK_Msk (0x2UL) /*!< SCB INTR_M_SET: I2C_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_SET_I2C_ACK_Pos (2UL) /*!< SCB INTR_M_SET: I2C_ACK (Bit 2) */ +#define SCB_INTR_M_SET_I2C_ACK_Msk (0x4UL) /*!< SCB INTR_M_SET: I2C_ACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_SET_I2C_STOP_Pos (4UL) /*!< SCB INTR_M_SET: I2C_STOP (Bit 4) */ +#define SCB_INTR_M_SET_I2C_STOP_Msk (0x10UL) /*!< SCB INTR_M_SET: I2C_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_SET_I2C_BUS_ERROR_Pos (8UL) /*!< SCB INTR_M_SET: I2C_BUS_ERROR (Bit 8) */ +#define SCB_INTR_M_SET_I2C_BUS_ERROR_Msk (0x100UL) /*!< SCB INTR_M_SET: I2C_BUS_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_SET_SPI_DONE_Pos (9UL) /*!< SCB INTR_M_SET: SPI_DONE (Bit 9) */ +#define SCB_INTR_M_SET_SPI_DONE_Msk (0x200UL) /*!< SCB INTR_M_SET: SPI_DONE (Bitfield-Mask: 0x01) */ +/* ==================================================== SCB.INTR_M_MASK ==================================================== */ +#define SCB_INTR_M_MASK_I2C_ARB_LOST_Pos (0UL) /*!< SCB INTR_M_MASK: I2C_ARB_LOST (Bit 0) */ +#define SCB_INTR_M_MASK_I2C_ARB_LOST_Msk (0x1UL) /*!< SCB INTR_M_MASK: I2C_ARB_LOST (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_MASK_I2C_NACK_Pos (1UL) /*!< SCB INTR_M_MASK: I2C_NACK (Bit 1) */ +#define SCB_INTR_M_MASK_I2C_NACK_Msk (0x2UL) /*!< SCB INTR_M_MASK: I2C_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_MASK_I2C_ACK_Pos (2UL) /*!< SCB INTR_M_MASK: I2C_ACK (Bit 2) */ +#define SCB_INTR_M_MASK_I2C_ACK_Msk (0x4UL) /*!< SCB INTR_M_MASK: I2C_ACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_MASK_I2C_STOP_Pos (4UL) /*!< SCB INTR_M_MASK: I2C_STOP (Bit 4) */ +#define SCB_INTR_M_MASK_I2C_STOP_Msk (0x10UL) /*!< SCB INTR_M_MASK: I2C_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_MASK_I2C_BUS_ERROR_Pos (8UL) /*!< SCB INTR_M_MASK: I2C_BUS_ERROR (Bit 8) */ +#define SCB_INTR_M_MASK_I2C_BUS_ERROR_Msk (0x100UL) /*!< SCB INTR_M_MASK: I2C_BUS_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_MASK_SPI_DONE_Pos (9UL) /*!< SCB INTR_M_MASK: SPI_DONE (Bit 9) */ +#define SCB_INTR_M_MASK_SPI_DONE_Msk (0x200UL) /*!< SCB INTR_M_MASK: SPI_DONE (Bitfield-Mask: 0x01) */ +/* =================================================== SCB.INTR_M_MASKED =================================================== */ +#define SCB_INTR_M_MASKED_I2C_ARB_LOST_Pos (0UL) /*!< SCB INTR_M_MASKED: I2C_ARB_LOST (Bit 0) */ +#define SCB_INTR_M_MASKED_I2C_ARB_LOST_Msk (0x1UL) /*!< SCB INTR_M_MASKED: I2C_ARB_LOST (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_MASKED_I2C_NACK_Pos (1UL) /*!< SCB INTR_M_MASKED: I2C_NACK (Bit 1) */ +#define SCB_INTR_M_MASKED_I2C_NACK_Msk (0x2UL) /*!< SCB INTR_M_MASKED: I2C_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_MASKED_I2C_ACK_Pos (2UL) /*!< SCB INTR_M_MASKED: I2C_ACK (Bit 2) */ +#define SCB_INTR_M_MASKED_I2C_ACK_Msk (0x4UL) /*!< SCB INTR_M_MASKED: I2C_ACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_MASKED_I2C_STOP_Pos (4UL) /*!< SCB INTR_M_MASKED: I2C_STOP (Bit 4) */ +#define SCB_INTR_M_MASKED_I2C_STOP_Msk (0x10UL) /*!< SCB INTR_M_MASKED: I2C_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_MASKED_I2C_BUS_ERROR_Pos (8UL) /*!< SCB INTR_M_MASKED: I2C_BUS_ERROR (Bit 8) */ +#define SCB_INTR_M_MASKED_I2C_BUS_ERROR_Msk (0x100UL) /*!< SCB INTR_M_MASKED: I2C_BUS_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_M_MASKED_SPI_DONE_Pos (9UL) /*!< SCB INTR_M_MASKED: SPI_DONE (Bit 9) */ +#define SCB_INTR_M_MASKED_SPI_DONE_Msk (0x200UL) /*!< SCB INTR_M_MASKED: SPI_DONE (Bitfield-Mask: 0x01) */ +/* ====================================================== SCB.INTR_S ======================================================= */ +#define SCB_INTR_S_I2C_ARB_LOST_Pos (0UL) /*!< SCB INTR_S: I2C_ARB_LOST (Bit 0) */ +#define SCB_INTR_S_I2C_ARB_LOST_Msk (0x1UL) /*!< SCB INTR_S: I2C_ARB_LOST (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_I2C_NACK_Pos (1UL) /*!< SCB INTR_S: I2C_NACK (Bit 1) */ +#define SCB_INTR_S_I2C_NACK_Msk (0x2UL) /*!< SCB INTR_S: I2C_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_I2C_ACK_Pos (2UL) /*!< SCB INTR_S: I2C_ACK (Bit 2) */ +#define SCB_INTR_S_I2C_ACK_Msk (0x4UL) /*!< SCB INTR_S: I2C_ACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_I2C_WRITE_STOP_Pos (3UL) /*!< SCB INTR_S: I2C_WRITE_STOP (Bit 3) */ +#define SCB_INTR_S_I2C_WRITE_STOP_Msk (0x8UL) /*!< SCB INTR_S: I2C_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_I2C_STOP_Pos (4UL) /*!< SCB INTR_S: I2C_STOP (Bit 4) */ +#define SCB_INTR_S_I2C_STOP_Msk (0x10UL) /*!< SCB INTR_S: I2C_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_I2C_START_Pos (5UL) /*!< SCB INTR_S: I2C_START (Bit 5) */ +#define SCB_INTR_S_I2C_START_Msk (0x20UL) /*!< SCB INTR_S: I2C_START (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_I2C_ADDR_MATCH_Pos (6UL) /*!< SCB INTR_S: I2C_ADDR_MATCH (Bit 6) */ +#define SCB_INTR_S_I2C_ADDR_MATCH_Msk (0x40UL) /*!< SCB INTR_S: I2C_ADDR_MATCH (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_I2C_GENERAL_Pos (7UL) /*!< SCB INTR_S: I2C_GENERAL (Bit 7) */ +#define SCB_INTR_S_I2C_GENERAL_Msk (0x80UL) /*!< SCB INTR_S: I2C_GENERAL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_I2C_BUS_ERROR_Pos (8UL) /*!< SCB INTR_S: I2C_BUS_ERROR (Bit 8) */ +#define SCB_INTR_S_I2C_BUS_ERROR_Msk (0x100UL) /*!< SCB INTR_S: I2C_BUS_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SPI_EZ_WRITE_STOP_Pos (9UL) /*!< SCB INTR_S: SPI_EZ_WRITE_STOP (Bit 9) */ +#define SCB_INTR_S_SPI_EZ_WRITE_STOP_Msk (0x200UL) /*!< SCB INTR_S: SPI_EZ_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SPI_EZ_STOP_Pos (10UL) /*!< SCB INTR_S: SPI_EZ_STOP (Bit 10) */ +#define SCB_INTR_S_SPI_EZ_STOP_Msk (0x400UL) /*!< SCB INTR_S: SPI_EZ_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SPI_BUS_ERROR_Pos (11UL) /*!< SCB INTR_S: SPI_BUS_ERROR (Bit 11) */ +#define SCB_INTR_S_SPI_BUS_ERROR_Msk (0x800UL) /*!< SCB INTR_S: SPI_BUS_ERROR (Bitfield-Mask: 0x01) */ +/* ==================================================== SCB.INTR_S_SET ===================================================== */ +#define SCB_INTR_S_SET_I2C_ARB_LOST_Pos (0UL) /*!< SCB INTR_S_SET: I2C_ARB_LOST (Bit 0) */ +#define SCB_INTR_S_SET_I2C_ARB_LOST_Msk (0x1UL) /*!< SCB INTR_S_SET: I2C_ARB_LOST (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_I2C_NACK_Pos (1UL) /*!< SCB INTR_S_SET: I2C_NACK (Bit 1) */ +#define SCB_INTR_S_SET_I2C_NACK_Msk (0x2UL) /*!< SCB INTR_S_SET: I2C_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_I2C_ACK_Pos (2UL) /*!< SCB INTR_S_SET: I2C_ACK (Bit 2) */ +#define SCB_INTR_S_SET_I2C_ACK_Msk (0x4UL) /*!< SCB INTR_S_SET: I2C_ACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_I2C_WRITE_STOP_Pos (3UL) /*!< SCB INTR_S_SET: I2C_WRITE_STOP (Bit 3) */ +#define SCB_INTR_S_SET_I2C_WRITE_STOP_Msk (0x8UL) /*!< SCB INTR_S_SET: I2C_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_I2C_STOP_Pos (4UL) /*!< SCB INTR_S_SET: I2C_STOP (Bit 4) */ +#define SCB_INTR_S_SET_I2C_STOP_Msk (0x10UL) /*!< SCB INTR_S_SET: I2C_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_I2C_START_Pos (5UL) /*!< SCB INTR_S_SET: I2C_START (Bit 5) */ +#define SCB_INTR_S_SET_I2C_START_Msk (0x20UL) /*!< SCB INTR_S_SET: I2C_START (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_I2C_ADDR_MATCH_Pos (6UL) /*!< SCB INTR_S_SET: I2C_ADDR_MATCH (Bit 6) */ +#define SCB_INTR_S_SET_I2C_ADDR_MATCH_Msk (0x40UL) /*!< SCB INTR_S_SET: I2C_ADDR_MATCH (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_I2C_GENERAL_Pos (7UL) /*!< SCB INTR_S_SET: I2C_GENERAL (Bit 7) */ +#define SCB_INTR_S_SET_I2C_GENERAL_Msk (0x80UL) /*!< SCB INTR_S_SET: I2C_GENERAL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_I2C_BUS_ERROR_Pos (8UL) /*!< SCB INTR_S_SET: I2C_BUS_ERROR (Bit 8) */ +#define SCB_INTR_S_SET_I2C_BUS_ERROR_Msk (0x100UL) /*!< SCB INTR_S_SET: I2C_BUS_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_SPI_EZ_WRITE_STOP_Pos (9UL) /*!< SCB INTR_S_SET: SPI_EZ_WRITE_STOP (Bit 9) */ +#define SCB_INTR_S_SET_SPI_EZ_WRITE_STOP_Msk (0x200UL) /*!< SCB INTR_S_SET: SPI_EZ_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_SPI_EZ_STOP_Pos (10UL) /*!< SCB INTR_S_SET: SPI_EZ_STOP (Bit 10) */ +#define SCB_INTR_S_SET_SPI_EZ_STOP_Msk (0x400UL) /*!< SCB INTR_S_SET: SPI_EZ_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_SET_SPI_BUS_ERROR_Pos (11UL) /*!< SCB INTR_S_SET: SPI_BUS_ERROR (Bit 11) */ +#define SCB_INTR_S_SET_SPI_BUS_ERROR_Msk (0x800UL) /*!< SCB INTR_S_SET: SPI_BUS_ERROR (Bitfield-Mask: 0x01) */ +/* ==================================================== SCB.INTR_S_MASK ==================================================== */ +#define SCB_INTR_S_MASK_I2C_ARB_LOST_Pos (0UL) /*!< SCB INTR_S_MASK: I2C_ARB_LOST (Bit 0) */ +#define SCB_INTR_S_MASK_I2C_ARB_LOST_Msk (0x1UL) /*!< SCB INTR_S_MASK: I2C_ARB_LOST (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_I2C_NACK_Pos (1UL) /*!< SCB INTR_S_MASK: I2C_NACK (Bit 1) */ +#define SCB_INTR_S_MASK_I2C_NACK_Msk (0x2UL) /*!< SCB INTR_S_MASK: I2C_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_I2C_ACK_Pos (2UL) /*!< SCB INTR_S_MASK: I2C_ACK (Bit 2) */ +#define SCB_INTR_S_MASK_I2C_ACK_Msk (0x4UL) /*!< SCB INTR_S_MASK: I2C_ACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_I2C_WRITE_STOP_Pos (3UL) /*!< SCB INTR_S_MASK: I2C_WRITE_STOP (Bit 3) */ +#define SCB_INTR_S_MASK_I2C_WRITE_STOP_Msk (0x8UL) /*!< SCB INTR_S_MASK: I2C_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_I2C_STOP_Pos (4UL) /*!< SCB INTR_S_MASK: I2C_STOP (Bit 4) */ +#define SCB_INTR_S_MASK_I2C_STOP_Msk (0x10UL) /*!< SCB INTR_S_MASK: I2C_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_I2C_START_Pos (5UL) /*!< SCB INTR_S_MASK: I2C_START (Bit 5) */ +#define SCB_INTR_S_MASK_I2C_START_Msk (0x20UL) /*!< SCB INTR_S_MASK: I2C_START (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_I2C_ADDR_MATCH_Pos (6UL) /*!< SCB INTR_S_MASK: I2C_ADDR_MATCH (Bit 6) */ +#define SCB_INTR_S_MASK_I2C_ADDR_MATCH_Msk (0x40UL) /*!< SCB INTR_S_MASK: I2C_ADDR_MATCH (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_I2C_GENERAL_Pos (7UL) /*!< SCB INTR_S_MASK: I2C_GENERAL (Bit 7) */ +#define SCB_INTR_S_MASK_I2C_GENERAL_Msk (0x80UL) /*!< SCB INTR_S_MASK: I2C_GENERAL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_I2C_BUS_ERROR_Pos (8UL) /*!< SCB INTR_S_MASK: I2C_BUS_ERROR (Bit 8) */ +#define SCB_INTR_S_MASK_I2C_BUS_ERROR_Msk (0x100UL) /*!< SCB INTR_S_MASK: I2C_BUS_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_SPI_EZ_WRITE_STOP_Pos (9UL) /*!< SCB INTR_S_MASK: SPI_EZ_WRITE_STOP (Bit 9) */ +#define SCB_INTR_S_MASK_SPI_EZ_WRITE_STOP_Msk (0x200UL) /*!< SCB INTR_S_MASK: SPI_EZ_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_SPI_EZ_STOP_Pos (10UL) /*!< SCB INTR_S_MASK: SPI_EZ_STOP (Bit 10) */ +#define SCB_INTR_S_MASK_SPI_EZ_STOP_Msk (0x400UL) /*!< SCB INTR_S_MASK: SPI_EZ_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASK_SPI_BUS_ERROR_Pos (11UL) /*!< SCB INTR_S_MASK: SPI_BUS_ERROR (Bit 11) */ +#define SCB_INTR_S_MASK_SPI_BUS_ERROR_Msk (0x800UL) /*!< SCB INTR_S_MASK: SPI_BUS_ERROR (Bitfield-Mask: 0x01) */ +/* =================================================== SCB.INTR_S_MASKED =================================================== */ +#define SCB_INTR_S_MASKED_I2C_ARB_LOST_Pos (0UL) /*!< SCB INTR_S_MASKED: I2C_ARB_LOST (Bit 0) */ +#define SCB_INTR_S_MASKED_I2C_ARB_LOST_Msk (0x1UL) /*!< SCB INTR_S_MASKED: I2C_ARB_LOST (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASKED_I2C_NACK_Pos (1UL) /*!< SCB INTR_S_MASKED: I2C_NACK (Bit 1) */ +#define SCB_INTR_S_MASKED_I2C_NACK_Msk (0x2UL) /*!< SCB INTR_S_MASKED: I2C_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASKED_I2C_ACK_Pos (2UL) /*!< SCB INTR_S_MASKED: I2C_ACK (Bit 2) */ +#define SCB_INTR_S_MASKED_I2C_ACK_Msk (0x4UL) /*!< SCB INTR_S_MASKED: I2C_ACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASKED_I2C_WRITE_STOP_Pos (3UL) /*!< SCB INTR_S_MASKED: I2C_WRITE_STOP (Bit 3) */ +#define SCB_INTR_S_MASKED_I2C_WRITE_STOP_Msk (0x8UL) /*!< SCB INTR_S_MASKED: I2C_WRITE_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASKED_I2C_STOP_Pos (4UL) /*!< SCB INTR_S_MASKED: I2C_STOP (Bit 4) */ +#define SCB_INTR_S_MASKED_I2C_STOP_Msk (0x10UL) /*!< SCB INTR_S_MASKED: I2C_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASKED_I2C_START_Pos (5UL) /*!< SCB INTR_S_MASKED: I2C_START (Bit 5) */ +#define SCB_INTR_S_MASKED_I2C_START_Msk (0x20UL) /*!< SCB INTR_S_MASKED: I2C_START (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASKED_I2C_ADDR_MATCH_Pos (6UL) /*!< SCB INTR_S_MASKED: I2C_ADDR_MATCH (Bit 6) */ +#define SCB_INTR_S_MASKED_I2C_ADDR_MATCH_Msk (0x40UL) /*!< SCB INTR_S_MASKED: I2C_ADDR_MATCH (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASKED_I2C_GENERAL_Pos (7UL) /*!< SCB INTR_S_MASKED: I2C_GENERAL (Bit 7) */ +#define SCB_INTR_S_MASKED_I2C_GENERAL_Msk (0x80UL) /*!< SCB INTR_S_MASKED: I2C_GENERAL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASKED_I2C_BUS_ERROR_Pos (8UL) /*!< SCB INTR_S_MASKED: I2C_BUS_ERROR (Bit 8) */ +#define SCB_INTR_S_MASKED_I2C_BUS_ERROR_Msk (0x100UL) /*!< SCB INTR_S_MASKED: I2C_BUS_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASKED_SPI_EZ_WRITE_STOP_Pos (9UL) /*!< SCB INTR_S_MASKED: SPI_EZ_WRITE_STOP (Bit 9) */ +#define SCB_INTR_S_MASKED_SPI_EZ_WRITE_STOP_Msk (0x200UL) /*!< SCB INTR_S_MASKED: SPI_EZ_WRITE_STOP (Bitfield-Mask: 0x01)*/ +#define SCB_INTR_S_MASKED_SPI_EZ_STOP_Pos (10UL) /*!< SCB INTR_S_MASKED: SPI_EZ_STOP (Bit 10) */ +#define SCB_INTR_S_MASKED_SPI_EZ_STOP_Msk (0x400UL) /*!< SCB INTR_S_MASKED: SPI_EZ_STOP (Bitfield-Mask: 0x01) */ +#define SCB_INTR_S_MASKED_SPI_BUS_ERROR_Pos (11UL) /*!< SCB INTR_S_MASKED: SPI_BUS_ERROR (Bit 11) */ +#define SCB_INTR_S_MASKED_SPI_BUS_ERROR_Msk (0x800UL) /*!< SCB INTR_S_MASKED: SPI_BUS_ERROR (Bitfield-Mask: 0x01) */ +/* ====================================================== SCB.INTR_TX ====================================================== */ +#define SCB_INTR_TX_TRIGGER_Pos (0UL) /*!< SCB INTR_TX: TRIGGER (Bit 0) */ +#define SCB_INTR_TX_TRIGGER_Msk (0x1UL) /*!< SCB INTR_TX: TRIGGER (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_NOT_FULL_Pos (1UL) /*!< SCB INTR_TX: NOT_FULL (Bit 1) */ +#define SCB_INTR_TX_NOT_FULL_Msk (0x2UL) /*!< SCB INTR_TX: NOT_FULL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_EMPTY_Pos (4UL) /*!< SCB INTR_TX: EMPTY (Bit 4) */ +#define SCB_INTR_TX_EMPTY_Msk (0x10UL) /*!< SCB INTR_TX: EMPTY (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_OVERFLOW_Pos (5UL) /*!< SCB INTR_TX: OVERFLOW (Bit 5) */ +#define SCB_INTR_TX_OVERFLOW_Msk (0x20UL) /*!< SCB INTR_TX: OVERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_UNDERFLOW_Pos (6UL) /*!< SCB INTR_TX: UNDERFLOW (Bit 6) */ +#define SCB_INTR_TX_UNDERFLOW_Msk (0x40UL) /*!< SCB INTR_TX: UNDERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_BLOCKED_Pos (7UL) /*!< SCB INTR_TX: BLOCKED (Bit 7) */ +#define SCB_INTR_TX_BLOCKED_Msk (0x80UL) /*!< SCB INTR_TX: BLOCKED (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_UART_NACK_Pos (8UL) /*!< SCB INTR_TX: UART_NACK (Bit 8) */ +#define SCB_INTR_TX_UART_NACK_Msk (0x100UL) /*!< SCB INTR_TX: UART_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_UART_DONE_Pos (9UL) /*!< SCB INTR_TX: UART_DONE (Bit 9) */ +#define SCB_INTR_TX_UART_DONE_Msk (0x200UL) /*!< SCB INTR_TX: UART_DONE (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_UART_ARB_LOST_Pos (10UL) /*!< SCB INTR_TX: UART_ARB_LOST (Bit 10) */ +#define SCB_INTR_TX_UART_ARB_LOST_Msk (0x400UL) /*!< SCB INTR_TX: UART_ARB_LOST (Bitfield-Mask: 0x01) */ +/* ==================================================== SCB.INTR_TX_SET ==================================================== */ +#define SCB_INTR_TX_SET_TRIGGER_Pos (0UL) /*!< SCB INTR_TX_SET: TRIGGER (Bit 0) */ +#define SCB_INTR_TX_SET_TRIGGER_Msk (0x1UL) /*!< SCB INTR_TX_SET: TRIGGER (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_SET_NOT_FULL_Pos (1UL) /*!< SCB INTR_TX_SET: NOT_FULL (Bit 1) */ +#define SCB_INTR_TX_SET_NOT_FULL_Msk (0x2UL) /*!< SCB INTR_TX_SET: NOT_FULL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_SET_EMPTY_Pos (4UL) /*!< SCB INTR_TX_SET: EMPTY (Bit 4) */ +#define SCB_INTR_TX_SET_EMPTY_Msk (0x10UL) /*!< SCB INTR_TX_SET: EMPTY (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_SET_OVERFLOW_Pos (5UL) /*!< SCB INTR_TX_SET: OVERFLOW (Bit 5) */ +#define SCB_INTR_TX_SET_OVERFLOW_Msk (0x20UL) /*!< SCB INTR_TX_SET: OVERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_SET_UNDERFLOW_Pos (6UL) /*!< SCB INTR_TX_SET: UNDERFLOW (Bit 6) */ +#define SCB_INTR_TX_SET_UNDERFLOW_Msk (0x40UL) /*!< SCB INTR_TX_SET: UNDERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_SET_BLOCKED_Pos (7UL) /*!< SCB INTR_TX_SET: BLOCKED (Bit 7) */ +#define SCB_INTR_TX_SET_BLOCKED_Msk (0x80UL) /*!< SCB INTR_TX_SET: BLOCKED (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_SET_UART_NACK_Pos (8UL) /*!< SCB INTR_TX_SET: UART_NACK (Bit 8) */ +#define SCB_INTR_TX_SET_UART_NACK_Msk (0x100UL) /*!< SCB INTR_TX_SET: UART_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_SET_UART_DONE_Pos (9UL) /*!< SCB INTR_TX_SET: UART_DONE (Bit 9) */ +#define SCB_INTR_TX_SET_UART_DONE_Msk (0x200UL) /*!< SCB INTR_TX_SET: UART_DONE (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_SET_UART_ARB_LOST_Pos (10UL) /*!< SCB INTR_TX_SET: UART_ARB_LOST (Bit 10) */ +#define SCB_INTR_TX_SET_UART_ARB_LOST_Msk (0x400UL) /*!< SCB INTR_TX_SET: UART_ARB_LOST (Bitfield-Mask: 0x01) */ +/* =================================================== SCB.INTR_TX_MASK ==================================================== */ +#define SCB_INTR_TX_MASK_TRIGGER_Pos (0UL) /*!< SCB INTR_TX_MASK: TRIGGER (Bit 0) */ +#define SCB_INTR_TX_MASK_TRIGGER_Msk (0x1UL) /*!< SCB INTR_TX_MASK: TRIGGER (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASK_NOT_FULL_Pos (1UL) /*!< SCB INTR_TX_MASK: NOT_FULL (Bit 1) */ +#define SCB_INTR_TX_MASK_NOT_FULL_Msk (0x2UL) /*!< SCB INTR_TX_MASK: NOT_FULL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASK_EMPTY_Pos (4UL) /*!< SCB INTR_TX_MASK: EMPTY (Bit 4) */ +#define SCB_INTR_TX_MASK_EMPTY_Msk (0x10UL) /*!< SCB INTR_TX_MASK: EMPTY (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASK_OVERFLOW_Pos (5UL) /*!< SCB INTR_TX_MASK: OVERFLOW (Bit 5) */ +#define SCB_INTR_TX_MASK_OVERFLOW_Msk (0x20UL) /*!< SCB INTR_TX_MASK: OVERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASK_UNDERFLOW_Pos (6UL) /*!< SCB INTR_TX_MASK: UNDERFLOW (Bit 6) */ +#define SCB_INTR_TX_MASK_UNDERFLOW_Msk (0x40UL) /*!< SCB INTR_TX_MASK: UNDERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASK_BLOCKED_Pos (7UL) /*!< SCB INTR_TX_MASK: BLOCKED (Bit 7) */ +#define SCB_INTR_TX_MASK_BLOCKED_Msk (0x80UL) /*!< SCB INTR_TX_MASK: BLOCKED (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASK_UART_NACK_Pos (8UL) /*!< SCB INTR_TX_MASK: UART_NACK (Bit 8) */ +#define SCB_INTR_TX_MASK_UART_NACK_Msk (0x100UL) /*!< SCB INTR_TX_MASK: UART_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASK_UART_DONE_Pos (9UL) /*!< SCB INTR_TX_MASK: UART_DONE (Bit 9) */ +#define SCB_INTR_TX_MASK_UART_DONE_Msk (0x200UL) /*!< SCB INTR_TX_MASK: UART_DONE (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASK_UART_ARB_LOST_Pos (10UL) /*!< SCB INTR_TX_MASK: UART_ARB_LOST (Bit 10) */ +#define SCB_INTR_TX_MASK_UART_ARB_LOST_Msk (0x400UL) /*!< SCB INTR_TX_MASK: UART_ARB_LOST (Bitfield-Mask: 0x01) */ +/* ================================================== SCB.INTR_TX_MASKED =================================================== */ +#define SCB_INTR_TX_MASKED_TRIGGER_Pos (0UL) /*!< SCB INTR_TX_MASKED: TRIGGER (Bit 0) */ +#define SCB_INTR_TX_MASKED_TRIGGER_Msk (0x1UL) /*!< SCB INTR_TX_MASKED: TRIGGER (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASKED_NOT_FULL_Pos (1UL) /*!< SCB INTR_TX_MASKED: NOT_FULL (Bit 1) */ +#define SCB_INTR_TX_MASKED_NOT_FULL_Msk (0x2UL) /*!< SCB INTR_TX_MASKED: NOT_FULL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASKED_EMPTY_Pos (4UL) /*!< SCB INTR_TX_MASKED: EMPTY (Bit 4) */ +#define SCB_INTR_TX_MASKED_EMPTY_Msk (0x10UL) /*!< SCB INTR_TX_MASKED: EMPTY (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASKED_OVERFLOW_Pos (5UL) /*!< SCB INTR_TX_MASKED: OVERFLOW (Bit 5) */ +#define SCB_INTR_TX_MASKED_OVERFLOW_Msk (0x20UL) /*!< SCB INTR_TX_MASKED: OVERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASKED_UNDERFLOW_Pos (6UL) /*!< SCB INTR_TX_MASKED: UNDERFLOW (Bit 6) */ +#define SCB_INTR_TX_MASKED_UNDERFLOW_Msk (0x40UL) /*!< SCB INTR_TX_MASKED: UNDERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASKED_BLOCKED_Pos (7UL) /*!< SCB INTR_TX_MASKED: BLOCKED (Bit 7) */ +#define SCB_INTR_TX_MASKED_BLOCKED_Msk (0x80UL) /*!< SCB INTR_TX_MASKED: BLOCKED (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASKED_UART_NACK_Pos (8UL) /*!< SCB INTR_TX_MASKED: UART_NACK (Bit 8) */ +#define SCB_INTR_TX_MASKED_UART_NACK_Msk (0x100UL) /*!< SCB INTR_TX_MASKED: UART_NACK (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASKED_UART_DONE_Pos (9UL) /*!< SCB INTR_TX_MASKED: UART_DONE (Bit 9) */ +#define SCB_INTR_TX_MASKED_UART_DONE_Msk (0x200UL) /*!< SCB INTR_TX_MASKED: UART_DONE (Bitfield-Mask: 0x01) */ +#define SCB_INTR_TX_MASKED_UART_ARB_LOST_Pos (10UL) /*!< SCB INTR_TX_MASKED: UART_ARB_LOST (Bit 10) */ +#define SCB_INTR_TX_MASKED_UART_ARB_LOST_Msk (0x400UL) /*!< SCB INTR_TX_MASKED: UART_ARB_LOST (Bitfield-Mask: 0x01) */ +/* ====================================================== SCB.INTR_RX ====================================================== */ +#define SCB_INTR_RX_TRIGGER_Pos (0UL) /*!< SCB INTR_RX: TRIGGER (Bit 0) */ +#define SCB_INTR_RX_TRIGGER_Msk (0x1UL) /*!< SCB INTR_RX: TRIGGER (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_NOT_EMPTY_Pos (2UL) /*!< SCB INTR_RX: NOT_EMPTY (Bit 2) */ +#define SCB_INTR_RX_NOT_EMPTY_Msk (0x4UL) /*!< SCB INTR_RX: NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_FULL_Pos (3UL) /*!< SCB INTR_RX: FULL (Bit 3) */ +#define SCB_INTR_RX_FULL_Msk (0x8UL) /*!< SCB INTR_RX: FULL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_OVERFLOW_Pos (5UL) /*!< SCB INTR_RX: OVERFLOW (Bit 5) */ +#define SCB_INTR_RX_OVERFLOW_Msk (0x20UL) /*!< SCB INTR_RX: OVERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_UNDERFLOW_Pos (6UL) /*!< SCB INTR_RX: UNDERFLOW (Bit 6) */ +#define SCB_INTR_RX_UNDERFLOW_Msk (0x40UL) /*!< SCB INTR_RX: UNDERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_BLOCKED_Pos (7UL) /*!< SCB INTR_RX: BLOCKED (Bit 7) */ +#define SCB_INTR_RX_BLOCKED_Msk (0x80UL) /*!< SCB INTR_RX: BLOCKED (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_FRAME_ERROR_Pos (8UL) /*!< SCB INTR_RX: FRAME_ERROR (Bit 8) */ +#define SCB_INTR_RX_FRAME_ERROR_Msk (0x100UL) /*!< SCB INTR_RX: FRAME_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_PARITY_ERROR_Pos (9UL) /*!< SCB INTR_RX: PARITY_ERROR (Bit 9) */ +#define SCB_INTR_RX_PARITY_ERROR_Msk (0x200UL) /*!< SCB INTR_RX: PARITY_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_BAUD_DETECT_Pos (10UL) /*!< SCB INTR_RX: BAUD_DETECT (Bit 10) */ +#define SCB_INTR_RX_BAUD_DETECT_Msk (0x400UL) /*!< SCB INTR_RX: BAUD_DETECT (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_BREAK_DETECT_Pos (11UL) /*!< SCB INTR_RX: BREAK_DETECT (Bit 11) */ +#define SCB_INTR_RX_BREAK_DETECT_Msk (0x800UL) /*!< SCB INTR_RX: BREAK_DETECT (Bitfield-Mask: 0x01) */ +/* ==================================================== SCB.INTR_RX_SET ==================================================== */ +#define SCB_INTR_RX_SET_TRIGGER_Pos (0UL) /*!< SCB INTR_RX_SET: TRIGGER (Bit 0) */ +#define SCB_INTR_RX_SET_TRIGGER_Msk (0x1UL) /*!< SCB INTR_RX_SET: TRIGGER (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_SET_NOT_EMPTY_Pos (2UL) /*!< SCB INTR_RX_SET: NOT_EMPTY (Bit 2) */ +#define SCB_INTR_RX_SET_NOT_EMPTY_Msk (0x4UL) /*!< SCB INTR_RX_SET: NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_SET_FULL_Pos (3UL) /*!< SCB INTR_RX_SET: FULL (Bit 3) */ +#define SCB_INTR_RX_SET_FULL_Msk (0x8UL) /*!< SCB INTR_RX_SET: FULL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_SET_OVERFLOW_Pos (5UL) /*!< SCB INTR_RX_SET: OVERFLOW (Bit 5) */ +#define SCB_INTR_RX_SET_OVERFLOW_Msk (0x20UL) /*!< SCB INTR_RX_SET: OVERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_SET_UNDERFLOW_Pos (6UL) /*!< SCB INTR_RX_SET: UNDERFLOW (Bit 6) */ +#define SCB_INTR_RX_SET_UNDERFLOW_Msk (0x40UL) /*!< SCB INTR_RX_SET: UNDERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_SET_BLOCKED_Pos (7UL) /*!< SCB INTR_RX_SET: BLOCKED (Bit 7) */ +#define SCB_INTR_RX_SET_BLOCKED_Msk (0x80UL) /*!< SCB INTR_RX_SET: BLOCKED (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_SET_FRAME_ERROR_Pos (8UL) /*!< SCB INTR_RX_SET: FRAME_ERROR (Bit 8) */ +#define SCB_INTR_RX_SET_FRAME_ERROR_Msk (0x100UL) /*!< SCB INTR_RX_SET: FRAME_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_SET_PARITY_ERROR_Pos (9UL) /*!< SCB INTR_RX_SET: PARITY_ERROR (Bit 9) */ +#define SCB_INTR_RX_SET_PARITY_ERROR_Msk (0x200UL) /*!< SCB INTR_RX_SET: PARITY_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_SET_BAUD_DETECT_Pos (10UL) /*!< SCB INTR_RX_SET: BAUD_DETECT (Bit 10) */ +#define SCB_INTR_RX_SET_BAUD_DETECT_Msk (0x400UL) /*!< SCB INTR_RX_SET: BAUD_DETECT (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_SET_BREAK_DETECT_Pos (11UL) /*!< SCB INTR_RX_SET: BREAK_DETECT (Bit 11) */ +#define SCB_INTR_RX_SET_BREAK_DETECT_Msk (0x800UL) /*!< SCB INTR_RX_SET: BREAK_DETECT (Bitfield-Mask: 0x01) */ +/* =================================================== SCB.INTR_RX_MASK ==================================================== */ +#define SCB_INTR_RX_MASK_TRIGGER_Pos (0UL) /*!< SCB INTR_RX_MASK: TRIGGER (Bit 0) */ +#define SCB_INTR_RX_MASK_TRIGGER_Msk (0x1UL) /*!< SCB INTR_RX_MASK: TRIGGER (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASK_NOT_EMPTY_Pos (2UL) /*!< SCB INTR_RX_MASK: NOT_EMPTY (Bit 2) */ +#define SCB_INTR_RX_MASK_NOT_EMPTY_Msk (0x4UL) /*!< SCB INTR_RX_MASK: NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASK_FULL_Pos (3UL) /*!< SCB INTR_RX_MASK: FULL (Bit 3) */ +#define SCB_INTR_RX_MASK_FULL_Msk (0x8UL) /*!< SCB INTR_RX_MASK: FULL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASK_OVERFLOW_Pos (5UL) /*!< SCB INTR_RX_MASK: OVERFLOW (Bit 5) */ +#define SCB_INTR_RX_MASK_OVERFLOW_Msk (0x20UL) /*!< SCB INTR_RX_MASK: OVERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASK_UNDERFLOW_Pos (6UL) /*!< SCB INTR_RX_MASK: UNDERFLOW (Bit 6) */ +#define SCB_INTR_RX_MASK_UNDERFLOW_Msk (0x40UL) /*!< SCB INTR_RX_MASK: UNDERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASK_BLOCKED_Pos (7UL) /*!< SCB INTR_RX_MASK: BLOCKED (Bit 7) */ +#define SCB_INTR_RX_MASK_BLOCKED_Msk (0x80UL) /*!< SCB INTR_RX_MASK: BLOCKED (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASK_FRAME_ERROR_Pos (8UL) /*!< SCB INTR_RX_MASK: FRAME_ERROR (Bit 8) */ +#define SCB_INTR_RX_MASK_FRAME_ERROR_Msk (0x100UL) /*!< SCB INTR_RX_MASK: FRAME_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASK_PARITY_ERROR_Pos (9UL) /*!< SCB INTR_RX_MASK: PARITY_ERROR (Bit 9) */ +#define SCB_INTR_RX_MASK_PARITY_ERROR_Msk (0x200UL) /*!< SCB INTR_RX_MASK: PARITY_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASK_BAUD_DETECT_Pos (10UL) /*!< SCB INTR_RX_MASK: BAUD_DETECT (Bit 10) */ +#define SCB_INTR_RX_MASK_BAUD_DETECT_Msk (0x400UL) /*!< SCB INTR_RX_MASK: BAUD_DETECT (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASK_BREAK_DETECT_Pos (11UL) /*!< SCB INTR_RX_MASK: BREAK_DETECT (Bit 11) */ +#define SCB_INTR_RX_MASK_BREAK_DETECT_Msk (0x800UL) /*!< SCB INTR_RX_MASK: BREAK_DETECT (Bitfield-Mask: 0x01) */ +/* ================================================== SCB.INTR_RX_MASKED =================================================== */ +#define SCB_INTR_RX_MASKED_TRIGGER_Pos (0UL) /*!< SCB INTR_RX_MASKED: TRIGGER (Bit 0) */ +#define SCB_INTR_RX_MASKED_TRIGGER_Msk (0x1UL) /*!< SCB INTR_RX_MASKED: TRIGGER (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASKED_NOT_EMPTY_Pos (2UL) /*!< SCB INTR_RX_MASKED: NOT_EMPTY (Bit 2) */ +#define SCB_INTR_RX_MASKED_NOT_EMPTY_Msk (0x4UL) /*!< SCB INTR_RX_MASKED: NOT_EMPTY (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASKED_FULL_Pos (3UL) /*!< SCB INTR_RX_MASKED: FULL (Bit 3) */ +#define SCB_INTR_RX_MASKED_FULL_Msk (0x8UL) /*!< SCB INTR_RX_MASKED: FULL (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASKED_OVERFLOW_Pos (5UL) /*!< SCB INTR_RX_MASKED: OVERFLOW (Bit 5) */ +#define SCB_INTR_RX_MASKED_OVERFLOW_Msk (0x20UL) /*!< SCB INTR_RX_MASKED: OVERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASKED_UNDERFLOW_Pos (6UL) /*!< SCB INTR_RX_MASKED: UNDERFLOW (Bit 6) */ +#define SCB_INTR_RX_MASKED_UNDERFLOW_Msk (0x40UL) /*!< SCB INTR_RX_MASKED: UNDERFLOW (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASKED_BLOCKED_Pos (7UL) /*!< SCB INTR_RX_MASKED: BLOCKED (Bit 7) */ +#define SCB_INTR_RX_MASKED_BLOCKED_Msk (0x80UL) /*!< SCB INTR_RX_MASKED: BLOCKED (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASKED_FRAME_ERROR_Pos (8UL) /*!< SCB INTR_RX_MASKED: FRAME_ERROR (Bit 8) */ +#define SCB_INTR_RX_MASKED_FRAME_ERROR_Msk (0x100UL) /*!< SCB INTR_RX_MASKED: FRAME_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASKED_PARITY_ERROR_Pos (9UL) /*!< SCB INTR_RX_MASKED: PARITY_ERROR (Bit 9) */ +#define SCB_INTR_RX_MASKED_PARITY_ERROR_Msk (0x200UL) /*!< SCB INTR_RX_MASKED: PARITY_ERROR (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASKED_BAUD_DETECT_Pos (10UL) /*!< SCB INTR_RX_MASKED: BAUD_DETECT (Bit 10) */ +#define SCB_INTR_RX_MASKED_BAUD_DETECT_Msk (0x400UL) /*!< SCB INTR_RX_MASKED: BAUD_DETECT (Bitfield-Mask: 0x01) */ +#define SCB_INTR_RX_MASKED_BREAK_DETECT_Pos (11UL) /*!< SCB INTR_RX_MASKED: BREAK_DETECT (Bit 11) */ +#define SCB_INTR_RX_MASKED_BREAK_DETECT_Msk (0x800UL) /*!< SCB INTR_RX_MASKED: BREAK_DETECT (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_SCB_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_sflash.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_sflash.h new file mode 100644 index 0000000000..4c1f70ca60 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_sflash.h @@ -0,0 +1,186 @@ +/***************************************************************************//** +* \file cyip_sflash.h +* +* \brief +* SFLASH IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_SFLASH_H_ +#define _CYIP_SFLASH_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ SFLASH ================ */ +/* =========================================================================================================================== */ + +#define SFLASH_SECTION_SIZE 0x00008000UL + +/** + * \brief FLASH Supervisory Region (SFLASH) + */ +typedef struct { /*!< SFLASH Structure */ + __IM uint16_t RESERVED; + __IOM uint16_t SILICON_ID; /*!< 0x00000002 Indicates siliconID of the device */ + __IM uint32_t RESERVED1[383]; + __IOM uint8_t DIE_LOT[3]; /*!< 0x00000600 Lot Number (3 bytes) */ + __IOM uint8_t DIE_WAFER; /*!< 0x00000603 Wafer Number */ + __IOM uint8_t DIE_X; /*!< 0x00000604 X Position on Wafer, CRI Pass/Fail Bin */ + __IOM uint8_t DIE_Y; /*!< 0x00000605 Y Position on Wafer, CHI Pass/Fail Bin */ + __IOM uint8_t DIE_SORT; /*!< 0x00000606 Sort1/2/3 Pass/Fail Bin */ + __IOM uint8_t DIE_MINOR; /*!< 0x00000607 Minor Revision Number */ + __IOM uint8_t DIE_DAY; /*!< 0x00000608 Day number */ + __IOM uint8_t DIE_MONTH; /*!< 0x00000609 Month number */ + __IOM uint8_t DIE_YEAR; /*!< 0x0000060A Year number */ + __IM uint8_t RESERVED2[501]; + __IOM uint32_t BLE_DEVICE_ADDRESS[128]; /*!< 0x00000800 BLE_DEVICE_ADDRESS */ + __IOM uint32_t USER_FREE_ROW1[128]; /*!< 0x00000A00 USER_FREE_ROW1 */ + __IOM uint32_t USER_FREE_ROW2[128]; /*!< 0x00000C00 USER_FREE_ROW2 */ + __IOM uint32_t USER_FREE_ROW3[128]; /*!< 0x00000E00 USER_FREE_ROW3 */ + __IM uint32_t RESERVED3[302]; + __IOM uint8_t DEVICE_UID[16]; /*!< 0x000014B8 Unique Identifier Number for each device */ + __IOM uint8_t MASTER_KEY[16]; /*!< 0x000014C8 Master key to change other keys */ + __IOM uint32_t STANDARD_SMPU_STRUCT_SLAVE_ADDR[16]; /*!< 0x000014D8 Standard SMPU STRUCT Slave Address value */ + __IOM uint32_t STANDARD_SMPU_STRUCT_SLAVE_ATTR[16]; /*!< 0x00001518 Standard SMPU STRUCT Slave Attribute value */ + __IOM uint32_t STANDARD_SMPU_STRUCT_MASTER_ATTR[16]; /*!< 0x00001558 Standard SMPU STRUCT Master Attribute value */ + __IOM uint32_t STANDARD_MPU_STRUCT[16]; /*!< 0x00001598 Standard MPU STRUCT */ + __IOM uint32_t STANDARD_PPU_STRUCT[16]; /*!< 0x000015D8 Standard PPU STRUCT */ + __IOM uint32_t CSP_PANEL_ID; /*!< 0x00001618 CSP Panel Id to record panel ID of CSP die */ + __IM uint32_t RESERVED4[121]; + __IOM uint16_t PILO_FREQ_STEP; /*!< 0x00001800 Resolution step for PILO at class in BCD format */ + __IM uint16_t RESERVED5[1023]; + __IOM uint32_t FLASH_BOOT_IDENTIFIER; /*!< 0x00002000 Flash Boot Firmware Identifier */ + __IOM uint32_t FLASH_BOOT_ATTRIBUTE; /*!< 0x00002004 N/A */ + __IOM uint32_t FLASH_BOOT_CMAC_ADDRESS; /*!< 0x00002008 Flash boot CMAC address */ + __IOM uint32_t FLASH_BOOT_ADDRESS; /*!< 0x0000200C Flash Boot Code Address */ + __IOM uint32_t FLASH_BOOT_NEXT_ADDRESS; /*!< 0x00002010 Flash Boot Next Code Address to be executed */ + __IOM uint32_t FLASH_BOOT_ID_TYPE; /*!< 0x00002014 Contains processor details */ + __IOM uint32_t FLASH_BOOT_VECTOR_TABLE[48]; /*!< 0x00002018 Flash Boot Vector Table */ + __IOM uint8_t FLASH_BOOT_CODE[8192]; /*!< 0x000020D8 Flash Boot Code 8KB */ + __IOM uint8_t FLASH_BOOT_CMAC[16]; /*!< 0x000040D8 Secure Hash/CMAC */ +} SFLASH_Type; /*!< Size = 16616 (0x40E8) */ + + +/* =================================================== SFLASH.SILICON_ID =================================================== */ +#define SFLASH_SILICON_ID_ID_Pos (0UL) /*!< SFLASH SILICON_ID: ID (Bit 0) */ +#define SFLASH_SILICON_ID_ID_Msk (0xffffUL) /*!< SFLASH SILICON_ID: ID (Bitfield-Mask: 0xffff) */ +/* ==================================================== SFLASH.DIE_LOT ===================================================== */ +#define SFLASH_DIE_LOT_LOT_Pos (0UL) /*!< SFLASH DIE_LOT: LOT (Bit 0) */ +#define SFLASH_DIE_LOT_LOT_Msk (0xffUL) /*!< SFLASH DIE_LOT: LOT (Bitfield-Mask: 0xff) */ +/* =================================================== SFLASH.DIE_WAFER ==================================================== */ +#define SFLASH_DIE_WAFER_WAFER_Pos (0UL) /*!< SFLASH DIE_WAFER: WAFER (Bit 0) */ +#define SFLASH_DIE_WAFER_WAFER_Msk (0xffUL) /*!< SFLASH DIE_WAFER: WAFER (Bitfield-Mask: 0xff) */ +/* ===================================================== SFLASH.DIE_X ====================================================== */ +#define SFLASH_DIE_X_X_Pos (0UL) /*!< SFLASH DIE_X: X (Bit 0) */ +#define SFLASH_DIE_X_X_Msk (0xffUL) /*!< SFLASH DIE_X: X (Bitfield-Mask: 0xff) */ +/* ===================================================== SFLASH.DIE_Y ====================================================== */ +#define SFLASH_DIE_Y_Y_Pos (0UL) /*!< SFLASH DIE_Y: Y (Bit 0) */ +#define SFLASH_DIE_Y_Y_Msk (0xffUL) /*!< SFLASH DIE_Y: Y (Bitfield-Mask: 0xff) */ +/* ==================================================== SFLASH.DIE_SORT ==================================================== */ +#define SFLASH_DIE_SORT_S1_PASS_Pos (0UL) /*!< SFLASH DIE_SORT: S1_PASS (Bit 0) */ +#define SFLASH_DIE_SORT_S1_PASS_Msk (0x1UL) /*!< SFLASH DIE_SORT: S1_PASS (Bitfield-Mask: 0x01) */ +#define SFLASH_DIE_SORT_S2_PASS_Pos (1UL) /*!< SFLASH DIE_SORT: S2_PASS (Bit 1) */ +#define SFLASH_DIE_SORT_S2_PASS_Msk (0x2UL) /*!< SFLASH DIE_SORT: S2_PASS (Bitfield-Mask: 0x01) */ +#define SFLASH_DIE_SORT_S3_PASS_Pos (2UL) /*!< SFLASH DIE_SORT: S3_PASS (Bit 2) */ +#define SFLASH_DIE_SORT_S3_PASS_Msk (0x4UL) /*!< SFLASH DIE_SORT: S3_PASS (Bitfield-Mask: 0x01) */ +#define SFLASH_DIE_SORT_CRI_PASS_Pos (3UL) /*!< SFLASH DIE_SORT: CRI_PASS (Bit 3) */ +#define SFLASH_DIE_SORT_CRI_PASS_Msk (0x8UL) /*!< SFLASH DIE_SORT: CRI_PASS (Bitfield-Mask: 0x01) */ +#define SFLASH_DIE_SORT_CHI_PASS_Pos (4UL) /*!< SFLASH DIE_SORT: CHI_PASS (Bit 4) */ +#define SFLASH_DIE_SORT_CHI_PASS_Msk (0x10UL) /*!< SFLASH DIE_SORT: CHI_PASS (Bitfield-Mask: 0x01) */ +#define SFLASH_DIE_SORT_ENG_PASS_Pos (5UL) /*!< SFLASH DIE_SORT: ENG_PASS (Bit 5) */ +#define SFLASH_DIE_SORT_ENG_PASS_Msk (0x20UL) /*!< SFLASH DIE_SORT: ENG_PASS (Bitfield-Mask: 0x01) */ +/* =================================================== SFLASH.DIE_MINOR ==================================================== */ +#define SFLASH_DIE_MINOR_MINOR_Pos (0UL) /*!< SFLASH DIE_MINOR: MINOR (Bit 0) */ +#define SFLASH_DIE_MINOR_MINOR_Msk (0xffUL) /*!< SFLASH DIE_MINOR: MINOR (Bitfield-Mask: 0xff) */ +/* ==================================================== SFLASH.DIE_DAY ===================================================== */ +#define SFLASH_DIE_DAY_MINOR_Pos (0UL) /*!< SFLASH DIE_DAY: MINOR (Bit 0) */ +#define SFLASH_DIE_DAY_MINOR_Msk (0xffUL) /*!< SFLASH DIE_DAY: MINOR (Bitfield-Mask: 0xff) */ +/* =================================================== SFLASH.DIE_MONTH ==================================================== */ +#define SFLASH_DIE_MONTH_MINOR_Pos (0UL) /*!< SFLASH DIE_MONTH: MINOR (Bit 0) */ +#define SFLASH_DIE_MONTH_MINOR_Msk (0xffUL) /*!< SFLASH DIE_MONTH: MINOR (Bitfield-Mask: 0xff) */ +/* ==================================================== SFLASH.DIE_YEAR ==================================================== */ +#define SFLASH_DIE_YEAR_MINOR_Pos (0UL) /*!< SFLASH DIE_YEAR: MINOR (Bit 0) */ +#define SFLASH_DIE_YEAR_MINOR_Msk (0xffUL) /*!< SFLASH DIE_YEAR: MINOR (Bitfield-Mask: 0xff) */ +/* =============================================== SFLASH.BLE_DEVICE_ADDRESS =============================================== */ +#define SFLASH_BLE_DEVICE_ADDRESS_ADDR_Pos (0UL) /*!< SFLASH BLE_DEVICE_ADDRESS: ADDR (Bit 0) */ +#define SFLASH_BLE_DEVICE_ADDRESS_ADDR_Msk (0xffffffffUL) /*!< SFLASH BLE_DEVICE_ADDRESS: ADDR (Bitfield-Mask: 0xffffffff)*/ +/* ================================================= SFLASH.USER_FREE_ROW1 ================================================= */ +#define SFLASH_USER_FREE_ROW1_DATA32_Pos (0UL) /*!< SFLASH USER_FREE_ROW1: DATA32 (Bit 0) */ +#define SFLASH_USER_FREE_ROW1_DATA32_Msk (0xffffffffUL) /*!< SFLASH USER_FREE_ROW1: DATA32 (Bitfield-Mask: 0xffffffff) */ +/* ================================================= SFLASH.USER_FREE_ROW2 ================================================= */ +#define SFLASH_USER_FREE_ROW2_DATA32_Pos (0UL) /*!< SFLASH USER_FREE_ROW2: DATA32 (Bit 0) */ +#define SFLASH_USER_FREE_ROW2_DATA32_Msk (0xffffffffUL) /*!< SFLASH USER_FREE_ROW2: DATA32 (Bitfield-Mask: 0xffffffff) */ +/* ================================================= SFLASH.USER_FREE_ROW3 ================================================= */ +#define SFLASH_USER_FREE_ROW3_DATA32_Pos (0UL) /*!< SFLASH USER_FREE_ROW3: DATA32 (Bit 0) */ +#define SFLASH_USER_FREE_ROW3_DATA32_Msk (0xffffffffUL) /*!< SFLASH USER_FREE_ROW3: DATA32 (Bitfield-Mask: 0xffffffff) */ +/* =================================================== SFLASH.DEVICE_UID =================================================== */ +#define SFLASH_DEVICE_UID_DATA_Pos (0UL) /*!< SFLASH DEVICE_UID: DATA (Bit 0) */ +#define SFLASH_DEVICE_UID_DATA_Msk (0xffUL) /*!< SFLASH DEVICE_UID: DATA (Bitfield-Mask: 0xff) */ +/* =================================================== SFLASH.MASTER_KEY =================================================== */ +#define SFLASH_MASTER_KEY_DATA_Pos (0UL) /*!< SFLASH MASTER_KEY: DATA (Bit 0) */ +#define SFLASH_MASTER_KEY_DATA_Msk (0xffUL) /*!< SFLASH MASTER_KEY: DATA (Bitfield-Mask: 0xff) */ +/* ======================================== SFLASH.STANDARD_SMPU_STRUCT_SLAVE_ADDR ========================================= */ +#define SFLASH_STANDARD_SMPU_STRUCT_SLAVE_ADDR_DATA32_Pos (0UL) /*!< SFLASH STANDARD_SMPU_STRUCT_SLAVE_ADDR: DATA32 (Bit 0) */ +#define SFLASH_STANDARD_SMPU_STRUCT_SLAVE_ADDR_DATA32_Msk (0xffffffffUL) /*!< SFLASH STANDARD_SMPU_STRUCT_SLAVE_ADDR: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ======================================== SFLASH.STANDARD_SMPU_STRUCT_SLAVE_ATTR ========================================= */ +#define SFLASH_STANDARD_SMPU_STRUCT_SLAVE_ATTR_DATA32_Pos (0UL) /*!< SFLASH STANDARD_SMPU_STRUCT_SLAVE_ATTR: DATA32 (Bit 0) */ +#define SFLASH_STANDARD_SMPU_STRUCT_SLAVE_ATTR_DATA32_Msk (0xffffffffUL) /*!< SFLASH STANDARD_SMPU_STRUCT_SLAVE_ATTR: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ======================================== SFLASH.STANDARD_SMPU_STRUCT_MASTER_ATTR ======================================== */ +#define SFLASH_STANDARD_SMPU_STRUCT_MASTER_ATTR_DATA32_Pos (0UL) /*!< SFLASH STANDARD_SMPU_STRUCT_MASTER_ATTR: DATA32 (Bit 0) */ +#define SFLASH_STANDARD_SMPU_STRUCT_MASTER_ATTR_DATA32_Msk (0xffffffffUL) /*!< SFLASH STANDARD_SMPU_STRUCT_MASTER_ATTR: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== SFLASH.STANDARD_MPU_STRUCT =============================================== */ +#define SFLASH_STANDARD_MPU_STRUCT_DATA32_Pos (0UL) /*!< SFLASH STANDARD_MPU_STRUCT: DATA32 (Bit 0) */ +#define SFLASH_STANDARD_MPU_STRUCT_DATA32_Msk (0xffffffffUL) /*!< SFLASH STANDARD_MPU_STRUCT: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== SFLASH.STANDARD_PPU_STRUCT =============================================== */ +#define SFLASH_STANDARD_PPU_STRUCT_DATA32_Pos (0UL) /*!< SFLASH STANDARD_PPU_STRUCT: DATA32 (Bit 0) */ +#define SFLASH_STANDARD_PPU_STRUCT_DATA32_Msk (0xffffffffUL) /*!< SFLASH STANDARD_PPU_STRUCT: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ================================================== SFLASH.CSP_PANEL_ID ================================================== */ +#define SFLASH_CSP_PANEL_ID_DATA32_Pos (0UL) /*!< SFLASH CSP_PANEL_ID: DATA32 (Bit 0) */ +#define SFLASH_CSP_PANEL_ID_DATA32_Msk (0xffffffffUL) /*!< SFLASH CSP_PANEL_ID: DATA32 (Bitfield-Mask: 0xffffffff) */ +/* ================================================= SFLASH.PILO_FREQ_STEP ================================================= */ +#define SFLASH_PILO_FREQ_STEP_STEP_Pos (0UL) /*!< SFLASH PILO_FREQ_STEP: STEP (Bit 0) */ +#define SFLASH_PILO_FREQ_STEP_STEP_Msk (0xffffUL) /*!< SFLASH PILO_FREQ_STEP: STEP (Bitfield-Mask: 0xffff) */ +/* ============================================= SFLASH.FLASH_BOOT_IDENTIFIER ============================================== */ +#define SFLASH_FLASH_BOOT_IDENTIFIER_DATA32_Pos (0UL) /*!< SFLASH FLASH_BOOT_IDENTIFIER: DATA32 (Bit 0) */ +#define SFLASH_FLASH_BOOT_IDENTIFIER_DATA32_Msk (0xffffffffUL) /*!< SFLASH FLASH_BOOT_IDENTIFIER: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== SFLASH.FLASH_BOOT_ATTRIBUTE ============================================== */ +#define SFLASH_FLASH_BOOT_ATTRIBUTE_DATA32_Pos (0UL) /*!< SFLASH FLASH_BOOT_ATTRIBUTE: DATA32 (Bit 0) */ +#define SFLASH_FLASH_BOOT_ATTRIBUTE_DATA32_Msk (0xffffffffUL) /*!< SFLASH FLASH_BOOT_ATTRIBUTE: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ============================================ SFLASH.FLASH_BOOT_CMAC_ADDRESS ============================================= */ +#define SFLASH_FLASH_BOOT_CMAC_ADDRESS_DATA32_Pos (0UL) /*!< SFLASH FLASH_BOOT_CMAC_ADDRESS: DATA32 (Bit 0) */ +#define SFLASH_FLASH_BOOT_CMAC_ADDRESS_DATA32_Msk (0xffffffffUL) /*!< SFLASH FLASH_BOOT_CMAC_ADDRESS: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* =============================================== SFLASH.FLASH_BOOT_ADDRESS =============================================== */ +#define SFLASH_FLASH_BOOT_ADDRESS_DATA32_Pos (0UL) /*!< SFLASH FLASH_BOOT_ADDRESS: DATA32 (Bit 0) */ +#define SFLASH_FLASH_BOOT_ADDRESS_DATA32_Msk (0xffffffffUL) /*!< SFLASH FLASH_BOOT_ADDRESS: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ============================================ SFLASH.FLASH_BOOT_NEXT_ADDRESS ============================================= */ +#define SFLASH_FLASH_BOOT_NEXT_ADDRESS_DATA32_Pos (0UL) /*!< SFLASH FLASH_BOOT_NEXT_ADDRESS: DATA32 (Bit 0) */ +#define SFLASH_FLASH_BOOT_NEXT_ADDRESS_DATA32_Msk (0xffffffffUL) /*!< SFLASH FLASH_BOOT_NEXT_ADDRESS: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* =============================================== SFLASH.FLASH_BOOT_ID_TYPE =============================================== */ +#define SFLASH_FLASH_BOOT_ID_TYPE_DATA32_Pos (0UL) /*!< SFLASH FLASH_BOOT_ID_TYPE: DATA32 (Bit 0) */ +#define SFLASH_FLASH_BOOT_ID_TYPE_DATA32_Msk (0xffffffffUL) /*!< SFLASH FLASH_BOOT_ID_TYPE: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ============================================ SFLASH.FLASH_BOOT_VECTOR_TABLE ============================================= */ +#define SFLASH_FLASH_BOOT_VECTOR_TABLE_DATA32_Pos (0UL) /*!< SFLASH FLASH_BOOT_VECTOR_TABLE: DATA32 (Bit 0) */ +#define SFLASH_FLASH_BOOT_VECTOR_TABLE_DATA32_Msk (0xffffffffUL) /*!< SFLASH FLASH_BOOT_VECTOR_TABLE: DATA32 (Bitfield-Mask: 0xffffffff)*/ +/* ================================================ SFLASH.FLASH_BOOT_CODE ================================================= */ +#define SFLASH_FLASH_BOOT_CODE_DATA_Pos (0UL) /*!< SFLASH FLASH_BOOT_CODE: DATA (Bit 0) */ +#define SFLASH_FLASH_BOOT_CODE_DATA_Msk (0xffUL) /*!< SFLASH FLASH_BOOT_CODE: DATA (Bitfield-Mask: 0xff) */ +/* ================================================ SFLASH.FLASH_BOOT_CMAC ================================================= */ +#define SFLASH_FLASH_BOOT_CMAC_DATA_Pos (0UL) /*!< SFLASH FLASH_BOOT_CMAC: DATA (Bit 0) */ +#define SFLASH_FLASH_BOOT_CMAC_DATA_Msk (0xffUL) /*!< SFLASH FLASH_BOOT_CMAC: DATA (Bitfield-Mask: 0xff) */ + + +#endif /* _CYIP_SFLASH_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_smartio.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_smartio.h new file mode 100644 index 0000000000..09d188f2fd --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_smartio.h @@ -0,0 +1,109 @@ +/***************************************************************************//** +* \file cyip_smartio.h +* +* \brief +* SMARTIO IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_SMARTIO_H_ +#define _CYIP_SMARTIO_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ SMARTIO ================ */ +/* =========================================================================================================================== */ + +#define SMARTIO_PRT_SECTION_SIZE 0x00000100UL +#define SMARTIO_SECTION_SIZE 0x00010000UL + +/** + * \brief Programmable IO port registers (SMARTIO_PRT) + */ +typedef struct { + __IOM uint32_t CTL; /*!< 0x00000000 Control register */ + __IM uint32_t RESERVED[3]; + __IOM uint32_t SYNC_CTL; /*!< 0x00000010 Synchronization control register */ + __IM uint32_t RESERVED1[3]; + __IOM uint32_t LUT_SEL[8]; /*!< 0x00000020 LUT component input selection */ + __IOM uint32_t LUT_CTL[8]; /*!< 0x00000040 LUT component control register */ + __IM uint32_t RESERVED2[24]; + __IOM uint32_t DU_SEL; /*!< 0x000000C0 Data unit component input selection */ + __IOM uint32_t DU_CTL; /*!< 0x000000C4 Data unit component control register */ + __IM uint32_t RESERVED3[10]; + __IOM uint32_t DATA; /*!< 0x000000F0 Data register */ + __IM uint32_t RESERVED4[3]; +} SMARTIO_PRT_Type; /*!< Size = 244 (0xF4) */ + +/** + * \brief Programmable IO configuration (SMARTIO) + */ +typedef struct { /*!< SMARTIO Structure */ + SMARTIO_PRT_Type PRT[128]; /*!< 0x00000000 Programmable IO port registers */ +} SMARTIO_Type; /*!< Size = 32768 (0x8000) */ + + +/* ==================================================== SMARTIO_PRT.CTL ==================================================== */ +#define SMARTIO_PRT_CTL_BYPASS_Pos (0UL) /*!< SMARTIO_PRT CTL: BYPASS (Bit 0) */ +#define SMARTIO_PRT_CTL_BYPASS_Msk (0xffUL) /*!< SMARTIO_PRT CTL: BYPASS (Bitfield-Mask: 0xff) */ +#define SMARTIO_PRT_CTL_CLOCK_SRC_Pos (8UL) /*!< SMARTIO_PRT CTL: CLOCK_SRC (Bit 8) */ +#define SMARTIO_PRT_CTL_CLOCK_SRC_Msk (0x1f00UL) /*!< SMARTIO_PRT CTL: CLOCK_SRC (Bitfield-Mask: 0x1f) */ +#define SMARTIO_PRT_CTL_HLD_OVR_Pos (24UL) /*!< SMARTIO_PRT CTL: HLD_OVR (Bit 24) */ +#define SMARTIO_PRT_CTL_HLD_OVR_Msk (0x1000000UL) /*!< SMARTIO_PRT CTL: HLD_OVR (Bitfield-Mask: 0x01) */ +#define SMARTIO_PRT_CTL_PIPELINE_EN_Pos (25UL) /*!< SMARTIO_PRT CTL: PIPELINE_EN (Bit 25) */ +#define SMARTIO_PRT_CTL_PIPELINE_EN_Msk (0x2000000UL) /*!< SMARTIO_PRT CTL: PIPELINE_EN (Bitfield-Mask: 0x01) */ +#define SMARTIO_PRT_CTL_ENABLED_Pos (31UL) /*!< SMARTIO_PRT CTL: ENABLED (Bit 31) */ +#define SMARTIO_PRT_CTL_ENABLED_Msk (0x80000000UL) /*!< SMARTIO_PRT CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ================================================= SMARTIO_PRT.SYNC_CTL ================================================== */ +#define SMARTIO_PRT_SYNC_CTL_IO_SYNC_EN_Pos (0UL) /*!< SMARTIO_PRT SYNC_CTL: IO_SYNC_EN (Bit 0) */ +#define SMARTIO_PRT_SYNC_CTL_IO_SYNC_EN_Msk (0xffUL) /*!< SMARTIO_PRT SYNC_CTL: IO_SYNC_EN (Bitfield-Mask: 0xff) */ +#define SMARTIO_PRT_SYNC_CTL_CHIP_SYNC_EN_Pos (8UL) /*!< SMARTIO_PRT SYNC_CTL: CHIP_SYNC_EN (Bit 8) */ +#define SMARTIO_PRT_SYNC_CTL_CHIP_SYNC_EN_Msk (0xff00UL) /*!< SMARTIO_PRT SYNC_CTL: CHIP_SYNC_EN (Bitfield-Mask: 0xff) */ +/* ================================================== SMARTIO_PRT.LUT_SEL ================================================== */ +#define SMARTIO_PRT_LUT_SEL_LUT_TR0_SEL_Pos (0UL) /*!< SMARTIO_PRT LUT_SEL: LUT_TR0_SEL (Bit 0) */ +#define SMARTIO_PRT_LUT_SEL_LUT_TR0_SEL_Msk (0xfUL) /*!< SMARTIO_PRT LUT_SEL: LUT_TR0_SEL (Bitfield-Mask: 0x0f) */ +#define SMARTIO_PRT_LUT_SEL_LUT_TR1_SEL_Pos (8UL) /*!< SMARTIO_PRT LUT_SEL: LUT_TR1_SEL (Bit 8) */ +#define SMARTIO_PRT_LUT_SEL_LUT_TR1_SEL_Msk (0xf00UL) /*!< SMARTIO_PRT LUT_SEL: LUT_TR1_SEL (Bitfield-Mask: 0x0f) */ +#define SMARTIO_PRT_LUT_SEL_LUT_TR2_SEL_Pos (16UL) /*!< SMARTIO_PRT LUT_SEL: LUT_TR2_SEL (Bit 16) */ +#define SMARTIO_PRT_LUT_SEL_LUT_TR2_SEL_Msk (0xf0000UL) /*!< SMARTIO_PRT LUT_SEL: LUT_TR2_SEL (Bitfield-Mask: 0x0f) */ +/* ================================================== SMARTIO_PRT.LUT_CTL ================================================== */ +#define SMARTIO_PRT_LUT_CTL_LUT_Pos (0UL) /*!< SMARTIO_PRT LUT_CTL: LUT (Bit 0) */ +#define SMARTIO_PRT_LUT_CTL_LUT_Msk (0xffUL) /*!< SMARTIO_PRT LUT_CTL: LUT (Bitfield-Mask: 0xff) */ +#define SMARTIO_PRT_LUT_CTL_LUT_OPC_Pos (8UL) /*!< SMARTIO_PRT LUT_CTL: LUT_OPC (Bit 8) */ +#define SMARTIO_PRT_LUT_CTL_LUT_OPC_Msk (0x300UL) /*!< SMARTIO_PRT LUT_CTL: LUT_OPC (Bitfield-Mask: 0x03) */ +/* ================================================== SMARTIO_PRT.DU_SEL =================================================== */ +#define SMARTIO_PRT_DU_SEL_DU_TR0_SEL_Pos (0UL) /*!< SMARTIO_PRT DU_SEL: DU_TR0_SEL (Bit 0) */ +#define SMARTIO_PRT_DU_SEL_DU_TR0_SEL_Msk (0xfUL) /*!< SMARTIO_PRT DU_SEL: DU_TR0_SEL (Bitfield-Mask: 0x0f) */ +#define SMARTIO_PRT_DU_SEL_DU_TR1_SEL_Pos (8UL) /*!< SMARTIO_PRT DU_SEL: DU_TR1_SEL (Bit 8) */ +#define SMARTIO_PRT_DU_SEL_DU_TR1_SEL_Msk (0xf00UL) /*!< SMARTIO_PRT DU_SEL: DU_TR1_SEL (Bitfield-Mask: 0x0f) */ +#define SMARTIO_PRT_DU_SEL_DU_TR2_SEL_Pos (16UL) /*!< SMARTIO_PRT DU_SEL: DU_TR2_SEL (Bit 16) */ +#define SMARTIO_PRT_DU_SEL_DU_TR2_SEL_Msk (0xf0000UL) /*!< SMARTIO_PRT DU_SEL: DU_TR2_SEL (Bitfield-Mask: 0x0f) */ +#define SMARTIO_PRT_DU_SEL_DU_DATA0_SEL_Pos (24UL) /*!< SMARTIO_PRT DU_SEL: DU_DATA0_SEL (Bit 24) */ +#define SMARTIO_PRT_DU_SEL_DU_DATA0_SEL_Msk (0x3000000UL) /*!< SMARTIO_PRT DU_SEL: DU_DATA0_SEL (Bitfield-Mask: 0x03) */ +#define SMARTIO_PRT_DU_SEL_DU_DATA1_SEL_Pos (28UL) /*!< SMARTIO_PRT DU_SEL: DU_DATA1_SEL (Bit 28) */ +#define SMARTIO_PRT_DU_SEL_DU_DATA1_SEL_Msk (0x30000000UL) /*!< SMARTIO_PRT DU_SEL: DU_DATA1_SEL (Bitfield-Mask: 0x03) */ +/* ================================================== SMARTIO_PRT.DU_CTL =================================================== */ +#define SMARTIO_PRT_DU_CTL_DU_SIZE_Pos (0UL) /*!< SMARTIO_PRT DU_CTL: DU_SIZE (Bit 0) */ +#define SMARTIO_PRT_DU_CTL_DU_SIZE_Msk (0x7UL) /*!< SMARTIO_PRT DU_CTL: DU_SIZE (Bitfield-Mask: 0x07) */ +#define SMARTIO_PRT_DU_CTL_DU_OPC_Pos (8UL) /*!< SMARTIO_PRT DU_CTL: DU_OPC (Bit 8) */ +#define SMARTIO_PRT_DU_CTL_DU_OPC_Msk (0xf00UL) /*!< SMARTIO_PRT DU_CTL: DU_OPC (Bitfield-Mask: 0x0f) */ +/* =================================================== SMARTIO_PRT.DATA ==================================================== */ +#define SMARTIO_PRT_DATA_DATA_Pos (0UL) /*!< SMARTIO_PRT DATA: DATA (Bit 0) */ +#define SMARTIO_PRT_DATA_DATA_Msk (0xffUL) /*!< SMARTIO_PRT DATA: DATA (Bitfield-Mask: 0xff) */ + + +#endif /* _CYIP_SMARTIO_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_smif.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_smif.h new file mode 100644 index 0000000000..0012e9a490 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_smif.h @@ -0,0 +1,404 @@ +/***************************************************************************//** +* \file cyip_smif.h +* +* \brief +* SMIF IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_SMIF_H_ +#define _CYIP_SMIF_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ SMIF ================ */ +/* =========================================================================================================================== */ + +#define SMIF_DEVICE_SECTION_SIZE 0x00000080UL +#define SMIF_SECTION_SIZE 0x00010000UL + +/** + * \brief Device (only used in XIP mode) (SMIF_DEVICE) + */ +typedef struct { + __IOM uint32_t CTL; /*!< 0x00000000 Control */ + __IM uint32_t RESERVED; + __IOM uint32_t ADDR; /*!< 0x00000008 Device region base address */ + __IOM uint32_t MASK; /*!< 0x0000000C Device region mask */ + __IM uint32_t RESERVED1[4]; + __IOM uint32_t ADDR_CTL; /*!< 0x00000020 Address control */ + __IM uint32_t RESERVED2[7]; + __IOM uint32_t RD_CMD_CTL; /*!< 0x00000040 Read command control */ + __IOM uint32_t RD_ADDR_CTL; /*!< 0x00000044 Read address control */ + __IOM uint32_t RD_MODE_CTL; /*!< 0x00000048 Read mode control */ + __IOM uint32_t RD_DUMMY_CTL; /*!< 0x0000004C Read dummy control */ + __IOM uint32_t RD_DATA_CTL; /*!< 0x00000050 Read data control */ + __IM uint32_t RESERVED3[3]; + __IOM uint32_t WR_CMD_CTL; /*!< 0x00000060 Write command control */ + __IOM uint32_t WR_ADDR_CTL; /*!< 0x00000064 Write address control */ + __IOM uint32_t WR_MODE_CTL; /*!< 0x00000068 Write mode control */ + __IOM uint32_t WR_DUMMY_CTL; /*!< 0x0000006C Write dummy control */ + __IOM uint32_t WR_DATA_CTL; /*!< 0x00000070 Write data control */ + __IM uint32_t RESERVED4[3]; +} SMIF_DEVICE_Type; /*!< Size = 116 (0x74) */ + +/** + * \brief Serial Memory Interface (SMIF) + */ +typedef struct { /*!< SMIF Structure */ + __IOM uint32_t CTL; /*!< 0x00000000 Control */ + __IM uint32_t STATUS; /*!< 0x00000004 Status */ + __IM uint32_t RESERVED[15]; + __IM uint32_t TX_CMD_FIFO_STATUS; /*!< 0x00000044 Transmitter command FIFO status */ + __IM uint32_t RESERVED1[2]; + __OM uint32_t TX_CMD_FIFO_WR; /*!< 0x00000050 Transmitter command FIFO write */ + __IM uint32_t RESERVED2[11]; + __IOM uint32_t TX_DATA_FIFO_CTL; /*!< 0x00000080 Transmitter data FIFO control */ + __IM uint32_t TX_DATA_FIFO_STATUS; /*!< 0x00000084 Transmitter data FIFO status */ + __IM uint32_t RESERVED3[2]; + __OM uint32_t TX_DATA_FIFO_WR1; /*!< 0x00000090 Transmitter data FIFO write */ + __OM uint32_t TX_DATA_FIFO_WR2; /*!< 0x00000094 Transmitter data FIFO write */ + __OM uint32_t TX_DATA_FIFO_WR4; /*!< 0x00000098 Transmitter data FIFO write */ + __IM uint32_t RESERVED4[9]; + __IOM uint32_t RX_DATA_FIFO_CTL; /*!< 0x000000C0 Receiver data FIFO control */ + __IM uint32_t RX_DATA_FIFO_STATUS; /*!< 0x000000C4 Receiver data FIFO status */ + __IM uint32_t RESERVED5[2]; + __IM uint32_t RX_DATA_FIFO_RD1; /*!< 0x000000D0 Receiver data FIFO read */ + __IM uint32_t RX_DATA_FIFO_RD2; /*!< 0x000000D4 Receiver data FIFO read */ + __IM uint32_t RX_DATA_FIFO_RD4; /*!< 0x000000D8 Receiver data FIFO read */ + __IM uint32_t RESERVED6; + __IM uint32_t RX_DATA_FIFO_RD1_SILENT; /*!< 0x000000E0 Receiver data FIFO silent read */ + __IM uint32_t RESERVED7[7]; + __IOM uint32_t SLOW_CA_CTL; /*!< 0x00000100 Slow cache control */ + __IM uint32_t RESERVED8; + __IOM uint32_t SLOW_CA_CMD; /*!< 0x00000108 Slow cache command */ + __IM uint32_t RESERVED9[13]; + __IM uint32_t SLOW_CA_STATUS0; /*!< 0x00000140 Slow cache status 0 */ + __IM uint32_t SLOW_CA_STATUS1; /*!< 0x00000144 Slow cache status 1 */ + __IM uint32_t SLOW_CA_STATUS2; /*!< 0x00000148 Slow cache status 2 */ + __IM uint32_t RESERVED10[13]; + __IOM uint32_t FAST_CA_CTL; /*!< 0x00000180 Fast cache control */ + __IM uint32_t RESERVED11; + __IOM uint32_t FAST_CA_CMD; /*!< 0x00000188 Fast cache command */ + __IM uint32_t RESERVED12[13]; + __IM uint32_t FAST_CA_STATUS0; /*!< 0x000001C0 Fast cache status 0 */ + __IM uint32_t FAST_CA_STATUS1; /*!< 0x000001C4 Fast cache status 1 */ + __IM uint32_t FAST_CA_STATUS2; /*!< 0x000001C8 Fast cache status 2 */ + __IM uint32_t RESERVED13[13]; + __IOM uint32_t CRYPTO_CMD; /*!< 0x00000200 Cryptography Command */ + __IM uint32_t RESERVED14[7]; + __IOM uint32_t CRYPTO_INPUT0; /*!< 0x00000220 Cryptography input 0 */ + __IOM uint32_t CRYPTO_INPUT1; /*!< 0x00000224 Cryptography input 1 */ + __IOM uint32_t CRYPTO_INPUT2; /*!< 0x00000228 Cryptography input 2 */ + __IOM uint32_t CRYPTO_INPUT3; /*!< 0x0000022C Cryptography input 3 */ + __IM uint32_t RESERVED15[4]; + __OM uint32_t CRYPTO_KEY0; /*!< 0x00000240 Cryptography key 0 */ + __OM uint32_t CRYPTO_KEY1; /*!< 0x00000244 Cryptography key 1 */ + __OM uint32_t CRYPTO_KEY2; /*!< 0x00000248 Cryptography key 2 */ + __OM uint32_t CRYPTO_KEY3; /*!< 0x0000024C Cryptography key 3 */ + __IM uint32_t RESERVED16[4]; + __IOM uint32_t CRYPTO_OUTPUT0; /*!< 0x00000260 Cryptography output 0 */ + __IOM uint32_t CRYPTO_OUTPUT1; /*!< 0x00000264 Cryptography output 1 */ + __IOM uint32_t CRYPTO_OUTPUT2; /*!< 0x00000268 Cryptography output 2 */ + __IOM uint32_t CRYPTO_OUTPUT3; /*!< 0x0000026C Cryptography output 3 */ + __IM uint32_t RESERVED17[340]; + __IOM uint32_t INTR; /*!< 0x000007C0 Interrupt register */ + __IOM uint32_t INTR_SET; /*!< 0x000007C4 Interrupt set register */ + __IOM uint32_t INTR_MASK; /*!< 0x000007C8 Interrupt mask register */ + __IM uint32_t INTR_MASKED; /*!< 0x000007CC Interrupt masked register */ + __IM uint32_t RESERVED18[12]; + SMIF_DEVICE_Type DEVICE[4]; /*!< 0x00000800 Device (only used in XIP mode) */ +} SMIF_Type; /*!< Size = 2560 (0xA00) */ + + +/* ==================================================== SMIF_DEVICE.CTL ==================================================== */ +#define SMIF_DEVICE_CTL_WR_EN_Pos (0UL) /*!< SMIF_DEVICE CTL: WR_EN (Bit 0) */ +#define SMIF_DEVICE_CTL_WR_EN_Msk (0x1UL) /*!< SMIF_DEVICE CTL: WR_EN (Bitfield-Mask: 0x01) */ +#define SMIF_DEVICE_CTL_CRYPTO_EN_Pos (8UL) /*!< SMIF_DEVICE CTL: CRYPTO_EN (Bit 8) */ +#define SMIF_DEVICE_CTL_CRYPTO_EN_Msk (0x100UL) /*!< SMIF_DEVICE CTL: CRYPTO_EN (Bitfield-Mask: 0x01) */ +#define SMIF_DEVICE_CTL_DATA_SEL_Pos (16UL) /*!< SMIF_DEVICE CTL: DATA_SEL (Bit 16) */ +#define SMIF_DEVICE_CTL_DATA_SEL_Msk (0x30000UL) /*!< SMIF_DEVICE CTL: DATA_SEL (Bitfield-Mask: 0x03) */ +#define SMIF_DEVICE_CTL_ENABLED_Pos (31UL) /*!< SMIF_DEVICE CTL: ENABLED (Bit 31) */ +#define SMIF_DEVICE_CTL_ENABLED_Msk (0x80000000UL) /*!< SMIF_DEVICE CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* =================================================== SMIF_DEVICE.ADDR ==================================================== */ +#define SMIF_DEVICE_ADDR_ADDR_Pos (8UL) /*!< SMIF_DEVICE ADDR: ADDR (Bit 8) */ +#define SMIF_DEVICE_ADDR_ADDR_Msk (0xffffff00UL) /*!< SMIF_DEVICE ADDR: ADDR (Bitfield-Mask: 0xffffff) */ +/* =================================================== SMIF_DEVICE.MASK ==================================================== */ +#define SMIF_DEVICE_MASK_MASK_Pos (8UL) /*!< SMIF_DEVICE MASK: MASK (Bit 8) */ +#define SMIF_DEVICE_MASK_MASK_Msk (0xffffff00UL) /*!< SMIF_DEVICE MASK: MASK (Bitfield-Mask: 0xffffff) */ +/* ================================================= SMIF_DEVICE.ADDR_CTL ================================================== */ +#define SMIF_DEVICE_ADDR_CTL_SIZE2_Pos (0UL) /*!< SMIF_DEVICE ADDR_CTL: SIZE2 (Bit 0) */ +#define SMIF_DEVICE_ADDR_CTL_SIZE2_Msk (0x3UL) /*!< SMIF_DEVICE ADDR_CTL: SIZE2 (Bitfield-Mask: 0x03) */ +#define SMIF_DEVICE_ADDR_CTL_DIV2_Pos (8UL) /*!< SMIF_DEVICE ADDR_CTL: DIV2 (Bit 8) */ +#define SMIF_DEVICE_ADDR_CTL_DIV2_Msk (0x100UL) /*!< SMIF_DEVICE ADDR_CTL: DIV2 (Bitfield-Mask: 0x01) */ +/* ================================================ SMIF_DEVICE.RD_CMD_CTL ================================================= */ +#define SMIF_DEVICE_RD_CMD_CTL_CODE_Pos (0UL) /*!< SMIF_DEVICE RD_CMD_CTL: CODE (Bit 0) */ +#define SMIF_DEVICE_RD_CMD_CTL_CODE_Msk (0xffUL) /*!< SMIF_DEVICE RD_CMD_CTL: CODE (Bitfield-Mask: 0xff) */ +#define SMIF_DEVICE_RD_CMD_CTL_WIDTH_Pos (16UL) /*!< SMIF_DEVICE RD_CMD_CTL: WIDTH (Bit 16) */ +#define SMIF_DEVICE_RD_CMD_CTL_WIDTH_Msk (0x30000UL) /*!< SMIF_DEVICE RD_CMD_CTL: WIDTH (Bitfield-Mask: 0x03) */ +#define SMIF_DEVICE_RD_CMD_CTL_PRESENT_Pos (31UL) /*!< SMIF_DEVICE RD_CMD_CTL: PRESENT (Bit 31) */ +#define SMIF_DEVICE_RD_CMD_CTL_PRESENT_Msk (0x80000000UL) /*!< SMIF_DEVICE RD_CMD_CTL: PRESENT (Bitfield-Mask: 0x01) */ +/* ================================================ SMIF_DEVICE.RD_ADDR_CTL ================================================ */ +#define SMIF_DEVICE_RD_ADDR_CTL_WIDTH_Pos (16UL) /*!< SMIF_DEVICE RD_ADDR_CTL: WIDTH (Bit 16) */ +#define SMIF_DEVICE_RD_ADDR_CTL_WIDTH_Msk (0x30000UL) /*!< SMIF_DEVICE RD_ADDR_CTL: WIDTH (Bitfield-Mask: 0x03) */ +/* ================================================ SMIF_DEVICE.RD_MODE_CTL ================================================ */ +#define SMIF_DEVICE_RD_MODE_CTL_CODE_Pos (0UL) /*!< SMIF_DEVICE RD_MODE_CTL: CODE (Bit 0) */ +#define SMIF_DEVICE_RD_MODE_CTL_CODE_Msk (0xffUL) /*!< SMIF_DEVICE RD_MODE_CTL: CODE (Bitfield-Mask: 0xff) */ +#define SMIF_DEVICE_RD_MODE_CTL_WIDTH_Pos (16UL) /*!< SMIF_DEVICE RD_MODE_CTL: WIDTH (Bit 16) */ +#define SMIF_DEVICE_RD_MODE_CTL_WIDTH_Msk (0x30000UL) /*!< SMIF_DEVICE RD_MODE_CTL: WIDTH (Bitfield-Mask: 0x03) */ +#define SMIF_DEVICE_RD_MODE_CTL_PRESENT_Pos (31UL) /*!< SMIF_DEVICE RD_MODE_CTL: PRESENT (Bit 31) */ +#define SMIF_DEVICE_RD_MODE_CTL_PRESENT_Msk (0x80000000UL) /*!< SMIF_DEVICE RD_MODE_CTL: PRESENT (Bitfield-Mask: 0x01) */ +/* =============================================== SMIF_DEVICE.RD_DUMMY_CTL ================================================ */ +#define SMIF_DEVICE_RD_DUMMY_CTL_SIZE5_Pos (0UL) /*!< SMIF_DEVICE RD_DUMMY_CTL: SIZE5 (Bit 0) */ +#define SMIF_DEVICE_RD_DUMMY_CTL_SIZE5_Msk (0x1fUL) /*!< SMIF_DEVICE RD_DUMMY_CTL: SIZE5 (Bitfield-Mask: 0x1f) */ +#define SMIF_DEVICE_RD_DUMMY_CTL_PRESENT_Pos (31UL) /*!< SMIF_DEVICE RD_DUMMY_CTL: PRESENT (Bit 31) */ +#define SMIF_DEVICE_RD_DUMMY_CTL_PRESENT_Msk (0x80000000UL) /*!< SMIF_DEVICE RD_DUMMY_CTL: PRESENT (Bitfield-Mask: 0x01) */ +/* ================================================ SMIF_DEVICE.RD_DATA_CTL ================================================ */ +#define SMIF_DEVICE_RD_DATA_CTL_WIDTH_Pos (16UL) /*!< SMIF_DEVICE RD_DATA_CTL: WIDTH (Bit 16) */ +#define SMIF_DEVICE_RD_DATA_CTL_WIDTH_Msk (0x30000UL) /*!< SMIF_DEVICE RD_DATA_CTL: WIDTH (Bitfield-Mask: 0x03) */ +/* ================================================ SMIF_DEVICE.WR_CMD_CTL ================================================= */ +#define SMIF_DEVICE_WR_CMD_CTL_CODE_Pos (0UL) /*!< SMIF_DEVICE WR_CMD_CTL: CODE (Bit 0) */ +#define SMIF_DEVICE_WR_CMD_CTL_CODE_Msk (0xffUL) /*!< SMIF_DEVICE WR_CMD_CTL: CODE (Bitfield-Mask: 0xff) */ +#define SMIF_DEVICE_WR_CMD_CTL_WIDTH_Pos (16UL) /*!< SMIF_DEVICE WR_CMD_CTL: WIDTH (Bit 16) */ +#define SMIF_DEVICE_WR_CMD_CTL_WIDTH_Msk (0x30000UL) /*!< SMIF_DEVICE WR_CMD_CTL: WIDTH (Bitfield-Mask: 0x03) */ +#define SMIF_DEVICE_WR_CMD_CTL_PRESENT_Pos (31UL) /*!< SMIF_DEVICE WR_CMD_CTL: PRESENT (Bit 31) */ +#define SMIF_DEVICE_WR_CMD_CTL_PRESENT_Msk (0x80000000UL) /*!< SMIF_DEVICE WR_CMD_CTL: PRESENT (Bitfield-Mask: 0x01) */ +/* ================================================ SMIF_DEVICE.WR_ADDR_CTL ================================================ */ +#define SMIF_DEVICE_WR_ADDR_CTL_WIDTH_Pos (16UL) /*!< SMIF_DEVICE WR_ADDR_CTL: WIDTH (Bit 16) */ +#define SMIF_DEVICE_WR_ADDR_CTL_WIDTH_Msk (0x30000UL) /*!< SMIF_DEVICE WR_ADDR_CTL: WIDTH (Bitfield-Mask: 0x03) */ +/* ================================================ SMIF_DEVICE.WR_MODE_CTL ================================================ */ +#define SMIF_DEVICE_WR_MODE_CTL_CODE_Pos (0UL) /*!< SMIF_DEVICE WR_MODE_CTL: CODE (Bit 0) */ +#define SMIF_DEVICE_WR_MODE_CTL_CODE_Msk (0xffUL) /*!< SMIF_DEVICE WR_MODE_CTL: CODE (Bitfield-Mask: 0xff) */ +#define SMIF_DEVICE_WR_MODE_CTL_WIDTH_Pos (16UL) /*!< SMIF_DEVICE WR_MODE_CTL: WIDTH (Bit 16) */ +#define SMIF_DEVICE_WR_MODE_CTL_WIDTH_Msk (0x30000UL) /*!< SMIF_DEVICE WR_MODE_CTL: WIDTH (Bitfield-Mask: 0x03) */ +#define SMIF_DEVICE_WR_MODE_CTL_PRESENT_Pos (31UL) /*!< SMIF_DEVICE WR_MODE_CTL: PRESENT (Bit 31) */ +#define SMIF_DEVICE_WR_MODE_CTL_PRESENT_Msk (0x80000000UL) /*!< SMIF_DEVICE WR_MODE_CTL: PRESENT (Bitfield-Mask: 0x01) */ +/* =============================================== SMIF_DEVICE.WR_DUMMY_CTL ================================================ */ +#define SMIF_DEVICE_WR_DUMMY_CTL_SIZE5_Pos (0UL) /*!< SMIF_DEVICE WR_DUMMY_CTL: SIZE5 (Bit 0) */ +#define SMIF_DEVICE_WR_DUMMY_CTL_SIZE5_Msk (0x1fUL) /*!< SMIF_DEVICE WR_DUMMY_CTL: SIZE5 (Bitfield-Mask: 0x1f) */ +#define SMIF_DEVICE_WR_DUMMY_CTL_PRESENT_Pos (31UL) /*!< SMIF_DEVICE WR_DUMMY_CTL: PRESENT (Bit 31) */ +#define SMIF_DEVICE_WR_DUMMY_CTL_PRESENT_Msk (0x80000000UL) /*!< SMIF_DEVICE WR_DUMMY_CTL: PRESENT (Bitfield-Mask: 0x01) */ +/* ================================================ SMIF_DEVICE.WR_DATA_CTL ================================================ */ +#define SMIF_DEVICE_WR_DATA_CTL_WIDTH_Pos (16UL) /*!< SMIF_DEVICE WR_DATA_CTL: WIDTH (Bit 16) */ +#define SMIF_DEVICE_WR_DATA_CTL_WIDTH_Msk (0x30000UL) /*!< SMIF_DEVICE WR_DATA_CTL: WIDTH (Bitfield-Mask: 0x03) */ + + +/* ======================================================= SMIF.CTL ======================================================== */ +#define SMIF_CTL_XIP_MODE_Pos (0UL) /*!< SMIF CTL: XIP_MODE (Bit 0) */ +#define SMIF_CTL_XIP_MODE_Msk (0x1UL) /*!< SMIF CTL: XIP_MODE (Bitfield-Mask: 0x01) */ +#define SMIF_CTL_CLOCK_IF_RX_SEL_Pos (12UL) /*!< SMIF CTL: CLOCK_IF_RX_SEL (Bit 12) */ +#define SMIF_CTL_CLOCK_IF_RX_SEL_Msk (0x3000UL) /*!< SMIF CTL: CLOCK_IF_RX_SEL (Bitfield-Mask: 0x03) */ +#define SMIF_CTL_DESELECT_DELAY_Pos (16UL) /*!< SMIF CTL: DESELECT_DELAY (Bit 16) */ +#define SMIF_CTL_DESELECT_DELAY_Msk (0x70000UL) /*!< SMIF CTL: DESELECT_DELAY (Bitfield-Mask: 0x07) */ +#define SMIF_CTL_BLOCK_Pos (24UL) /*!< SMIF CTL: BLOCK (Bit 24) */ +#define SMIF_CTL_BLOCK_Msk (0x1000000UL) /*!< SMIF CTL: BLOCK (Bitfield-Mask: 0x01) */ +#define SMIF_CTL_ENABLED_Pos (31UL) /*!< SMIF CTL: ENABLED (Bit 31) */ +#define SMIF_CTL_ENABLED_Msk (0x80000000UL) /*!< SMIF CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* ====================================================== SMIF.STATUS ====================================================== */ +#define SMIF_STATUS_BUSY_Pos (31UL) /*!< SMIF STATUS: BUSY (Bit 31) */ +#define SMIF_STATUS_BUSY_Msk (0x80000000UL) /*!< SMIF STATUS: BUSY (Bitfield-Mask: 0x01) */ +/* ================================================ SMIF.TX_CMD_FIFO_STATUS ================================================ */ +#define SMIF_TX_CMD_FIFO_STATUS_USED3_Pos (0UL) /*!< SMIF TX_CMD_FIFO_STATUS: USED3 (Bit 0) */ +#define SMIF_TX_CMD_FIFO_STATUS_USED3_Msk (0x7UL) /*!< SMIF TX_CMD_FIFO_STATUS: USED3 (Bitfield-Mask: 0x07) */ +/* ================================================== SMIF.TX_CMD_FIFO_WR ================================================== */ +#define SMIF_TX_CMD_FIFO_WR_DATA20_Pos (0UL) /*!< SMIF TX_CMD_FIFO_WR: DATA20 (Bit 0) */ +#define SMIF_TX_CMD_FIFO_WR_DATA20_Msk (0xfffffUL) /*!< SMIF TX_CMD_FIFO_WR: DATA20 (Bitfield-Mask: 0xfffff) */ +/* ================================================= SMIF.TX_DATA_FIFO_CTL ================================================= */ +#define SMIF_TX_DATA_FIFO_CTL_TRIGGER_LEVEL_Pos (0UL) /*!< SMIF TX_DATA_FIFO_CTL: TRIGGER_LEVEL (Bit 0) */ +#define SMIF_TX_DATA_FIFO_CTL_TRIGGER_LEVEL_Msk (0x7UL) /*!< SMIF TX_DATA_FIFO_CTL: TRIGGER_LEVEL (Bitfield-Mask: 0x07)*/ +/* =============================================== SMIF.TX_DATA_FIFO_STATUS ================================================ */ +#define SMIF_TX_DATA_FIFO_STATUS_USED4_Pos (0UL) /*!< SMIF TX_DATA_FIFO_STATUS: USED4 (Bit 0) */ +#define SMIF_TX_DATA_FIFO_STATUS_USED4_Msk (0xfUL) /*!< SMIF TX_DATA_FIFO_STATUS: USED4 (Bitfield-Mask: 0x0f) */ +/* ================================================= SMIF.TX_DATA_FIFO_WR1 ================================================= */ +#define SMIF_TX_DATA_FIFO_WR1_DATA0_Pos (0UL) /*!< SMIF TX_DATA_FIFO_WR1: DATA0 (Bit 0) */ +#define SMIF_TX_DATA_FIFO_WR1_DATA0_Msk (0xffUL) /*!< SMIF TX_DATA_FIFO_WR1: DATA0 (Bitfield-Mask: 0xff) */ +/* ================================================= SMIF.TX_DATA_FIFO_WR2 ================================================= */ +#define SMIF_TX_DATA_FIFO_WR2_DATA0_Pos (0UL) /*!< SMIF TX_DATA_FIFO_WR2: DATA0 (Bit 0) */ +#define SMIF_TX_DATA_FIFO_WR2_DATA0_Msk (0xffUL) /*!< SMIF TX_DATA_FIFO_WR2: DATA0 (Bitfield-Mask: 0xff) */ +#define SMIF_TX_DATA_FIFO_WR2_DATA1_Pos (8UL) /*!< SMIF TX_DATA_FIFO_WR2: DATA1 (Bit 8) */ +#define SMIF_TX_DATA_FIFO_WR2_DATA1_Msk (0xff00UL) /*!< SMIF TX_DATA_FIFO_WR2: DATA1 (Bitfield-Mask: 0xff) */ +/* ================================================= SMIF.TX_DATA_FIFO_WR4 ================================================= */ +#define SMIF_TX_DATA_FIFO_WR4_DATA0_Pos (0UL) /*!< SMIF TX_DATA_FIFO_WR4: DATA0 (Bit 0) */ +#define SMIF_TX_DATA_FIFO_WR4_DATA0_Msk (0xffUL) /*!< SMIF TX_DATA_FIFO_WR4: DATA0 (Bitfield-Mask: 0xff) */ +#define SMIF_TX_DATA_FIFO_WR4_DATA1_Pos (8UL) /*!< SMIF TX_DATA_FIFO_WR4: DATA1 (Bit 8) */ +#define SMIF_TX_DATA_FIFO_WR4_DATA1_Msk (0xff00UL) /*!< SMIF TX_DATA_FIFO_WR4: DATA1 (Bitfield-Mask: 0xff) */ +#define SMIF_TX_DATA_FIFO_WR4_DATA2_Pos (16UL) /*!< SMIF TX_DATA_FIFO_WR4: DATA2 (Bit 16) */ +#define SMIF_TX_DATA_FIFO_WR4_DATA2_Msk (0xff0000UL) /*!< SMIF TX_DATA_FIFO_WR4: DATA2 (Bitfield-Mask: 0xff) */ +#define SMIF_TX_DATA_FIFO_WR4_DATA3_Pos (24UL) /*!< SMIF TX_DATA_FIFO_WR4: DATA3 (Bit 24) */ +#define SMIF_TX_DATA_FIFO_WR4_DATA3_Msk (0xff000000UL) /*!< SMIF TX_DATA_FIFO_WR4: DATA3 (Bitfield-Mask: 0xff) */ +/* ================================================= SMIF.RX_DATA_FIFO_CTL ================================================= */ +#define SMIF_RX_DATA_FIFO_CTL_TRIGGER_LEVEL_Pos (0UL) /*!< SMIF RX_DATA_FIFO_CTL: TRIGGER_LEVEL (Bit 0) */ +#define SMIF_RX_DATA_FIFO_CTL_TRIGGER_LEVEL_Msk (0x7UL) /*!< SMIF RX_DATA_FIFO_CTL: TRIGGER_LEVEL (Bitfield-Mask: 0x07)*/ +/* =============================================== SMIF.RX_DATA_FIFO_STATUS ================================================ */ +#define SMIF_RX_DATA_FIFO_STATUS_USED4_Pos (0UL) /*!< SMIF RX_DATA_FIFO_STATUS: USED4 (Bit 0) */ +#define SMIF_RX_DATA_FIFO_STATUS_USED4_Msk (0xfUL) /*!< SMIF RX_DATA_FIFO_STATUS: USED4 (Bitfield-Mask: 0x0f) */ +/* ================================================= SMIF.RX_DATA_FIFO_RD1 ================================================= */ +#define SMIF_RX_DATA_FIFO_RD1_DATA0_Pos (0UL) /*!< SMIF RX_DATA_FIFO_RD1: DATA0 (Bit 0) */ +#define SMIF_RX_DATA_FIFO_RD1_DATA0_Msk (0xffUL) /*!< SMIF RX_DATA_FIFO_RD1: DATA0 (Bitfield-Mask: 0xff) */ +/* ================================================= SMIF.RX_DATA_FIFO_RD2 ================================================= */ +#define SMIF_RX_DATA_FIFO_RD2_DATA0_Pos (0UL) /*!< SMIF RX_DATA_FIFO_RD2: DATA0 (Bit 0) */ +#define SMIF_RX_DATA_FIFO_RD2_DATA0_Msk (0xffUL) /*!< SMIF RX_DATA_FIFO_RD2: DATA0 (Bitfield-Mask: 0xff) */ +#define SMIF_RX_DATA_FIFO_RD2_DATA1_Pos (8UL) /*!< SMIF RX_DATA_FIFO_RD2: DATA1 (Bit 8) */ +#define SMIF_RX_DATA_FIFO_RD2_DATA1_Msk (0xff00UL) /*!< SMIF RX_DATA_FIFO_RD2: DATA1 (Bitfield-Mask: 0xff) */ +/* ================================================= SMIF.RX_DATA_FIFO_RD4 ================================================= */ +#define SMIF_RX_DATA_FIFO_RD4_DATA0_Pos (0UL) /*!< SMIF RX_DATA_FIFO_RD4: DATA0 (Bit 0) */ +#define SMIF_RX_DATA_FIFO_RD4_DATA0_Msk (0xffUL) /*!< SMIF RX_DATA_FIFO_RD4: DATA0 (Bitfield-Mask: 0xff) */ +#define SMIF_RX_DATA_FIFO_RD4_DATA1_Pos (8UL) /*!< SMIF RX_DATA_FIFO_RD4: DATA1 (Bit 8) */ +#define SMIF_RX_DATA_FIFO_RD4_DATA1_Msk (0xff00UL) /*!< SMIF RX_DATA_FIFO_RD4: DATA1 (Bitfield-Mask: 0xff) */ +#define SMIF_RX_DATA_FIFO_RD4_DATA2_Pos (16UL) /*!< SMIF RX_DATA_FIFO_RD4: DATA2 (Bit 16) */ +#define SMIF_RX_DATA_FIFO_RD4_DATA2_Msk (0xff0000UL) /*!< SMIF RX_DATA_FIFO_RD4: DATA2 (Bitfield-Mask: 0xff) */ +#define SMIF_RX_DATA_FIFO_RD4_DATA3_Pos (24UL) /*!< SMIF RX_DATA_FIFO_RD4: DATA3 (Bit 24) */ +#define SMIF_RX_DATA_FIFO_RD4_DATA3_Msk (0xff000000UL) /*!< SMIF RX_DATA_FIFO_RD4: DATA3 (Bitfield-Mask: 0xff) */ +/* ============================================= SMIF.RX_DATA_FIFO_RD1_SILENT ============================================== */ +#define SMIF_RX_DATA_FIFO_RD1_SILENT_DATA0_Pos (0UL) /*!< SMIF RX_DATA_FIFO_RD1_SILENT: DATA0 (Bit 0) */ +#define SMIF_RX_DATA_FIFO_RD1_SILENT_DATA0_Msk (0xffUL) /*!< SMIF RX_DATA_FIFO_RD1_SILENT: DATA0 (Bitfield-Mask: 0xff) */ +/* =================================================== SMIF.SLOW_CA_CTL ==================================================== */ +#define SMIF_SLOW_CA_CTL_WAY_Pos (16UL) /*!< SMIF SLOW_CA_CTL: WAY (Bit 16) */ +#define SMIF_SLOW_CA_CTL_WAY_Msk (0x30000UL) /*!< SMIF SLOW_CA_CTL: WAY (Bitfield-Mask: 0x03) */ +#define SMIF_SLOW_CA_CTL_SET_ADDR_Pos (24UL) /*!< SMIF SLOW_CA_CTL: SET_ADDR (Bit 24) */ +#define SMIF_SLOW_CA_CTL_SET_ADDR_Msk (0x3000000UL) /*!< SMIF SLOW_CA_CTL: SET_ADDR (Bitfield-Mask: 0x03) */ +#define SMIF_SLOW_CA_CTL_PREF_EN_Pos (30UL) /*!< SMIF SLOW_CA_CTL: PREF_EN (Bit 30) */ +#define SMIF_SLOW_CA_CTL_PREF_EN_Msk (0x40000000UL) /*!< SMIF SLOW_CA_CTL: PREF_EN (Bitfield-Mask: 0x01) */ +#define SMIF_SLOW_CA_CTL_ENABLED_Pos (31UL) /*!< SMIF SLOW_CA_CTL: ENABLED (Bit 31) */ +#define SMIF_SLOW_CA_CTL_ENABLED_Msk (0x80000000UL) /*!< SMIF SLOW_CA_CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* =================================================== SMIF.SLOW_CA_CMD ==================================================== */ +#define SMIF_SLOW_CA_CMD_INV_Pos (0UL) /*!< SMIF SLOW_CA_CMD: INV (Bit 0) */ +#define SMIF_SLOW_CA_CMD_INV_Msk (0x1UL) /*!< SMIF SLOW_CA_CMD: INV (Bitfield-Mask: 0x01) */ +/* ================================================= SMIF.SLOW_CA_STATUS0 ================================================== */ +#define SMIF_SLOW_CA_STATUS0_VALID16_Pos (0UL) /*!< SMIF SLOW_CA_STATUS0: VALID16 (Bit 0) */ +#define SMIF_SLOW_CA_STATUS0_VALID16_Msk (0xffffUL) /*!< SMIF SLOW_CA_STATUS0: VALID16 (Bitfield-Mask: 0xffff) */ +/* ================================================= SMIF.SLOW_CA_STATUS1 ================================================== */ +#define SMIF_SLOW_CA_STATUS1_TAG_Pos (0UL) /*!< SMIF SLOW_CA_STATUS1: TAG (Bit 0) */ +#define SMIF_SLOW_CA_STATUS1_TAG_Msk (0xffffffffUL) /*!< SMIF SLOW_CA_STATUS1: TAG (Bitfield-Mask: 0xffffffff) */ +/* ================================================= SMIF.SLOW_CA_STATUS2 ================================================== */ +#define SMIF_SLOW_CA_STATUS2_LRU_Pos (0UL) /*!< SMIF SLOW_CA_STATUS2: LRU (Bit 0) */ +#define SMIF_SLOW_CA_STATUS2_LRU_Msk (0x3fUL) /*!< SMIF SLOW_CA_STATUS2: LRU (Bitfield-Mask: 0x3f) */ +/* =================================================== SMIF.FAST_CA_CTL ==================================================== */ +#define SMIF_FAST_CA_CTL_WAY_Pos (16UL) /*!< SMIF FAST_CA_CTL: WAY (Bit 16) */ +#define SMIF_FAST_CA_CTL_WAY_Msk (0x30000UL) /*!< SMIF FAST_CA_CTL: WAY (Bitfield-Mask: 0x03) */ +#define SMIF_FAST_CA_CTL_SET_ADDR_Pos (24UL) /*!< SMIF FAST_CA_CTL: SET_ADDR (Bit 24) */ +#define SMIF_FAST_CA_CTL_SET_ADDR_Msk (0x3000000UL) /*!< SMIF FAST_CA_CTL: SET_ADDR (Bitfield-Mask: 0x03) */ +#define SMIF_FAST_CA_CTL_PREF_EN_Pos (30UL) /*!< SMIF FAST_CA_CTL: PREF_EN (Bit 30) */ +#define SMIF_FAST_CA_CTL_PREF_EN_Msk (0x40000000UL) /*!< SMIF FAST_CA_CTL: PREF_EN (Bitfield-Mask: 0x01) */ +#define SMIF_FAST_CA_CTL_ENABLED_Pos (31UL) /*!< SMIF FAST_CA_CTL: ENABLED (Bit 31) */ +#define SMIF_FAST_CA_CTL_ENABLED_Msk (0x80000000UL) /*!< SMIF FAST_CA_CTL: ENABLED (Bitfield-Mask: 0x01) */ +/* =================================================== SMIF.FAST_CA_CMD ==================================================== */ +#define SMIF_FAST_CA_CMD_INV_Pos (0UL) /*!< SMIF FAST_CA_CMD: INV (Bit 0) */ +#define SMIF_FAST_CA_CMD_INV_Msk (0x1UL) /*!< SMIF FAST_CA_CMD: INV (Bitfield-Mask: 0x01) */ +/* ================================================= SMIF.FAST_CA_STATUS0 ================================================== */ +#define SMIF_FAST_CA_STATUS0_VALID16_Pos (0UL) /*!< SMIF FAST_CA_STATUS0: VALID16 (Bit 0) */ +#define SMIF_FAST_CA_STATUS0_VALID16_Msk (0xffffUL) /*!< SMIF FAST_CA_STATUS0: VALID16 (Bitfield-Mask: 0xffff) */ +/* ================================================= SMIF.FAST_CA_STATUS1 ================================================== */ +#define SMIF_FAST_CA_STATUS1_TAG_Pos (0UL) /*!< SMIF FAST_CA_STATUS1: TAG (Bit 0) */ +#define SMIF_FAST_CA_STATUS1_TAG_Msk (0xffffffffUL) /*!< SMIF FAST_CA_STATUS1: TAG (Bitfield-Mask: 0xffffffff) */ +/* ================================================= SMIF.FAST_CA_STATUS2 ================================================== */ +#define SMIF_FAST_CA_STATUS2_LRU_Pos (0UL) /*!< SMIF FAST_CA_STATUS2: LRU (Bit 0) */ +#define SMIF_FAST_CA_STATUS2_LRU_Msk (0x3fUL) /*!< SMIF FAST_CA_STATUS2: LRU (Bitfield-Mask: 0x3f) */ +/* ==================================================== SMIF.CRYPTO_CMD ==================================================== */ +#define SMIF_CRYPTO_CMD_START_Pos (0UL) /*!< SMIF CRYPTO_CMD: START (Bit 0) */ +#define SMIF_CRYPTO_CMD_START_Msk (0x1UL) /*!< SMIF CRYPTO_CMD: START (Bitfield-Mask: 0x01) */ +/* ================================================== SMIF.CRYPTO_INPUT0 =================================================== */ +#define SMIF_CRYPTO_INPUT0_INPUT_Pos (0UL) /*!< SMIF CRYPTO_INPUT0: INPUT (Bit 0) */ +#define SMIF_CRYPTO_INPUT0_INPUT_Msk (0xffffffffUL) /*!< SMIF CRYPTO_INPUT0: INPUT (Bitfield-Mask: 0xffffffff) */ +/* ================================================== SMIF.CRYPTO_INPUT1 =================================================== */ +#define SMIF_CRYPTO_INPUT1_INPUT_Pos (0UL) /*!< SMIF CRYPTO_INPUT1: INPUT (Bit 0) */ +#define SMIF_CRYPTO_INPUT1_INPUT_Msk (0xffffffffUL) /*!< SMIF CRYPTO_INPUT1: INPUT (Bitfield-Mask: 0xffffffff) */ +/* ================================================== SMIF.CRYPTO_INPUT2 =================================================== */ +#define SMIF_CRYPTO_INPUT2_INPUT_Pos (0UL) /*!< SMIF CRYPTO_INPUT2: INPUT (Bit 0) */ +#define SMIF_CRYPTO_INPUT2_INPUT_Msk (0xffffffffUL) /*!< SMIF CRYPTO_INPUT2: INPUT (Bitfield-Mask: 0xffffffff) */ +/* ================================================== SMIF.CRYPTO_INPUT3 =================================================== */ +#define SMIF_CRYPTO_INPUT3_INPUT_Pos (0UL) /*!< SMIF CRYPTO_INPUT3: INPUT (Bit 0) */ +#define SMIF_CRYPTO_INPUT3_INPUT_Msk (0xffffffffUL) /*!< SMIF CRYPTO_INPUT3: INPUT (Bitfield-Mask: 0xffffffff) */ +/* =================================================== SMIF.CRYPTO_KEY0 ==================================================== */ +#define SMIF_CRYPTO_KEY0_KEY_Pos (0UL) /*!< SMIF CRYPTO_KEY0: KEY (Bit 0) */ +#define SMIF_CRYPTO_KEY0_KEY_Msk (0xffffffffUL) /*!< SMIF CRYPTO_KEY0: KEY (Bitfield-Mask: 0xffffffff) */ +/* =================================================== SMIF.CRYPTO_KEY1 ==================================================== */ +#define SMIF_CRYPTO_KEY1_KEY_Pos (0UL) /*!< SMIF CRYPTO_KEY1: KEY (Bit 0) */ +#define SMIF_CRYPTO_KEY1_KEY_Msk (0xffffffffUL) /*!< SMIF CRYPTO_KEY1: KEY (Bitfield-Mask: 0xffffffff) */ +/* =================================================== SMIF.CRYPTO_KEY2 ==================================================== */ +#define SMIF_CRYPTO_KEY2_KEY_Pos (0UL) /*!< SMIF CRYPTO_KEY2: KEY (Bit 0) */ +#define SMIF_CRYPTO_KEY2_KEY_Msk (0xffffffffUL) /*!< SMIF CRYPTO_KEY2: KEY (Bitfield-Mask: 0xffffffff) */ +/* =================================================== SMIF.CRYPTO_KEY3 ==================================================== */ +#define SMIF_CRYPTO_KEY3_KEY_Pos (0UL) /*!< SMIF CRYPTO_KEY3: KEY (Bit 0) */ +#define SMIF_CRYPTO_KEY3_KEY_Msk (0xffffffffUL) /*!< SMIF CRYPTO_KEY3: KEY (Bitfield-Mask: 0xffffffff) */ +/* ================================================== SMIF.CRYPTO_OUTPUT0 ================================================== */ +#define SMIF_CRYPTO_OUTPUT0_OUTPUT_Pos (0UL) /*!< SMIF CRYPTO_OUTPUT0: OUTPUT (Bit 0) */ +#define SMIF_CRYPTO_OUTPUT0_OUTPUT_Msk (0xffffffffUL) /*!< SMIF CRYPTO_OUTPUT0: OUTPUT (Bitfield-Mask: 0xffffffff) */ +/* ================================================== SMIF.CRYPTO_OUTPUT1 ================================================== */ +#define SMIF_CRYPTO_OUTPUT1_OUTPUT_Pos (0UL) /*!< SMIF CRYPTO_OUTPUT1: OUTPUT (Bit 0) */ +#define SMIF_CRYPTO_OUTPUT1_OUTPUT_Msk (0xffffffffUL) /*!< SMIF CRYPTO_OUTPUT1: OUTPUT (Bitfield-Mask: 0xffffffff) */ +/* ================================================== SMIF.CRYPTO_OUTPUT2 ================================================== */ +#define SMIF_CRYPTO_OUTPUT2_OUTPUT_Pos (0UL) /*!< SMIF CRYPTO_OUTPUT2: OUTPUT (Bit 0) */ +#define SMIF_CRYPTO_OUTPUT2_OUTPUT_Msk (0xffffffffUL) /*!< SMIF CRYPTO_OUTPUT2: OUTPUT (Bitfield-Mask: 0xffffffff) */ +/* ================================================== SMIF.CRYPTO_OUTPUT3 ================================================== */ +#define SMIF_CRYPTO_OUTPUT3_OUTPUT_Pos (0UL) /*!< SMIF CRYPTO_OUTPUT3: OUTPUT (Bit 0) */ +#define SMIF_CRYPTO_OUTPUT3_OUTPUT_Msk (0xffffffffUL) /*!< SMIF CRYPTO_OUTPUT3: OUTPUT (Bitfield-Mask: 0xffffffff) */ +/* ======================================================= SMIF.INTR ======================================================= */ +#define SMIF_INTR_TR_TX_REQ_Pos (0UL) /*!< SMIF INTR: TR_TX_REQ (Bit 0) */ +#define SMIF_INTR_TR_TX_REQ_Msk (0x1UL) /*!< SMIF INTR: TR_TX_REQ (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_TR_RX_REQ_Pos (1UL) /*!< SMIF INTR: TR_RX_REQ (Bit 1) */ +#define SMIF_INTR_TR_RX_REQ_Msk (0x2UL) /*!< SMIF INTR: TR_RX_REQ (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_XIP_ALIGNMENT_ERROR_Pos (2UL) /*!< SMIF INTR: XIP_ALIGNMENT_ERROR (Bit 2) */ +#define SMIF_INTR_XIP_ALIGNMENT_ERROR_Msk (0x4UL) /*!< SMIF INTR: XIP_ALIGNMENT_ERROR (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_TX_CMD_FIFO_OVERFLOW_Pos (3UL) /*!< SMIF INTR: TX_CMD_FIFO_OVERFLOW (Bit 3) */ +#define SMIF_INTR_TX_CMD_FIFO_OVERFLOW_Msk (0x8UL) /*!< SMIF INTR: TX_CMD_FIFO_OVERFLOW (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_TX_DATA_FIFO_OVERFLOW_Pos (4UL) /*!< SMIF INTR: TX_DATA_FIFO_OVERFLOW (Bit 4) */ +#define SMIF_INTR_TX_DATA_FIFO_OVERFLOW_Msk (0x10UL) /*!< SMIF INTR: TX_DATA_FIFO_OVERFLOW (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_RX_DATA_FIFO_UNDERFLOW_Pos (5UL) /*!< SMIF INTR: RX_DATA_FIFO_UNDERFLOW (Bit 5) */ +#define SMIF_INTR_RX_DATA_FIFO_UNDERFLOW_Msk (0x20UL) /*!< SMIF INTR: RX_DATA_FIFO_UNDERFLOW (Bitfield-Mask: 0x01) */ +/* ===================================================== SMIF.INTR_SET ===================================================== */ +#define SMIF_INTR_SET_TR_TX_REQ_Pos (0UL) /*!< SMIF INTR_SET: TR_TX_REQ (Bit 0) */ +#define SMIF_INTR_SET_TR_TX_REQ_Msk (0x1UL) /*!< SMIF INTR_SET: TR_TX_REQ (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_SET_TR_RX_REQ_Pos (1UL) /*!< SMIF INTR_SET: TR_RX_REQ (Bit 1) */ +#define SMIF_INTR_SET_TR_RX_REQ_Msk (0x2UL) /*!< SMIF INTR_SET: TR_RX_REQ (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_SET_XIP_ALIGNMENT_ERROR_Pos (2UL) /*!< SMIF INTR_SET: XIP_ALIGNMENT_ERROR (Bit 2) */ +#define SMIF_INTR_SET_XIP_ALIGNMENT_ERROR_Msk (0x4UL) /*!< SMIF INTR_SET: XIP_ALIGNMENT_ERROR (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_SET_TX_CMD_FIFO_OVERFLOW_Pos (3UL) /*!< SMIF INTR_SET: TX_CMD_FIFO_OVERFLOW (Bit 3) */ +#define SMIF_INTR_SET_TX_CMD_FIFO_OVERFLOW_Msk (0x8UL) /*!< SMIF INTR_SET: TX_CMD_FIFO_OVERFLOW (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_SET_TX_DATA_FIFO_OVERFLOW_Pos (4UL) /*!< SMIF INTR_SET: TX_DATA_FIFO_OVERFLOW (Bit 4) */ +#define SMIF_INTR_SET_TX_DATA_FIFO_OVERFLOW_Msk (0x10UL) /*!< SMIF INTR_SET: TX_DATA_FIFO_OVERFLOW (Bitfield-Mask: 0x01)*/ +#define SMIF_INTR_SET_RX_DATA_FIFO_UNDERFLOW_Pos (5UL) /*!< SMIF INTR_SET: RX_DATA_FIFO_UNDERFLOW (Bit 5) */ +#define SMIF_INTR_SET_RX_DATA_FIFO_UNDERFLOW_Msk (0x20UL) /*!< SMIF INTR_SET: RX_DATA_FIFO_UNDERFLOW (Bitfield-Mask: 0x01)*/ +/* ==================================================== SMIF.INTR_MASK ===================================================== */ +#define SMIF_INTR_MASK_TR_TX_REQ_Pos (0UL) /*!< SMIF INTR_MASK: TR_TX_REQ (Bit 0) */ +#define SMIF_INTR_MASK_TR_TX_REQ_Msk (0x1UL) /*!< SMIF INTR_MASK: TR_TX_REQ (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_MASK_TR_RX_REQ_Pos (1UL) /*!< SMIF INTR_MASK: TR_RX_REQ (Bit 1) */ +#define SMIF_INTR_MASK_TR_RX_REQ_Msk (0x2UL) /*!< SMIF INTR_MASK: TR_RX_REQ (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_MASK_XIP_ALIGNMENT_ERROR_Pos (2UL) /*!< SMIF INTR_MASK: XIP_ALIGNMENT_ERROR (Bit 2) */ +#define SMIF_INTR_MASK_XIP_ALIGNMENT_ERROR_Msk (0x4UL) /*!< SMIF INTR_MASK: XIP_ALIGNMENT_ERROR (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_MASK_TX_CMD_FIFO_OVERFLOW_Pos (3UL) /*!< SMIF INTR_MASK: TX_CMD_FIFO_OVERFLOW (Bit 3) */ +#define SMIF_INTR_MASK_TX_CMD_FIFO_OVERFLOW_Msk (0x8UL) /*!< SMIF INTR_MASK: TX_CMD_FIFO_OVERFLOW (Bitfield-Mask: 0x01)*/ +#define SMIF_INTR_MASK_TX_DATA_FIFO_OVERFLOW_Pos (4UL) /*!< SMIF INTR_MASK: TX_DATA_FIFO_OVERFLOW (Bit 4) */ +#define SMIF_INTR_MASK_TX_DATA_FIFO_OVERFLOW_Msk (0x10UL) /*!< SMIF INTR_MASK: TX_DATA_FIFO_OVERFLOW (Bitfield-Mask: 0x01)*/ +#define SMIF_INTR_MASK_RX_DATA_FIFO_UNDERFLOW_Pos (5UL) /*!< SMIF INTR_MASK: RX_DATA_FIFO_UNDERFLOW (Bit 5) */ +#define SMIF_INTR_MASK_RX_DATA_FIFO_UNDERFLOW_Msk (0x20UL) /*!< SMIF INTR_MASK: RX_DATA_FIFO_UNDERFLOW (Bitfield-Mask: 0x01)*/ +/* =================================================== SMIF.INTR_MASKED ==================================================== */ +#define SMIF_INTR_MASKED_TR_TX_REQ_Pos (0UL) /*!< SMIF INTR_MASKED: TR_TX_REQ (Bit 0) */ +#define SMIF_INTR_MASKED_TR_TX_REQ_Msk (0x1UL) /*!< SMIF INTR_MASKED: TR_TX_REQ (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_MASKED_TR_RX_REQ_Pos (1UL) /*!< SMIF INTR_MASKED: TR_RX_REQ (Bit 1) */ +#define SMIF_INTR_MASKED_TR_RX_REQ_Msk (0x2UL) /*!< SMIF INTR_MASKED: TR_RX_REQ (Bitfield-Mask: 0x01) */ +#define SMIF_INTR_MASKED_XIP_ALIGNMENT_ERROR_Pos (2UL) /*!< SMIF INTR_MASKED: XIP_ALIGNMENT_ERROR (Bit 2) */ +#define SMIF_INTR_MASKED_XIP_ALIGNMENT_ERROR_Msk (0x4UL) /*!< SMIF INTR_MASKED: XIP_ALIGNMENT_ERROR (Bitfield-Mask: 0x01)*/ +#define SMIF_INTR_MASKED_TX_CMD_FIFO_OVERFLOW_Pos (3UL) /*!< SMIF INTR_MASKED: TX_CMD_FIFO_OVERFLOW (Bit 3) */ +#define SMIF_INTR_MASKED_TX_CMD_FIFO_OVERFLOW_Msk (0x8UL) /*!< SMIF INTR_MASKED: TX_CMD_FIFO_OVERFLOW (Bitfield-Mask: 0x01)*/ +#define SMIF_INTR_MASKED_TX_DATA_FIFO_OVERFLOW_Pos (4UL) /*!< SMIF INTR_MASKED: TX_DATA_FIFO_OVERFLOW (Bit 4) */ +#define SMIF_INTR_MASKED_TX_DATA_FIFO_OVERFLOW_Msk (0x10UL) /*!< SMIF INTR_MASKED: TX_DATA_FIFO_OVERFLOW (Bitfield-Mask: 0x01)*/ +#define SMIF_INTR_MASKED_RX_DATA_FIFO_UNDERFLOW_Pos (5UL) /*!< SMIF INTR_MASKED: RX_DATA_FIFO_UNDERFLOW (Bit 5) */ +#define SMIF_INTR_MASKED_RX_DATA_FIFO_UNDERFLOW_Msk (0x20UL) /*!< SMIF INTR_MASKED: RX_DATA_FIFO_UNDERFLOW (Bitfield-Mask: 0x01)*/ + + +#endif /* _CYIP_SMIF_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_srss.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_srss.h new file mode 100644 index 0000000000..53b9d7d786 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_srss.h @@ -0,0 +1,655 @@ +/***************************************************************************//** +* \file cyip_srss.h +* +* \brief +* SRSS IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_SRSS_H_ +#define _CYIP_SRSS_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ SRSS ================ */ +/* =========================================================================================================================== */ + +#define MCWDT_STRUCT_SECTION_SIZE 0x00000040UL +#define CLK_CSV_SECTION_SIZE 0x00000010UL +#define SRSS_SECTION_SIZE 0x00010000UL + +/** + * \brief Multi-Counter Watchdog Timer (MCWDT_STRUCT) + */ +typedef struct { + __IM uint32_t RESERVED; + __IOM uint32_t MCWDT_CNTLOW; /*!< 0x00000004 Multi-Counter Watchdog Sub-counters 0/1 */ + __IOM uint32_t MCWDT_CNTHIGH; /*!< 0x00000008 Multi-Counter Watchdog Sub-counter 2 */ + __IOM uint32_t MCWDT_MATCH; /*!< 0x0000000C Multi-Counter Watchdog Counter Match Register */ + __IOM uint32_t MCWDT_CONFIG; /*!< 0x00000010 Multi-Counter Watchdog Counter Configuration */ + __IOM uint32_t MCWDT_CTL; /*!< 0x00000014 Multi-Counter Watchdog Counter Control */ + __IOM uint32_t MCWDT_INTR; /*!< 0x00000018 Multi-Counter Watchdog Counter Interrupt Register */ + __IOM uint32_t MCWDT_INTR_SET; /*!< 0x0000001C Multi-Counter Watchdog Counter Interrupt Set Register */ + __IOM uint32_t MCWDT_INTR_MASK; /*!< 0x00000020 Multi-Counter Watchdog Counter Interrupt Mask Register */ + __IM uint32_t MCWDT_INTR_MASKED; /*!< 0x00000024 Multi-Counter Watchdog Counter Interrupt Masked Register */ + __IOM uint32_t MCWDT_LOCK; /*!< 0x00000028 Multi-Counter Watchdog Counter Lock Register */ + __IM uint32_t RESERVED1[5]; +} MCWDT_STRUCT_Type; /*!< Size = 44 (0x2C) */ + +/** + * \brief SRSS Clock Supervisor (CSV) registers (CLK_CSV) + */ +typedef struct { + __IOM uint32_t HF_CTL; /*!< 0x00000000 HFCLK Clock Supervision Control Register */ + __IOM uint32_t HF_LIMIT; /*!< 0x00000004 HFCLK Clock Supervision Limit Register */ + __IM uint32_t HF_CNT; /*!< 0x00000008 HFCLK Clock Supervision Count Register */ + __IM uint32_t RESERVED; +} CLK_CSV_Type; /*!< Size = 12 (0xC) */ + +/** + * \brief SRSS Core Registers (SRSS) + */ +typedef struct { /*!< SRSS Structure */ + __IOM uint32_t PWR_CTL; /*!< 0x00000000 Power Mode Control */ + __IOM uint32_t PWR_HIBERNATE; /*!< 0x00000004 HIBERNATE Mode Register */ + __IOM uint32_t PWR_LVD_CTL; /*!< 0x00000008 Low Voltage Detector (LVD) Configuration Register */ + __IM uint32_t RESERVED[2]; + __IOM uint32_t PWR_BUCK_CTL; /*!< 0x00000014 SIMO Buck Control Register */ + __IOM uint32_t PWR_BUCK_CTL2; /*!< 0x00000018 SIMO Buck Control Register 2 */ + __IM uint32_t PWR_LVD_STATUS; /*!< 0x0000001C Low Voltage Detector (LVD) Status Register */ + __IM uint32_t RESERVED1[24]; + __IOM uint32_t PWR_HIB_DATA[16]; /*!< 0x00000080 HIBERNATE Data Register */ + __IM uint32_t RESERVED2[48]; + __IOM uint32_t WDT_CTL; /*!< 0x00000180 Watchdog Counter Control Register */ + __IOM uint32_t WDT_CNT; /*!< 0x00000184 Watchdog Counter Count Register */ + __IOM uint32_t WDT_MATCH; /*!< 0x00000188 Watchdog Counter Match Register */ + __IM uint32_t RESERVED3[29]; + MCWDT_STRUCT_Type MCWDT_STRUCT[4]; /*!< 0x00000200 Multi-Counter Watchdog Timer */ + __IOM uint32_t CLK_DSI_SELECT[16]; /*!< 0x00000300 Clock DSI Select Register */ + __IOM uint32_t CLK_PATH_SELECT[16]; /*!< 0x00000340 Clock Path Select Register */ + __IOM uint32_t CLK_ROOT_SELECT[16]; /*!< 0x00000380 Clock Root Select Register */ + __IM uint32_t RESERVED4[16]; + CLK_CSV_Type CLK_CSV[16]; /*!< 0x00000400 SRSS Clock Supervisor (CSV) registers */ + __IOM uint32_t CLK_SELECT; /*!< 0x00000500 Clock selection register */ + __IOM uint32_t CLK_TIMER_CTL; /*!< 0x00000504 Timer Clock Control Register */ + __IOM uint32_t CLK_CSV_WCO_CTL; /*!< 0x00000508 WCO Clock Supervision Control Register */ + __IOM uint32_t CLK_ILO_CONFIG; /*!< 0x0000050C HVILO Configuration */ + __IOM uint32_t CLK_IMO_CONFIG; /*!< 0x00000510 IMO Configuration */ + __IOM uint32_t CLK_OUTPUT_FAST; /*!< 0x00000514 Fast Clock Output Select Register */ + __IOM uint32_t CLK_OUTPUT_SLOW; /*!< 0x00000518 Slow Clock Output Select Register */ + __IOM uint32_t CLK_CAL_CNT1; /*!< 0x0000051C Clock Calibration Counter 1 */ + __IM uint32_t CLK_CAL_CNT2; /*!< 0x00000520 Clock Calibration Counter 2 */ + __IM uint32_t RESERVED5[2]; + __IOM uint32_t CLK_ECO_CONFIG; /*!< 0x0000052C ECO Configuration Register */ + __IM uint32_t CLK_ECO_STATUS; /*!< 0x00000530 ECO Status Register */ + __IM uint32_t RESERVED6; + __IOM uint32_t CLK_WCO_DPLL; /*!< 0x00000538 WCO DPLL Register */ + __IOM uint32_t CLK_PILO_CONFIG; /*!< 0x0000053C Precision ILO Configuration Register */ + __IM uint32_t RESERVED7[16]; + __IOM uint32_t CLK_FLL_CONFIG; /*!< 0x00000580 FLL Configuration Register */ + __IOM uint32_t CLK_FLL_CONFIG2; /*!< 0x00000584 FLL Configuration Register 2 */ + __IOM uint32_t CLK_FLL_CONFIG3; /*!< 0x00000588 FLL Configuration Register 3 */ + __IOM uint32_t CLK_FLL_CONFIG4; /*!< 0x0000058C FLL Configuration Register 4 */ + __IOM uint32_t CLK_FLL_STATUS; /*!< 0x00000590 FLL Status Register */ + __IM uint32_t RESERVED8[27]; + __IOM uint32_t CLK_PLL_CONFIG[15]; /*!< 0x00000600 PLL Configuration Register */ + __IM uint32_t RESERVED9; + __IOM uint32_t CLK_PLL_STATUS[15]; /*!< 0x00000640 PLL Status Register */ + __IM uint32_t RESERVED10[33]; + __IOM uint32_t SRSS_INTR; /*!< 0x00000700 SRSS Interrupt Register */ + __IOM uint32_t SRSS_INTR_SET; /*!< 0x00000704 SRSS Interrupt Set Register */ + __IOM uint32_t SRSS_INTR_MASK; /*!< 0x00000708 SRSS Interrupt Mask Register */ + __IM uint32_t SRSS_INTR_MASKED; /*!< 0x0000070C SRSS Interrupt Masked Register */ + __IOM uint32_t SRSS_INTR_CFG; /*!< 0x00000710 SRSS Interrupt Configuration Register */ + __IM uint32_t RESERVED11[59]; + __IOM uint32_t RES_CAUSE; /*!< 0x00000800 Reset Cause Observation Register */ + __IOM uint32_t RES_CAUSE2; /*!< 0x00000804 Reset Cause Observation Register 2 */ + __IM uint32_t RESERVED12[7614]; + __IOM uint32_t PWR_TRIM_REF_CTL; /*!< 0x00007F00 Reference Trim Register */ + __IOM uint32_t PWR_TRIM_BODOVP_CTL; /*!< 0x00007F04 BOD/OVP Trim Register */ + __IOM uint32_t CLK_TRIM_CCO_CTL; /*!< 0x00007F08 CCO Trim Register */ + __IOM uint32_t CLK_TRIM_CCO_CTL2; /*!< 0x00007F0C CCO Trim Register 2 */ + __IM uint32_t RESERVED13[8]; + __IOM uint32_t PWR_TRIM_WAKE_CTL; /*!< 0x00007F30 Wakeup Trim Register */ + __IM uint32_t RESERVED14[8183]; + __IOM uint32_t PWR_TRIM_LVD_CTL; /*!< 0x0000FF10 LVD Trim Register */ + __IM uint32_t RESERVED15; + __IOM uint32_t CLK_TRIM_ILO_CTL; /*!< 0x0000FF18 ILO Trim Register */ + __IOM uint32_t PWR_TRIM_PWRSYS_CTL; /*!< 0x0000FF1C Power System Trim Register */ + __IOM uint32_t CLK_TRIM_ECO_CTL; /*!< 0x0000FF20 ECO Trim Register */ + __IOM uint32_t CLK_TRIM_PILO_CTL; /*!< 0x0000FF24 PILO Trim Register */ + __IOM uint32_t CLK_TRIM_PILO_CTL2; /*!< 0x0000FF28 PILO Trim Register 2 */ + __IOM uint32_t CLK_TRIM_PILO_CTL3; /*!< 0x0000FF2C PILO Trim Register 3 */ +} SRSS_Type; /*!< Size = 65328 (0xFF30) */ + + +/* =============================================== MCWDT_STRUCT.MCWDT_CNTLOW =============================================== */ +#define MCWDT_STRUCT_MCWDT_CNTLOW_WDT_CTR0_Pos (0UL) /*!< MCWDT_STRUCT MCWDT_CNTLOW: WDT_CTR0 (Bit 0) */ +#define MCWDT_STRUCT_MCWDT_CNTLOW_WDT_CTR0_Msk (0xffffUL) /*!< MCWDT_STRUCT MCWDT_CNTLOW: WDT_CTR0 (Bitfield-Mask: 0xffff)*/ +#define MCWDT_STRUCT_MCWDT_CNTLOW_WDT_CTR1_Pos (16UL) /*!< MCWDT_STRUCT MCWDT_CNTLOW: WDT_CTR1 (Bit 16) */ +#define MCWDT_STRUCT_MCWDT_CNTLOW_WDT_CTR1_Msk (0xffff0000UL) /*!< MCWDT_STRUCT MCWDT_CNTLOW: WDT_CTR1 (Bitfield-Mask: 0xffff)*/ +/* ============================================== MCWDT_STRUCT.MCWDT_CNTHIGH =============================================== */ +#define MCWDT_STRUCT_MCWDT_CNTHIGH_WDT_CTR2_Pos (0UL) /*!< MCWDT_STRUCT MCWDT_CNTHIGH: WDT_CTR2 (Bit 0) */ +#define MCWDT_STRUCT_MCWDT_CNTHIGH_WDT_CTR2_Msk (0xffffffffUL) /*!< MCWDT_STRUCT MCWDT_CNTHIGH: WDT_CTR2 (Bitfield-Mask: 0xffffffff)*/ +/* =============================================== MCWDT_STRUCT.MCWDT_MATCH ================================================ */ +#define MCWDT_STRUCT_MCWDT_MATCH_WDT_MATCH0_Pos (0UL) /*!< MCWDT_STRUCT MCWDT_MATCH: WDT_MATCH0 (Bit 0) */ +#define MCWDT_STRUCT_MCWDT_MATCH_WDT_MATCH0_Msk (0xffffUL) /*!< MCWDT_STRUCT MCWDT_MATCH: WDT_MATCH0 (Bitfield-Mask: 0xffff)*/ +#define MCWDT_STRUCT_MCWDT_MATCH_WDT_MATCH1_Pos (16UL) /*!< MCWDT_STRUCT MCWDT_MATCH: WDT_MATCH1 (Bit 16) */ +#define MCWDT_STRUCT_MCWDT_MATCH_WDT_MATCH1_Msk (0xffff0000UL) /*!< MCWDT_STRUCT MCWDT_MATCH: WDT_MATCH1 (Bitfield-Mask: 0xffff)*/ +/* =============================================== MCWDT_STRUCT.MCWDT_CONFIG =============================================== */ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_MODE0_Pos (0UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_MODE0 (Bit 0) */ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_MODE0_Msk (0x3UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_MODE0 (Bitfield-Mask: 0x03)*/ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_CLEAR0_Pos (2UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_CLEAR0 (Bit 2) */ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_CLEAR0_Msk (0x4UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_CLEAR0 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_CASCADE0_1_Pos (3UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_CASCADE0_1 (Bit 3) */ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_CASCADE0_1_Msk (0x8UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_CASCADE0_1 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_MODE1_Pos (8UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_MODE1 (Bit 8) */ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_MODE1_Msk (0x300UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_MODE1 (Bitfield-Mask: 0x03)*/ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_CLEAR1_Pos (10UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_CLEAR1 (Bit 10) */ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_CLEAR1_Msk (0x400UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_CLEAR1 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_CASCADE1_2_Pos (11UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_CASCADE1_2 (Bit 11) */ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_CASCADE1_2_Msk (0x800UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_CASCADE1_2 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_MODE2_Pos (16UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_MODE2 (Bit 16) */ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_MODE2_Msk (0x10000UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_MODE2 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_BITS2_Pos (24UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_BITS2 (Bit 24) */ +#define MCWDT_STRUCT_MCWDT_CONFIG_WDT_BITS2_Msk (0x1f000000UL) /*!< MCWDT_STRUCT MCWDT_CONFIG: WDT_BITS2 (Bitfield-Mask: 0x1f)*/ +/* ================================================ MCWDT_STRUCT.MCWDT_CTL ================================================= */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLE0_Pos (0UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLE0 (Bit 0) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLE0_Msk (0x1UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLE0 (Bitfield-Mask: 0x01) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLED0_Pos (1UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLED0 (Bit 1) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLED0_Msk (0x2UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLED0 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_RESET0_Pos (3UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_RESET0 (Bit 3) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_RESET0_Msk (0x8UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_RESET0 (Bitfield-Mask: 0x01) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLE1_Pos (8UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLE1 (Bit 8) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLE1_Msk (0x100UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLE1 (Bitfield-Mask: 0x01) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLED1_Pos (9UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLED1 (Bit 9) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLED1_Msk (0x200UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLED1 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_RESET1_Pos (11UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_RESET1 (Bit 11) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_RESET1_Msk (0x800UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_RESET1 (Bitfield-Mask: 0x01) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLE2_Pos (16UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLE2 (Bit 16) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLE2_Msk (0x10000UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLE2 (Bitfield-Mask: 0x01) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLED2_Pos (17UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLED2 (Bit 17) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_ENABLED2_Msk (0x20000UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_ENABLED2 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_RESET2_Pos (19UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_RESET2 (Bit 19) */ +#define MCWDT_STRUCT_MCWDT_CTL_WDT_RESET2_Msk (0x80000UL) /*!< MCWDT_STRUCT MCWDT_CTL: WDT_RESET2 (Bitfield-Mask: 0x01) */ +/* ================================================ MCWDT_STRUCT.MCWDT_INTR ================================================ */ +#define MCWDT_STRUCT_MCWDT_INTR_MCWDT_INT0_Pos (0UL) /*!< MCWDT_STRUCT MCWDT_INTR: MCWDT_INT0 (Bit 0) */ +#define MCWDT_STRUCT_MCWDT_INTR_MCWDT_INT0_Msk (0x1UL) /*!< MCWDT_STRUCT MCWDT_INTR: MCWDT_INT0 (Bitfield-Mask: 0x01) */ +#define MCWDT_STRUCT_MCWDT_INTR_MCWDT_INT1_Pos (1UL) /*!< MCWDT_STRUCT MCWDT_INTR: MCWDT_INT1 (Bit 1) */ +#define MCWDT_STRUCT_MCWDT_INTR_MCWDT_INT1_Msk (0x2UL) /*!< MCWDT_STRUCT MCWDT_INTR: MCWDT_INT1 (Bitfield-Mask: 0x01) */ +#define MCWDT_STRUCT_MCWDT_INTR_MCWDT_INT2_Pos (2UL) /*!< MCWDT_STRUCT MCWDT_INTR: MCWDT_INT2 (Bit 2) */ +#define MCWDT_STRUCT_MCWDT_INTR_MCWDT_INT2_Msk (0x4UL) /*!< MCWDT_STRUCT MCWDT_INTR: MCWDT_INT2 (Bitfield-Mask: 0x01) */ +/* ============================================== MCWDT_STRUCT.MCWDT_INTR_SET ============================================== */ +#define MCWDT_STRUCT_MCWDT_INTR_SET_MCWDT_INT0_Pos (0UL) /*!< MCWDT_STRUCT MCWDT_INTR_SET: MCWDT_INT0 (Bit 0) */ +#define MCWDT_STRUCT_MCWDT_INTR_SET_MCWDT_INT0_Msk (0x1UL) /*!< MCWDT_STRUCT MCWDT_INTR_SET: MCWDT_INT0 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_INTR_SET_MCWDT_INT1_Pos (1UL) /*!< MCWDT_STRUCT MCWDT_INTR_SET: MCWDT_INT1 (Bit 1) */ +#define MCWDT_STRUCT_MCWDT_INTR_SET_MCWDT_INT1_Msk (0x2UL) /*!< MCWDT_STRUCT MCWDT_INTR_SET: MCWDT_INT1 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_INTR_SET_MCWDT_INT2_Pos (2UL) /*!< MCWDT_STRUCT MCWDT_INTR_SET: MCWDT_INT2 (Bit 2) */ +#define MCWDT_STRUCT_MCWDT_INTR_SET_MCWDT_INT2_Msk (0x4UL) /*!< MCWDT_STRUCT MCWDT_INTR_SET: MCWDT_INT2 (Bitfield-Mask: 0x01)*/ +/* ============================================= MCWDT_STRUCT.MCWDT_INTR_MASK ============================================== */ +#define MCWDT_STRUCT_MCWDT_INTR_MASK_MCWDT_INT0_Pos (0UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASK: MCWDT_INT0 (Bit 0) */ +#define MCWDT_STRUCT_MCWDT_INTR_MASK_MCWDT_INT0_Msk (0x1UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASK: MCWDT_INT0 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_INTR_MASK_MCWDT_INT1_Pos (1UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASK: MCWDT_INT1 (Bit 1) */ +#define MCWDT_STRUCT_MCWDT_INTR_MASK_MCWDT_INT1_Msk (0x2UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASK: MCWDT_INT1 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_INTR_MASK_MCWDT_INT2_Pos (2UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASK: MCWDT_INT2 (Bit 2) */ +#define MCWDT_STRUCT_MCWDT_INTR_MASK_MCWDT_INT2_Msk (0x4UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASK: MCWDT_INT2 (Bitfield-Mask: 0x01)*/ +/* ============================================ MCWDT_STRUCT.MCWDT_INTR_MASKED ============================================= */ +#define MCWDT_STRUCT_MCWDT_INTR_MASKED_MCWDT_INT0_Pos (0UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASKED: MCWDT_INT0 (Bit 0) */ +#define MCWDT_STRUCT_MCWDT_INTR_MASKED_MCWDT_INT0_Msk (0x1UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASKED: MCWDT_INT0 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_INTR_MASKED_MCWDT_INT1_Pos (1UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASKED: MCWDT_INT1 (Bit 1) */ +#define MCWDT_STRUCT_MCWDT_INTR_MASKED_MCWDT_INT1_Msk (0x2UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASKED: MCWDT_INT1 (Bitfield-Mask: 0x01)*/ +#define MCWDT_STRUCT_MCWDT_INTR_MASKED_MCWDT_INT2_Pos (2UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASKED: MCWDT_INT2 (Bit 2) */ +#define MCWDT_STRUCT_MCWDT_INTR_MASKED_MCWDT_INT2_Msk (0x4UL) /*!< MCWDT_STRUCT MCWDT_INTR_MASKED: MCWDT_INT2 (Bitfield-Mask: 0x01)*/ +/* ================================================ MCWDT_STRUCT.MCWDT_LOCK ================================================ */ +#define MCWDT_STRUCT_MCWDT_LOCK_MCWDT_LOCK_Pos (30UL) /*!< MCWDT_STRUCT MCWDT_LOCK: MCWDT_LOCK (Bit 30) */ +#define MCWDT_STRUCT_MCWDT_LOCK_MCWDT_LOCK_Msk (0xc0000000UL) /*!< MCWDT_STRUCT MCWDT_LOCK: MCWDT_LOCK (Bitfield-Mask: 0x03) */ + + +/* ==================================================== CLK_CSV.HF_CTL ===================================================== */ +#define CLK_CSV_HF_CTL_CSV_FREQ_WINDOW_Pos (0UL) /*!< CLK_CSV HF_CTL: CSV_FREQ_WINDOW (Bit 0) */ +#define CLK_CSV_HF_CTL_CSV_FREQ_WINDOW_Msk (0xffffUL) /*!< CLK_CSV HF_CTL: CSV_FREQ_WINDOW (Bitfield-Mask: 0xffff) */ +#define CLK_CSV_HF_CTL_CSV_MUX_Pos (16UL) /*!< CLK_CSV HF_CTL: CSV_MUX (Bit 16) */ +#define CLK_CSV_HF_CTL_CSV_MUX_Msk (0x30000UL) /*!< CLK_CSV HF_CTL: CSV_MUX (Bitfield-Mask: 0x03) */ +#define CLK_CSV_HF_CTL_CSV_LOSS_WINDOW_Pos (20UL) /*!< CLK_CSV HF_CTL: CSV_LOSS_WINDOW (Bit 20) */ +#define CLK_CSV_HF_CTL_CSV_LOSS_WINDOW_Msk (0x700000UL) /*!< CLK_CSV HF_CTL: CSV_LOSS_WINDOW (Bitfield-Mask: 0x07) */ +#define CLK_CSV_HF_CTL_CSV_FREQ_ACTION_Pos (24UL) /*!< CLK_CSV HF_CTL: CSV_FREQ_ACTION (Bit 24) */ +#define CLK_CSV_HF_CTL_CSV_FREQ_ACTION_Msk (0x3000000UL) /*!< CLK_CSV HF_CTL: CSV_FREQ_ACTION (Bitfield-Mask: 0x03) */ +#define CLK_CSV_HF_CTL_CSV_FREQ_ONESHOT_Pos (26UL) /*!< CLK_CSV HF_CTL: CSV_FREQ_ONESHOT (Bit 26) */ +#define CLK_CSV_HF_CTL_CSV_FREQ_ONESHOT_Msk (0x4000000UL) /*!< CLK_CSV HF_CTL: CSV_FREQ_ONESHOT (Bitfield-Mask: 0x01) */ +#define CLK_CSV_HF_CTL_CSV_FREQ_EN_Pos (27UL) /*!< CLK_CSV HF_CTL: CSV_FREQ_EN (Bit 27) */ +#define CLK_CSV_HF_CTL_CSV_FREQ_EN_Msk (0x8000000UL) /*!< CLK_CSV HF_CTL: CSV_FREQ_EN (Bitfield-Mask: 0x01) */ +#define CLK_CSV_HF_CTL_CSV_LOSS_ACTION_Pos (28UL) /*!< CLK_CSV HF_CTL: CSV_LOSS_ACTION (Bit 28) */ +#define CLK_CSV_HF_CTL_CSV_LOSS_ACTION_Msk (0x30000000UL) /*!< CLK_CSV HF_CTL: CSV_LOSS_ACTION (Bitfield-Mask: 0x03) */ +#define CLK_CSV_HF_CTL_CSV_LOSS_EN_Pos (31UL) /*!< CLK_CSV HF_CTL: CSV_LOSS_EN (Bit 31) */ +#define CLK_CSV_HF_CTL_CSV_LOSS_EN_Msk (0x80000000UL) /*!< CLK_CSV HF_CTL: CSV_LOSS_EN (Bitfield-Mask: 0x01) */ +/* =================================================== CLK_CSV.HF_LIMIT ==================================================== */ +#define CLK_CSV_HF_LIMIT_LOWER_LIMIT_Pos (0UL) /*!< CLK_CSV HF_LIMIT: LOWER_LIMIT (Bit 0) */ +#define CLK_CSV_HF_LIMIT_LOWER_LIMIT_Msk (0xffffUL) /*!< CLK_CSV HF_LIMIT: LOWER_LIMIT (Bitfield-Mask: 0xffff) */ +#define CLK_CSV_HF_LIMIT_UPPER_LIMIT_Pos (16UL) /*!< CLK_CSV HF_LIMIT: UPPER_LIMIT (Bit 16) */ +#define CLK_CSV_HF_LIMIT_UPPER_LIMIT_Msk (0xffff0000UL) /*!< CLK_CSV HF_LIMIT: UPPER_LIMIT (Bitfield-Mask: 0xffff) */ +/* ==================================================== CLK_CSV.HF_CNT ===================================================== */ +#define CLK_CSV_HF_CNT_CNT_Pos (0UL) /*!< CLK_CSV HF_CNT: CNT (Bit 0) */ +#define CLK_CSV_HF_CNT_CNT_Msk (0xffffUL) /*!< CLK_CSV HF_CNT: CNT (Bitfield-Mask: 0xffff) */ + + +/* ===================================================== SRSS.PWR_CTL ====================================================== */ +#define SRSS_PWR_CTL_POWER_MODE_Pos (0UL) /*!< SRSS PWR_CTL: POWER_MODE (Bit 0) */ +#define SRSS_PWR_CTL_POWER_MODE_Msk (0x3UL) /*!< SRSS PWR_CTL: POWER_MODE (Bitfield-Mask: 0x03) */ +#define SRSS_PWR_CTL_DEBUG_SESSION_Pos (4UL) /*!< SRSS PWR_CTL: DEBUG_SESSION (Bit 4) */ +#define SRSS_PWR_CTL_DEBUG_SESSION_Msk (0x10UL) /*!< SRSS PWR_CTL: DEBUG_SESSION (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_LPM_READY_Pos (5UL) /*!< SRSS PWR_CTL: LPM_READY (Bit 5) */ +#define SRSS_PWR_CTL_LPM_READY_Msk (0x20UL) /*!< SRSS PWR_CTL: LPM_READY (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_DPSLP_REG_DIS_Pos (20UL) /*!< SRSS PWR_CTL: DPSLP_REG_DIS (Bit 20) */ +#define SRSS_PWR_CTL_DPSLP_REG_DIS_Msk (0x100000UL) /*!< SRSS PWR_CTL: DPSLP_REG_DIS (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_RET_REG_DIS_Pos (21UL) /*!< SRSS PWR_CTL: RET_REG_DIS (Bit 21) */ +#define SRSS_PWR_CTL_RET_REG_DIS_Msk (0x200000UL) /*!< SRSS PWR_CTL: RET_REG_DIS (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_NWELL_REG_DIS_Pos (22UL) /*!< SRSS PWR_CTL: NWELL_REG_DIS (Bit 22) */ +#define SRSS_PWR_CTL_NWELL_REG_DIS_Msk (0x400000UL) /*!< SRSS PWR_CTL: NWELL_REG_DIS (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_LINREG_DIS_Pos (23UL) /*!< SRSS PWR_CTL: LINREG_DIS (Bit 23) */ +#define SRSS_PWR_CTL_LINREG_DIS_Msk (0x800000UL) /*!< SRSS PWR_CTL: LINREG_DIS (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_LINREG_LPMODE_Pos (24UL) /*!< SRSS PWR_CTL: LINREG_LPMODE (Bit 24) */ +#define SRSS_PWR_CTL_LINREG_LPMODE_Msk (0x1000000UL) /*!< SRSS PWR_CTL: LINREG_LPMODE (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_PORBOD_LPMODE_Pos (25UL) /*!< SRSS PWR_CTL: PORBOD_LPMODE (Bit 25) */ +#define SRSS_PWR_CTL_PORBOD_LPMODE_Msk (0x2000000UL) /*!< SRSS PWR_CTL: PORBOD_LPMODE (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_BGREF_LPMODE_Pos (26UL) /*!< SRSS PWR_CTL: BGREF_LPMODE (Bit 26) */ +#define SRSS_PWR_CTL_BGREF_LPMODE_Msk (0x4000000UL) /*!< SRSS PWR_CTL: BGREF_LPMODE (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_PLL_LS_BYPASS_Pos (27UL) /*!< SRSS PWR_CTL: PLL_LS_BYPASS (Bit 27) */ +#define SRSS_PWR_CTL_PLL_LS_BYPASS_Msk (0x8000000UL) /*!< SRSS PWR_CTL: PLL_LS_BYPASS (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_VREFBUF_LPMODE_Pos (28UL) /*!< SRSS PWR_CTL: VREFBUF_LPMODE (Bit 28) */ +#define SRSS_PWR_CTL_VREFBUF_LPMODE_Msk (0x10000000UL) /*!< SRSS PWR_CTL: VREFBUF_LPMODE (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_VREFBUF_DIS_Pos (29UL) /*!< SRSS PWR_CTL: VREFBUF_DIS (Bit 29) */ +#define SRSS_PWR_CTL_VREFBUF_DIS_Msk (0x20000000UL) /*!< SRSS PWR_CTL: VREFBUF_DIS (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_ACT_REF_DIS_Pos (30UL) /*!< SRSS PWR_CTL: ACT_REF_DIS (Bit 30) */ +#define SRSS_PWR_CTL_ACT_REF_DIS_Msk (0x40000000UL) /*!< SRSS PWR_CTL: ACT_REF_DIS (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_CTL_ACT_REF_OK_Pos (31UL) /*!< SRSS PWR_CTL: ACT_REF_OK (Bit 31) */ +#define SRSS_PWR_CTL_ACT_REF_OK_Msk (0x80000000UL) /*!< SRSS PWR_CTL: ACT_REF_OK (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.PWR_HIBERNATE =================================================== */ +#define SRSS_PWR_HIBERNATE_TOKEN_Pos (0UL) /*!< SRSS PWR_HIBERNATE: TOKEN (Bit 0) */ +#define SRSS_PWR_HIBERNATE_TOKEN_Msk (0xffUL) /*!< SRSS PWR_HIBERNATE: TOKEN (Bitfield-Mask: 0xff) */ +#define SRSS_PWR_HIBERNATE_UNLOCK_Pos (8UL) /*!< SRSS PWR_HIBERNATE: UNLOCK (Bit 8) */ +#define SRSS_PWR_HIBERNATE_UNLOCK_Msk (0xff00UL) /*!< SRSS PWR_HIBERNATE: UNLOCK (Bitfield-Mask: 0xff) */ +#define SRSS_PWR_HIBERNATE_FREEZE_Pos (17UL) /*!< SRSS PWR_HIBERNATE: FREEZE (Bit 17) */ +#define SRSS_PWR_HIBERNATE_FREEZE_Msk (0x20000UL) /*!< SRSS PWR_HIBERNATE: FREEZE (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_HIBERNATE_MASK_HIBALARM_Pos (18UL) /*!< SRSS PWR_HIBERNATE: MASK_HIBALARM (Bit 18) */ +#define SRSS_PWR_HIBERNATE_MASK_HIBALARM_Msk (0x40000UL) /*!< SRSS PWR_HIBERNATE: MASK_HIBALARM (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_HIBERNATE_MASK_HIBWDT_Pos (19UL) /*!< SRSS PWR_HIBERNATE: MASK_HIBWDT (Bit 19) */ +#define SRSS_PWR_HIBERNATE_MASK_HIBWDT_Msk (0x80000UL) /*!< SRSS PWR_HIBERNATE: MASK_HIBWDT (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_HIBERNATE_POLARITY_HIBPIN_Pos (20UL) /*!< SRSS PWR_HIBERNATE: POLARITY_HIBPIN (Bit 20) */ +#define SRSS_PWR_HIBERNATE_POLARITY_HIBPIN_Msk (0xf00000UL) /*!< SRSS PWR_HIBERNATE: POLARITY_HIBPIN (Bitfield-Mask: 0x0f) */ +#define SRSS_PWR_HIBERNATE_MASK_HIBPIN_Pos (24UL) /*!< SRSS PWR_HIBERNATE: MASK_HIBPIN (Bit 24) */ +#define SRSS_PWR_HIBERNATE_MASK_HIBPIN_Msk (0xf000000UL) /*!< SRSS PWR_HIBERNATE: MASK_HIBPIN (Bitfield-Mask: 0x0f) */ +#define SRSS_PWR_HIBERNATE_HIBERNATE_DISABLE_Pos (30UL) /*!< SRSS PWR_HIBERNATE: HIBERNATE_DISABLE (Bit 30) */ +#define SRSS_PWR_HIBERNATE_HIBERNATE_DISABLE_Msk (0x40000000UL) /*!< SRSS PWR_HIBERNATE: HIBERNATE_DISABLE (Bitfield-Mask: 0x01)*/ +#define SRSS_PWR_HIBERNATE_HIBERNATE_Pos (31UL) /*!< SRSS PWR_HIBERNATE: HIBERNATE (Bit 31) */ +#define SRSS_PWR_HIBERNATE_HIBERNATE_Msk (0x80000000UL) /*!< SRSS PWR_HIBERNATE: HIBERNATE (Bitfield-Mask: 0x01) */ +/* =================================================== SRSS.PWR_LVD_CTL ==================================================== */ +#define SRSS_PWR_LVD_CTL_HVLVD1_TRIPSEL_Pos (0UL) /*!< SRSS PWR_LVD_CTL: HVLVD1_TRIPSEL (Bit 0) */ +#define SRSS_PWR_LVD_CTL_HVLVD1_TRIPSEL_Msk (0xfUL) /*!< SRSS PWR_LVD_CTL: HVLVD1_TRIPSEL (Bitfield-Mask: 0x0f) */ +#define SRSS_PWR_LVD_CTL_HVLVD1_SRCSEL_Pos (4UL) /*!< SRSS PWR_LVD_CTL: HVLVD1_SRCSEL (Bit 4) */ +#define SRSS_PWR_LVD_CTL_HVLVD1_SRCSEL_Msk (0x70UL) /*!< SRSS PWR_LVD_CTL: HVLVD1_SRCSEL (Bitfield-Mask: 0x07) */ +#define SRSS_PWR_LVD_CTL_HVLVD1_EN_Pos (7UL) /*!< SRSS PWR_LVD_CTL: HVLVD1_EN (Bit 7) */ +#define SRSS_PWR_LVD_CTL_HVLVD1_EN_Msk (0x80UL) /*!< SRSS PWR_LVD_CTL: HVLVD1_EN (Bitfield-Mask: 0x01) */ +/* =================================================== SRSS.PWR_BUCK_CTL =================================================== */ +#define SRSS_PWR_BUCK_CTL_BUCK_OUT1_SEL_Pos (0UL) /*!< SRSS PWR_BUCK_CTL: BUCK_OUT1_SEL (Bit 0) */ +#define SRSS_PWR_BUCK_CTL_BUCK_OUT1_SEL_Msk (0x7UL) /*!< SRSS PWR_BUCK_CTL: BUCK_OUT1_SEL (Bitfield-Mask: 0x07) */ +#define SRSS_PWR_BUCK_CTL_BUCK_EN_Pos (30UL) /*!< SRSS PWR_BUCK_CTL: BUCK_EN (Bit 30) */ +#define SRSS_PWR_BUCK_CTL_BUCK_EN_Msk (0x40000000UL) /*!< SRSS PWR_BUCK_CTL: BUCK_EN (Bitfield-Mask: 0x01) */ +#define SRSS_PWR_BUCK_CTL_BUCK_OUT1_EN_Pos (31UL) /*!< SRSS PWR_BUCK_CTL: BUCK_OUT1_EN (Bit 31) */ +#define SRSS_PWR_BUCK_CTL_BUCK_OUT1_EN_Msk (0x80000000UL) /*!< SRSS PWR_BUCK_CTL: BUCK_OUT1_EN (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.PWR_BUCK_CTL2 =================================================== */ +#define SRSS_PWR_BUCK_CTL2_BUCK_OUT2_SEL_Pos (0UL) /*!< SRSS PWR_BUCK_CTL2: BUCK_OUT2_SEL (Bit 0) */ +#define SRSS_PWR_BUCK_CTL2_BUCK_OUT2_SEL_Msk (0x7UL) /*!< SRSS PWR_BUCK_CTL2: BUCK_OUT2_SEL (Bitfield-Mask: 0x07) */ +#define SRSS_PWR_BUCK_CTL2_BUCK_OUT2_HW_SEL_Pos (30UL) /*!< SRSS PWR_BUCK_CTL2: BUCK_OUT2_HW_SEL (Bit 30) */ +#define SRSS_PWR_BUCK_CTL2_BUCK_OUT2_HW_SEL_Msk (0x40000000UL) /*!< SRSS PWR_BUCK_CTL2: BUCK_OUT2_HW_SEL (Bitfield-Mask: 0x01)*/ +#define SRSS_PWR_BUCK_CTL2_BUCK_OUT2_EN_Pos (31UL) /*!< SRSS PWR_BUCK_CTL2: BUCK_OUT2_EN (Bit 31) */ +#define SRSS_PWR_BUCK_CTL2_BUCK_OUT2_EN_Msk (0x80000000UL) /*!< SRSS PWR_BUCK_CTL2: BUCK_OUT2_EN (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.PWR_LVD_STATUS ================================================== */ +#define SRSS_PWR_LVD_STATUS_HVLVD1_OK_Pos (0UL) /*!< SRSS PWR_LVD_STATUS: HVLVD1_OK (Bit 0) */ +#define SRSS_PWR_LVD_STATUS_HVLVD1_OK_Msk (0x1UL) /*!< SRSS PWR_LVD_STATUS: HVLVD1_OK (Bitfield-Mask: 0x01) */ +/* =================================================== SRSS.PWR_HIB_DATA =================================================== */ +#define SRSS_PWR_HIB_DATA_HIB_DATA_Pos (0UL) /*!< SRSS PWR_HIB_DATA: HIB_DATA (Bit 0) */ +#define SRSS_PWR_HIB_DATA_HIB_DATA_Msk (0xffffffffUL) /*!< SRSS PWR_HIB_DATA: HIB_DATA (Bitfield-Mask: 0xffffffff) */ +/* ===================================================== SRSS.WDT_CTL ====================================================== */ +#define SRSS_WDT_CTL_WDT_EN_Pos (0UL) /*!< SRSS WDT_CTL: WDT_EN (Bit 0) */ +#define SRSS_WDT_CTL_WDT_EN_Msk (0x1UL) /*!< SRSS WDT_CTL: WDT_EN (Bitfield-Mask: 0x01) */ +#define SRSS_WDT_CTL_WDT_LOCK_Pos (30UL) /*!< SRSS WDT_CTL: WDT_LOCK (Bit 30) */ +#define SRSS_WDT_CTL_WDT_LOCK_Msk (0xc0000000UL) /*!< SRSS WDT_CTL: WDT_LOCK (Bitfield-Mask: 0x03) */ +/* ===================================================== SRSS.WDT_CNT ====================================================== */ +#define SRSS_WDT_CNT_COUNTER_Pos (0UL) /*!< SRSS WDT_CNT: COUNTER (Bit 0) */ +#define SRSS_WDT_CNT_COUNTER_Msk (0xffffUL) /*!< SRSS WDT_CNT: COUNTER (Bitfield-Mask: 0xffff) */ +/* ==================================================== SRSS.WDT_MATCH ===================================================== */ +#define SRSS_WDT_MATCH_MATCH_Pos (0UL) /*!< SRSS WDT_MATCH: MATCH (Bit 0) */ +#define SRSS_WDT_MATCH_MATCH_Msk (0xffffUL) /*!< SRSS WDT_MATCH: MATCH (Bitfield-Mask: 0xffff) */ +#define SRSS_WDT_MATCH_IGNORE_BITS_Pos (16UL) /*!< SRSS WDT_MATCH: IGNORE_BITS (Bit 16) */ +#define SRSS_WDT_MATCH_IGNORE_BITS_Msk (0xf0000UL) /*!< SRSS WDT_MATCH: IGNORE_BITS (Bitfield-Mask: 0x0f) */ +/* ================================================== SRSS.CLK_DSI_SELECT ================================================== */ +#define SRSS_CLK_DSI_SELECT_DSI_MUX_Pos (0UL) /*!< SRSS CLK_DSI_SELECT: DSI_MUX (Bit 0) */ +#define SRSS_CLK_DSI_SELECT_DSI_MUX_Msk (0x1fUL) /*!< SRSS CLK_DSI_SELECT: DSI_MUX (Bitfield-Mask: 0x1f) */ +/* ================================================= SRSS.CLK_PATH_SELECT ================================================== */ +#define SRSS_CLK_PATH_SELECT_PATH_MUX_Pos (0UL) /*!< SRSS CLK_PATH_SELECT: PATH_MUX (Bit 0) */ +#define SRSS_CLK_PATH_SELECT_PATH_MUX_Msk (0x7UL) /*!< SRSS CLK_PATH_SELECT: PATH_MUX (Bitfield-Mask: 0x07) */ +/* ================================================= SRSS.CLK_ROOT_SELECT ================================================== */ +#define SRSS_CLK_ROOT_SELECT_ROOT_MUX_Pos (0UL) /*!< SRSS CLK_ROOT_SELECT: ROOT_MUX (Bit 0) */ +#define SRSS_CLK_ROOT_SELECT_ROOT_MUX_Msk (0xfUL) /*!< SRSS CLK_ROOT_SELECT: ROOT_MUX (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_ROOT_SELECT_ROOT_DIV_Pos (4UL) /*!< SRSS CLK_ROOT_SELECT: ROOT_DIV (Bit 4) */ +#define SRSS_CLK_ROOT_SELECT_ROOT_DIV_Msk (0x30UL) /*!< SRSS CLK_ROOT_SELECT: ROOT_DIV (Bitfield-Mask: 0x03) */ +#define SRSS_CLK_ROOT_SELECT_ENABLE_Pos (31UL) /*!< SRSS CLK_ROOT_SELECT: ENABLE (Bit 31) */ +#define SRSS_CLK_ROOT_SELECT_ENABLE_Msk (0x80000000UL) /*!< SRSS CLK_ROOT_SELECT: ENABLE (Bitfield-Mask: 0x01) */ +/* ==================================================== SRSS.CLK_SELECT ==================================================== */ +#define SRSS_CLK_SELECT_LFCLK_SEL_Pos (0UL) /*!< SRSS CLK_SELECT: LFCLK_SEL (Bit 0) */ +#define SRSS_CLK_SELECT_LFCLK_SEL_Msk (0x3UL) /*!< SRSS CLK_SELECT: LFCLK_SEL (Bitfield-Mask: 0x03) */ +#define SRSS_CLK_SELECT_PUMP_SEL_Pos (8UL) /*!< SRSS CLK_SELECT: PUMP_SEL (Bit 8) */ +#define SRSS_CLK_SELECT_PUMP_SEL_Msk (0xf00UL) /*!< SRSS CLK_SELECT: PUMP_SEL (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_SELECT_PUMP_DIV_Pos (12UL) /*!< SRSS CLK_SELECT: PUMP_DIV (Bit 12) */ +#define SRSS_CLK_SELECT_PUMP_DIV_Msk (0x7000UL) /*!< SRSS CLK_SELECT: PUMP_DIV (Bitfield-Mask: 0x07) */ +#define SRSS_CLK_SELECT_PUMP_ENABLE_Pos (15UL) /*!< SRSS CLK_SELECT: PUMP_ENABLE (Bit 15) */ +#define SRSS_CLK_SELECT_PUMP_ENABLE_Msk (0x8000UL) /*!< SRSS CLK_SELECT: PUMP_ENABLE (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.CLK_TIMER_CTL =================================================== */ +#define SRSS_CLK_TIMER_CTL_TIMER_SEL_Pos (0UL) /*!< SRSS CLK_TIMER_CTL: TIMER_SEL (Bit 0) */ +#define SRSS_CLK_TIMER_CTL_TIMER_SEL_Msk (0x1UL) /*!< SRSS CLK_TIMER_CTL: TIMER_SEL (Bitfield-Mask: 0x01) */ +#define SRSS_CLK_TIMER_CTL_TIMER_HF0_DIV_Pos (8UL) /*!< SRSS CLK_TIMER_CTL: TIMER_HF0_DIV (Bit 8) */ +#define SRSS_CLK_TIMER_CTL_TIMER_HF0_DIV_Msk (0x300UL) /*!< SRSS CLK_TIMER_CTL: TIMER_HF0_DIV (Bitfield-Mask: 0x03) */ +#define SRSS_CLK_TIMER_CTL_TIMER_DIV_Pos (16UL) /*!< SRSS CLK_TIMER_CTL: TIMER_DIV (Bit 16) */ +#define SRSS_CLK_TIMER_CTL_TIMER_DIV_Msk (0xff0000UL) /*!< SRSS CLK_TIMER_CTL: TIMER_DIV (Bitfield-Mask: 0xff) */ +#define SRSS_CLK_TIMER_CTL_ENABLE_Pos (31UL) /*!< SRSS CLK_TIMER_CTL: ENABLE (Bit 31) */ +#define SRSS_CLK_TIMER_CTL_ENABLE_Msk (0x80000000UL) /*!< SRSS CLK_TIMER_CTL: ENABLE (Bitfield-Mask: 0x01) */ +/* ================================================= SRSS.CLK_CSV_WCO_CTL ================================================== */ +#define SRSS_CLK_CSV_WCO_CTL_CSV_MUX_Pos (16UL) /*!< SRSS CLK_CSV_WCO_CTL: CSV_MUX (Bit 16) */ +#define SRSS_CLK_CSV_WCO_CTL_CSV_MUX_Msk (0x30000UL) /*!< SRSS CLK_CSV_WCO_CTL: CSV_MUX (Bitfield-Mask: 0x03) */ +#define SRSS_CLK_CSV_WCO_CTL_CSV_LOSS_WINDOW_Pos (20UL) /*!< SRSS CLK_CSV_WCO_CTL: CSV_LOSS_WINDOW (Bit 20) */ +#define SRSS_CLK_CSV_WCO_CTL_CSV_LOSS_WINDOW_Msk (0x700000UL) /*!< SRSS CLK_CSV_WCO_CTL: CSV_LOSS_WINDOW (Bitfield-Mask: 0x07)*/ +#define SRSS_CLK_CSV_WCO_CTL_CSV_LOSS_ACTION_Pos (28UL) /*!< SRSS CLK_CSV_WCO_CTL: CSV_LOSS_ACTION (Bit 28) */ +#define SRSS_CLK_CSV_WCO_CTL_CSV_LOSS_ACTION_Msk (0x30000000UL) /*!< SRSS CLK_CSV_WCO_CTL: CSV_LOSS_ACTION (Bitfield-Mask: 0x03)*/ +#define SRSS_CLK_CSV_WCO_CTL_CSV_LOSS_EN_Pos (31UL) /*!< SRSS CLK_CSV_WCO_CTL: CSV_LOSS_EN (Bit 31) */ +#define SRSS_CLK_CSV_WCO_CTL_CSV_LOSS_EN_Msk (0x80000000UL) /*!< SRSS CLK_CSV_WCO_CTL: CSV_LOSS_EN (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.CLK_ILO_CONFIG ================================================== */ +#define SRSS_CLK_ILO_CONFIG_HVILO_BACKUP_Pos (0UL) /*!< SRSS CLK_ILO_CONFIG: HVILO_BACKUP (Bit 0) */ +#define SRSS_CLK_ILO_CONFIG_HVILO_BACKUP_Msk (0x1UL) /*!< SRSS CLK_ILO_CONFIG: HVILO_BACKUP (Bitfield-Mask: 0x01) */ +#define SRSS_CLK_ILO_CONFIG_ENABLE_Pos (31UL) /*!< SRSS CLK_ILO_CONFIG: ENABLE (Bit 31) */ +#define SRSS_CLK_ILO_CONFIG_ENABLE_Msk (0x80000000UL) /*!< SRSS CLK_ILO_CONFIG: ENABLE (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.CLK_IMO_CONFIG ================================================== */ +#define SRSS_CLK_IMO_CONFIG_ENABLE_Pos (31UL) /*!< SRSS CLK_IMO_CONFIG: ENABLE (Bit 31) */ +#define SRSS_CLK_IMO_CONFIG_ENABLE_Msk (0x80000000UL) /*!< SRSS CLK_IMO_CONFIG: ENABLE (Bitfield-Mask: 0x01) */ +/* ================================================= SRSS.CLK_OUTPUT_FAST ================================================== */ +#define SRSS_CLK_OUTPUT_FAST_FAST_SEL0_Pos (0UL) /*!< SRSS CLK_OUTPUT_FAST: FAST_SEL0 (Bit 0) */ +#define SRSS_CLK_OUTPUT_FAST_FAST_SEL0_Msk (0xfUL) /*!< SRSS CLK_OUTPUT_FAST: FAST_SEL0 (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_OUTPUT_FAST_PATH_SEL0_Pos (4UL) /*!< SRSS CLK_OUTPUT_FAST: PATH_SEL0 (Bit 4) */ +#define SRSS_CLK_OUTPUT_FAST_PATH_SEL0_Msk (0xf0UL) /*!< SRSS CLK_OUTPUT_FAST: PATH_SEL0 (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_OUTPUT_FAST_HFCLK_SEL0_Pos (8UL) /*!< SRSS CLK_OUTPUT_FAST: HFCLK_SEL0 (Bit 8) */ +#define SRSS_CLK_OUTPUT_FAST_HFCLK_SEL0_Msk (0xf00UL) /*!< SRSS CLK_OUTPUT_FAST: HFCLK_SEL0 (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_OUTPUT_FAST_FAST_SEL1_Pos (16UL) /*!< SRSS CLK_OUTPUT_FAST: FAST_SEL1 (Bit 16) */ +#define SRSS_CLK_OUTPUT_FAST_FAST_SEL1_Msk (0xf0000UL) /*!< SRSS CLK_OUTPUT_FAST: FAST_SEL1 (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_OUTPUT_FAST_PATH_SEL1_Pos (20UL) /*!< SRSS CLK_OUTPUT_FAST: PATH_SEL1 (Bit 20) */ +#define SRSS_CLK_OUTPUT_FAST_PATH_SEL1_Msk (0xf00000UL) /*!< SRSS CLK_OUTPUT_FAST: PATH_SEL1 (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_OUTPUT_FAST_HFCLK_SEL1_Pos (24UL) /*!< SRSS CLK_OUTPUT_FAST: HFCLK_SEL1 (Bit 24) */ +#define SRSS_CLK_OUTPUT_FAST_HFCLK_SEL1_Msk (0xf000000UL) /*!< SRSS CLK_OUTPUT_FAST: HFCLK_SEL1 (Bitfield-Mask: 0x0f) */ +/* ================================================= SRSS.CLK_OUTPUT_SLOW ================================================== */ +#define SRSS_CLK_OUTPUT_SLOW_SLOW_SEL0_Pos (0UL) /*!< SRSS CLK_OUTPUT_SLOW: SLOW_SEL0 (Bit 0) */ +#define SRSS_CLK_OUTPUT_SLOW_SLOW_SEL0_Msk (0xfUL) /*!< SRSS CLK_OUTPUT_SLOW: SLOW_SEL0 (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_OUTPUT_SLOW_SLOW_SEL1_Pos (4UL) /*!< SRSS CLK_OUTPUT_SLOW: SLOW_SEL1 (Bit 4) */ +#define SRSS_CLK_OUTPUT_SLOW_SLOW_SEL1_Msk (0xf0UL) /*!< SRSS CLK_OUTPUT_SLOW: SLOW_SEL1 (Bitfield-Mask: 0x0f) */ +/* =================================================== SRSS.CLK_CAL_CNT1 =================================================== */ +#define SRSS_CLK_CAL_CNT1_CAL_COUNTER1_Pos (0UL) /*!< SRSS CLK_CAL_CNT1: CAL_COUNTER1 (Bit 0) */ +#define SRSS_CLK_CAL_CNT1_CAL_COUNTER1_Msk (0xffffffUL) /*!< SRSS CLK_CAL_CNT1: CAL_COUNTER1 (Bitfield-Mask: 0xffffff) */ +#define SRSS_CLK_CAL_CNT1_CAL_COUNTER_DONE_Pos (31UL) /*!< SRSS CLK_CAL_CNT1: CAL_COUNTER_DONE (Bit 31) */ +#define SRSS_CLK_CAL_CNT1_CAL_COUNTER_DONE_Msk (0x80000000UL) /*!< SRSS CLK_CAL_CNT1: CAL_COUNTER_DONE (Bitfield-Mask: 0x01) */ +/* =================================================== SRSS.CLK_CAL_CNT2 =================================================== */ +#define SRSS_CLK_CAL_CNT2_CAL_COUNTER2_Pos (0UL) /*!< SRSS CLK_CAL_CNT2: CAL_COUNTER2 (Bit 0) */ +#define SRSS_CLK_CAL_CNT2_CAL_COUNTER2_Msk (0xffffffUL) /*!< SRSS CLK_CAL_CNT2: CAL_COUNTER2 (Bitfield-Mask: 0xffffff) */ +/* ================================================== SRSS.CLK_ECO_CONFIG ================================================== */ +#define SRSS_CLK_ECO_CONFIG_AGC_EN_Pos (1UL) /*!< SRSS CLK_ECO_CONFIG: AGC_EN (Bit 1) */ +#define SRSS_CLK_ECO_CONFIG_AGC_EN_Msk (0x2UL) /*!< SRSS CLK_ECO_CONFIG: AGC_EN (Bitfield-Mask: 0x01) */ +#define SRSS_CLK_ECO_CONFIG_ECO_EN_Pos (31UL) /*!< SRSS CLK_ECO_CONFIG: ECO_EN (Bit 31) */ +#define SRSS_CLK_ECO_CONFIG_ECO_EN_Msk (0x80000000UL) /*!< SRSS CLK_ECO_CONFIG: ECO_EN (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.CLK_ECO_STATUS ================================================== */ +#define SRSS_CLK_ECO_STATUS_ECO_OK_Pos (0UL) /*!< SRSS CLK_ECO_STATUS: ECO_OK (Bit 0) */ +#define SRSS_CLK_ECO_STATUS_ECO_OK_Msk (0x1UL) /*!< SRSS CLK_ECO_STATUS: ECO_OK (Bitfield-Mask: 0x01) */ +#define SRSS_CLK_ECO_STATUS_ECO_READY_Pos (1UL) /*!< SRSS CLK_ECO_STATUS: ECO_READY (Bit 1) */ +#define SRSS_CLK_ECO_STATUS_ECO_READY_Msk (0x2UL) /*!< SRSS CLK_ECO_STATUS: ECO_READY (Bitfield-Mask: 0x01) */ +/* =================================================== SRSS.CLK_WCO_DPLL =================================================== */ +#define SRSS_CLK_WCO_DPLL_DPLL_MULT_Pos (0UL) /*!< SRSS CLK_WCO_DPLL: DPLL_MULT (Bit 0) */ +#define SRSS_CLK_WCO_DPLL_DPLL_MULT_Msk (0x7ffUL) /*!< SRSS CLK_WCO_DPLL: DPLL_MULT (Bitfield-Mask: 0x7ff) */ +#define SRSS_CLK_WCO_DPLL_DPLL_LF_IGAIN_Pos (16UL) /*!< SRSS CLK_WCO_DPLL: DPLL_LF_IGAIN (Bit 16) */ +#define SRSS_CLK_WCO_DPLL_DPLL_LF_IGAIN_Msk (0x70000UL) /*!< SRSS CLK_WCO_DPLL: DPLL_LF_IGAIN (Bitfield-Mask: 0x07) */ +#define SRSS_CLK_WCO_DPLL_DPLL_LF_PGAIN_Pos (19UL) /*!< SRSS CLK_WCO_DPLL: DPLL_LF_PGAIN (Bit 19) */ +#define SRSS_CLK_WCO_DPLL_DPLL_LF_PGAIN_Msk (0x380000UL) /*!< SRSS CLK_WCO_DPLL: DPLL_LF_PGAIN (Bitfield-Mask: 0x07) */ +#define SRSS_CLK_WCO_DPLL_DPLL_LF_LIMIT_Pos (22UL) /*!< SRSS CLK_WCO_DPLL: DPLL_LF_LIMIT (Bit 22) */ +#define SRSS_CLK_WCO_DPLL_DPLL_LF_LIMIT_Msk (0x3fc00000UL) /*!< SRSS CLK_WCO_DPLL: DPLL_LF_LIMIT (Bitfield-Mask: 0xff) */ +#define SRSS_CLK_WCO_DPLL_DPLL_EN_Pos (31UL) /*!< SRSS CLK_WCO_DPLL: DPLL_EN (Bit 31) */ +#define SRSS_CLK_WCO_DPLL_DPLL_EN_Msk (0x80000000UL) /*!< SRSS CLK_WCO_DPLL: DPLL_EN (Bitfield-Mask: 0x01) */ +/* ================================================= SRSS.CLK_PILO_CONFIG ================================================== */ +#define SRSS_CLK_PILO_CONFIG_PILO_FFREQ_Pos (0UL) /*!< SRSS CLK_PILO_CONFIG: PILO_FFREQ (Bit 0) */ +#define SRSS_CLK_PILO_CONFIG_PILO_FFREQ_Msk (0x3ffUL) /*!< SRSS CLK_PILO_CONFIG: PILO_FFREQ (Bitfield-Mask: 0x3ff) */ +#define SRSS_CLK_PILO_CONFIG_PILO_CLK_EN_Pos (29UL) /*!< SRSS CLK_PILO_CONFIG: PILO_CLK_EN (Bit 29) */ +#define SRSS_CLK_PILO_CONFIG_PILO_CLK_EN_Msk (0x20000000UL) /*!< SRSS CLK_PILO_CONFIG: PILO_CLK_EN (Bitfield-Mask: 0x01) */ +#define SRSS_CLK_PILO_CONFIG_PILO_RESET_N_Pos (30UL) /*!< SRSS CLK_PILO_CONFIG: PILO_RESET_N (Bit 30) */ +#define SRSS_CLK_PILO_CONFIG_PILO_RESET_N_Msk (0x40000000UL) /*!< SRSS CLK_PILO_CONFIG: PILO_RESET_N (Bitfield-Mask: 0x01) */ +#define SRSS_CLK_PILO_CONFIG_PILO_EN_Pos (31UL) /*!< SRSS CLK_PILO_CONFIG: PILO_EN (Bit 31) */ +#define SRSS_CLK_PILO_CONFIG_PILO_EN_Msk (0x80000000UL) /*!< SRSS CLK_PILO_CONFIG: PILO_EN (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.CLK_FLL_CONFIG ================================================== */ +#define SRSS_CLK_FLL_CONFIG_FLL_MULT_Pos (0UL) /*!< SRSS CLK_FLL_CONFIG: FLL_MULT (Bit 0) */ +#define SRSS_CLK_FLL_CONFIG_FLL_MULT_Msk (0x3ffffUL) /*!< SRSS CLK_FLL_CONFIG: FLL_MULT (Bitfield-Mask: 0x3ffff) */ +#define SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV_Pos (24UL) /*!< SRSS CLK_FLL_CONFIG: FLL_OUTPUT_DIV (Bit 24) */ +#define SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV_Msk (0x1000000UL) /*!< SRSS CLK_FLL_CONFIG: FLL_OUTPUT_DIV (Bitfield-Mask: 0x01) */ +#define SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Pos (31UL) /*!< SRSS CLK_FLL_CONFIG: FLL_ENABLE (Bit 31) */ +#define SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk (0x80000000UL) /*!< SRSS CLK_FLL_CONFIG: FLL_ENABLE (Bitfield-Mask: 0x01) */ +/* ================================================= SRSS.CLK_FLL_CONFIG2 ================================================== */ +#define SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV_Pos (0UL) /*!< SRSS CLK_FLL_CONFIG2: FLL_REF_DIV (Bit 0) */ +#define SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV_Msk (0x1fffUL) /*!< SRSS CLK_FLL_CONFIG2: FLL_REF_DIV (Bitfield-Mask: 0x1fff) */ +#define SRSS_CLK_FLL_CONFIG2_LOCK_TOL_Pos (16UL) /*!< SRSS CLK_FLL_CONFIG2: LOCK_TOL (Bit 16) */ +#define SRSS_CLK_FLL_CONFIG2_LOCK_TOL_Msk (0x1ff0000UL) /*!< SRSS CLK_FLL_CONFIG2: LOCK_TOL (Bitfield-Mask: 0x1ff) */ +/* ================================================= SRSS.CLK_FLL_CONFIG3 ================================================== */ +#define SRSS_CLK_FLL_CONFIG3_FLL_LF_IGAIN_Pos (0UL) /*!< SRSS CLK_FLL_CONFIG3: FLL_LF_IGAIN (Bit 0) */ +#define SRSS_CLK_FLL_CONFIG3_FLL_LF_IGAIN_Msk (0xfUL) /*!< SRSS CLK_FLL_CONFIG3: FLL_LF_IGAIN (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_FLL_CONFIG3_FLL_LF_PGAIN_Pos (4UL) /*!< SRSS CLK_FLL_CONFIG3: FLL_LF_PGAIN (Bit 4) */ +#define SRSS_CLK_FLL_CONFIG3_FLL_LF_PGAIN_Msk (0xf0UL) /*!< SRSS CLK_FLL_CONFIG3: FLL_LF_PGAIN (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_FLL_CONFIG3_SETTLING_COUNT_Pos (8UL) /*!< SRSS CLK_FLL_CONFIG3: SETTLING_COUNT (Bit 8) */ +#define SRSS_CLK_FLL_CONFIG3_SETTLING_COUNT_Msk (0x1fff00UL) /*!< SRSS CLK_FLL_CONFIG3: SETTLING_COUNT (Bitfield-Mask: 0x1fff)*/ +#define SRSS_CLK_FLL_CONFIG3_BYPASS_SEL_Pos (28UL) /*!< SRSS CLK_FLL_CONFIG3: BYPASS_SEL (Bit 28) */ +#define SRSS_CLK_FLL_CONFIG3_BYPASS_SEL_Msk (0x30000000UL) /*!< SRSS CLK_FLL_CONFIG3: BYPASS_SEL (Bitfield-Mask: 0x03) */ +/* ================================================= SRSS.CLK_FLL_CONFIG4 ================================================== */ +#define SRSS_CLK_FLL_CONFIG4_CCO_LIMIT_Pos (0UL) /*!< SRSS CLK_FLL_CONFIG4: CCO_LIMIT (Bit 0) */ +#define SRSS_CLK_FLL_CONFIG4_CCO_LIMIT_Msk (0xffUL) /*!< SRSS CLK_FLL_CONFIG4: CCO_LIMIT (Bitfield-Mask: 0xff) */ +#define SRSS_CLK_FLL_CONFIG4_CCO_RANGE_Pos (8UL) /*!< SRSS CLK_FLL_CONFIG4: CCO_RANGE (Bit 8) */ +#define SRSS_CLK_FLL_CONFIG4_CCO_RANGE_Msk (0x700UL) /*!< SRSS CLK_FLL_CONFIG4: CCO_RANGE (Bitfield-Mask: 0x07) */ +#define SRSS_CLK_FLL_CONFIG4_CCO_FREQ_Pos (16UL) /*!< SRSS CLK_FLL_CONFIG4: CCO_FREQ (Bit 16) */ +#define SRSS_CLK_FLL_CONFIG4_CCO_FREQ_Msk (0x1ff0000UL) /*!< SRSS CLK_FLL_CONFIG4: CCO_FREQ (Bitfield-Mask: 0x1ff) */ +#define SRSS_CLK_FLL_CONFIG4_CCO_ENABLE_Pos (31UL) /*!< SRSS CLK_FLL_CONFIG4: CCO_ENABLE (Bit 31) */ +#define SRSS_CLK_FLL_CONFIG4_CCO_ENABLE_Msk (0x80000000UL) /*!< SRSS CLK_FLL_CONFIG4: CCO_ENABLE (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.CLK_FLL_STATUS ================================================== */ +#define SRSS_CLK_FLL_STATUS_LOCKED_Pos (0UL) /*!< SRSS CLK_FLL_STATUS: LOCKED (Bit 0) */ +#define SRSS_CLK_FLL_STATUS_LOCKED_Msk (0x1UL) /*!< SRSS CLK_FLL_STATUS: LOCKED (Bitfield-Mask: 0x01) */ +#define SRSS_CLK_FLL_STATUS_UNLOCK_OCCURRED_Pos (1UL) /*!< SRSS CLK_FLL_STATUS: UNLOCK_OCCURRED (Bit 1) */ +#define SRSS_CLK_FLL_STATUS_UNLOCK_OCCURRED_Msk (0x2UL) /*!< SRSS CLK_FLL_STATUS: UNLOCK_OCCURRED (Bitfield-Mask: 0x01)*/ +#define SRSS_CLK_FLL_STATUS_CCO_READY_Pos (2UL) /*!< SRSS CLK_FLL_STATUS: CCO_READY (Bit 2) */ +#define SRSS_CLK_FLL_STATUS_CCO_READY_Msk (0x4UL) /*!< SRSS CLK_FLL_STATUS: CCO_READY (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.CLK_PLL_CONFIG ================================================== */ +#define SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV_Pos (0UL) /*!< SRSS CLK_PLL_CONFIG: FEEDBACK_DIV (Bit 0) */ +#define SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV_Msk (0x7fUL) /*!< SRSS CLK_PLL_CONFIG: FEEDBACK_DIV (Bitfield-Mask: 0x7f) */ +#define SRSS_CLK_PLL_CONFIG_REFERENCE_DIV_Pos (8UL) /*!< SRSS CLK_PLL_CONFIG: REFERENCE_DIV (Bit 8) */ +#define SRSS_CLK_PLL_CONFIG_REFERENCE_DIV_Msk (0x1f00UL) /*!< SRSS CLK_PLL_CONFIG: REFERENCE_DIV (Bitfield-Mask: 0x1f) */ +#define SRSS_CLK_PLL_CONFIG_OUTPUT_DIV_Pos (16UL) /*!< SRSS CLK_PLL_CONFIG: OUTPUT_DIV (Bit 16) */ +#define SRSS_CLK_PLL_CONFIG_OUTPUT_DIV_Msk (0x1f0000UL) /*!< SRSS CLK_PLL_CONFIG: OUTPUT_DIV (Bitfield-Mask: 0x1f) */ +#define SRSS_CLK_PLL_CONFIG_PLL_LF_MODE_Pos (27UL) /*!< SRSS CLK_PLL_CONFIG: PLL_LF_MODE (Bit 27) */ +#define SRSS_CLK_PLL_CONFIG_PLL_LF_MODE_Msk (0x8000000UL) /*!< SRSS CLK_PLL_CONFIG: PLL_LF_MODE (Bitfield-Mask: 0x01) */ +#define SRSS_CLK_PLL_CONFIG_BYPASS_SEL_Pos (28UL) /*!< SRSS CLK_PLL_CONFIG: BYPASS_SEL (Bit 28) */ +#define SRSS_CLK_PLL_CONFIG_BYPASS_SEL_Msk (0x30000000UL) /*!< SRSS CLK_PLL_CONFIG: BYPASS_SEL (Bitfield-Mask: 0x03) */ +#define SRSS_CLK_PLL_CONFIG_ENABLE_Pos (31UL) /*!< SRSS CLK_PLL_CONFIG: ENABLE (Bit 31) */ +#define SRSS_CLK_PLL_CONFIG_ENABLE_Msk (0x80000000UL) /*!< SRSS CLK_PLL_CONFIG: ENABLE (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.CLK_PLL_STATUS ================================================== */ +#define SRSS_CLK_PLL_STATUS_LOCKED_Pos (0UL) /*!< SRSS CLK_PLL_STATUS: LOCKED (Bit 0) */ +#define SRSS_CLK_PLL_STATUS_LOCKED_Msk (0x1UL) /*!< SRSS CLK_PLL_STATUS: LOCKED (Bitfield-Mask: 0x01) */ +#define SRSS_CLK_PLL_STATUS_UNLOCK_OCCURRED_Pos (1UL) /*!< SRSS CLK_PLL_STATUS: UNLOCK_OCCURRED (Bit 1) */ +#define SRSS_CLK_PLL_STATUS_UNLOCK_OCCURRED_Msk (0x2UL) /*!< SRSS CLK_PLL_STATUS: UNLOCK_OCCURRED (Bitfield-Mask: 0x01)*/ +/* ==================================================== SRSS.SRSS_INTR ===================================================== */ +#define SRSS_SRSS_INTR_WDT_MATCH_Pos (0UL) /*!< SRSS SRSS_INTR: WDT_MATCH (Bit 0) */ +#define SRSS_SRSS_INTR_WDT_MATCH_Msk (0x1UL) /*!< SRSS SRSS_INTR: WDT_MATCH (Bitfield-Mask: 0x01) */ +#define SRSS_SRSS_INTR_HVLVD1_Pos (1UL) /*!< SRSS SRSS_INTR: HVLVD1 (Bit 1) */ +#define SRSS_SRSS_INTR_HVLVD1_Msk (0x2UL) /*!< SRSS SRSS_INTR: HVLVD1 (Bitfield-Mask: 0x01) */ +#define SRSS_SRSS_INTR_CLK_CAL_Pos (5UL) /*!< SRSS SRSS_INTR: CLK_CAL (Bit 5) */ +#define SRSS_SRSS_INTR_CLK_CAL_Msk (0x20UL) /*!< SRSS SRSS_INTR: CLK_CAL (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.SRSS_INTR_SET =================================================== */ +#define SRSS_SRSS_INTR_SET_WDT_MATCH_Pos (0UL) /*!< SRSS SRSS_INTR_SET: WDT_MATCH (Bit 0) */ +#define SRSS_SRSS_INTR_SET_WDT_MATCH_Msk (0x1UL) /*!< SRSS SRSS_INTR_SET: WDT_MATCH (Bitfield-Mask: 0x01) */ +#define SRSS_SRSS_INTR_SET_HVLVD1_Pos (1UL) /*!< SRSS SRSS_INTR_SET: HVLVD1 (Bit 1) */ +#define SRSS_SRSS_INTR_SET_HVLVD1_Msk (0x2UL) /*!< SRSS SRSS_INTR_SET: HVLVD1 (Bitfield-Mask: 0x01) */ +#define SRSS_SRSS_INTR_SET_CLK_CAL_Pos (5UL) /*!< SRSS SRSS_INTR_SET: CLK_CAL (Bit 5) */ +#define SRSS_SRSS_INTR_SET_CLK_CAL_Msk (0x20UL) /*!< SRSS SRSS_INTR_SET: CLK_CAL (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.SRSS_INTR_MASK ================================================== */ +#define SRSS_SRSS_INTR_MASK_WDT_MATCH_Pos (0UL) /*!< SRSS SRSS_INTR_MASK: WDT_MATCH (Bit 0) */ +#define SRSS_SRSS_INTR_MASK_WDT_MATCH_Msk (0x1UL) /*!< SRSS SRSS_INTR_MASK: WDT_MATCH (Bitfield-Mask: 0x01) */ +#define SRSS_SRSS_INTR_MASK_HVLVD1_Pos (1UL) /*!< SRSS SRSS_INTR_MASK: HVLVD1 (Bit 1) */ +#define SRSS_SRSS_INTR_MASK_HVLVD1_Msk (0x2UL) /*!< SRSS SRSS_INTR_MASK: HVLVD1 (Bitfield-Mask: 0x01) */ +#define SRSS_SRSS_INTR_MASK_CLK_CAL_Pos (5UL) /*!< SRSS SRSS_INTR_MASK: CLK_CAL (Bit 5) */ +#define SRSS_SRSS_INTR_MASK_CLK_CAL_Msk (0x20UL) /*!< SRSS SRSS_INTR_MASK: CLK_CAL (Bitfield-Mask: 0x01) */ +/* ================================================= SRSS.SRSS_INTR_MASKED ================================================= */ +#define SRSS_SRSS_INTR_MASKED_WDT_MATCH_Pos (0UL) /*!< SRSS SRSS_INTR_MASKED: WDT_MATCH (Bit 0) */ +#define SRSS_SRSS_INTR_MASKED_WDT_MATCH_Msk (0x1UL) /*!< SRSS SRSS_INTR_MASKED: WDT_MATCH (Bitfield-Mask: 0x01) */ +#define SRSS_SRSS_INTR_MASKED_HVLVD1_Pos (1UL) /*!< SRSS SRSS_INTR_MASKED: HVLVD1 (Bit 1) */ +#define SRSS_SRSS_INTR_MASKED_HVLVD1_Msk (0x2UL) /*!< SRSS SRSS_INTR_MASKED: HVLVD1 (Bitfield-Mask: 0x01) */ +#define SRSS_SRSS_INTR_MASKED_CLK_CAL_Pos (5UL) /*!< SRSS SRSS_INTR_MASKED: CLK_CAL (Bit 5) */ +#define SRSS_SRSS_INTR_MASKED_CLK_CAL_Msk (0x20UL) /*!< SRSS SRSS_INTR_MASKED: CLK_CAL (Bitfield-Mask: 0x01) */ +/* ================================================== SRSS.SRSS_INTR_CFG =================================================== */ +#define SRSS_SRSS_INTR_CFG_HVLVD1_EDGE_SEL_Pos (0UL) /*!< SRSS SRSS_INTR_CFG: HVLVD1_EDGE_SEL (Bit 0) */ +#define SRSS_SRSS_INTR_CFG_HVLVD1_EDGE_SEL_Msk (0x3UL) /*!< SRSS SRSS_INTR_CFG: HVLVD1_EDGE_SEL (Bitfield-Mask: 0x03) */ +/* ==================================================== SRSS.RES_CAUSE ===================================================== */ +#define SRSS_RES_CAUSE_RESET_WDT_Pos (0UL) /*!< SRSS RES_CAUSE: RESET_WDT (Bit 0) */ +#define SRSS_RES_CAUSE_RESET_WDT_Msk (0x1UL) /*!< SRSS RES_CAUSE: RESET_WDT (Bitfield-Mask: 0x01) */ +#define SRSS_RES_CAUSE_RESET_ACT_FAULT_Pos (1UL) /*!< SRSS RES_CAUSE: RESET_ACT_FAULT (Bit 1) */ +#define SRSS_RES_CAUSE_RESET_ACT_FAULT_Msk (0x2UL) /*!< SRSS RES_CAUSE: RESET_ACT_FAULT (Bitfield-Mask: 0x01) */ +#define SRSS_RES_CAUSE_RESET_DPSLP_FAULT_Pos (2UL) /*!< SRSS RES_CAUSE: RESET_DPSLP_FAULT (Bit 2) */ +#define SRSS_RES_CAUSE_RESET_DPSLP_FAULT_Msk (0x4UL) /*!< SRSS RES_CAUSE: RESET_DPSLP_FAULT (Bitfield-Mask: 0x01) */ +#define SRSS_RES_CAUSE_RESET_CSV_WCO_LOSS_Pos (3UL) /*!< SRSS RES_CAUSE: RESET_CSV_WCO_LOSS (Bit 3) */ +#define SRSS_RES_CAUSE_RESET_CSV_WCO_LOSS_Msk (0x8UL) /*!< SRSS RES_CAUSE: RESET_CSV_WCO_LOSS (Bitfield-Mask: 0x01) */ +#define SRSS_RES_CAUSE_RESET_SOFT_Pos (4UL) /*!< SRSS RES_CAUSE: RESET_SOFT (Bit 4) */ +#define SRSS_RES_CAUSE_RESET_SOFT_Msk (0x10UL) /*!< SRSS RES_CAUSE: RESET_SOFT (Bitfield-Mask: 0x01) */ +#define SRSS_RES_CAUSE_RESET_MCWDT0_Pos (5UL) /*!< SRSS RES_CAUSE: RESET_MCWDT0 (Bit 5) */ +#define SRSS_RES_CAUSE_RESET_MCWDT0_Msk (0x20UL) /*!< SRSS RES_CAUSE: RESET_MCWDT0 (Bitfield-Mask: 0x01) */ +#define SRSS_RES_CAUSE_RESET_MCWDT1_Pos (6UL) /*!< SRSS RES_CAUSE: RESET_MCWDT1 (Bit 6) */ +#define SRSS_RES_CAUSE_RESET_MCWDT1_Msk (0x40UL) /*!< SRSS RES_CAUSE: RESET_MCWDT1 (Bitfield-Mask: 0x01) */ +#define SRSS_RES_CAUSE_RESET_MCWDT2_Pos (7UL) /*!< SRSS RES_CAUSE: RESET_MCWDT2 (Bit 7) */ +#define SRSS_RES_CAUSE_RESET_MCWDT2_Msk (0x80UL) /*!< SRSS RES_CAUSE: RESET_MCWDT2 (Bitfield-Mask: 0x01) */ +#define SRSS_RES_CAUSE_RESET_MCWDT3_Pos (8UL) /*!< SRSS RES_CAUSE: RESET_MCWDT3 (Bit 8) */ +#define SRSS_RES_CAUSE_RESET_MCWDT3_Msk (0x100UL) /*!< SRSS RES_CAUSE: RESET_MCWDT3 (Bitfield-Mask: 0x01) */ +/* ==================================================== SRSS.RES_CAUSE2 ==================================================== */ +#define SRSS_RES_CAUSE2_RESET_CSV_HF_LOSS_Pos (0UL) /*!< SRSS RES_CAUSE2: RESET_CSV_HF_LOSS (Bit 0) */ +#define SRSS_RES_CAUSE2_RESET_CSV_HF_LOSS_Msk (0xffffUL) /*!< SRSS RES_CAUSE2: RESET_CSV_HF_LOSS (Bitfield-Mask: 0xffff)*/ +#define SRSS_RES_CAUSE2_RESET_CSV_HF_FREQ_Pos (16UL) /*!< SRSS RES_CAUSE2: RESET_CSV_HF_FREQ (Bit 16) */ +#define SRSS_RES_CAUSE2_RESET_CSV_HF_FREQ_Msk (0xffff0000UL) /*!< SRSS RES_CAUSE2: RESET_CSV_HF_FREQ (Bitfield-Mask: 0xffff)*/ +/* ================================================= SRSS.PWR_TRIM_REF_CTL ================================================= */ +#define SRSS_PWR_TRIM_REF_CTL_ACT_REF_TCTRIM_Pos (0UL) /*!< SRSS PWR_TRIM_REF_CTL: ACT_REF_TCTRIM (Bit 0) */ +#define SRSS_PWR_TRIM_REF_CTL_ACT_REF_TCTRIM_Msk (0xfUL) /*!< SRSS PWR_TRIM_REF_CTL: ACT_REF_TCTRIM (Bitfield-Mask: 0x0f)*/ +#define SRSS_PWR_TRIM_REF_CTL_ACT_REF_ITRIM_Pos (4UL) /*!< SRSS PWR_TRIM_REF_CTL: ACT_REF_ITRIM (Bit 4) */ +#define SRSS_PWR_TRIM_REF_CTL_ACT_REF_ITRIM_Msk (0xf0UL) /*!< SRSS PWR_TRIM_REF_CTL: ACT_REF_ITRIM (Bitfield-Mask: 0x0f)*/ +#define SRSS_PWR_TRIM_REF_CTL_ACT_REF_ABSTRIM_Pos (8UL) /*!< SRSS PWR_TRIM_REF_CTL: ACT_REF_ABSTRIM (Bit 8) */ +#define SRSS_PWR_TRIM_REF_CTL_ACT_REF_ABSTRIM_Msk (0x1f00UL) /*!< SRSS PWR_TRIM_REF_CTL: ACT_REF_ABSTRIM (Bitfield-Mask: 0x1f)*/ +#define SRSS_PWR_TRIM_REF_CTL_ACT_REF_IBOOST_Pos (14UL) /*!< SRSS PWR_TRIM_REF_CTL: ACT_REF_IBOOST (Bit 14) */ +#define SRSS_PWR_TRIM_REF_CTL_ACT_REF_IBOOST_Msk (0x4000UL) /*!< SRSS PWR_TRIM_REF_CTL: ACT_REF_IBOOST (Bitfield-Mask: 0x01)*/ +#define SRSS_PWR_TRIM_REF_CTL_DPSLP_REF_TCTRIM_Pos (16UL) /*!< SRSS PWR_TRIM_REF_CTL: DPSLP_REF_TCTRIM (Bit 16) */ +#define SRSS_PWR_TRIM_REF_CTL_DPSLP_REF_TCTRIM_Msk (0xf0000UL) /*!< SRSS PWR_TRIM_REF_CTL: DPSLP_REF_TCTRIM (Bitfield-Mask: 0x0f)*/ +#define SRSS_PWR_TRIM_REF_CTL_DPSLP_REF_ABSTRIM_Pos (20UL) /*!< SRSS PWR_TRIM_REF_CTL: DPSLP_REF_ABSTRIM (Bit 20) */ +#define SRSS_PWR_TRIM_REF_CTL_DPSLP_REF_ABSTRIM_Msk (0x1f00000UL) /*!< SRSS PWR_TRIM_REF_CTL: DPSLP_REF_ABSTRIM (Bitfield-Mask: 0x1f)*/ +#define SRSS_PWR_TRIM_REF_CTL_DPSLP_REF_ITRIM_Pos (28UL) /*!< SRSS PWR_TRIM_REF_CTL: DPSLP_REF_ITRIM (Bit 28) */ +#define SRSS_PWR_TRIM_REF_CTL_DPSLP_REF_ITRIM_Msk (0xf0000000UL) /*!< SRSS PWR_TRIM_REF_CTL: DPSLP_REF_ITRIM (Bitfield-Mask: 0x0f)*/ +/* =============================================== SRSS.PWR_TRIM_BODOVP_CTL ================================================ */ +#define SRSS_PWR_TRIM_BODOVP_CTL_HVPORBOD_TRIPSEL_Pos (0UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: HVPORBOD_TRIPSEL (Bit 0) */ +#define SRSS_PWR_TRIM_BODOVP_CTL_HVPORBOD_TRIPSEL_Msk (0x7UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: HVPORBOD_TRIPSEL (Bitfield-Mask: 0x07)*/ +#define SRSS_PWR_TRIM_BODOVP_CTL_HVPORBOD_OFSTRIM_Pos (4UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: HVPORBOD_OFSTRIM (Bit 4) */ +#define SRSS_PWR_TRIM_BODOVP_CTL_HVPORBOD_OFSTRIM_Msk (0x70UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: HVPORBOD_OFSTRIM (Bitfield-Mask: 0x07)*/ +#define SRSS_PWR_TRIM_BODOVP_CTL_HVPORBOD_ITRIM_Pos (7UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: HVPORBOD_ITRIM (Bit 7) */ +#define SRSS_PWR_TRIM_BODOVP_CTL_HVPORBOD_ITRIM_Msk (0x380UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: HVPORBOD_ITRIM (Bitfield-Mask: 0x07)*/ +#define SRSS_PWR_TRIM_BODOVP_CTL_LVPORBOD_TRIPSEL_Pos (10UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: LVPORBOD_TRIPSEL (Bit 10) */ +#define SRSS_PWR_TRIM_BODOVP_CTL_LVPORBOD_TRIPSEL_Msk (0x1c00UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: LVPORBOD_TRIPSEL (Bitfield-Mask: 0x07)*/ +#define SRSS_PWR_TRIM_BODOVP_CTL_LVPORBOD_OFSTRIM_Pos (14UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: LVPORBOD_OFSTRIM (Bit 14) */ +#define SRSS_PWR_TRIM_BODOVP_CTL_LVPORBOD_OFSTRIM_Msk (0x1c000UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: LVPORBOD_OFSTRIM (Bitfield-Mask: 0x07)*/ +#define SRSS_PWR_TRIM_BODOVP_CTL_LVPORBOD_ITRIM_Pos (17UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: LVPORBOD_ITRIM (Bit 17) */ +#define SRSS_PWR_TRIM_BODOVP_CTL_LVPORBOD_ITRIM_Msk (0xe0000UL) /*!< SRSS PWR_TRIM_BODOVP_CTL: LVPORBOD_ITRIM (Bitfield-Mask: 0x07)*/ +/* ================================================= SRSS.CLK_TRIM_CCO_CTL ================================================= */ +#define SRSS_CLK_TRIM_CCO_CTL_CCO_RCSTRIM_Pos (0UL) /*!< SRSS CLK_TRIM_CCO_CTL: CCO_RCSTRIM (Bit 0) */ +#define SRSS_CLK_TRIM_CCO_CTL_CCO_RCSTRIM_Msk (0x3fUL) /*!< SRSS CLK_TRIM_CCO_CTL: CCO_RCSTRIM (Bitfield-Mask: 0x3f) */ +#define SRSS_CLK_TRIM_CCO_CTL_CCO_STABLE_CNT_Pos (24UL) /*!< SRSS CLK_TRIM_CCO_CTL: CCO_STABLE_CNT (Bit 24) */ +#define SRSS_CLK_TRIM_CCO_CTL_CCO_STABLE_CNT_Msk (0x3f000000UL) /*!< SRSS CLK_TRIM_CCO_CTL: CCO_STABLE_CNT (Bitfield-Mask: 0x3f)*/ +#define SRSS_CLK_TRIM_CCO_CTL_ENABLE_CNT_Pos (31UL) /*!< SRSS CLK_TRIM_CCO_CTL: ENABLE_CNT (Bit 31) */ +#define SRSS_CLK_TRIM_CCO_CTL_ENABLE_CNT_Msk (0x80000000UL) /*!< SRSS CLK_TRIM_CCO_CTL: ENABLE_CNT (Bitfield-Mask: 0x01) */ +/* ================================================ SRSS.CLK_TRIM_CCO_CTL2 ================================================= */ +#define SRSS_CLK_TRIM_CCO_CTL2_CCO_FCTRIM1_Pos (0UL) /*!< SRSS CLK_TRIM_CCO_CTL2: CCO_FCTRIM1 (Bit 0) */ +#define SRSS_CLK_TRIM_CCO_CTL2_CCO_FCTRIM1_Msk (0x1fUL) /*!< SRSS CLK_TRIM_CCO_CTL2: CCO_FCTRIM1 (Bitfield-Mask: 0x1f) */ +#define SRSS_CLK_TRIM_CCO_CTL2_CCO_FCTRIM2_Pos (5UL) /*!< SRSS CLK_TRIM_CCO_CTL2: CCO_FCTRIM2 (Bit 5) */ +#define SRSS_CLK_TRIM_CCO_CTL2_CCO_FCTRIM2_Msk (0x3e0UL) /*!< SRSS CLK_TRIM_CCO_CTL2: CCO_FCTRIM2 (Bitfield-Mask: 0x1f) */ +#define SRSS_CLK_TRIM_CCO_CTL2_CCO_FCTRIM3_Pos (10UL) /*!< SRSS CLK_TRIM_CCO_CTL2: CCO_FCTRIM3 (Bit 10) */ +#define SRSS_CLK_TRIM_CCO_CTL2_CCO_FCTRIM3_Msk (0x7c00UL) /*!< SRSS CLK_TRIM_CCO_CTL2: CCO_FCTRIM3 (Bitfield-Mask: 0x1f) */ +#define SRSS_CLK_TRIM_CCO_CTL2_CCO_FCTRIM4_Pos (15UL) /*!< SRSS CLK_TRIM_CCO_CTL2: CCO_FCTRIM4 (Bit 15) */ +#define SRSS_CLK_TRIM_CCO_CTL2_CCO_FCTRIM4_Msk (0xf8000UL) /*!< SRSS CLK_TRIM_CCO_CTL2: CCO_FCTRIM4 (Bitfield-Mask: 0x1f) */ +#define SRSS_CLK_TRIM_CCO_CTL2_CCO_FCTRIM5_Pos (20UL) /*!< SRSS CLK_TRIM_CCO_CTL2: CCO_FCTRIM5 (Bit 20) */ +#define SRSS_CLK_TRIM_CCO_CTL2_CCO_FCTRIM5_Msk (0x1f00000UL) /*!< SRSS CLK_TRIM_CCO_CTL2: CCO_FCTRIM5 (Bitfield-Mask: 0x1f) */ +/* ================================================ SRSS.PWR_TRIM_WAKE_CTL ================================================= */ +#define SRSS_PWR_TRIM_WAKE_CTL_WAKE_DELAY_Pos (0UL) /*!< SRSS PWR_TRIM_WAKE_CTL: WAKE_DELAY (Bit 0) */ +#define SRSS_PWR_TRIM_WAKE_CTL_WAKE_DELAY_Msk (0xffUL) /*!< SRSS PWR_TRIM_WAKE_CTL: WAKE_DELAY (Bitfield-Mask: 0xff) */ +/* ================================================= SRSS.PWR_TRIM_LVD_CTL ================================================= */ +#define SRSS_PWR_TRIM_LVD_CTL_HVLVD1_OFSTRIM_Pos (0UL) /*!< SRSS PWR_TRIM_LVD_CTL: HVLVD1_OFSTRIM (Bit 0) */ +#define SRSS_PWR_TRIM_LVD_CTL_HVLVD1_OFSTRIM_Msk (0x7UL) /*!< SRSS PWR_TRIM_LVD_CTL: HVLVD1_OFSTRIM (Bitfield-Mask: 0x07)*/ +#define SRSS_PWR_TRIM_LVD_CTL_HVLVD1_ITRIM_Pos (4UL) /*!< SRSS PWR_TRIM_LVD_CTL: HVLVD1_ITRIM (Bit 4) */ +#define SRSS_PWR_TRIM_LVD_CTL_HVLVD1_ITRIM_Msk (0x70UL) /*!< SRSS PWR_TRIM_LVD_CTL: HVLVD1_ITRIM (Bitfield-Mask: 0x07) */ +/* ================================================= SRSS.CLK_TRIM_ILO_CTL ================================================= */ +#define SRSS_CLK_TRIM_ILO_CTL_ILO_FTRIM_Pos (0UL) /*!< SRSS CLK_TRIM_ILO_CTL: ILO_FTRIM (Bit 0) */ +#define SRSS_CLK_TRIM_ILO_CTL_ILO_FTRIM_Msk (0x3fUL) /*!< SRSS CLK_TRIM_ILO_CTL: ILO_FTRIM (Bitfield-Mask: 0x3f) */ +/* =============================================== SRSS.PWR_TRIM_PWRSYS_CTL ================================================ */ +#define SRSS_PWR_TRIM_PWRSYS_CTL_ACT_REG_TRIM_Pos (0UL) /*!< SRSS PWR_TRIM_PWRSYS_CTL: ACT_REG_TRIM (Bit 0) */ +#define SRSS_PWR_TRIM_PWRSYS_CTL_ACT_REG_TRIM_Msk (0x1fUL) /*!< SRSS PWR_TRIM_PWRSYS_CTL: ACT_REG_TRIM (Bitfield-Mask: 0x1f)*/ +#define SRSS_PWR_TRIM_PWRSYS_CTL_ACT_REG_BOOST_Pos (30UL) /*!< SRSS PWR_TRIM_PWRSYS_CTL: ACT_REG_BOOST (Bit 30) */ +#define SRSS_PWR_TRIM_PWRSYS_CTL_ACT_REG_BOOST_Msk (0xc0000000UL) /*!< SRSS PWR_TRIM_PWRSYS_CTL: ACT_REG_BOOST (Bitfield-Mask: 0x03)*/ +/* ================================================= SRSS.CLK_TRIM_ECO_CTL ================================================= */ +#define SRSS_CLK_TRIM_ECO_CTL_WDTRIM_Pos (0UL) /*!< SRSS CLK_TRIM_ECO_CTL: WDTRIM (Bit 0) */ +#define SRSS_CLK_TRIM_ECO_CTL_WDTRIM_Msk (0x7UL) /*!< SRSS CLK_TRIM_ECO_CTL: WDTRIM (Bitfield-Mask: 0x07) */ +#define SRSS_CLK_TRIM_ECO_CTL_ATRIM_Pos (4UL) /*!< SRSS CLK_TRIM_ECO_CTL: ATRIM (Bit 4) */ +#define SRSS_CLK_TRIM_ECO_CTL_ATRIM_Msk (0xf0UL) /*!< SRSS CLK_TRIM_ECO_CTL: ATRIM (Bitfield-Mask: 0x0f) */ +#define SRSS_CLK_TRIM_ECO_CTL_FTRIM_Pos (8UL) /*!< SRSS CLK_TRIM_ECO_CTL: FTRIM (Bit 8) */ +#define SRSS_CLK_TRIM_ECO_CTL_FTRIM_Msk (0x300UL) /*!< SRSS CLK_TRIM_ECO_CTL: FTRIM (Bitfield-Mask: 0x03) */ +#define SRSS_CLK_TRIM_ECO_CTL_RTRIM_Pos (10UL) /*!< SRSS CLK_TRIM_ECO_CTL: RTRIM (Bit 10) */ +#define SRSS_CLK_TRIM_ECO_CTL_RTRIM_Msk (0xc00UL) /*!< SRSS CLK_TRIM_ECO_CTL: RTRIM (Bitfield-Mask: 0x03) */ +#define SRSS_CLK_TRIM_ECO_CTL_GTRIM_Pos (12UL) /*!< SRSS CLK_TRIM_ECO_CTL: GTRIM (Bit 12) */ +#define SRSS_CLK_TRIM_ECO_CTL_GTRIM_Msk (0x3000UL) /*!< SRSS CLK_TRIM_ECO_CTL: GTRIM (Bitfield-Mask: 0x03) */ +#define SRSS_CLK_TRIM_ECO_CTL_ITRIM_Pos (16UL) /*!< SRSS CLK_TRIM_ECO_CTL: ITRIM (Bit 16) */ +#define SRSS_CLK_TRIM_ECO_CTL_ITRIM_Msk (0x3f0000UL) /*!< SRSS CLK_TRIM_ECO_CTL: ITRIM (Bitfield-Mask: 0x3f) */ +/* ================================================ SRSS.CLK_TRIM_PILO_CTL ================================================= */ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_CFREQ_Pos (0UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_CFREQ (Bit 0) */ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_CFREQ_Msk (0x3fUL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_CFREQ (Bitfield-Mask: 0x3f) */ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_OSC_TRIM_Pos (12UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_OSC_TRIM (Bit 12) */ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_OSC_TRIM_Msk (0x7000UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_OSC_TRIM (Bitfield-Mask: 0x07)*/ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_COMP_TRIM_Pos (16UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_COMP_TRIM (Bit 16) */ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_COMP_TRIM_Msk (0x30000UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_COMP_TRIM (Bitfield-Mask: 0x03)*/ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_NBIAS_TRIM_Pos (18UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_NBIAS_TRIM (Bit 18) */ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_NBIAS_TRIM_Msk (0xc0000UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_NBIAS_TRIM (Bitfield-Mask: 0x03)*/ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_RES_TRIM_Pos (20UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_RES_TRIM (Bit 20) */ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_RES_TRIM_Msk (0x1f00000UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_RES_TRIM (Bitfield-Mask: 0x1f)*/ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_ISLOPE_TRIM_Pos (26UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_ISLOPE_TRIM (Bit 26) */ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_ISLOPE_TRIM_Msk (0xc000000UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_ISLOPE_TRIM (Bitfield-Mask: 0x03)*/ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_VTDIFF_TRIM_Pos (28UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_VTDIFF_TRIM (Bit 28) */ +#define SRSS_CLK_TRIM_PILO_CTL_PILO_VTDIFF_TRIM_Msk (0x70000000UL) /*!< SRSS CLK_TRIM_PILO_CTL: PILO_VTDIFF_TRIM (Bitfield-Mask: 0x07)*/ +/* ================================================ SRSS.CLK_TRIM_PILO_CTL2 ================================================ */ +#define SRSS_CLK_TRIM_PILO_CTL2_PILO_VREF_TRIM_Pos (0UL) /*!< SRSS CLK_TRIM_PILO_CTL2: PILO_VREF_TRIM (Bit 0) */ +#define SRSS_CLK_TRIM_PILO_CTL2_PILO_VREF_TRIM_Msk (0xffUL) /*!< SRSS CLK_TRIM_PILO_CTL2: PILO_VREF_TRIM (Bitfield-Mask: 0xff)*/ +#define SRSS_CLK_TRIM_PILO_CTL2_PILO_IREFBM_TRIM_Pos (8UL) /*!< SRSS CLK_TRIM_PILO_CTL2: PILO_IREFBM_TRIM (Bit 8) */ +#define SRSS_CLK_TRIM_PILO_CTL2_PILO_IREFBM_TRIM_Msk (0x1f00UL) /*!< SRSS CLK_TRIM_PILO_CTL2: PILO_IREFBM_TRIM (Bitfield-Mask: 0x1f)*/ +#define SRSS_CLK_TRIM_PILO_CTL2_PILO_IREF_TRIM_Pos (16UL) /*!< SRSS CLK_TRIM_PILO_CTL2: PILO_IREF_TRIM (Bit 16) */ +#define SRSS_CLK_TRIM_PILO_CTL2_PILO_IREF_TRIM_Msk (0xff0000UL) /*!< SRSS CLK_TRIM_PILO_CTL2: PILO_IREF_TRIM (Bitfield-Mask: 0xff)*/ +/* ================================================ SRSS.CLK_TRIM_PILO_CTL3 ================================================ */ +#define SRSS_CLK_TRIM_PILO_CTL3_PILO_ENGOPT_Pos (0UL) /*!< SRSS CLK_TRIM_PILO_CTL3: PILO_ENGOPT (Bit 0) */ +#define SRSS_CLK_TRIM_PILO_CTL3_PILO_ENGOPT_Msk (0xffffUL) /*!< SRSS CLK_TRIM_PILO_CTL3: PILO_ENGOPT (Bitfield-Mask: 0xffff)*/ + + +#endif /* _CYIP_SRSS_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_tcpwm.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_tcpwm.h new file mode 100644 index 0000000000..72a3c48110 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_tcpwm.h @@ -0,0 +1,191 @@ +/***************************************************************************//** +* \file cyip_tcpwm.h +* +* \brief +* TCPWM IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_TCPWM_H_ +#define _CYIP_TCPWM_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ TCPWM ================ */ +/* =========================================================================================================================== */ + +#define TCPWM_CNT_SECTION_SIZE 0x00000040UL +#define TCPWM_SECTION_SIZE 0x00010000UL + +/** + * \brief Timer/Counter/PWM Counter Module (TCPWM_CNT) + */ +typedef struct { + __IOM uint32_t CTRL; /*!< 0x00000000 Counter control register */ + __IM uint32_t STATUS; /*!< 0x00000004 Counter status register */ + __IOM uint32_t COUNTER; /*!< 0x00000008 Counter count register */ + __IOM uint32_t CC; /*!< 0x0000000C Counter compare/capture register */ + __IOM uint32_t CC_BUFF; /*!< 0x00000010 Counter buffered compare/capture register */ + __IOM uint32_t PERIOD; /*!< 0x00000014 Counter period register */ + __IOM uint32_t PERIOD_BUFF; /*!< 0x00000018 Counter buffered period register */ + __IM uint32_t RESERVED; + __IOM uint32_t TR_CTRL0; /*!< 0x00000020 Counter trigger control register 0 */ + __IOM uint32_t TR_CTRL1; /*!< 0x00000024 Counter trigger control register 1 */ + __IOM uint32_t TR_CTRL2; /*!< 0x00000028 Counter trigger control register 2 */ + __IM uint32_t RESERVED1; + __IOM uint32_t INTR; /*!< 0x00000030 Interrupt request register */ + __IOM uint32_t INTR_SET; /*!< 0x00000034 Interrupt set request register */ + __IOM uint32_t INTR_MASK; /*!< 0x00000038 Interrupt mask register */ + __IM uint32_t INTR_MASKED; /*!< 0x0000003C Interrupt masked request register */ +} TCPWM_CNT_Type; /*!< Size = 64 (0x40) */ + +/** + * \brief Timer/Counter/PWM (TCPWM) + */ +typedef struct { /*!< TCPWM Structure */ + __IOM uint32_t CTRL; /*!< 0x00000000 TCPWM control register */ + __IOM uint32_t CTRL_CLR; /*!< 0x00000004 TCPWM control clear register */ + __IOM uint32_t CTRL_SET; /*!< 0x00000008 TCPWM control set register */ + __IOM uint32_t CMD_CAPTURE; /*!< 0x0000000C TCPWM capture command register */ + __IOM uint32_t CMD_RELOAD; /*!< 0x00000010 TCPWM reload command register */ + __IOM uint32_t CMD_STOP; /*!< 0x00000014 TCPWM stop command register */ + __IOM uint32_t CMD_START; /*!< 0x00000018 TCPWM start command register */ + __IM uint32_t INTR_CAUSE; /*!< 0x0000001C TCPWM Counter interrupt cause register */ + __IM uint32_t RESERVED[56]; + TCPWM_CNT_Type CNT[32]; /*!< 0x00000100 Timer/Counter/PWM Counter Module */ +} TCPWM_Type; /*!< Size = 2304 (0x900) */ + + +/* ==================================================== TCPWM_CNT.CTRL ===================================================== */ +#define TCPWM_CNT_CTRL_AUTO_RELOAD_CC_Pos (0UL) /*!< TCPWM_CNT CTRL: AUTO_RELOAD_CC (Bit 0) */ +#define TCPWM_CNT_CTRL_AUTO_RELOAD_CC_Msk (0x1UL) /*!< TCPWM_CNT CTRL: AUTO_RELOAD_CC (Bitfield-Mask: 0x01) */ +#define TCPWM_CNT_CTRL_AUTO_RELOAD_PERIOD_Pos (1UL) /*!< TCPWM_CNT CTRL: AUTO_RELOAD_PERIOD (Bit 1) */ +#define TCPWM_CNT_CTRL_AUTO_RELOAD_PERIOD_Msk (0x2UL) /*!< TCPWM_CNT CTRL: AUTO_RELOAD_PERIOD (Bitfield-Mask: 0x01) */ +#define TCPWM_CNT_CTRL_PWM_SYNC_KILL_Pos (2UL) /*!< TCPWM_CNT CTRL: PWM_SYNC_KILL (Bit 2) */ +#define TCPWM_CNT_CTRL_PWM_SYNC_KILL_Msk (0x4UL) /*!< TCPWM_CNT CTRL: PWM_SYNC_KILL (Bitfield-Mask: 0x01) */ +#define TCPWM_CNT_CTRL_PWM_STOP_ON_KILL_Pos (3UL) /*!< TCPWM_CNT CTRL: PWM_STOP_ON_KILL (Bit 3) */ +#define TCPWM_CNT_CTRL_PWM_STOP_ON_KILL_Msk (0x8UL) /*!< TCPWM_CNT CTRL: PWM_STOP_ON_KILL (Bitfield-Mask: 0x01) */ +#define TCPWM_CNT_CTRL_GENERIC_Pos (8UL) /*!< TCPWM_CNT CTRL: GENERIC (Bit 8) */ +#define TCPWM_CNT_CTRL_GENERIC_Msk (0xff00UL) /*!< TCPWM_CNT CTRL: GENERIC (Bitfield-Mask: 0xff) */ +#define TCPWM_CNT_CTRL_UP_DOWN_MODE_Pos (16UL) /*!< TCPWM_CNT CTRL: UP_DOWN_MODE (Bit 16) */ +#define TCPWM_CNT_CTRL_UP_DOWN_MODE_Msk (0x30000UL) /*!< TCPWM_CNT CTRL: UP_DOWN_MODE (Bitfield-Mask: 0x03) */ +#define TCPWM_CNT_CTRL_ONE_SHOT_Pos (18UL) /*!< TCPWM_CNT CTRL: ONE_SHOT (Bit 18) */ +#define TCPWM_CNT_CTRL_ONE_SHOT_Msk (0x40000UL) /*!< TCPWM_CNT CTRL: ONE_SHOT (Bitfield-Mask: 0x01) */ +#define TCPWM_CNT_CTRL_QUADRATURE_MODE_Pos (20UL) /*!< TCPWM_CNT CTRL: QUADRATURE_MODE (Bit 20) */ +#define TCPWM_CNT_CTRL_QUADRATURE_MODE_Msk (0x300000UL) /*!< TCPWM_CNT CTRL: QUADRATURE_MODE (Bitfield-Mask: 0x03) */ +#define TCPWM_CNT_CTRL_MODE_Pos (24UL) /*!< TCPWM_CNT CTRL: MODE (Bit 24) */ +#define TCPWM_CNT_CTRL_MODE_Msk (0x7000000UL) /*!< TCPWM_CNT CTRL: MODE (Bitfield-Mask: 0x07) */ +/* =================================================== TCPWM_CNT.STATUS ==================================================== */ +#define TCPWM_CNT_STATUS_DOWN_Pos (0UL) /*!< TCPWM_CNT STATUS: DOWN (Bit 0) */ +#define TCPWM_CNT_STATUS_DOWN_Msk (0x1UL) /*!< TCPWM_CNT STATUS: DOWN (Bitfield-Mask: 0x01) */ +#define TCPWM_CNT_STATUS_GENERIC_Pos (8UL) /*!< TCPWM_CNT STATUS: GENERIC (Bit 8) */ +#define TCPWM_CNT_STATUS_GENERIC_Msk (0xff00UL) /*!< TCPWM_CNT STATUS: GENERIC (Bitfield-Mask: 0xff) */ +#define TCPWM_CNT_STATUS_RUNNING_Pos (31UL) /*!< TCPWM_CNT STATUS: RUNNING (Bit 31) */ +#define TCPWM_CNT_STATUS_RUNNING_Msk (0x80000000UL) /*!< TCPWM_CNT STATUS: RUNNING (Bitfield-Mask: 0x01) */ +/* =================================================== TCPWM_CNT.COUNTER =================================================== */ +#define TCPWM_CNT_COUNTER_COUNTER_Pos (0UL) /*!< TCPWM_CNT COUNTER: COUNTER (Bit 0) */ +#define TCPWM_CNT_COUNTER_COUNTER_Msk (0xffffffffUL) /*!< TCPWM_CNT COUNTER: COUNTER (Bitfield-Mask: 0xffffffff) */ +/* ===================================================== TCPWM_CNT.CC ====================================================== */ +#define TCPWM_CNT_CC_CC_Pos (0UL) /*!< TCPWM_CNT CC: CC (Bit 0) */ +#define TCPWM_CNT_CC_CC_Msk (0xffffffffUL) /*!< TCPWM_CNT CC: CC (Bitfield-Mask: 0xffffffff) */ +/* =================================================== TCPWM_CNT.CC_BUFF =================================================== */ +#define TCPWM_CNT_CC_BUFF_CC_Pos (0UL) /*!< TCPWM_CNT CC_BUFF: CC (Bit 0) */ +#define TCPWM_CNT_CC_BUFF_CC_Msk (0xffffffffUL) /*!< TCPWM_CNT CC_BUFF: CC (Bitfield-Mask: 0xffffffff) */ +/* =================================================== TCPWM_CNT.PERIOD ==================================================== */ +#define TCPWM_CNT_PERIOD_PERIOD_Pos (0UL) /*!< TCPWM_CNT PERIOD: PERIOD (Bit 0) */ +#define TCPWM_CNT_PERIOD_PERIOD_Msk (0xffffffffUL) /*!< TCPWM_CNT PERIOD: PERIOD (Bitfield-Mask: 0xffffffff) */ +/* ================================================= TCPWM_CNT.PERIOD_BUFF ================================================= */ +#define TCPWM_CNT_PERIOD_BUFF_PERIOD_Pos (0UL) /*!< TCPWM_CNT PERIOD_BUFF: PERIOD (Bit 0) */ +#define TCPWM_CNT_PERIOD_BUFF_PERIOD_Msk (0xffffffffUL) /*!< TCPWM_CNT PERIOD_BUFF: PERIOD (Bitfield-Mask: 0xffffffff) */ +/* ================================================== TCPWM_CNT.TR_CTRL0 =================================================== */ +#define TCPWM_CNT_TR_CTRL0_CAPTURE_SEL_Pos (0UL) /*!< TCPWM_CNT TR_CTRL0: CAPTURE_SEL (Bit 0) */ +#define TCPWM_CNT_TR_CTRL0_CAPTURE_SEL_Msk (0xfUL) /*!< TCPWM_CNT TR_CTRL0: CAPTURE_SEL (Bitfield-Mask: 0x0f) */ +#define TCPWM_CNT_TR_CTRL0_COUNT_SEL_Pos (4UL) /*!< TCPWM_CNT TR_CTRL0: COUNT_SEL (Bit 4) */ +#define TCPWM_CNT_TR_CTRL0_COUNT_SEL_Msk (0xf0UL) /*!< TCPWM_CNT TR_CTRL0: COUNT_SEL (Bitfield-Mask: 0x0f) */ +#define TCPWM_CNT_TR_CTRL0_RELOAD_SEL_Pos (8UL) /*!< TCPWM_CNT TR_CTRL0: RELOAD_SEL (Bit 8) */ +#define TCPWM_CNT_TR_CTRL0_RELOAD_SEL_Msk (0xf00UL) /*!< TCPWM_CNT TR_CTRL0: RELOAD_SEL (Bitfield-Mask: 0x0f) */ +#define TCPWM_CNT_TR_CTRL0_STOP_SEL_Pos (12UL) /*!< TCPWM_CNT TR_CTRL0: STOP_SEL (Bit 12) */ +#define TCPWM_CNT_TR_CTRL0_STOP_SEL_Msk (0xf000UL) /*!< TCPWM_CNT TR_CTRL0: STOP_SEL (Bitfield-Mask: 0x0f) */ +#define TCPWM_CNT_TR_CTRL0_START_SEL_Pos (16UL) /*!< TCPWM_CNT TR_CTRL0: START_SEL (Bit 16) */ +#define TCPWM_CNT_TR_CTRL0_START_SEL_Msk (0xf0000UL) /*!< TCPWM_CNT TR_CTRL0: START_SEL (Bitfield-Mask: 0x0f) */ +/* ================================================== TCPWM_CNT.TR_CTRL1 =================================================== */ +#define TCPWM_CNT_TR_CTRL1_CAPTURE_EDGE_Pos (0UL) /*!< TCPWM_CNT TR_CTRL1: CAPTURE_EDGE (Bit 0) */ +#define TCPWM_CNT_TR_CTRL1_CAPTURE_EDGE_Msk (0x3UL) /*!< TCPWM_CNT TR_CTRL1: CAPTURE_EDGE (Bitfield-Mask: 0x03) */ +#define TCPWM_CNT_TR_CTRL1_COUNT_EDGE_Pos (2UL) /*!< TCPWM_CNT TR_CTRL1: COUNT_EDGE (Bit 2) */ +#define TCPWM_CNT_TR_CTRL1_COUNT_EDGE_Msk (0xcUL) /*!< TCPWM_CNT TR_CTRL1: COUNT_EDGE (Bitfield-Mask: 0x03) */ +#define TCPWM_CNT_TR_CTRL1_RELOAD_EDGE_Pos (4UL) /*!< TCPWM_CNT TR_CTRL1: RELOAD_EDGE (Bit 4) */ +#define TCPWM_CNT_TR_CTRL1_RELOAD_EDGE_Msk (0x30UL) /*!< TCPWM_CNT TR_CTRL1: RELOAD_EDGE (Bitfield-Mask: 0x03) */ +#define TCPWM_CNT_TR_CTRL1_STOP_EDGE_Pos (6UL) /*!< TCPWM_CNT TR_CTRL1: STOP_EDGE (Bit 6) */ +#define TCPWM_CNT_TR_CTRL1_STOP_EDGE_Msk (0xc0UL) /*!< TCPWM_CNT TR_CTRL1: STOP_EDGE (Bitfield-Mask: 0x03) */ +#define TCPWM_CNT_TR_CTRL1_START_EDGE_Pos (8UL) /*!< TCPWM_CNT TR_CTRL1: START_EDGE (Bit 8) */ +#define TCPWM_CNT_TR_CTRL1_START_EDGE_Msk (0x300UL) /*!< TCPWM_CNT TR_CTRL1: START_EDGE (Bitfield-Mask: 0x03) */ +/* ================================================== TCPWM_CNT.TR_CTRL2 =================================================== */ +#define TCPWM_CNT_TR_CTRL2_CC_MATCH_MODE_Pos (0UL) /*!< TCPWM_CNT TR_CTRL2: CC_MATCH_MODE (Bit 0) */ +#define TCPWM_CNT_TR_CTRL2_CC_MATCH_MODE_Msk (0x3UL) /*!< TCPWM_CNT TR_CTRL2: CC_MATCH_MODE (Bitfield-Mask: 0x03) */ +#define TCPWM_CNT_TR_CTRL2_OVERFLOW_MODE_Pos (2UL) /*!< TCPWM_CNT TR_CTRL2: OVERFLOW_MODE (Bit 2) */ +#define TCPWM_CNT_TR_CTRL2_OVERFLOW_MODE_Msk (0xcUL) /*!< TCPWM_CNT TR_CTRL2: OVERFLOW_MODE (Bitfield-Mask: 0x03) */ +#define TCPWM_CNT_TR_CTRL2_UNDERFLOW_MODE_Pos (4UL) /*!< TCPWM_CNT TR_CTRL2: UNDERFLOW_MODE (Bit 4) */ +#define TCPWM_CNT_TR_CTRL2_UNDERFLOW_MODE_Msk (0x30UL) /*!< TCPWM_CNT TR_CTRL2: UNDERFLOW_MODE (Bitfield-Mask: 0x03) */ +/* ==================================================== TCPWM_CNT.INTR ===================================================== */ +#define TCPWM_CNT_INTR_TC_Pos (0UL) /*!< TCPWM_CNT INTR: TC (Bit 0) */ +#define TCPWM_CNT_INTR_TC_Msk (0x1UL) /*!< TCPWM_CNT INTR: TC (Bitfield-Mask: 0x01) */ +#define TCPWM_CNT_INTR_CC_MATCH_Pos (1UL) /*!< TCPWM_CNT INTR: CC_MATCH (Bit 1) */ +#define TCPWM_CNT_INTR_CC_MATCH_Msk (0x2UL) /*!< TCPWM_CNT INTR: CC_MATCH (Bitfield-Mask: 0x01) */ +/* ================================================== TCPWM_CNT.INTR_SET =================================================== */ +#define TCPWM_CNT_INTR_SET_TC_Pos (0UL) /*!< TCPWM_CNT INTR_SET: TC (Bit 0) */ +#define TCPWM_CNT_INTR_SET_TC_Msk (0x1UL) /*!< TCPWM_CNT INTR_SET: TC (Bitfield-Mask: 0x01) */ +#define TCPWM_CNT_INTR_SET_CC_MATCH_Pos (1UL) /*!< TCPWM_CNT INTR_SET: CC_MATCH (Bit 1) */ +#define TCPWM_CNT_INTR_SET_CC_MATCH_Msk (0x2UL) /*!< TCPWM_CNT INTR_SET: CC_MATCH (Bitfield-Mask: 0x01) */ +/* ================================================== TCPWM_CNT.INTR_MASK ================================================== */ +#define TCPWM_CNT_INTR_MASK_TC_Pos (0UL) /*!< TCPWM_CNT INTR_MASK: TC (Bit 0) */ +#define TCPWM_CNT_INTR_MASK_TC_Msk (0x1UL) /*!< TCPWM_CNT INTR_MASK: TC (Bitfield-Mask: 0x01) */ +#define TCPWM_CNT_INTR_MASK_CC_MATCH_Pos (1UL) /*!< TCPWM_CNT INTR_MASK: CC_MATCH (Bit 1) */ +#define TCPWM_CNT_INTR_MASK_CC_MATCH_Msk (0x2UL) /*!< TCPWM_CNT INTR_MASK: CC_MATCH (Bitfield-Mask: 0x01) */ +/* ================================================= TCPWM_CNT.INTR_MASKED ================================================= */ +#define TCPWM_CNT_INTR_MASKED_TC_Pos (0UL) /*!< TCPWM_CNT INTR_MASKED: TC (Bit 0) */ +#define TCPWM_CNT_INTR_MASKED_TC_Msk (0x1UL) /*!< TCPWM_CNT INTR_MASKED: TC (Bitfield-Mask: 0x01) */ +#define TCPWM_CNT_INTR_MASKED_CC_MATCH_Pos (1UL) /*!< TCPWM_CNT INTR_MASKED: CC_MATCH (Bit 1) */ +#define TCPWM_CNT_INTR_MASKED_CC_MATCH_Msk (0x2UL) /*!< TCPWM_CNT INTR_MASKED: CC_MATCH (Bitfield-Mask: 0x01) */ + + +/* ====================================================== TCPWM.CTRL ======================================================= */ +#define TCPWM_CTRL_COUNTER_ENABLED_Pos (0UL) /*!< TCPWM CTRL: COUNTER_ENABLED (Bit 0) */ +#define TCPWM_CTRL_COUNTER_ENABLED_Msk (0xffffffffUL) /*!< TCPWM CTRL: COUNTER_ENABLED (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== TCPWM.CTRL_CLR ===================================================== */ +#define TCPWM_CTRL_CLR_COUNTER_ENABLED_Pos (0UL) /*!< TCPWM CTRL_CLR: COUNTER_ENABLED (Bit 0) */ +#define TCPWM_CTRL_CLR_COUNTER_ENABLED_Msk (0xffffffffUL) /*!< TCPWM CTRL_CLR: COUNTER_ENABLED (Bitfield-Mask: 0xffffffff)*/ +/* ==================================================== TCPWM.CTRL_SET ===================================================== */ +#define TCPWM_CTRL_SET_COUNTER_ENABLED_Pos (0UL) /*!< TCPWM CTRL_SET: COUNTER_ENABLED (Bit 0) */ +#define TCPWM_CTRL_SET_COUNTER_ENABLED_Msk (0xffffffffUL) /*!< TCPWM CTRL_SET: COUNTER_ENABLED (Bitfield-Mask: 0xffffffff)*/ +/* =================================================== TCPWM.CMD_CAPTURE =================================================== */ +#define TCPWM_CMD_CAPTURE_COUNTER_CAPTURE_Pos (0UL) /*!< TCPWM CMD_CAPTURE: COUNTER_CAPTURE (Bit 0) */ +#define TCPWM_CMD_CAPTURE_COUNTER_CAPTURE_Msk (0xffffffffUL) /*!< TCPWM CMD_CAPTURE: COUNTER_CAPTURE (Bitfield-Mask: 0xffffffff)*/ +/* =================================================== TCPWM.CMD_RELOAD ==================================================== */ +#define TCPWM_CMD_RELOAD_COUNTER_RELOAD_Pos (0UL) /*!< TCPWM CMD_RELOAD: COUNTER_RELOAD (Bit 0) */ +#define TCPWM_CMD_RELOAD_COUNTER_RELOAD_Msk (0xffffffffUL) /*!< TCPWM CMD_RELOAD: COUNTER_RELOAD (Bitfield-Mask: 0xffffffff)*/ +/* ==================================================== TCPWM.CMD_STOP ===================================================== */ +#define TCPWM_CMD_STOP_COUNTER_STOP_Pos (0UL) /*!< TCPWM CMD_STOP: COUNTER_STOP (Bit 0) */ +#define TCPWM_CMD_STOP_COUNTER_STOP_Msk (0xffffffffUL) /*!< TCPWM CMD_STOP: COUNTER_STOP (Bitfield-Mask: 0xffffffff) */ +/* ==================================================== TCPWM.CMD_START ==================================================== */ +#define TCPWM_CMD_START_COUNTER_START_Pos (0UL) /*!< TCPWM CMD_START: COUNTER_START (Bit 0) */ +#define TCPWM_CMD_START_COUNTER_START_Msk (0xffffffffUL) /*!< TCPWM CMD_START: COUNTER_START (Bitfield-Mask: 0xffffffff)*/ +/* =================================================== TCPWM.INTR_CAUSE ==================================================== */ +#define TCPWM_INTR_CAUSE_COUNTER_INT_Pos (0UL) /*!< TCPWM INTR_CAUSE: COUNTER_INT (Bit 0) */ +#define TCPWM_INTR_CAUSE_COUNTER_INT_Msk (0xffffffffUL) /*!< TCPWM INTR_CAUSE: COUNTER_INT (Bitfield-Mask: 0xffffffff) */ + + +#endif /* _CYIP_TCPWM_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_udb.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_udb.h new file mode 100644 index 0000000000..163e6eeaf4 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_udb.h @@ -0,0 +1,2052 @@ +/***************************************************************************//** +* \file cyip_udb.h +* +* \brief +* UDB IP definitions +* +* \note +* Generated 2/9/2017 by CyDeviceHeaderGenerator v1.1.0.47 +* from the register map configuration rev#961378 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CYIP_UDB_H_ +#define _CYIP_UDB_H_ + +#include "cyip_headers.h" + +/* =========================================================================================================================== */ +/* ================ UDB ================ */ +/* =========================================================================================================================== */ + +#define UDB_WRKONE_SECTION_SIZE 0x00000800UL +#define UDB_WRKMULT_SECTION_SIZE 0x00001000UL +#define UDB_UDBPAIR_UDBSNG_SECTION_SIZE 0x00000080UL +#define UDB_UDBPAIR_ROUTE_SECTION_SIZE 0x00000100UL +#define UDB_UDBPAIR_SECTION_SIZE 0x00000200UL +#define UDB_DSI_SECTION_SIZE 0x00000080UL +#define UDB_PA_SECTION_SIZE 0x00000040UL +#define UDB_BCTL_SECTION_SIZE 0x00000080UL +#define UDB_UDBIF_SECTION_SIZE 0x00000020UL +#define UDB_SECTION_SIZE 0x00010000UL + +/** + * \brief UDB Working Registers (2 registers from one UDB at a time) (UDB_WRKONE) + */ +typedef struct { + __IOM uint32_t A[64]; /*!< 0x00000000 Accumulator Registers {A1,A0} */ + __IOM uint32_t D[64]; /*!< 0x00000100 Data Registers {D1,D0} */ + __IOM uint32_t F[64]; /*!< 0x00000200 FIFOs {F1,F0} */ + __IOM uint32_t CTL_ST[64]; /*!< 0x00000300 Status and Control Registers {CTL,ST} */ + __IOM uint32_t ACTL_MSK[64]; /*!< 0x00000400 Mask and Auxiliary Control Registers {ACTL,MSK} */ + __IM uint32_t MC[64]; /*!< 0x00000500 PLD Macrocell Read Registers {00,MC} */ + __IM uint32_t RESERVED[128]; +} UDB_WRKONE_Type; /*!< Size = 1536 (0x600) */ + +/** + * \brief UDB Working Registers (1 register from multiple UDBs at a time) (UDB_WRKMULT) + */ +typedef struct { + __IOM uint32_t A0[64]; /*!< 0x00000000 Accumulator 0 */ + __IOM uint32_t A1[64]; /*!< 0x00000100 Accumulator 1 */ + __IOM uint32_t D0[64]; /*!< 0x00000200 Data 0 */ + __IOM uint32_t D1[64]; /*!< 0x00000300 Data 1 */ + __IOM uint32_t F0[64]; /*!< 0x00000400 FIFO 0 */ + __IOM uint32_t F1[64]; /*!< 0x00000500 FIFO 1 */ + __IM uint32_t ST[64]; /*!< 0x00000600 Status Register */ + __IOM uint32_t CTL[64]; /*!< 0x00000700 Control Register */ + __IOM uint32_t MSK[64]; /*!< 0x00000800 Interrupt Mask */ + __IOM uint32_t ACTL[64]; /*!< 0x00000900 Auxiliary Control */ + __IM uint32_t MC[64]; /*!< 0x00000A00 PLD Macrocell reading */ + __IM uint32_t RESERVED[320]; +} UDB_WRKMULT_Type; /*!< Size = 2816 (0xB00) */ + +/** + * \brief Single UDB Configuration (UDB_UDBPAIR_UDBSNG) + */ +typedef struct { + __IOM uint32_t PLD_IT[12]; /*!< 0x00000000 PLD Input Terms */ + __IOM uint32_t PLD_ORT0; /*!< 0x00000030 PLD OR Terms */ + __IOM uint32_t PLD_ORT1; /*!< 0x00000034 PLD OR Terms */ + __IOM uint32_t PLD_CFG0; /*!< 0x00000038 PLD configuration for Carry Enable, Constant, and XOR feedback */ + __IOM uint32_t PLD_CFG1; /*!< 0x0000003C PLD configuration for Set / Reset selection, and Bypass control*/ + __IOM uint32_t DPATH_CFG0; /*!< 0x00000040 Datapath input selections (RAD0, RAD1, RAD2, F0_LD, F1_LD, + D0_LD, D1_LD) */ + __IOM uint32_t DPATH_CFG1; /*!< 0x00000044 Datapath input and output selections (SCI_MUX, SI_MUX, OUT0 + thru OUT5) */ + __IOM uint32_t DPATH_CFG2; /*!< 0x00000048 Datapath output synchronization, ALU mask, compare 0 and 1 + masks */ + __IOM uint32_t DPATH_CFG3; /*!< 0x0000004C Datapath mask enables, shift in, carry in, compare, chaining, + MSB configs; FIFO, shift and parallel input control */ + __IOM uint32_t DPATH_CFG4; /*!< 0x00000050 Datapath FIFO and register access configuration control */ + __IOM uint32_t SC_CFG0; /*!< 0x00000054 SC Mode 0 and 1 control registers; status register input mode; + general SC configuration */ + __IOM uint32_t SC_CFG1; /*!< 0x00000058 SC counter control */ + __IOM uint32_t RC_CFG0; /*!< 0x0000005C PLD0, PLD1, Datatpath, and SC clock and reset control */ + __IOM uint32_t RC_CFG1; /*!< 0x00000060 PLD0, PLD1, Datatpath, and SC clock selection, general reset + control */ + __IOM uint32_t DPATH_OPC[4]; /*!< 0x00000064 Datapath opcode configuration */ + __IM uint32_t RESERVED[3]; +} UDB_UDBPAIR_UDBSNG_Type; /*!< Size = 116 (0x74) */ + +/** + * \brief Routing Configuration for one UDB Pair (UDB_UDBPAIR_ROUTE) + */ +typedef struct { + __IOM uint32_t TOP_V_BOT; /*!< 0x00000000 See mxudb BROS 002-10714 Appendix A section 'TVI vs. BVI + Muxing' */ + __IOM uint32_t LVI1_V_2; /*!< 0x00000004 See mxudb BROS 002-10714 Appendix A section 'LVI / RVI for + Horizontal Muxing' */ + __IOM uint32_t RVI1_V_2; /*!< 0x00000008 See mxudb BROS 002-10714 Appendix A section 'LVI / RVI for + Horizontal Muxing' */ + __IOM uint32_t TUI_CFG0; /*!< 0x0000000C See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t TUI_CFG1; /*!< 0x00000010 See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t TUI_CFG2; /*!< 0x00000014 See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t TUI_CFG3; /*!< 0x00000018 See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t TUI_CFG4; /*!< 0x0000001C See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t TUI_CFG5; /*!< 0x00000020 See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t BUI_CFG0; /*!< 0x00000024 See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t BUI_CFG1; /*!< 0x00000028 See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t BUI_CFG2; /*!< 0x0000002C See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t BUI_CFG3; /*!< 0x00000030 See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t BUI_CFG4; /*!< 0x00000034 See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t BUI_CFG5; /*!< 0x00000038 See mxudb BROS 002-10714 Appendix A section 'TUI / BUI Muxing' */ + __IOM uint32_t RVO_CFG0; /*!< 0x0000003C See mxudb BROS 002-10714 Appendix A section 'RVO Muxing' */ + __IOM uint32_t RVO_CFG1; /*!< 0x00000040 See mxudb BROS 002-10714 Appendix A section 'RVO Muxing' */ + __IOM uint32_t RVO_CFG2; /*!< 0x00000044 See mxudb BROS 002-10714 Appendix A section 'RVO Muxing' */ + __IOM uint32_t RVO_CFG3; /*!< 0x00000048 See mxudb BROS 002-10714 Appendix A section 'RVO Muxing' */ + __IOM uint32_t LVO_CFG0; /*!< 0x0000004C See mxudb BROS 002-10714 Appendix A section 'LVO Muxing' */ + __IOM uint32_t LVO_CFG1; /*!< 0x00000050 See mxudb BROS 002-10714 Appendix A section 'LVO Muxing' */ + __IOM uint32_t RHO_CFG0; /*!< 0x00000054 See mxudb BROS 002-10714 Appendix A section 'RHO Muxing' */ + __IOM uint32_t RHO_CFG1; /*!< 0x00000058 See mxudb BROS 002-10714 Appendix A section 'RHO Muxing' */ + __IOM uint32_t RHO_CFG2; /*!< 0x0000005C See mxudb BROS 002-10714 Appendix A section 'RHO Muxing' */ + __IOM uint32_t LHO_CFG0; /*!< 0x00000060 See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG1; /*!< 0x00000064 See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG2; /*!< 0x00000068 See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG3; /*!< 0x0000006C See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG4; /*!< 0x00000070 See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG5; /*!< 0x00000074 See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG6; /*!< 0x00000078 See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG7; /*!< 0x0000007C See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG8; /*!< 0x00000080 See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG9; /*!< 0x00000084 See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG10; /*!< 0x00000088 See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IOM uint32_t LHO_CFG11; /*!< 0x0000008C See mxudb BROS 002-10714 Appendix A section 'LHO Muxing' */ + __IM uint32_t RESERVED[28]; +} UDB_UDBPAIR_ROUTE_Type; /*!< Size = 144 (0x90) */ + +/** + * \brief UDB Pair Configuration (up to 32 Pairs) (UDB_UDBPAIR) + */ +typedef struct { + UDB_UDBPAIR_UDBSNG_Type UDBSNG[2]; /*!< 0x00000000 Single UDB Configuration */ + UDB_UDBPAIR_ROUTE_Type ROUTE; /*!< 0x00000100 Routing Configuration for one UDB Pair */ +} UDB_UDBPAIR_Type; /*!< Size = 512 (0x200) */ + +/** + * \brief DSI Configuration (up to 32 DSI) (UDB_DSI) + */ +typedef struct { + __IOM uint32_t LVI1_V_2; /*!< 0x00000000 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LVI / RVI for Horizontal Muxing' as + being equivalent */ + __IOM uint32_t RVI1_V_2; /*!< 0x00000004 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LVI / RVI for Horizontal Muxing' as + being equivalent */ + __IOM uint32_t DOP_CFG0; /*!< 0x00000008 See mxudb BROS 002-10714 Appendix B section 'DOP Muxing' */ + __IOM uint32_t DOP_CFG1; /*!< 0x0000000C See mxudb BROS 002-10714 Appendix B section 'DOP Muxing' */ + __IOM uint32_t DOP_CFG2; /*!< 0x00000010 See mxudb BROS 002-10714 Appendix B section 'DOP Muxing' */ + __IOM uint32_t DOP_CFG3; /*!< 0x00000014 See mxudb BROS 002-10714 Appendix B section 'DOP Muxing' */ + __IOM uint32_t DOT_CFG0; /*!< 0x00000018 See mxudb BROS 002-10714 Appendix B section 'DOT Muxing' */ + __IOM uint32_t DOT_CFG1; /*!< 0x0000001C See mxudb BROS 002-10714 Appendix B section 'DOT Muxing' */ + __IOM uint32_t DOT_CFG2; /*!< 0x00000020 See mxudb BROS 002-10714 Appendix B section 'DOT Muxing' */ + __IOM uint32_t DOT_CFG3; /*!< 0x00000024 See mxudb BROS 002-10714 Appendix B section 'DOT Muxing' */ + __IOM uint32_t RVO_CFG0; /*!< 0x00000028 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'RVO Muxing' as being equivalent */ + __IOM uint32_t RVO_CFG1; /*!< 0x0000002C See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'RVO Muxing' as being equivalent */ + __IOM uint32_t RVO_CFG2; /*!< 0x00000030 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'RVO Muxing' as being equivalent */ + __IOM uint32_t RVO_CFG3; /*!< 0x00000034 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'RVO Muxing' as being equivalent */ + __IOM uint32_t LVO_CFG0; /*!< 0x00000038 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LVO Muxing' as being equivalent */ + __IOM uint32_t LVO_CFG1; /*!< 0x0000003C See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LVO Muxing' as being equivalent */ + __IOM uint32_t RHO_CFG0; /*!< 0x00000040 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'RHO Muxing' as being equivalent */ + __IOM uint32_t RHO_CFG1; /*!< 0x00000044 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'RHO Muxing' as being equivalent */ + __IOM uint32_t RHO_CFG2; /*!< 0x00000048 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'RHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG0; /*!< 0x0000004C See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG1; /*!< 0x00000050 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG2; /*!< 0x00000054 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG3; /*!< 0x00000058 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG4; /*!< 0x0000005C See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG5; /*!< 0x00000060 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG6; /*!< 0x00000064 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG7; /*!< 0x00000068 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG8; /*!< 0x0000006C See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG9; /*!< 0x00000070 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG10; /*!< 0x00000074 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IOM uint32_t LHO_CFG11; /*!< 0x00000078 See mxudb BROS 002-10714 Appendix B DSI Routing which refers + to Appendix A section 'LHO Muxing' as being equivalent */ + __IM uint32_t RESERVED; +} UDB_DSI_Type; /*!< Size = 124 (0x7C) */ + +/** + * \brief Port Adapter Configuration (up to 32 PA) (UDB_PA) + */ +typedef struct { + __IOM uint32_t CFG0; /*!< 0x00000000 PA Data In Clock Control Register */ + __IOM uint32_t CFG1; /*!< 0x00000004 PA Data Out Clock Control Register */ + __IOM uint32_t CFG2; /*!< 0x00000008 PA Clock Select Register */ + __IOM uint32_t CFG3; /*!< 0x0000000C PA Reset Select Register */ + __IOM uint32_t CFG4; /*!< 0x00000010 PA Reset Enable Register */ + __IOM uint32_t CFG5; /*!< 0x00000014 PA Reset Pin Select Register */ + __IOM uint32_t CFG6; /*!< 0x00000018 PA Input Data Sync Control Register - Low */ + __IOM uint32_t CFG7; /*!< 0x0000001C PA Input Data Sync Control Register - High */ + __IOM uint32_t CFG8; /*!< 0x00000020 PA Output Data Sync Control Register - Low */ + __IOM uint32_t CFG9; /*!< 0x00000024 PA Output Data Sync Control Register - High */ + __IOM uint32_t CFG10; /*!< 0x00000028 PA Output Data Select Register - Low */ + __IOM uint32_t CFG11; /*!< 0x0000002C PA Output Data Select Register - High */ + __IOM uint32_t CFG12; /*!< 0x00000030 PA OE Select Register - Low */ + __IOM uint32_t CFG13; /*!< 0x00000034 PA OE Select Register - High */ + __IOM uint32_t CFG14; /*!< 0x00000038 PA OE Sync Register */ + __IM uint32_t RESERVED; +} UDB_PA_Type; /*!< Size = 60 (0x3C) */ + +/** + * \brief UDB Array Bank Control (UDB_BCTL) + */ +typedef struct { + __IOM uint32_t MDCLK_EN; /*!< 0x00000000 Master Digital Clock Enable Register */ + __IOM uint32_t MBCLK_EN; /*!< 0x00000004 Master clk_peri_app Enable Register */ + __IOM uint32_t BOTSEL_L; /*!< 0x00000008 Lower Nibble Bottom Digital Clock Select Register */ + __IOM uint32_t BOTSEL_U; /*!< 0x0000000C Upper Nibble Bottom Digital Clock Select Register */ + __IOM uint32_t QCLK_EN[16]; /*!< 0x00000010 Quadrant Digital Clock Enable Registers */ + __IM uint32_t RESERVED[12]; +} UDB_BCTL_Type; /*!< Size = 80 (0x50) */ + +/** + * \brief UDB Subsystem Interface Configuration (UDB_UDBIF) + */ +typedef struct { + __IOM uint32_t BANK_CTL; /*!< 0x00000000 Bank Control */ + __IOM uint32_t INT_CLK_CTL; /*!< 0x00000004 Interrupt Clock Control */ + __IOM uint32_t INT_CFG; /*!< 0x00000008 Interrupt Configuration */ + __IOM uint32_t TR_CLK_CTL; /*!< 0x0000000C Trigger Clock Control */ + __IOM uint32_t TR_CFG; /*!< 0x00000010 Trigger Configuration */ + __IOM uint32_t PRIVATE; /*!< 0x00000014 Internal use only */ + __IM uint32_t RESERVED[2]; +} UDB_UDBIF_Type; /*!< Size = 24 (0x18) */ + +/** + * \brief Programmable Digital Subsystem (UDB) + */ +typedef struct { /*!< UDB Structure */ + UDB_WRKONE_Type WRKONE; /*!< 0x00000000 UDB Working Registers (2 registers from one UDB at a time) */ + __IM uint32_t RESERVED[512]; + UDB_WRKMULT_Type WRKMULT; /*!< 0x00001000 UDB Working Registers (1 register from multiple UDBs at a time)*/ + UDB_UDBPAIR_Type UDBPAIR[32]; /*!< 0x00002000 UDB Pair Configuration (up to 32 Pairs) */ + UDB_DSI_Type DSI[32]; /*!< 0x00006000 DSI Configuration (up to 32 DSI) */ + UDB_PA_Type PA[32]; /*!< 0x00007000 Port Adapter Configuration (up to 32 PA) */ + UDB_BCTL_Type BCTL; /*!< 0x00007800 UDB Array Bank Control */ + __IM uint32_t RESERVED1[32]; + UDB_UDBIF_Type UDBIF; /*!< 0x00007900 UDB Subsystem Interface Configuration */ +} UDB_Type; /*!< Size = 31008 (0x7920) */ + + +/* ===================================================== UDB_WRKONE.A ====================================================== */ +#define UDB_WRKONE_A_A0_Pos (0UL) /*!< UDB_WRKONE A: A0 (Bit 0) */ +#define UDB_WRKONE_A_A0_Msk (0xffUL) /*!< UDB_WRKONE A: A0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKONE_A_A1_Pos (8UL) /*!< UDB_WRKONE A: A1 (Bit 8) */ +#define UDB_WRKONE_A_A1_Msk (0xff00UL) /*!< UDB_WRKONE A: A1 (Bitfield-Mask: 0xff) */ +/* ===================================================== UDB_WRKONE.D ====================================================== */ +#define UDB_WRKONE_D_D0_Pos (0UL) /*!< UDB_WRKONE D: D0 (Bit 0) */ +#define UDB_WRKONE_D_D0_Msk (0xffUL) /*!< UDB_WRKONE D: D0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKONE_D_D1_Pos (8UL) /*!< UDB_WRKONE D: D1 (Bit 8) */ +#define UDB_WRKONE_D_D1_Msk (0xff00UL) /*!< UDB_WRKONE D: D1 (Bitfield-Mask: 0xff) */ +/* ===================================================== UDB_WRKONE.F ====================================================== */ +#define UDB_WRKONE_F_F0_Pos (0UL) /*!< UDB_WRKONE F: F0 (Bit 0) */ +#define UDB_WRKONE_F_F0_Msk (0xffUL) /*!< UDB_WRKONE F: F0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKONE_F_F1_Pos (8UL) /*!< UDB_WRKONE F: F1 (Bit 8) */ +#define UDB_WRKONE_F_F1_Msk (0xff00UL) /*!< UDB_WRKONE F: F1 (Bitfield-Mask: 0xff) */ +/* =================================================== UDB_WRKONE.CTL_ST =================================================== */ +#define UDB_WRKONE_CTL_ST_ST_Pos (0UL) /*!< UDB_WRKONE CTL_ST: ST (Bit 0) */ +#define UDB_WRKONE_CTL_ST_ST_Msk (0xffUL) /*!< UDB_WRKONE CTL_ST: ST (Bitfield-Mask: 0xff) */ +#define UDB_WRKONE_CTL_ST_CTL_Pos (8UL) /*!< UDB_WRKONE CTL_ST: CTL (Bit 8) */ +#define UDB_WRKONE_CTL_ST_CTL_Msk (0xff00UL) /*!< UDB_WRKONE CTL_ST: CTL (Bitfield-Mask: 0xff) */ +/* ================================================== UDB_WRKONE.ACTL_MSK ================================================== */ +#define UDB_WRKONE_ACTL_MSK_MSK_Pos (0UL) /*!< UDB_WRKONE ACTL_MSK: MSK (Bit 0) */ +#define UDB_WRKONE_ACTL_MSK_MSK_Msk (0x7fUL) /*!< UDB_WRKONE ACTL_MSK: MSK (Bitfield-Mask: 0x7f) */ +#define UDB_WRKONE_ACTL_MSK_FIFO0_CLR_Pos (8UL) /*!< UDB_WRKONE ACTL_MSK: FIFO0_CLR (Bit 8) */ +#define UDB_WRKONE_ACTL_MSK_FIFO0_CLR_Msk (0x100UL) /*!< UDB_WRKONE ACTL_MSK: FIFO0_CLR (Bitfield-Mask: 0x01) */ +#define UDB_WRKONE_ACTL_MSK_FIFO1_CLR_Pos (9UL) /*!< UDB_WRKONE ACTL_MSK: FIFO1_CLR (Bit 9) */ +#define UDB_WRKONE_ACTL_MSK_FIFO1_CLR_Msk (0x200UL) /*!< UDB_WRKONE ACTL_MSK: FIFO1_CLR (Bitfield-Mask: 0x01) */ +#define UDB_WRKONE_ACTL_MSK_FIFO0_LVL_Pos (10UL) /*!< UDB_WRKONE ACTL_MSK: FIFO0_LVL (Bit 10) */ +#define UDB_WRKONE_ACTL_MSK_FIFO0_LVL_Msk (0x400UL) /*!< UDB_WRKONE ACTL_MSK: FIFO0_LVL (Bitfield-Mask: 0x01) */ +#define UDB_WRKONE_ACTL_MSK_FIFO1_LVL_Pos (11UL) /*!< UDB_WRKONE ACTL_MSK: FIFO1_LVL (Bit 11) */ +#define UDB_WRKONE_ACTL_MSK_FIFO1_LVL_Msk (0x800UL) /*!< UDB_WRKONE ACTL_MSK: FIFO1_LVL (Bitfield-Mask: 0x01) */ +#define UDB_WRKONE_ACTL_MSK_INT_EN_Pos (12UL) /*!< UDB_WRKONE ACTL_MSK: INT_EN (Bit 12) */ +#define UDB_WRKONE_ACTL_MSK_INT_EN_Msk (0x1000UL) /*!< UDB_WRKONE ACTL_MSK: INT_EN (Bitfield-Mask: 0x01) */ +#define UDB_WRKONE_ACTL_MSK_CNT_START_Pos (13UL) /*!< UDB_WRKONE ACTL_MSK: CNT_START (Bit 13) */ +#define UDB_WRKONE_ACTL_MSK_CNT_START_Msk (0x2000UL) /*!< UDB_WRKONE ACTL_MSK: CNT_START (Bitfield-Mask: 0x01) */ +/* ===================================================== UDB_WRKONE.MC ===================================================== */ +#define UDB_WRKONE_MC_PLD0_MC_Pos (0UL) /*!< UDB_WRKONE MC: PLD0_MC (Bit 0) */ +#define UDB_WRKONE_MC_PLD0_MC_Msk (0xfUL) /*!< UDB_WRKONE MC: PLD0_MC (Bitfield-Mask: 0x0f) */ +#define UDB_WRKONE_MC_PLD1_MC_Pos (4UL) /*!< UDB_WRKONE MC: PLD1_MC (Bit 4) */ +#define UDB_WRKONE_MC_PLD1_MC_Msk (0xf0UL) /*!< UDB_WRKONE MC: PLD1_MC (Bitfield-Mask: 0x0f) */ + + +/* ==================================================== UDB_WRKMULT.A0 ===================================================== */ +#define UDB_WRKMULT_A0_A0_0_Pos (0UL) /*!< UDB_WRKMULT A0: A0_0 (Bit 0) */ +#define UDB_WRKMULT_A0_A0_0_Msk (0xffUL) /*!< UDB_WRKMULT A0: A0_0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_A0_A0_1_Pos (8UL) /*!< UDB_WRKMULT A0: A0_1 (Bit 8) */ +#define UDB_WRKMULT_A0_A0_1_Msk (0xff00UL) /*!< UDB_WRKMULT A0: A0_1 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_A0_A0_2_Pos (16UL) /*!< UDB_WRKMULT A0: A0_2 (Bit 16) */ +#define UDB_WRKMULT_A0_A0_2_Msk (0xff0000UL) /*!< UDB_WRKMULT A0: A0_2 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_A0_A0_3_Pos (24UL) /*!< UDB_WRKMULT A0: A0_3 (Bit 24) */ +#define UDB_WRKMULT_A0_A0_3_Msk (0xff000000UL) /*!< UDB_WRKMULT A0: A0_3 (Bitfield-Mask: 0xff) */ +/* ==================================================== UDB_WRKMULT.A1 ===================================================== */ +#define UDB_WRKMULT_A1_A1_0_Pos (0UL) /*!< UDB_WRKMULT A1: A1_0 (Bit 0) */ +#define UDB_WRKMULT_A1_A1_0_Msk (0xffUL) /*!< UDB_WRKMULT A1: A1_0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_A1_A1_1_Pos (8UL) /*!< UDB_WRKMULT A1: A1_1 (Bit 8) */ +#define UDB_WRKMULT_A1_A1_1_Msk (0xff00UL) /*!< UDB_WRKMULT A1: A1_1 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_A1_A1_2_Pos (16UL) /*!< UDB_WRKMULT A1: A1_2 (Bit 16) */ +#define UDB_WRKMULT_A1_A1_2_Msk (0xff0000UL) /*!< UDB_WRKMULT A1: A1_2 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_A1_A1_3_Pos (24UL) /*!< UDB_WRKMULT A1: A1_3 (Bit 24) */ +#define UDB_WRKMULT_A1_A1_3_Msk (0xff000000UL) /*!< UDB_WRKMULT A1: A1_3 (Bitfield-Mask: 0xff) */ +/* ==================================================== UDB_WRKMULT.D0 ===================================================== */ +#define UDB_WRKMULT_D0_D0_0_Pos (0UL) /*!< UDB_WRKMULT D0: D0_0 (Bit 0) */ +#define UDB_WRKMULT_D0_D0_0_Msk (0xffUL) /*!< UDB_WRKMULT D0: D0_0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_D0_D0_1_Pos (8UL) /*!< UDB_WRKMULT D0: D0_1 (Bit 8) */ +#define UDB_WRKMULT_D0_D0_1_Msk (0xff00UL) /*!< UDB_WRKMULT D0: D0_1 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_D0_D0_2_Pos (16UL) /*!< UDB_WRKMULT D0: D0_2 (Bit 16) */ +#define UDB_WRKMULT_D0_D0_2_Msk (0xff0000UL) /*!< UDB_WRKMULT D0: D0_2 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_D0_D0_3_Pos (24UL) /*!< UDB_WRKMULT D0: D0_3 (Bit 24) */ +#define UDB_WRKMULT_D0_D0_3_Msk (0xff000000UL) /*!< UDB_WRKMULT D0: D0_3 (Bitfield-Mask: 0xff) */ +/* ==================================================== UDB_WRKMULT.D1 ===================================================== */ +#define UDB_WRKMULT_D1_D1_0_Pos (0UL) /*!< UDB_WRKMULT D1: D1_0 (Bit 0) */ +#define UDB_WRKMULT_D1_D1_0_Msk (0xffUL) /*!< UDB_WRKMULT D1: D1_0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_D1_D1_1_Pos (8UL) /*!< UDB_WRKMULT D1: D1_1 (Bit 8) */ +#define UDB_WRKMULT_D1_D1_1_Msk (0xff00UL) /*!< UDB_WRKMULT D1: D1_1 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_D1_D1_2_Pos (16UL) /*!< UDB_WRKMULT D1: D1_2 (Bit 16) */ +#define UDB_WRKMULT_D1_D1_2_Msk (0xff0000UL) /*!< UDB_WRKMULT D1: D1_2 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_D1_D1_3_Pos (24UL) /*!< UDB_WRKMULT D1: D1_3 (Bit 24) */ +#define UDB_WRKMULT_D1_D1_3_Msk (0xff000000UL) /*!< UDB_WRKMULT D1: D1_3 (Bitfield-Mask: 0xff) */ +/* ==================================================== UDB_WRKMULT.F0 ===================================================== */ +#define UDB_WRKMULT_F0_F0_0_Pos (0UL) /*!< UDB_WRKMULT F0: F0_0 (Bit 0) */ +#define UDB_WRKMULT_F0_F0_0_Msk (0xffUL) /*!< UDB_WRKMULT F0: F0_0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_F0_F0_1_Pos (8UL) /*!< UDB_WRKMULT F0: F0_1 (Bit 8) */ +#define UDB_WRKMULT_F0_F0_1_Msk (0xff00UL) /*!< UDB_WRKMULT F0: F0_1 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_F0_F0_2_Pos (16UL) /*!< UDB_WRKMULT F0: F0_2 (Bit 16) */ +#define UDB_WRKMULT_F0_F0_2_Msk (0xff0000UL) /*!< UDB_WRKMULT F0: F0_2 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_F0_F0_3_Pos (24UL) /*!< UDB_WRKMULT F0: F0_3 (Bit 24) */ +#define UDB_WRKMULT_F0_F0_3_Msk (0xff000000UL) /*!< UDB_WRKMULT F0: F0_3 (Bitfield-Mask: 0xff) */ +/* ==================================================== UDB_WRKMULT.F1 ===================================================== */ +#define UDB_WRKMULT_F1_F1_0_Pos (0UL) /*!< UDB_WRKMULT F1: F1_0 (Bit 0) */ +#define UDB_WRKMULT_F1_F1_0_Msk (0xffUL) /*!< UDB_WRKMULT F1: F1_0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_F1_F1_1_Pos (8UL) /*!< UDB_WRKMULT F1: F1_1 (Bit 8) */ +#define UDB_WRKMULT_F1_F1_1_Msk (0xff00UL) /*!< UDB_WRKMULT F1: F1_1 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_F1_F1_2_Pos (16UL) /*!< UDB_WRKMULT F1: F1_2 (Bit 16) */ +#define UDB_WRKMULT_F1_F1_2_Msk (0xff0000UL) /*!< UDB_WRKMULT F1: F1_2 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_F1_F1_3_Pos (24UL) /*!< UDB_WRKMULT F1: F1_3 (Bit 24) */ +#define UDB_WRKMULT_F1_F1_3_Msk (0xff000000UL) /*!< UDB_WRKMULT F1: F1_3 (Bitfield-Mask: 0xff) */ +/* ==================================================== UDB_WRKMULT.ST ===================================================== */ +#define UDB_WRKMULT_ST_ST_0_Pos (0UL) /*!< UDB_WRKMULT ST: ST_0 (Bit 0) */ +#define UDB_WRKMULT_ST_ST_0_Msk (0xffUL) /*!< UDB_WRKMULT ST: ST_0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_ST_ST_1_Pos (8UL) /*!< UDB_WRKMULT ST: ST_1 (Bit 8) */ +#define UDB_WRKMULT_ST_ST_1_Msk (0xff00UL) /*!< UDB_WRKMULT ST: ST_1 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_ST_ST_2_Pos (16UL) /*!< UDB_WRKMULT ST: ST_2 (Bit 16) */ +#define UDB_WRKMULT_ST_ST_2_Msk (0xff0000UL) /*!< UDB_WRKMULT ST: ST_2 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_ST_ST_3_Pos (24UL) /*!< UDB_WRKMULT ST: ST_3 (Bit 24) */ +#define UDB_WRKMULT_ST_ST_3_Msk (0xff000000UL) /*!< UDB_WRKMULT ST: ST_3 (Bitfield-Mask: 0xff) */ +/* ==================================================== UDB_WRKMULT.CTL ==================================================== */ +#define UDB_WRKMULT_CTL_CTL_0_Pos (0UL) /*!< UDB_WRKMULT CTL: CTL_0 (Bit 0) */ +#define UDB_WRKMULT_CTL_CTL_0_Msk (0xffUL) /*!< UDB_WRKMULT CTL: CTL_0 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_CTL_CTL_1_Pos (8UL) /*!< UDB_WRKMULT CTL: CTL_1 (Bit 8) */ +#define UDB_WRKMULT_CTL_CTL_1_Msk (0xff00UL) /*!< UDB_WRKMULT CTL: CTL_1 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_CTL_CTL_2_Pos (16UL) /*!< UDB_WRKMULT CTL: CTL_2 (Bit 16) */ +#define UDB_WRKMULT_CTL_CTL_2_Msk (0xff0000UL) /*!< UDB_WRKMULT CTL: CTL_2 (Bitfield-Mask: 0xff) */ +#define UDB_WRKMULT_CTL_CTL_3_Pos (24UL) /*!< UDB_WRKMULT CTL: CTL_3 (Bit 24) */ +#define UDB_WRKMULT_CTL_CTL_3_Msk (0xff000000UL) /*!< UDB_WRKMULT CTL: CTL_3 (Bitfield-Mask: 0xff) */ +/* ==================================================== UDB_WRKMULT.MSK ==================================================== */ +#define UDB_WRKMULT_MSK_MSK_0_Pos (0UL) /*!< UDB_WRKMULT MSK: MSK_0 (Bit 0) */ +#define UDB_WRKMULT_MSK_MSK_0_Msk (0x7fUL) /*!< UDB_WRKMULT MSK: MSK_0 (Bitfield-Mask: 0x7f) */ +#define UDB_WRKMULT_MSK_MSK_1_Pos (8UL) /*!< UDB_WRKMULT MSK: MSK_1 (Bit 8) */ +#define UDB_WRKMULT_MSK_MSK_1_Msk (0x7f00UL) /*!< UDB_WRKMULT MSK: MSK_1 (Bitfield-Mask: 0x7f) */ +#define UDB_WRKMULT_MSK_MSK_2_Pos (16UL) /*!< UDB_WRKMULT MSK: MSK_2 (Bit 16) */ +#define UDB_WRKMULT_MSK_MSK_2_Msk (0x7f0000UL) /*!< UDB_WRKMULT MSK: MSK_2 (Bitfield-Mask: 0x7f) */ +#define UDB_WRKMULT_MSK_MSK_3_Pos (24UL) /*!< UDB_WRKMULT MSK: MSK_3 (Bit 24) */ +#define UDB_WRKMULT_MSK_MSK_3_Msk (0x7f000000UL) /*!< UDB_WRKMULT MSK: MSK_3 (Bitfield-Mask: 0x7f) */ +/* =================================================== UDB_WRKMULT.ACTL ==================================================== */ +#define UDB_WRKMULT_ACTL_FIFO0_CLR_0_Pos (0UL) /*!< UDB_WRKMULT ACTL: FIFO0_CLR_0 (Bit 0) */ +#define UDB_WRKMULT_ACTL_FIFO0_CLR_0_Msk (0x1UL) /*!< UDB_WRKMULT ACTL: FIFO0_CLR_0 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO1_CLR_0_Pos (1UL) /*!< UDB_WRKMULT ACTL: FIFO1_CLR_0 (Bit 1) */ +#define UDB_WRKMULT_ACTL_FIFO1_CLR_0_Msk (0x2UL) /*!< UDB_WRKMULT ACTL: FIFO1_CLR_0 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO0_LVL_0_Pos (2UL) /*!< UDB_WRKMULT ACTL: FIFO0_LVL_0 (Bit 2) */ +#define UDB_WRKMULT_ACTL_FIFO0_LVL_0_Msk (0x4UL) /*!< UDB_WRKMULT ACTL: FIFO0_LVL_0 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO1_LVL_0_Pos (3UL) /*!< UDB_WRKMULT ACTL: FIFO1_LVL_0 (Bit 3) */ +#define UDB_WRKMULT_ACTL_FIFO1_LVL_0_Msk (0x8UL) /*!< UDB_WRKMULT ACTL: FIFO1_LVL_0 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_INT_EN_0_Pos (4UL) /*!< UDB_WRKMULT ACTL: INT_EN_0 (Bit 4) */ +#define UDB_WRKMULT_ACTL_INT_EN_0_Msk (0x10UL) /*!< UDB_WRKMULT ACTL: INT_EN_0 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_CNT_START_0_Pos (5UL) /*!< UDB_WRKMULT ACTL: CNT_START_0 (Bit 5) */ +#define UDB_WRKMULT_ACTL_CNT_START_0_Msk (0x20UL) /*!< UDB_WRKMULT ACTL: CNT_START_0 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO0_CLR_1_Pos (8UL) /*!< UDB_WRKMULT ACTL: FIFO0_CLR_1 (Bit 8) */ +#define UDB_WRKMULT_ACTL_FIFO0_CLR_1_Msk (0x100UL) /*!< UDB_WRKMULT ACTL: FIFO0_CLR_1 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO1_CLR_1_Pos (9UL) /*!< UDB_WRKMULT ACTL: FIFO1_CLR_1 (Bit 9) */ +#define UDB_WRKMULT_ACTL_FIFO1_CLR_1_Msk (0x200UL) /*!< UDB_WRKMULT ACTL: FIFO1_CLR_1 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO0_LVL_1_Pos (10UL) /*!< UDB_WRKMULT ACTL: FIFO0_LVL_1 (Bit 10) */ +#define UDB_WRKMULT_ACTL_FIFO0_LVL_1_Msk (0x400UL) /*!< UDB_WRKMULT ACTL: FIFO0_LVL_1 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO1_LVL_1_Pos (11UL) /*!< UDB_WRKMULT ACTL: FIFO1_LVL_1 (Bit 11) */ +#define UDB_WRKMULT_ACTL_FIFO1_LVL_1_Msk (0x800UL) /*!< UDB_WRKMULT ACTL: FIFO1_LVL_1 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_INT_EN_1_Pos (12UL) /*!< UDB_WRKMULT ACTL: INT_EN_1 (Bit 12) */ +#define UDB_WRKMULT_ACTL_INT_EN_1_Msk (0x1000UL) /*!< UDB_WRKMULT ACTL: INT_EN_1 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_CNT_START_1_Pos (13UL) /*!< UDB_WRKMULT ACTL: CNT_START_1 (Bit 13) */ +#define UDB_WRKMULT_ACTL_CNT_START_1_Msk (0x2000UL) /*!< UDB_WRKMULT ACTL: CNT_START_1 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO0_CLR_2_Pos (16UL) /*!< UDB_WRKMULT ACTL: FIFO0_CLR_2 (Bit 16) */ +#define UDB_WRKMULT_ACTL_FIFO0_CLR_2_Msk (0x10000UL) /*!< UDB_WRKMULT ACTL: FIFO0_CLR_2 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO1_CLR_2_Pos (17UL) /*!< UDB_WRKMULT ACTL: FIFO1_CLR_2 (Bit 17) */ +#define UDB_WRKMULT_ACTL_FIFO1_CLR_2_Msk (0x20000UL) /*!< UDB_WRKMULT ACTL: FIFO1_CLR_2 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO0_LVL_2_Pos (18UL) /*!< UDB_WRKMULT ACTL: FIFO0_LVL_2 (Bit 18) */ +#define UDB_WRKMULT_ACTL_FIFO0_LVL_2_Msk (0x40000UL) /*!< UDB_WRKMULT ACTL: FIFO0_LVL_2 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO1_LVL_2_Pos (19UL) /*!< UDB_WRKMULT ACTL: FIFO1_LVL_2 (Bit 19) */ +#define UDB_WRKMULT_ACTL_FIFO1_LVL_2_Msk (0x80000UL) /*!< UDB_WRKMULT ACTL: FIFO1_LVL_2 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_INT_EN_2_Pos (20UL) /*!< UDB_WRKMULT ACTL: INT_EN_2 (Bit 20) */ +#define UDB_WRKMULT_ACTL_INT_EN_2_Msk (0x100000UL) /*!< UDB_WRKMULT ACTL: INT_EN_2 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_CNT_START_2_Pos (21UL) /*!< UDB_WRKMULT ACTL: CNT_START_2 (Bit 21) */ +#define UDB_WRKMULT_ACTL_CNT_START_2_Msk (0x200000UL) /*!< UDB_WRKMULT ACTL: CNT_START_2 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO0_CLR_3_Pos (24UL) /*!< UDB_WRKMULT ACTL: FIFO0_CLR_3 (Bit 24) */ +#define UDB_WRKMULT_ACTL_FIFO0_CLR_3_Msk (0x1000000UL) /*!< UDB_WRKMULT ACTL: FIFO0_CLR_3 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO1_CLR_3_Pos (25UL) /*!< UDB_WRKMULT ACTL: FIFO1_CLR_3 (Bit 25) */ +#define UDB_WRKMULT_ACTL_FIFO1_CLR_3_Msk (0x2000000UL) /*!< UDB_WRKMULT ACTL: FIFO1_CLR_3 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO0_LVL_3_Pos (26UL) /*!< UDB_WRKMULT ACTL: FIFO0_LVL_3 (Bit 26) */ +#define UDB_WRKMULT_ACTL_FIFO0_LVL_3_Msk (0x4000000UL) /*!< UDB_WRKMULT ACTL: FIFO0_LVL_3 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_FIFO1_LVL_3_Pos (27UL) /*!< UDB_WRKMULT ACTL: FIFO1_LVL_3 (Bit 27) */ +#define UDB_WRKMULT_ACTL_FIFO1_LVL_3_Msk (0x8000000UL) /*!< UDB_WRKMULT ACTL: FIFO1_LVL_3 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_INT_EN_3_Pos (28UL) /*!< UDB_WRKMULT ACTL: INT_EN_3 (Bit 28) */ +#define UDB_WRKMULT_ACTL_INT_EN_3_Msk (0x10000000UL) /*!< UDB_WRKMULT ACTL: INT_EN_3 (Bitfield-Mask: 0x01) */ +#define UDB_WRKMULT_ACTL_CNT_START_3_Pos (29UL) /*!< UDB_WRKMULT ACTL: CNT_START_3 (Bit 29) */ +#define UDB_WRKMULT_ACTL_CNT_START_3_Msk (0x20000000UL) /*!< UDB_WRKMULT ACTL: CNT_START_3 (Bitfield-Mask: 0x01) */ +/* ==================================================== UDB_WRKMULT.MC ===================================================== */ +#define UDB_WRKMULT_MC_PLD0_MC_0_Pos (0UL) /*!< UDB_WRKMULT MC: PLD0_MC_0 (Bit 0) */ +#define UDB_WRKMULT_MC_PLD0_MC_0_Msk (0xfUL) /*!< UDB_WRKMULT MC: PLD0_MC_0 (Bitfield-Mask: 0x0f) */ +#define UDB_WRKMULT_MC_PLD1_MC_0_Pos (4UL) /*!< UDB_WRKMULT MC: PLD1_MC_0 (Bit 4) */ +#define UDB_WRKMULT_MC_PLD1_MC_0_Msk (0xf0UL) /*!< UDB_WRKMULT MC: PLD1_MC_0 (Bitfield-Mask: 0x0f) */ +#define UDB_WRKMULT_MC_PLD0_MC_1_Pos (8UL) /*!< UDB_WRKMULT MC: PLD0_MC_1 (Bit 8) */ +#define UDB_WRKMULT_MC_PLD0_MC_1_Msk (0xf00UL) /*!< UDB_WRKMULT MC: PLD0_MC_1 (Bitfield-Mask: 0x0f) */ +#define UDB_WRKMULT_MC_PLD1_MC_1_Pos (12UL) /*!< UDB_WRKMULT MC: PLD1_MC_1 (Bit 12) */ +#define UDB_WRKMULT_MC_PLD1_MC_1_Msk (0xf000UL) /*!< UDB_WRKMULT MC: PLD1_MC_1 (Bitfield-Mask: 0x0f) */ +#define UDB_WRKMULT_MC_PLD0_MC_2_Pos (16UL) /*!< UDB_WRKMULT MC: PLD0_MC_2 (Bit 16) */ +#define UDB_WRKMULT_MC_PLD0_MC_2_Msk (0xf0000UL) /*!< UDB_WRKMULT MC: PLD0_MC_2 (Bitfield-Mask: 0x0f) */ +#define UDB_WRKMULT_MC_PLD1_MC_2_Pos (20UL) /*!< UDB_WRKMULT MC: PLD1_MC_2 (Bit 20) */ +#define UDB_WRKMULT_MC_PLD1_MC_2_Msk (0xf00000UL) /*!< UDB_WRKMULT MC: PLD1_MC_2 (Bitfield-Mask: 0x0f) */ +#define UDB_WRKMULT_MC_PLD0_MC_3_Pos (24UL) /*!< UDB_WRKMULT MC: PLD0_MC_3 (Bit 24) */ +#define UDB_WRKMULT_MC_PLD0_MC_3_Msk (0xf000000UL) /*!< UDB_WRKMULT MC: PLD0_MC_3 (Bitfield-Mask: 0x0f) */ +#define UDB_WRKMULT_MC_PLD1_MC_3_Pos (28UL) /*!< UDB_WRKMULT MC: PLD1_MC_3 (Bit 28) */ +#define UDB_WRKMULT_MC_PLD1_MC_3_Msk (0xf0000000UL) /*!< UDB_WRKMULT MC: PLD1_MC_3 (Bitfield-Mask: 0x0f) */ + + +/* =============================================== UDB_UDBPAIR_UDBSNG.PLD_IT =============================================== */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT0_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT0 (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT0_Msk (0x1UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT1_Pos (1UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT1 (Bit 1) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT1_Msk (0x2UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT2_Pos (2UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT2 (Bit 2) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT2_Msk (0x4UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT3_Pos (3UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT3 (Bit 3) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT3_Msk (0x8UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT4_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT4 (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT4_Msk (0x10UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT4 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT5_Pos (5UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT5 (Bit 5) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT5_Msk (0x20UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT5 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT6_Pos (6UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT6 (Bit 6) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT6_Msk (0x40UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT6 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT7_Pos (7UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT7 (Bit 7) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_C_FOR_PT7_Msk (0x80UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_C_FOR_PT7 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT0_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT0 (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT0_Msk (0x100UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT1_Pos (9UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT1 (Bit 9) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT1_Msk (0x200UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT2_Pos (10UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT2 (Bit 10) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT2_Msk (0x400UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT3_Pos (11UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT3 (Bit 11) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT3_Msk (0x800UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT4_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT4 (Bit 12) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT4_Msk (0x1000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT4 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT5_Pos (13UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT5 (Bit 13) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT5_Msk (0x2000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT5 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT6_Pos (14UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT6 (Bit 14) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT6_Msk (0x4000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT6 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT7_Pos (15UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT7 (Bit 15) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_C_FOR_PT7_Msk (0x8000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_C_FOR_PT7 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT0_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT0 (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT0_Msk (0x10000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT1_Pos (17UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT1 (Bit 17) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT1_Msk (0x20000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT2_Pos (18UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT2 (Bit 18) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT2_Msk (0x40000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT3_Pos (19UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT3 (Bit 19) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT3_Msk (0x80000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT4_Pos (20UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT4 (Bit 20) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT4_Msk (0x100000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT4 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT5_Pos (21UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT5 (Bit 21) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT5_Msk (0x200000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT5 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT6_Pos (22UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT6 (Bit 22) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT6_Msk (0x400000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT6 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT7_Pos (23UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT7 (Bit 23) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD0_INX_T_FOR_PT7_Msk (0x800000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD0_INX_T_FOR_PT7 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT0_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT0 (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT0_Msk (0x1000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT1_Pos (25UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT1 (Bit 25) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT1_Msk (0x2000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT2_Pos (26UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT2 (Bit 26) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT2_Msk (0x4000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT3_Pos (27UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT3 (Bit 27) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT3_Msk (0x8000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT4_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT4 (Bit 28) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT4_Msk (0x10000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT4 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT5_Pos (29UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT5 (Bit 29) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT5_Msk (0x20000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT5 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT6_Pos (30UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT6 (Bit 30) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT6_Msk (0x40000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT6 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT7_Pos (31UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT7 (Bit 31) */ +#define UDB_UDBPAIR_UDBSNG_PLD_IT_PLD1_INX_T_FOR_PT7_Msk (0x80000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_IT: PLD1_INX_T_FOR_PT7 (Bitfield-Mask: 0x01)*/ +/* ============================================== UDB_UDBPAIR_UDBSNG.PLD_ORT0 ============================================== */ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT0_T_FOR_OUT0_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT0_T_FOR_OUT0 (Bit 0)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT0_T_FOR_OUT0_Msk (0x1UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT0_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT1_T_FOR_OUT0_Pos (1UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT1_T_FOR_OUT0 (Bit 1)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT1_T_FOR_OUT0_Msk (0x2UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT1_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT2_T_FOR_OUT0_Pos (2UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT2_T_FOR_OUT0 (Bit 2)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT2_T_FOR_OUT0_Msk (0x4UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT2_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT3_T_FOR_OUT0_Pos (3UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT3_T_FOR_OUT0 (Bit 3)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT3_T_FOR_OUT0_Msk (0x8UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT3_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT4_T_FOR_OUT0_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT4_T_FOR_OUT0 (Bit 4)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT4_T_FOR_OUT0_Msk (0x10UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT4_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT5_T_FOR_OUT0_Pos (5UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT5_T_FOR_OUT0 (Bit 5)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT5_T_FOR_OUT0_Msk (0x20UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT5_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT6_T_FOR_OUT0_Pos (6UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT6_T_FOR_OUT0 (Bit 6)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT6_T_FOR_OUT0_Msk (0x40UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT6_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT7_T_FOR_OUT0_Pos (7UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT7_T_FOR_OUT0 (Bit 7)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT7_T_FOR_OUT0_Msk (0x80UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT7_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT0_T_FOR_OUT0_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT0_T_FOR_OUT0 (Bit 8)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT0_T_FOR_OUT0_Msk (0x100UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT0_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT1_T_FOR_OUT0_Pos (9UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT1_T_FOR_OUT0 (Bit 9)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT1_T_FOR_OUT0_Msk (0x200UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT1_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT2_T_FOR_OUT0_Pos (10UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT2_T_FOR_OUT0 (Bit 10)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT2_T_FOR_OUT0_Msk (0x400UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT2_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT3_T_FOR_OUT0_Pos (11UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT3_T_FOR_OUT0 (Bit 11)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT3_T_FOR_OUT0_Msk (0x800UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT3_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT4_T_FOR_OUT0_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT4_T_FOR_OUT0 (Bit 12)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT4_T_FOR_OUT0_Msk (0x1000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT4_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT5_T_FOR_OUT0_Pos (13UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT5_T_FOR_OUT0 (Bit 13)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT5_T_FOR_OUT0_Msk (0x2000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT5_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT6_T_FOR_OUT0_Pos (14UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT6_T_FOR_OUT0 (Bit 14)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT6_T_FOR_OUT0_Msk (0x4000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT6_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT7_T_FOR_OUT0_Pos (15UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT7_T_FOR_OUT0 (Bit 15)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT7_T_FOR_OUT0_Msk (0x8000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT7_T_FOR_OUT0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT0_T_FOR_OUT1_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT0_T_FOR_OUT1 (Bit 16)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT0_T_FOR_OUT1_Msk (0x10000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT0_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT1_T_FOR_OUT1_Pos (17UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT1_T_FOR_OUT1 (Bit 17)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT1_T_FOR_OUT1_Msk (0x20000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT1_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT2_T_FOR_OUT1_Pos (18UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT2_T_FOR_OUT1 (Bit 18)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT2_T_FOR_OUT1_Msk (0x40000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT2_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT3_T_FOR_OUT1_Pos (19UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT3_T_FOR_OUT1 (Bit 19)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT3_T_FOR_OUT1_Msk (0x80000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT3_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT4_T_FOR_OUT1_Pos (20UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT4_T_FOR_OUT1 (Bit 20)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT4_T_FOR_OUT1_Msk (0x100000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT4_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT5_T_FOR_OUT1_Pos (21UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT5_T_FOR_OUT1 (Bit 21)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT5_T_FOR_OUT1_Msk (0x200000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT5_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT6_T_FOR_OUT1_Pos (22UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT6_T_FOR_OUT1 (Bit 22)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT6_T_FOR_OUT1_Msk (0x400000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT6_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT7_T_FOR_OUT1_Pos (23UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT7_T_FOR_OUT1 (Bit 23)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD0_PT7_T_FOR_OUT1_Msk (0x800000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD0_PT7_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT0_T_FOR_OUT1_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT0_T_FOR_OUT1 (Bit 24)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT0_T_FOR_OUT1_Msk (0x1000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT0_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT1_T_FOR_OUT1_Pos (25UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT1_T_FOR_OUT1 (Bit 25)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT1_T_FOR_OUT1_Msk (0x2000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT1_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT2_T_FOR_OUT1_Pos (26UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT2_T_FOR_OUT1 (Bit 26)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT2_T_FOR_OUT1_Msk (0x4000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT2_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT3_T_FOR_OUT1_Pos (27UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT3_T_FOR_OUT1 (Bit 27)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT3_T_FOR_OUT1_Msk (0x8000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT3_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT4_T_FOR_OUT1_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT4_T_FOR_OUT1 (Bit 28)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT4_T_FOR_OUT1_Msk (0x10000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT4_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT5_T_FOR_OUT1_Pos (29UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT5_T_FOR_OUT1 (Bit 29)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT5_T_FOR_OUT1_Msk (0x20000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT5_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT6_T_FOR_OUT1_Pos (30UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT6_T_FOR_OUT1 (Bit 30)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT6_T_FOR_OUT1_Msk (0x40000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT6_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT7_T_FOR_OUT1_Pos (31UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT7_T_FOR_OUT1 (Bit 31)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT0_PLD1_PT7_T_FOR_OUT1_Msk (0x80000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT0: PLD1_PT7_T_FOR_OUT1 (Bitfield-Mask: 0x01)*/ +/* ============================================== UDB_UDBPAIR_UDBSNG.PLD_ORT1 ============================================== */ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT0_T_FOR_OUT2_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT0_T_FOR_OUT2 (Bit 0)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT0_T_FOR_OUT2_Msk (0x1UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT0_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT1_T_FOR_OUT2_Pos (1UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT1_T_FOR_OUT2 (Bit 1)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT1_T_FOR_OUT2_Msk (0x2UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT1_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT2_T_FOR_OUT2_Pos (2UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT2_T_FOR_OUT2 (Bit 2)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT2_T_FOR_OUT2_Msk (0x4UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT2_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT3_T_FOR_OUT2_Pos (3UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT3_T_FOR_OUT2 (Bit 3)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT3_T_FOR_OUT2_Msk (0x8UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT3_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT4_T_FOR_OUT2_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT4_T_FOR_OUT2 (Bit 4)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT4_T_FOR_OUT2_Msk (0x10UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT4_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT5_T_FOR_OUT2_Pos (5UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT5_T_FOR_OUT2 (Bit 5)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT5_T_FOR_OUT2_Msk (0x20UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT5_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT6_T_FOR_OUT2_Pos (6UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT6_T_FOR_OUT2 (Bit 6)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT6_T_FOR_OUT2_Msk (0x40UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT6_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT7_T_FOR_OUT2_Pos (7UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT7_T_FOR_OUT2 (Bit 7)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT7_T_FOR_OUT2_Msk (0x80UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT7_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT0_T_FOR_OUT2_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT0_T_FOR_OUT2 (Bit 8)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT0_T_FOR_OUT2_Msk (0x100UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT0_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT1_T_FOR_OUT2_Pos (9UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT1_T_FOR_OUT2 (Bit 9)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT1_T_FOR_OUT2_Msk (0x200UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT1_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT2_T_FOR_OUT2_Pos (10UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT2_T_FOR_OUT2 (Bit 10)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT2_T_FOR_OUT2_Msk (0x400UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT2_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT3_T_FOR_OUT2_Pos (11UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT3_T_FOR_OUT2 (Bit 11)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT3_T_FOR_OUT2_Msk (0x800UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT3_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT4_T_FOR_OUT2_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT4_T_FOR_OUT2 (Bit 12)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT4_T_FOR_OUT2_Msk (0x1000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT4_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT5_T_FOR_OUT2_Pos (13UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT5_T_FOR_OUT2 (Bit 13)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT5_T_FOR_OUT2_Msk (0x2000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT5_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT6_T_FOR_OUT2_Pos (14UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT6_T_FOR_OUT2 (Bit 14)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT6_T_FOR_OUT2_Msk (0x4000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT6_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT7_T_FOR_OUT2_Pos (15UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT7_T_FOR_OUT2 (Bit 15)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT7_T_FOR_OUT2_Msk (0x8000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT7_T_FOR_OUT2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT0_T_FOR_OUT3_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT0_T_FOR_OUT3 (Bit 16)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT0_T_FOR_OUT3_Msk (0x10000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT0_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT1_T_FOR_OUT3_Pos (17UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT1_T_FOR_OUT3 (Bit 17)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT1_T_FOR_OUT3_Msk (0x20000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT1_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT2_T_FOR_OUT3_Pos (18UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT2_T_FOR_OUT3 (Bit 18)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT2_T_FOR_OUT3_Msk (0x40000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT2_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT3_T_FOR_OUT3_Pos (19UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT3_T_FOR_OUT3 (Bit 19)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT3_T_FOR_OUT3_Msk (0x80000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT3_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT4_T_FOR_OUT3_Pos (20UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT4_T_FOR_OUT3 (Bit 20)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT4_T_FOR_OUT3_Msk (0x100000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT4_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT5_T_FOR_OUT3_Pos (21UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT5_T_FOR_OUT3 (Bit 21)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT5_T_FOR_OUT3_Msk (0x200000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT5_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT6_T_FOR_OUT3_Pos (22UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT6_T_FOR_OUT3 (Bit 22)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT6_T_FOR_OUT3_Msk (0x400000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT6_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT7_T_FOR_OUT3_Pos (23UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT7_T_FOR_OUT3 (Bit 23)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD0_PT7_T_FOR_OUT3_Msk (0x800000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD0_PT7_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT0_T_FOR_OUT3_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT0_T_FOR_OUT3 (Bit 24)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT0_T_FOR_OUT3_Msk (0x1000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT0_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT1_T_FOR_OUT3_Pos (25UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT1_T_FOR_OUT3 (Bit 25)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT1_T_FOR_OUT3_Msk (0x2000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT1_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT2_T_FOR_OUT3_Pos (26UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT2_T_FOR_OUT3 (Bit 26)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT2_T_FOR_OUT3_Msk (0x4000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT2_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT3_T_FOR_OUT3_Pos (27UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT3_T_FOR_OUT3 (Bit 27)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT3_T_FOR_OUT3_Msk (0x8000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT3_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT4_T_FOR_OUT3_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT4_T_FOR_OUT3 (Bit 28)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT4_T_FOR_OUT3_Msk (0x10000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT4_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT5_T_FOR_OUT3_Pos (29UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT5_T_FOR_OUT3 (Bit 29)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT5_T_FOR_OUT3_Msk (0x20000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT5_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT6_T_FOR_OUT3_Pos (30UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT6_T_FOR_OUT3 (Bit 30)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT6_T_FOR_OUT3_Msk (0x40000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT6_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT7_T_FOR_OUT3_Pos (31UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT7_T_FOR_OUT3 (Bit 31)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_ORT1_PLD1_PT7_T_FOR_OUT3_Msk (0x80000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_ORT1: PLD1_PT7_T_FOR_OUT3 (Bitfield-Mask: 0x01)*/ +/* ============================================== UDB_UDBPAIR_UDBSNG.PLD_CFG0 ============================================== */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC0_CEN_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC0_CEN (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC0_CEN_Msk (0x1UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC0_CEN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC0_DFF_C_Pos (1UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC0_DFF_C (Bit 1) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC0_DFF_C_Msk (0x2UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC0_DFF_C (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC1_CEN_Pos (2UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC1_CEN (Bit 2) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC1_CEN_Msk (0x4UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC1_CEN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC1_DFF_C_Pos (3UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC1_DFF_C (Bit 3) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC1_DFF_C_Msk (0x8UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC1_DFF_C (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC2_CEN_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC2_CEN (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC2_CEN_Msk (0x10UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC2_CEN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC2_DFF_C_Pos (5UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC2_DFF_C (Bit 5) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC2_DFF_C_Msk (0x20UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC2_DFF_C (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC3_CEN_Pos (6UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC3_CEN (Bit 6) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC3_CEN_Msk (0x40UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC3_CEN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC3_DFF_C_Pos (7UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC3_DFF_C (Bit 7) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC3_DFF_C_Msk (0x80UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC3_DFF_C (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC0_CEN_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC0_CEN (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC0_CEN_Msk (0x100UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC0_CEN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC0_DFF_C_Pos (9UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC0_DFF_C (Bit 9) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC0_DFF_C_Msk (0x200UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC0_DFF_C (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC1_CEN_Pos (10UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC1_CEN (Bit 10) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC1_CEN_Msk (0x400UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC1_CEN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC1_DFF_C_Pos (11UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC1_DFF_C (Bit 11) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC1_DFF_C_Msk (0x800UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC1_DFF_C (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC2_CEN_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC2_CEN (Bit 12) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC2_CEN_Msk (0x1000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC2_CEN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC2_DFF_C_Pos (13UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC2_DFF_C (Bit 13) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC2_DFF_C_Msk (0x2000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC2_DFF_C (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC3_CEN_Pos (14UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC3_CEN (Bit 14) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC3_CEN_Msk (0x4000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC3_CEN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC3_DFF_C_Pos (15UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC3_DFF_C (Bit 15) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC3_DFF_C_Msk (0x8000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC3_DFF_C (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC0_XORFB_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC0_XORFB (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC0_XORFB_Msk (0x30000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC0_XORFB (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC1_XORFB_Pos (18UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC1_XORFB (Bit 18) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC1_XORFB_Msk (0xc0000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC1_XORFB (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC2_XORFB_Pos (20UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC2_XORFB (Bit 20) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC2_XORFB_Msk (0x300000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC2_XORFB (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC3_XORFB_Pos (22UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC3_XORFB (Bit 22) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD0_MC3_XORFB_Msk (0xc00000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD0_MC3_XORFB (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC0_XORFB_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC0_XORFB (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC0_XORFB_Msk (0x3000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC0_XORFB (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC1_XORFB_Pos (26UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC1_XORFB (Bit 26) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC1_XORFB_Msk (0xc000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC1_XORFB (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC2_XORFB_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC2_XORFB (Bit 28) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC2_XORFB_Msk (0x30000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC2_XORFB (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC3_XORFB_Pos (30UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC3_XORFB (Bit 30) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG0_PLD1_MC3_XORFB_Msk (0xc0000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG0: PLD1_MC3_XORFB (Bitfield-Mask: 0x03)*/ +/* ============================================== UDB_UDBPAIR_UDBSNG.PLD_CFG1 ============================================== */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC0_SET_SEL_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC0_SET_SEL (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC0_SET_SEL_Msk (0x1UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC0_SET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC0_RESET_SEL_Pos (1UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC0_RESET_SEL (Bit 1) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC0_RESET_SEL_Msk (0x2UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC0_RESET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC1_SET_SEL_Pos (2UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC1_SET_SEL (Bit 2) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC1_SET_SEL_Msk (0x4UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC1_SET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC1_RESET_SEL_Pos (3UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC1_RESET_SEL (Bit 3) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC1_RESET_SEL_Msk (0x8UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC1_RESET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC2_SET_SEL_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC2_SET_SEL (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC2_SET_SEL_Msk (0x10UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC2_SET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC2_RESET_SEL_Pos (5UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC2_RESET_SEL (Bit 5) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC2_RESET_SEL_Msk (0x20UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC2_RESET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC3_SET_SEL_Pos (6UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC3_SET_SEL (Bit 6) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC3_SET_SEL_Msk (0x40UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC3_SET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC3_RESET_SEL_Pos (7UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC3_RESET_SEL (Bit 7) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC3_RESET_SEL_Msk (0x80UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC3_RESET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC0_SET_SEL_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC0_SET_SEL (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC0_SET_SEL_Msk (0x100UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC0_SET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC0_RESET_SEL_Pos (9UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC0_RESET_SEL (Bit 9) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC0_RESET_SEL_Msk (0x200UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC0_RESET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC1_SET_SEL_Pos (10UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC1_SET_SEL (Bit 10) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC1_SET_SEL_Msk (0x400UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC1_SET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC1_RESET_SEL_Pos (11UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC1_RESET_SEL (Bit 11)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC1_RESET_SEL_Msk (0x800UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC1_RESET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC2_SET_SEL_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC2_SET_SEL (Bit 12) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC2_SET_SEL_Msk (0x1000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC2_SET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC2_RESET_SEL_Pos (13UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC2_RESET_SEL (Bit 13)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC2_RESET_SEL_Msk (0x2000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC2_RESET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC3_SET_SEL_Pos (14UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC3_SET_SEL (Bit 14) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC3_SET_SEL_Msk (0x4000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC3_SET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC3_RESET_SEL_Pos (15UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC3_RESET_SEL (Bit 15)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC3_RESET_SEL_Msk (0x8000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC3_RESET_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC0_BYPASS_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC0_BYPASS (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC0_BYPASS_Msk (0x10000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC0_BYPASS (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC1_BYPASS_Pos (18UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC1_BYPASS (Bit 18) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC1_BYPASS_Msk (0x40000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC1_BYPASS (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC2_BYPASS_Pos (20UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC2_BYPASS (Bit 20) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC2_BYPASS_Msk (0x100000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC2_BYPASS (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC3_BYPASS_Pos (22UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC3_BYPASS (Bit 22) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD0_MC3_BYPASS_Msk (0x400000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD0_MC3_BYPASS (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC0_BYPASS_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC0_BYPASS (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC0_BYPASS_Msk (0x1000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC0_BYPASS (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC1_BYPASS_Pos (26UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC1_BYPASS (Bit 26) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC1_BYPASS_Msk (0x4000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC1_BYPASS (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC2_BYPASS_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC2_BYPASS (Bit 28) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC2_BYPASS_Msk (0x10000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC2_BYPASS (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC3_BYPASS_Pos (30UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC3_BYPASS (Bit 30) */ +#define UDB_UDBPAIR_UDBSNG_PLD_CFG1_PLD1_MC3_BYPASS_Msk (0x40000000UL) /*!< UDB_UDBPAIR_UDBSNG PLD_CFG1: PLD1_MC3_BYPASS (Bitfield-Mask: 0x01)*/ +/* ============================================= UDB_UDBPAIR_UDBSNG.DPATH_CFG0 ============================================= */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_RAD0_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: RAD0 (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_RAD0_Msk (0x7UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: RAD0 (Bitfield-Mask: 0x07) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_RAD1_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: RAD1 (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_RAD1_Msk (0x70UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: RAD1 (Bitfield-Mask: 0x07) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_RAD2_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: RAD2 (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_RAD2_Msk (0x700UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: RAD2 (Bitfield-Mask: 0x07) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS0_Pos (11UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS0 (Bit 11) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS0_Msk (0x800UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS1_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS1 (Bit 12) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS1_Msk (0x1000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS2_Pos (13UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS2 (Bit 13) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS2_Msk (0x2000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS2 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS3_Pos (14UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS3 (Bit 14) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS3_Msk (0x4000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS3 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS4_Pos (15UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS4 (Bit 15) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS4_Msk (0x8000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS4 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_F0_LD_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: F0_LD (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_F0_LD_Msk (0x70000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: F0_LD (Bitfield-Mask: 0x07)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS5_Pos (19UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS5 (Bit 19) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_DP_RTE_BYPASS5_Msk (0x80000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: DP_RTE_BYPASS5 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_F1_LD_Pos (20UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: F1_LD (Bit 20) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_F1_LD_Msk (0x700000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: F1_LD (Bitfield-Mask: 0x07)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_D0_LD_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: D0_LD (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_D0_LD_Msk (0x7000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: D0_LD (Bitfield-Mask: 0x07)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_D1_LD_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: D1_LD (Bit 28) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG0_D1_LD_Msk (0x70000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG0: D1_LD (Bitfield-Mask: 0x07)*/ +/* ============================================= UDB_UDBPAIR_UDBSNG.DPATH_CFG1 ============================================= */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_SI_MUX_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: SI_MUX (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_SI_MUX_Msk (0x7UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: SI_MUX (Bitfield-Mask: 0x07)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_CI_MUX_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: CI_MUX (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_CI_MUX_Msk (0x70UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: CI_MUX (Bitfield-Mask: 0x07)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT0_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT0 (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT0_Msk (0xf00UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT0 (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT1_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT1 (Bit 12) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT1_Msk (0xf000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT1 (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT2_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT2 (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT2_Msk (0xf0000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT2 (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT3_Pos (20UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT3 (Bit 20) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT3_Msk (0xf00000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT3 (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT4_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT4 (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT4_Msk (0xf000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT4 (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT5_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT5 (Bit 28) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG1_OUT5_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG1: OUT5 (Bitfield-Mask: 0x0f) */ +/* ============================================= UDB_UDBPAIR_UDBSNG.DPATH_CFG2 ============================================= */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG2_OUT_SYNC_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG2: OUT_SYNC (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG2_OUT_SYNC_Msk (0x3fUL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG2: OUT_SYNC (Bitfield-Mask: 0x3f)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG2_AMASK_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG2: AMASK (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG2_AMASK_Msk (0xff00UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG2: AMASK (Bitfield-Mask: 0xff)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG2_CMASK0_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG2: CMASK0 (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG2_CMASK0_Msk (0xff0000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG2: CMASK0 (Bitfield-Mask: 0xff)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG2_CMASK1_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG2: CMASK1 (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG2_CMASK1_Msk (0xff000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG2: CMASK1 (Bitfield-Mask: 0xff)*/ +/* ============================================= UDB_UDBPAIR_UDBSNG.DPATH_CFG3 ============================================= */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_SI_SELA_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: SI_SELA (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_SI_SELA_Msk (0x3UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: SI_SELA (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_SI_SELB_Pos (2UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: SI_SELB (Bit 2) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_SI_SELB_Msk (0xcUL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: SI_SELB (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_DEF_SI_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: DEF_SI (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_DEF_SI_Msk (0x10UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: DEF_SI (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_AMASK_EN_Pos (5UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: AMASK_EN (Bit 5) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_AMASK_EN_Msk (0x20UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: AMASK_EN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CMASK0_EN_Pos (6UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CMASK0_EN (Bit 6) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CMASK0_EN_Msk (0x40UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CMASK0_EN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CMASK1_EN_Pos (7UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CMASK1_EN (Bit 7) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CMASK1_EN_Msk (0x80UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CMASK1_EN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CI_SELA_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CI_SELA (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CI_SELA_Msk (0x300UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CI_SELA (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CI_SELB_Pos (10UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CI_SELB (Bit 10) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CI_SELB_Msk (0xc00UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CI_SELB (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CMP_SELA_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CMP_SELA (Bit 12) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CMP_SELA_Msk (0x3000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CMP_SELA (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CMP_SELB_Pos (14UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CMP_SELB (Bit 14) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CMP_SELB_Msk (0xc000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CMP_SELB (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CHAIN0_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CHAIN0 (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CHAIN0_Msk (0x10000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CHAIN0 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CHAIN1_Pos (17UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CHAIN1 (Bit 17) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CHAIN1_Msk (0x20000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CHAIN1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CHAIN_FB_Pos (18UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CHAIN_FB (Bit 18) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CHAIN_FB_Msk (0x40000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CHAIN_FB (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CHAIN_CMSB_Pos (19UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CHAIN_CMSB (Bit 19) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_CHAIN_CMSB_Msk (0x80000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: CHAIN_CMSB (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_MSB_SEL_Pos (20UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: MSB_SEL (Bit 20) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_MSB_SEL_Msk (0x700000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: MSB_SEL (Bitfield-Mask: 0x07)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_MSB_EN_Pos (23UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: MSB_EN (Bit 23) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_MSB_EN_Msk (0x800000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: MSB_EN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_F0_INSEL_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: F0_INSEL (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_F0_INSEL_Msk (0x3000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: F0_INSEL (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_F1_INSEL_Pos (26UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: F1_INSEL (Bit 26) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_F1_INSEL_Msk (0xc000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: F1_INSEL (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_MSB_SI_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: MSB_SI (Bit 28) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_MSB_SI_Msk (0x10000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: MSB_SI (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_PI_DYN_Pos (29UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: PI_DYN (Bit 29) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_PI_DYN_Msk (0x20000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: PI_DYN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_SHIFT_SEL_Pos (30UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: SHIFT_SEL (Bit 30) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_SHIFT_SEL_Msk (0x40000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: SHIFT_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_PI_SEL_Pos (31UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: PI_SEL (Bit 31) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG3_PI_SEL_Msk (0x80000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG3: PI_SEL (Bitfield-Mask: 0x01)*/ +/* ============================================= UDB_UDBPAIR_UDBSNG.DPATH_CFG4 ============================================= */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_EXT_CRCPRS_Pos (1UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: EXT_CRCPRS (Bit 1) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_EXT_CRCPRS_Msk (0x2UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: EXT_CRCPRS (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_FIFO_ASYNC_Pos (2UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: FIFO_ASYNC (Bit 2) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_FIFO_ASYNC_Msk (0x4UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: FIFO_ASYNC (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_FIFO_EDGE_Pos (3UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: FIFO_EDGE (Bit 3) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_FIFO_EDGE_Msk (0x8UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: FIFO_EDGE (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_FIFO_CAP_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: FIFO_CAP (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_FIFO_CAP_Msk (0x10UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: FIFO_CAP (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_FIFO_FAST_Pos (5UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: FIFO_FAST (Bit 5) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_FIFO_FAST_Msk (0x20UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: FIFO_FAST (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_F0_CK_INV_Pos (6UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: F0_CK_INV (Bit 6) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_F0_CK_INV_Msk (0x40UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: F0_CK_INV (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_F1_CK_INV_Pos (7UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: F1_CK_INV (Bit 7) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_F1_CK_INV_Msk (0x80UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: F1_CK_INV (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_F0_DYN_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: F0_DYN (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_F0_DYN_Msk (0x100UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: F0_DYN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_F1_DYN_Pos (9UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: F1_DYN (Bit 9) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_F1_DYN_Msk (0x200UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: F1_DYN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_FIFO_ADD_SYNC_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: FIFO_ADD_SYNC (Bit 12) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_CFG4_FIFO_ADD_SYNC_Msk (0x1000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_CFG4: FIFO_ADD_SYNC (Bitfield-Mask: 0x01)*/ +/* ============================================== UDB_UDBPAIR_UDBSNG.SC_CFG0 =============================================== */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_CTL_MD0_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: CTL_MD0 (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_CTL_MD0_Msk (0xffUL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: CTL_MD0 (Bitfield-Mask: 0xff) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_CTL_MD1_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: CTL_MD1 (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_CTL_MD1_Msk (0xff00UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: CTL_MD1 (Bitfield-Mask: 0xff) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_STAT_MD_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: STAT_MD (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_STAT_MD_Msk (0xff0000UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: STAT_MD (Bitfield-Mask: 0xff) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_SC_OUT_CTL_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: SC_OUT_CTL (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_SC_OUT_CTL_Msk (0x3000000UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: SC_OUT_CTL (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_SC_INT_MD_Pos (26UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: SC_INT_MD (Bit 26) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_SC_INT_MD_Msk (0x4000000UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: SC_INT_MD (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_SC_SYNC_MD_Pos (27UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: SC_SYNC_MD (Bit 27) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_SC_SYNC_MD_Msk (0x8000000UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: SC_SYNC_MD (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_SC_EXT_RES_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: SC_EXT_RES (Bit 28) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG0_SC_EXT_RES_Msk (0x10000000UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG0: SC_EXT_RES (Bitfield-Mask: 0x01)*/ +/* ============================================== UDB_UDBPAIR_UDBSNG.SC_CFG1 =============================================== */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG1_CNT_LD_SEL_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG1: CNT_LD_SEL (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG1_CNT_LD_SEL_Msk (0x3UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG1: CNT_LD_SEL (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_SC_CFG1_CNT_EN_SEL_Pos (2UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG1: CNT_EN_SEL (Bit 2) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG1_CNT_EN_SEL_Msk (0xcUL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG1: CNT_EN_SEL (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_SC_CFG1_ROUTE_LD_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG1: ROUTE_LD (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG1_ROUTE_LD_Msk (0x10UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG1: ROUTE_LD (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_SC_CFG1_ROUTE_EN_Pos (5UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG1: ROUTE_EN (Bit 5) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG1_ROUTE_EN_Msk (0x20UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG1: ROUTE_EN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_SC_CFG1_ALT_CNT_Pos (6UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG1: ALT_CNT (Bit 6) */ +#define UDB_UDBPAIR_UDBSNG_SC_CFG1_ALT_CNT_Msk (0x40UL) /*!< UDB_UDBPAIR_UDBSNG SC_CFG1: ALT_CNT (Bitfield-Mask: 0x01) */ +/* ============================================== UDB_UDBPAIR_UDBSNG.RC_CFG0 =============================================== */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_EN_SEL_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_EN_SEL (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_EN_SEL_Msk (0x3UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_EN_SEL (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_EN_MODE_Pos (2UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_EN_MODE (Bit 2) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_EN_MODE_Msk (0xcUL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_EN_MODE (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_EN_INV_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_EN_INV (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_EN_INV_Msk (0x10UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_EN_INV (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_INV_Pos (5UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_INV (Bit 5) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_INV_Msk (0x20UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_INV (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_RES_SEL0_OR_FRES_Pos (6UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_RES_SEL0_OR_FRES (Bit 6)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_RES_SEL0_OR_FRES_Msk (0x40UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_RES_SEL0_OR_FRES (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_RES_SEL1_Pos (7UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_RES_SEL1 (Bit 7) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD0_RC_RES_SEL1_Msk (0x80UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD0_RC_RES_SEL1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD1_RC_EN_SEL_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD1_RC_EN_SEL (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD1_RC_EN_SEL_Msk (0x300UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD1_RC_EN_SEL (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD1_RC_EN_MODE_Pos (10UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD1_RC_EN_MODE (Bit 10) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD1_RC_EN_MODE_Msk (0xc00UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD1_RC_EN_MODE (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD1_RC_EN_INV_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD1_RC_EN_INV (Bit 12) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD1_RC_EN_INV_Msk (0x1000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD1_RC_EN_INV (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD1_RC_INV_Pos (13UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD1_RC_INV (Bit 13) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD1_RC_INV_Msk (0x2000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD1_RC_INV (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD1_RC_RES_SEL0_OR_FRES_Pos (14UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD1_RC_RES_SEL0_OR_FRES (Bit 14)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_PLD1_RC_RES_SEL0_OR_FRES_Msk (0x4000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: PLD1_RC_RES_SEL0_OR_FRES (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_EN_SEL_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_EN_SEL (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_EN_SEL_Msk (0x30000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_EN_SEL (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_EN_MODE_Pos (18UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_EN_MODE (Bit 18) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_EN_MODE_Msk (0xc0000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_EN_MODE (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_EN_INV_Pos (20UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_EN_INV (Bit 20) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_EN_INV_Msk (0x100000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_EN_INV (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_INV_Pos (21UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_INV (Bit 21) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_INV_Msk (0x200000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_INV (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_RES_SEL0_OR_FRES_Pos (22UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_RES_SEL0_OR_FRES (Bit 22)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_RES_SEL0_OR_FRES_Msk (0x400000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_RES_SEL0_OR_FRES (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_RES_SEL1_Pos (23UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_RES_SEL1 (Bit 23) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_DP_RC_RES_SEL1_Msk (0x800000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: DP_RC_RES_SEL1 (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_EN_SEL_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_EN_SEL (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_EN_SEL_Msk (0x3000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_EN_SEL (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_EN_MODE_Pos (26UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_EN_MODE (Bit 26) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_EN_MODE_Msk (0xc000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_EN_MODE (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_EN_INV_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_EN_INV (Bit 28) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_EN_INV_Msk (0x10000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_EN_INV (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_INV_Pos (29UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_INV (Bit 29) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_INV_Msk (0x20000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_INV (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_RES_SEL0_OR_FRES_Pos (30UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_RES_SEL0_OR_FRES (Bit 30)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_RES_SEL0_OR_FRES_Msk (0x40000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_RES_SEL0_OR_FRES (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_RES_SEL1_Pos (31UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_RES_SEL1 (Bit 31) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG0_SC_RC_RES_SEL1_Msk (0x80000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG0: SC_RC_RES_SEL1 (Bitfield-Mask: 0x01)*/ +/* ============================================== UDB_UDBPAIR_UDBSNG.RC_CFG1 =============================================== */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_PLD0_CK_SEL_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: PLD0_CK_SEL (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_PLD0_CK_SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: PLD0_CK_SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_PLD1_CK_SEL_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: PLD1_CK_SEL (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_PLD1_CK_SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: PLD1_CK_SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_DP_CK_SEL_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: DP_CK_SEL (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_DP_CK_SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: DP_CK_SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_SC_CK_SEL_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: SC_CK_SEL (Bit 12) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_SC_CK_SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: SC_CK_SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_RES_SEL_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: RES_SEL (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_RES_SEL_Msk (0x30000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: RES_SEL (Bitfield-Mask: 0x03) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_RES_POL_Pos (18UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: RES_POL (Bit 18) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_RES_POL_Msk (0x40000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: RES_POL (Bitfield-Mask: 0x01) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_EN_RES_CNTCTL_Pos (19UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: EN_RES_CNTCTL (Bit 19) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_EN_RES_CNTCTL_Msk (0x80000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: EN_RES_CNTCTL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_DP_RES_POL_Pos (22UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: DP_RES_POL (Bit 22) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_DP_RES_POL_Msk (0x400000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: DP_RES_POL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_SC_RES_POL_Pos (23UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: SC_RES_POL (Bit 23) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_SC_RES_POL_Msk (0x800000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: SC_RES_POL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_ALT_RES_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: ALT_RES (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_ALT_RES_Msk (0x1000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: ALT_RES (Bitfield-Mask: 0x01) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_EXT_SYNC_Pos (25UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: EXT_SYNC (Bit 25) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_EXT_SYNC_Msk (0x2000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: EXT_SYNC (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_EN_RES_STAT_Pos (26UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: EN_RES_STAT (Bit 26) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_EN_RES_STAT_Msk (0x4000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: EN_RES_STAT (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_EN_RES_DP_Pos (27UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: EN_RES_DP (Bit 27) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_EN_RES_DP_Msk (0x8000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: EN_RES_DP (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_EXT_CK_SEL_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: EXT_CK_SEL (Bit 28) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_EXT_CK_SEL_Msk (0x30000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: EXT_CK_SEL (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_PLD0_RES_POL_Pos (30UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: PLD0_RES_POL (Bit 30) */ +#define UDB_UDBPAIR_UDBSNG_RC_CFG1_PLD0_RES_POL_Msk (0x40000000UL) /*!< UDB_UDBPAIR_UDBSNG RC_CFG1: PLD0_RES_POL (Bitfield-Mask: 0x01)*/ +/* ============================================= UDB_UDBPAIR_UDBSNG.DPATH_OPC ============================================== */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_CMP_SEL_Pos (0UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_CMP_SEL (Bit 0) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_CMP_SEL_Msk (0x1UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_CMP_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_SI_SEL_Pos (1UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_SI_SEL (Bit 1) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_SI_SEL_Msk (0x2UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_SI_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_CI_SEL_Pos (2UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_CI_SEL (Bit 2) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_CI_SEL_Msk (0x4UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_CI_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_CFB_EN_Pos (3UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_CFB_EN (Bit 3) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_CFB_EN_Msk (0x8UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_CFB_EN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_A1_WR_SRC_Pos (4UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_A1_WR_SRC (Bit 4) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_A1_WR_SRC_Msk (0x30UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_A1_WR_SRC (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_A0_WR_SRC_Pos (6UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_A0_WR_SRC (Bit 6) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_A0_WR_SRC_Msk (0xc0UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_A0_WR_SRC (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_SHIFT_Pos (8UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_SHIFT (Bit 8) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_SHIFT_Msk (0x300UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_SHIFT (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_SRC_B_Pos (10UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_SRC_B (Bit 10) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_SRC_B_Msk (0xc00UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_SRC_B (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_SRC_A_Pos (12UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_SRC_A (Bit 12) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_SRC_A_Msk (0x1000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_SRC_A (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_FUNC_Pos (13UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_FUNC (Bit 13) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC0_FUNC_Msk (0xe000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC0_FUNC (Bitfield-Mask: 0x07)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_CMP_SEL_Pos (16UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_CMP_SEL (Bit 16) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_CMP_SEL_Msk (0x10000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_CMP_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_SI_SEL_Pos (17UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_SI_SEL (Bit 17) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_SI_SEL_Msk (0x20000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_SI_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_CI_SEL_Pos (18UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_CI_SEL (Bit 18) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_CI_SEL_Msk (0x40000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_CI_SEL (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_CFB_EN_Pos (19UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_CFB_EN (Bit 19) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_CFB_EN_Msk (0x80000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_CFB_EN (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_A1_WR_SRC_Pos (20UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_A1_WR_SRC (Bit 20) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_A1_WR_SRC_Msk (0x300000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_A1_WR_SRC (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_A0_WR_SRC_Pos (22UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_A0_WR_SRC (Bit 22) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_A0_WR_SRC_Msk (0xc00000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_A0_WR_SRC (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_SHIFT_Pos (24UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_SHIFT (Bit 24) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_SHIFT_Msk (0x3000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_SHIFT (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_SRC_B_Pos (26UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_SRC_B (Bit 26) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_SRC_B_Msk (0xc000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_SRC_B (Bitfield-Mask: 0x03)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_SRC_A_Pos (28UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_SRC_A (Bit 28) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_SRC_A_Msk (0x10000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_SRC_A (Bitfield-Mask: 0x01)*/ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_FUNC_Pos (29UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_FUNC (Bit 29) */ +#define UDB_UDBPAIR_UDBSNG_DPATH_OPC_OPC1_FUNC_Msk (0xe0000000UL) /*!< UDB_UDBPAIR_UDBSNG DPATH_OPC: OPC1_FUNC (Bitfield-Mask: 0x07)*/ + + +/* ============================================== UDB_UDBPAIR_ROUTE.TOP_V_BOT ============================================== */ +#define UDB_UDBPAIR_ROUTE_TOP_V_BOT_TOP_V_BOT_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE TOP_V_BOT: TOP_V_BOT (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_TOP_V_BOT_TOP_V_BOT_Msk (0xffffffffUL) /*!< UDB_UDBPAIR_ROUTE TOP_V_BOT: TOP_V_BOT (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LVI1_V_2 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LVI1_V_2_LVI1_V_2_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LVI1_V_2: LVI1_V_2 (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LVI1_V_2_LVI1_V_2_Msk (0xffffffffUL) /*!< UDB_UDBPAIR_ROUTE LVI1_V_2: LVI1_V_2 (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.RVI1_V_2 =============================================== */ +#define UDB_UDBPAIR_ROUTE_RVI1_V_2_RVI1_V_2_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE RVI1_V_2: RVI1_V_2 (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_RVI1_V_2_RVI1_V_2_Msk (0xffffffffUL) /*!< UDB_UDBPAIR_ROUTE RVI1_V_2: RVI1_V_2 (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.TUI_CFG0 =============================================== */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI0SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI0SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI0SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI0SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI1SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI1SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI1SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI1SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI2SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI2SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI2SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI2SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI3SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI3SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI3SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI3SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI4SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI4SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI4SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI4SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI5SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI5SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI5SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI5SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI6SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI6SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI6SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI6SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI7SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI7SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG0_TUI7SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG0: TUI7SEL (Bitfield-Mask: 0x0f) */ +/* ============================================== UDB_UDBPAIR_ROUTE.TUI_CFG1 =============================================== */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI8SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI8SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI8SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI8SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI9SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI9SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI9SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI9SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI10SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI10SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI10SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI10SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI11SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI11SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI11SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI11SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI12SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI12SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI12SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI12SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI13SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI13SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI13SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI13SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI14SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI14SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI14SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI14SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI15SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI15SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG1_TUI15SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG1: TUI15SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.TUI_CFG2 =============================================== */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI16SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI16SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI16SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI16SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI17SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI17SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI17SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI17SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI18SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI18SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI18SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI18SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI19SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI19SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI19SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI19SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI20SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI20SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI20SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI20SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI21SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI21SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI21SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI21SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI22SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI22SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI22SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI22SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI23SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI23SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG2_TUI23SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG2: TUI23SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.TUI_CFG3 =============================================== */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI24SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI24SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI24SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI24SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI25SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI25SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI25SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI25SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI26SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI26SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI26SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI26SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI27SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI27SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI27SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI27SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI28SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI28SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI28SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI28SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI29SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI29SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI29SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI29SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI30SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI30SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI30SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI30SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI31SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI31SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG3_TUI31SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG3: TUI31SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.TUI_CFG4 =============================================== */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI32SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI32SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI32SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI32SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI33SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI33SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI33SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI33SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI34SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI34SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI34SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI34SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI35SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI35SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI35SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI35SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI36SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI36SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI36SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI36SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI37SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI37SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI37SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI37SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI38SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI38SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI38SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI38SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI39SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI39SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG4_TUI39SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG4: TUI39SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.TUI_CFG5 =============================================== */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG5_TUI40SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG5: TUI40SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG5_TUI40SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG5: TUI40SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_TUI_CFG5_TUI41SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG5: TUI41SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_TUI_CFG5_TUI41SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE TUI_CFG5: TUI41SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.BUI_CFG0 =============================================== */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI0SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI0SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI0SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI0SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI1SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI1SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI1SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI1SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI2SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI2SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI2SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI2SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI3SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI3SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI3SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI3SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI4SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI4SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI4SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI4SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI5SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI5SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI5SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI5SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI6SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI6SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI6SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI6SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI7SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI7SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG0_BUI7SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG0: BUI7SEL (Bitfield-Mask: 0x0f) */ +/* ============================================== UDB_UDBPAIR_ROUTE.BUI_CFG1 =============================================== */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI8SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI8SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI8SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI8SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI9SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI9SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI9SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI9SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI10SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI10SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI10SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI10SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI11SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI11SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI11SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI11SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI12SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI12SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI12SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI12SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI13SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI13SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI13SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI13SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI14SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI14SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI14SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI14SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI15SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI15SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG1_BUI15SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG1: BUI15SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.BUI_CFG2 =============================================== */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI16SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI16SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI16SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI16SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI17SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI17SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI17SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI17SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI18SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI18SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI18SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI18SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI19SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI19SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI19SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI19SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI20SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI20SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI20SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI20SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI21SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI21SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI21SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI21SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI22SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI22SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI22SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI22SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI23SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI23SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG2_BUI23SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG2: BUI23SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.BUI_CFG3 =============================================== */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI24SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI24SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI24SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI24SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI25SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI25SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI25SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI25SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI26SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI26SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI26SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI26SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI27SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI27SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI27SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI27SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI28SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI28SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI28SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI28SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI29SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI29SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI29SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI29SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI30SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI30SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI30SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI30SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI31SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI31SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG3_BUI31SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG3: BUI31SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.BUI_CFG4 =============================================== */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI32SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI32SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI32SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI32SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI33SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI33SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI33SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI33SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI34SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI34SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI34SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI34SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI35SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI35SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI35SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI35SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI36SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI36SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI36SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI36SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI37SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI37SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI37SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI37SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI38SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI38SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI38SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI38SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI39SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI39SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG4_BUI39SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG4: BUI39SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.BUI_CFG5 =============================================== */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG5_BUI40SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG5: BUI40SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG5_BUI40SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG5: BUI40SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_BUI_CFG5_BUI41SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG5: BUI41SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_BUI_CFG5_BUI41SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE BUI_CFG5: BUI41SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.RVO_CFG0 =============================================== */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG0_RVO0SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG0: RVO0SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG0_RVO0SEL_Msk (0x1fUL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG0: RVO0SEL (Bitfield-Mask: 0x1f) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG0_RVO1SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG0: RVO1SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG0_RVO1SEL_Msk (0x1f00UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG0: RVO1SEL (Bitfield-Mask: 0x1f) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG0_RVO2SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG0: RVO2SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG0_RVO2SEL_Msk (0x1f0000UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG0: RVO2SEL (Bitfield-Mask: 0x1f) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG0_RVO3SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG0: RVO3SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG0_RVO3SEL_Msk (0x1f000000UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG0: RVO3SEL (Bitfield-Mask: 0x1f) */ +/* ============================================== UDB_UDBPAIR_ROUTE.RVO_CFG1 =============================================== */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG1_RVO4SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG1: RVO4SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG1_RVO4SEL_Msk (0x1fUL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG1: RVO4SEL (Bitfield-Mask: 0x1f) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG1_RVO5SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG1: RVO5SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG1_RVO5SEL_Msk (0x1f00UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG1: RVO5SEL (Bitfield-Mask: 0x1f) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG1_RVO6SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG1: RVO6SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG1_RVO6SEL_Msk (0x1f0000UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG1: RVO6SEL (Bitfield-Mask: 0x1f) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG1_RVO7SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG1: RVO7SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG1_RVO7SEL_Msk (0x1f000000UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG1: RVO7SEL (Bitfield-Mask: 0x1f) */ +/* ============================================== UDB_UDBPAIR_ROUTE.RVO_CFG2 =============================================== */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG2_RVO8SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG2: RVO8SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG2_RVO8SEL_Msk (0x1fUL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG2: RVO8SEL (Bitfield-Mask: 0x1f) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG2_RVO9SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG2: RVO9SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG2_RVO9SEL_Msk (0x1f00UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG2: RVO9SEL (Bitfield-Mask: 0x1f) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG2_RVO10SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG2: RVO10SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG2_RVO10SEL_Msk (0x1f0000UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG2: RVO10SEL (Bitfield-Mask: 0x1f)*/ +#define UDB_UDBPAIR_ROUTE_RVO_CFG2_RVO11SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG2: RVO11SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG2_RVO11SEL_Msk (0x1f000000UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG2: RVO11SEL (Bitfield-Mask: 0x1f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.RVO_CFG3 =============================================== */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG3_RVO12SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG3: RVO12SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG3_RVO12SEL_Msk (0x1fUL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG3: RVO12SEL (Bitfield-Mask: 0x1f)*/ +#define UDB_UDBPAIR_ROUTE_RVO_CFG3_RVO13SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG3: RVO13SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG3_RVO13SEL_Msk (0x1f00UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG3: RVO13SEL (Bitfield-Mask: 0x1f)*/ +#define UDB_UDBPAIR_ROUTE_RVO_CFG3_RVO14SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG3: RVO14SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG3_RVO14SEL_Msk (0x1f0000UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG3: RVO14SEL (Bitfield-Mask: 0x1f)*/ +#define UDB_UDBPAIR_ROUTE_RVO_CFG3_RVO15SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG3: RVO15SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_RVO_CFG3_RVO15SEL_Msk (0x1f000000UL) /*!< UDB_UDBPAIR_ROUTE RVO_CFG3: RVO15SEL (Bitfield-Mask: 0x1f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LVO_CFG0 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO0SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO0SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO0SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO0SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO1SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO1SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO1SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO1SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO2SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO2SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO2SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO2SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO3SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO3SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO3SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO3SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO4SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO4SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO4SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO4SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO5SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO5SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO5SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO5SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO6SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO6SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO6SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO6SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO7SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO7SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG0_LVO7SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG0: LVO7SEL (Bitfield-Mask: 0x0f) */ +/* ============================================== UDB_UDBPAIR_ROUTE.LVO_CFG1 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO8SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO8SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO8SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO8SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO9SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO9SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO9SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO9SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO10SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO10SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO10SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO10SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO11SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO11SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO11SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO11SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO12SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO12SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO12SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO12SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO13SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO13SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO13SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO13SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO14SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO14SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO14SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO14SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO15SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO15SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LVO_CFG1_LVO15SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LVO_CFG1: LVO15SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.RHO_CFG0 =============================================== */ +#define UDB_UDBPAIR_ROUTE_RHO_CFG0_RHOSEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE RHO_CFG0: RHOSEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_RHO_CFG0_RHOSEL_Msk (0xffffffffUL) /*!< UDB_UDBPAIR_ROUTE RHO_CFG0: RHOSEL (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.RHO_CFG1 =============================================== */ +#define UDB_UDBPAIR_ROUTE_RHO_CFG1_RHOSEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE RHO_CFG1: RHOSEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_RHO_CFG1_RHOSEL_Msk (0xffffffffUL) /*!< UDB_UDBPAIR_ROUTE RHO_CFG1: RHOSEL (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.RHO_CFG2 =============================================== */ +#define UDB_UDBPAIR_ROUTE_RHO_CFG2_RHOSEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE RHO_CFG2: RHOSEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_RHO_CFG2_RHOSEL_Msk (0xffffffffUL) /*!< UDB_UDBPAIR_ROUTE RHO_CFG2: RHOSEL (Bitfield-Mask: 0xffffffff)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG0 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO0SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO0SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO0SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO0SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO1SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO1SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO1SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO1SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO2SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO2SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO2SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO2SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO3SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO3SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO3SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO3SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO4SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO4SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO4SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO4SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO5SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO5SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO5SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO5SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO6SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO6SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO6SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO6SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO7SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO7SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG0_LHO7SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG0: LHO7SEL (Bitfield-Mask: 0x0f) */ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG1 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO8SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO8SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO8SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO8SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO9SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO9SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO9SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO9SEL (Bitfield-Mask: 0x0f) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO10SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO10SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO10SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO10SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO11SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO11SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO11SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO11SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO12SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO12SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO12SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO12SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO13SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO13SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO13SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO13SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO14SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO14SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO14SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO14SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO15SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO15SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG1_LHO15SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG1: LHO15SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG2 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO16SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO16SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO16SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO16SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO17SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO17SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO17SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO17SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO18SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO18SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO18SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO18SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO19SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO19SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO19SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO19SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO20SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO20SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO20SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO20SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO21SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO21SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO21SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO21SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO22SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO22SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO22SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO22SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO23SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO23SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG2_LHO23SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG2: LHO23SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG3 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO24SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO24SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO24SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO24SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO25SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO25SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO25SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO25SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO26SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO26SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO26SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO26SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO27SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO27SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO27SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO27SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO28SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO28SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO28SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO28SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO29SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO29SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO29SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO29SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO30SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO30SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO30SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO30SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO31SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO31SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG3_LHO31SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG3: LHO31SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG4 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO32SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO32SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO32SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO32SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO33SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO33SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO33SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO33SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO34SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO34SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO34SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO34SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO35SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO35SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO35SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO35SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO36SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO36SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO36SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO36SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO37SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO37SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO37SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO37SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO38SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO38SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO38SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO38SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO39SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO39SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG4_LHO39SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG4: LHO39SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG5 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO40SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO40SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO40SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO40SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO41SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO41SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO41SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO41SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO42SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO42SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO42SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO42SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO43SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO43SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO43SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO43SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO44SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO44SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO44SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO44SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO45SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO45SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO45SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO45SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO46SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO46SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO46SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO46SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO47SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO47SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG5_LHO47SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG5: LHO47SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG6 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO48SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO48SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO48SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO48SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO49SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO49SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO49SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO49SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO50SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO50SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO50SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO50SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO51SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO51SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO51SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO51SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO52SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO52SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO52SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO52SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO53SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO53SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO53SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO53SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO54SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO54SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO54SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO54SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO55SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO55SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG6_LHO55SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG6: LHO55SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG7 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO56SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO56SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO56SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO56SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO57SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO57SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO57SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO57SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO58SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO58SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO58SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO58SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO59SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO59SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO59SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO59SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO60SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO60SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO60SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO60SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO61SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO61SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO61SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO61SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO62SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO62SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO62SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO62SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO63SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO63SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG7_LHO63SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG7: LHO63SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG8 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO64SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO64SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO64SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO64SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO65SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO65SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO65SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO65SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO66SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO66SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO66SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO66SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO67SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO67SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO67SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO67SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO68SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO68SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO68SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO68SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO69SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO69SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO69SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO69SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO70SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO70SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO70SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO70SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO71SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO71SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG8_LHO71SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG8: LHO71SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG9 =============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO72SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO72SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO72SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO72SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO73SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO73SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO73SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO73SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO74SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO74SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO74SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO74SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO75SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO75SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO75SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO75SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO76SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO76SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO76SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO76SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO77SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO77SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO77SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO77SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO78SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO78SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO78SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO78SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO79SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO79SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG9_LHO79SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG9: LHO79SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG10 ============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO80SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO80SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO80SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO80SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO81SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO81SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO81SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO81SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO82SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO82SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO82SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO82SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO83SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO83SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO83SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO83SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO84SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO84SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO84SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO84SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO85SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO85SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO85SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO85SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO86SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO86SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO86SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO86SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO87SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO87SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG10_LHO87SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG10: LHO87SEL (Bitfield-Mask: 0x0f)*/ +/* ============================================== UDB_UDBPAIR_ROUTE.LHO_CFG11 ============================================== */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO88SEL_Pos (0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO88SEL (Bit 0) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO88SEL_Msk (0xfUL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO88SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO89SEL_Pos (4UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO89SEL (Bit 4) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO89SEL_Msk (0xf0UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO89SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO90SEL_Pos (8UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO90SEL (Bit 8) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO90SEL_Msk (0xf00UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO90SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO91SEL_Pos (12UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO91SEL (Bit 12) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO91SEL_Msk (0xf000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO91SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO92SEL_Pos (16UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO92SEL (Bit 16) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO92SEL_Msk (0xf0000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO92SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO93SEL_Pos (20UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO93SEL (Bit 20) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO93SEL_Msk (0xf00000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO93SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO94SEL_Pos (24UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO94SEL (Bit 24) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO94SEL_Msk (0xf000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO94SEL (Bitfield-Mask: 0x0f)*/ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO95SEL_Pos (28UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO95SEL (Bit 28) */ +#define UDB_UDBPAIR_ROUTE_LHO_CFG11_LHO95SEL_Msk (0xf0000000UL) /*!< UDB_UDBPAIR_ROUTE LHO_CFG11: LHO95SEL (Bitfield-Mask: 0x0f)*/ + + +/* =================================================== UDB_DSI.LVI1_V_2 ==================================================== */ +#define UDB_DSI_LVI1_V_2_LVI1_V_2_Pos (0UL) /*!< UDB_DSI LVI1_V_2: LVI1_V_2 (Bit 0) */ +#define UDB_DSI_LVI1_V_2_LVI1_V_2_Msk (0xffffffffUL) /*!< UDB_DSI LVI1_V_2: LVI1_V_2 (Bitfield-Mask: 0xffffffff) */ +/* =================================================== UDB_DSI.RVI1_V_2 ==================================================== */ +#define UDB_DSI_RVI1_V_2_RVI1_V_2_Pos (0UL) /*!< UDB_DSI RVI1_V_2: RVI1_V_2 (Bit 0) */ +#define UDB_DSI_RVI1_V_2_RVI1_V_2_Msk (0xffffffffUL) /*!< UDB_DSI RVI1_V_2: RVI1_V_2 (Bitfield-Mask: 0xffffffff) */ +/* =================================================== UDB_DSI.DOP_CFG0 ==================================================== */ +#define UDB_DSI_DOP_CFG0_DOP0SEL_Pos (0UL) /*!< UDB_DSI DOP_CFG0: DOP0SEL (Bit 0) */ +#define UDB_DSI_DOP_CFG0_DOP0SEL_Msk (0x1fUL) /*!< UDB_DSI DOP_CFG0: DOP0SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG0_DOP1SEL_Pos (8UL) /*!< UDB_DSI DOP_CFG0: DOP1SEL (Bit 8) */ +#define UDB_DSI_DOP_CFG0_DOP1SEL_Msk (0x1f00UL) /*!< UDB_DSI DOP_CFG0: DOP1SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG0_DOP2SEL_Pos (16UL) /*!< UDB_DSI DOP_CFG0: DOP2SEL (Bit 16) */ +#define UDB_DSI_DOP_CFG0_DOP2SEL_Msk (0x1f0000UL) /*!< UDB_DSI DOP_CFG0: DOP2SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG0_DOP3SEL_Pos (24UL) /*!< UDB_DSI DOP_CFG0: DOP3SEL (Bit 24) */ +#define UDB_DSI_DOP_CFG0_DOP3SEL_Msk (0x1f000000UL) /*!< UDB_DSI DOP_CFG0: DOP3SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.DOP_CFG1 ==================================================== */ +#define UDB_DSI_DOP_CFG1_DOP4SEL_Pos (0UL) /*!< UDB_DSI DOP_CFG1: DOP4SEL (Bit 0) */ +#define UDB_DSI_DOP_CFG1_DOP4SEL_Msk (0x1fUL) /*!< UDB_DSI DOP_CFG1: DOP4SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG1_DOP5SEL_Pos (8UL) /*!< UDB_DSI DOP_CFG1: DOP5SEL (Bit 8) */ +#define UDB_DSI_DOP_CFG1_DOP5SEL_Msk (0x1f00UL) /*!< UDB_DSI DOP_CFG1: DOP5SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG1_DOP6SEL_Pos (16UL) /*!< UDB_DSI DOP_CFG1: DOP6SEL (Bit 16) */ +#define UDB_DSI_DOP_CFG1_DOP6SEL_Msk (0x1f0000UL) /*!< UDB_DSI DOP_CFG1: DOP6SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG1_DOP7SEL_Pos (24UL) /*!< UDB_DSI DOP_CFG1: DOP7SEL (Bit 24) */ +#define UDB_DSI_DOP_CFG1_DOP7SEL_Msk (0x1f000000UL) /*!< UDB_DSI DOP_CFG1: DOP7SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.DOP_CFG2 ==================================================== */ +#define UDB_DSI_DOP_CFG2_DOP8SEL_Pos (0UL) /*!< UDB_DSI DOP_CFG2: DOP8SEL (Bit 0) */ +#define UDB_DSI_DOP_CFG2_DOP8SEL_Msk (0x1fUL) /*!< UDB_DSI DOP_CFG2: DOP8SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG2_DOP9SEL_Pos (8UL) /*!< UDB_DSI DOP_CFG2: DOP9SEL (Bit 8) */ +#define UDB_DSI_DOP_CFG2_DOP9SEL_Msk (0x1f00UL) /*!< UDB_DSI DOP_CFG2: DOP9SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG2_DOP10SEL_Pos (16UL) /*!< UDB_DSI DOP_CFG2: DOP10SEL (Bit 16) */ +#define UDB_DSI_DOP_CFG2_DOP10SEL_Msk (0x1f0000UL) /*!< UDB_DSI DOP_CFG2: DOP10SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG2_DOP11SEL_Pos (24UL) /*!< UDB_DSI DOP_CFG2: DOP11SEL (Bit 24) */ +#define UDB_DSI_DOP_CFG2_DOP11SEL_Msk (0x1f000000UL) /*!< UDB_DSI DOP_CFG2: DOP11SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.DOP_CFG3 ==================================================== */ +#define UDB_DSI_DOP_CFG3_DOP12SEL_Pos (0UL) /*!< UDB_DSI DOP_CFG3: DOP12SEL (Bit 0) */ +#define UDB_DSI_DOP_CFG3_DOP12SEL_Msk (0x1fUL) /*!< UDB_DSI DOP_CFG3: DOP12SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG3_DOP13SEL_Pos (8UL) /*!< UDB_DSI DOP_CFG3: DOP13SEL (Bit 8) */ +#define UDB_DSI_DOP_CFG3_DOP13SEL_Msk (0x1f00UL) /*!< UDB_DSI DOP_CFG3: DOP13SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG3_DOP14SEL_Pos (16UL) /*!< UDB_DSI DOP_CFG3: DOP14SEL (Bit 16) */ +#define UDB_DSI_DOP_CFG3_DOP14SEL_Msk (0x1f0000UL) /*!< UDB_DSI DOP_CFG3: DOP14SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOP_CFG3_DOP15SEL_Pos (24UL) /*!< UDB_DSI DOP_CFG3: DOP15SEL (Bit 24) */ +#define UDB_DSI_DOP_CFG3_DOP15SEL_Msk (0x1f000000UL) /*!< UDB_DSI DOP_CFG3: DOP15SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.DOT_CFG0 ==================================================== */ +#define UDB_DSI_DOT_CFG0_DOT0SEL_Pos (0UL) /*!< UDB_DSI DOT_CFG0: DOT0SEL (Bit 0) */ +#define UDB_DSI_DOT_CFG0_DOT0SEL_Msk (0x1fUL) /*!< UDB_DSI DOT_CFG0: DOT0SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG0_DOT1SEL_Pos (8UL) /*!< UDB_DSI DOT_CFG0: DOT1SEL (Bit 8) */ +#define UDB_DSI_DOT_CFG0_DOT1SEL_Msk (0x1f00UL) /*!< UDB_DSI DOT_CFG0: DOT1SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG0_DOT2SEL_Pos (16UL) /*!< UDB_DSI DOT_CFG0: DOT2SEL (Bit 16) */ +#define UDB_DSI_DOT_CFG0_DOT2SEL_Msk (0x1f0000UL) /*!< UDB_DSI DOT_CFG0: DOT2SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG0_DOT3SEL_Pos (24UL) /*!< UDB_DSI DOT_CFG0: DOT3SEL (Bit 24) */ +#define UDB_DSI_DOT_CFG0_DOT3SEL_Msk (0x1f000000UL) /*!< UDB_DSI DOT_CFG0: DOT3SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.DOT_CFG1 ==================================================== */ +#define UDB_DSI_DOT_CFG1_DOT4SEL_Pos (0UL) /*!< UDB_DSI DOT_CFG1: DOT4SEL (Bit 0) */ +#define UDB_DSI_DOT_CFG1_DOT4SEL_Msk (0x1fUL) /*!< UDB_DSI DOT_CFG1: DOT4SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG1_DOT5SEL_Pos (8UL) /*!< UDB_DSI DOT_CFG1: DOT5SEL (Bit 8) */ +#define UDB_DSI_DOT_CFG1_DOT5SEL_Msk (0x1f00UL) /*!< UDB_DSI DOT_CFG1: DOT5SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG1_DOT6SEL_Pos (16UL) /*!< UDB_DSI DOT_CFG1: DOT6SEL (Bit 16) */ +#define UDB_DSI_DOT_CFG1_DOT6SEL_Msk (0x1f0000UL) /*!< UDB_DSI DOT_CFG1: DOT6SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG1_DOT7SEL_Pos (24UL) /*!< UDB_DSI DOT_CFG1: DOT7SEL (Bit 24) */ +#define UDB_DSI_DOT_CFG1_DOT7SEL_Msk (0x1f000000UL) /*!< UDB_DSI DOT_CFG1: DOT7SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.DOT_CFG2 ==================================================== */ +#define UDB_DSI_DOT_CFG2_DOT8SEL_Pos (0UL) /*!< UDB_DSI DOT_CFG2: DOT8SEL (Bit 0) */ +#define UDB_DSI_DOT_CFG2_DOT8SEL_Msk (0x1fUL) /*!< UDB_DSI DOT_CFG2: DOT8SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG2_DOT9SEL_Pos (8UL) /*!< UDB_DSI DOT_CFG2: DOT9SEL (Bit 8) */ +#define UDB_DSI_DOT_CFG2_DOT9SEL_Msk (0x1f00UL) /*!< UDB_DSI DOT_CFG2: DOT9SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG2_DOT10SEL_Pos (16UL) /*!< UDB_DSI DOT_CFG2: DOT10SEL (Bit 16) */ +#define UDB_DSI_DOT_CFG2_DOT10SEL_Msk (0x1f0000UL) /*!< UDB_DSI DOT_CFG2: DOT10SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG2_DOT11SEL_Pos (24UL) /*!< UDB_DSI DOT_CFG2: DOT11SEL (Bit 24) */ +#define UDB_DSI_DOT_CFG2_DOT11SEL_Msk (0x1f000000UL) /*!< UDB_DSI DOT_CFG2: DOT11SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.DOT_CFG3 ==================================================== */ +#define UDB_DSI_DOT_CFG3_DOT12SEL_Pos (0UL) /*!< UDB_DSI DOT_CFG3: DOT12SEL (Bit 0) */ +#define UDB_DSI_DOT_CFG3_DOT12SEL_Msk (0x1fUL) /*!< UDB_DSI DOT_CFG3: DOT12SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG3_DOT13SEL_Pos (8UL) /*!< UDB_DSI DOT_CFG3: DOT13SEL (Bit 8) */ +#define UDB_DSI_DOT_CFG3_DOT13SEL_Msk (0x1f00UL) /*!< UDB_DSI DOT_CFG3: DOT13SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG3_DOT14SEL_Pos (16UL) /*!< UDB_DSI DOT_CFG3: DOT14SEL (Bit 16) */ +#define UDB_DSI_DOT_CFG3_DOT14SEL_Msk (0x1f0000UL) /*!< UDB_DSI DOT_CFG3: DOT14SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_DOT_CFG3_DOT15SEL_Pos (24UL) /*!< UDB_DSI DOT_CFG3: DOT15SEL (Bit 24) */ +#define UDB_DSI_DOT_CFG3_DOT15SEL_Msk (0x1f000000UL) /*!< UDB_DSI DOT_CFG3: DOT15SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.RVO_CFG0 ==================================================== */ +#define UDB_DSI_RVO_CFG0_RVO0SEL_Pos (0UL) /*!< UDB_DSI RVO_CFG0: RVO0SEL (Bit 0) */ +#define UDB_DSI_RVO_CFG0_RVO0SEL_Msk (0x1fUL) /*!< UDB_DSI RVO_CFG0: RVO0SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG0_RVO1SEL_Pos (8UL) /*!< UDB_DSI RVO_CFG0: RVO1SEL (Bit 8) */ +#define UDB_DSI_RVO_CFG0_RVO1SEL_Msk (0x1f00UL) /*!< UDB_DSI RVO_CFG0: RVO1SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG0_RVO2SEL_Pos (16UL) /*!< UDB_DSI RVO_CFG0: RVO2SEL (Bit 16) */ +#define UDB_DSI_RVO_CFG0_RVO2SEL_Msk (0x1f0000UL) /*!< UDB_DSI RVO_CFG0: RVO2SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG0_RVO3SEL_Pos (24UL) /*!< UDB_DSI RVO_CFG0: RVO3SEL (Bit 24) */ +#define UDB_DSI_RVO_CFG0_RVO3SEL_Msk (0x1f000000UL) /*!< UDB_DSI RVO_CFG0: RVO3SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.RVO_CFG1 ==================================================== */ +#define UDB_DSI_RVO_CFG1_RVO4SEL_Pos (0UL) /*!< UDB_DSI RVO_CFG1: RVO4SEL (Bit 0) */ +#define UDB_DSI_RVO_CFG1_RVO4SEL_Msk (0x1fUL) /*!< UDB_DSI RVO_CFG1: RVO4SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG1_RVO5SEL_Pos (8UL) /*!< UDB_DSI RVO_CFG1: RVO5SEL (Bit 8) */ +#define UDB_DSI_RVO_CFG1_RVO5SEL_Msk (0x1f00UL) /*!< UDB_DSI RVO_CFG1: RVO5SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG1_RVO6SEL_Pos (16UL) /*!< UDB_DSI RVO_CFG1: RVO6SEL (Bit 16) */ +#define UDB_DSI_RVO_CFG1_RVO6SEL_Msk (0x1f0000UL) /*!< UDB_DSI RVO_CFG1: RVO6SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG1_RVO7SEL_Pos (24UL) /*!< UDB_DSI RVO_CFG1: RVO7SEL (Bit 24) */ +#define UDB_DSI_RVO_CFG1_RVO7SEL_Msk (0x1f000000UL) /*!< UDB_DSI RVO_CFG1: RVO7SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.RVO_CFG2 ==================================================== */ +#define UDB_DSI_RVO_CFG2_RVO8SEL_Pos (0UL) /*!< UDB_DSI RVO_CFG2: RVO8SEL (Bit 0) */ +#define UDB_DSI_RVO_CFG2_RVO8SEL_Msk (0x1fUL) /*!< UDB_DSI RVO_CFG2: RVO8SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG2_RVO9SEL_Pos (8UL) /*!< UDB_DSI RVO_CFG2: RVO9SEL (Bit 8) */ +#define UDB_DSI_RVO_CFG2_RVO9SEL_Msk (0x1f00UL) /*!< UDB_DSI RVO_CFG2: RVO9SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG2_RVO10SEL_Pos (16UL) /*!< UDB_DSI RVO_CFG2: RVO10SEL (Bit 16) */ +#define UDB_DSI_RVO_CFG2_RVO10SEL_Msk (0x1f0000UL) /*!< UDB_DSI RVO_CFG2: RVO10SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG2_RVO11SEL_Pos (24UL) /*!< UDB_DSI RVO_CFG2: RVO11SEL (Bit 24) */ +#define UDB_DSI_RVO_CFG2_RVO11SEL_Msk (0x1f000000UL) /*!< UDB_DSI RVO_CFG2: RVO11SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.RVO_CFG3 ==================================================== */ +#define UDB_DSI_RVO_CFG3_RVO12SEL_Pos (0UL) /*!< UDB_DSI RVO_CFG3: RVO12SEL (Bit 0) */ +#define UDB_DSI_RVO_CFG3_RVO12SEL_Msk (0x1fUL) /*!< UDB_DSI RVO_CFG3: RVO12SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG3_RVO13SEL_Pos (8UL) /*!< UDB_DSI RVO_CFG3: RVO13SEL (Bit 8) */ +#define UDB_DSI_RVO_CFG3_RVO13SEL_Msk (0x1f00UL) /*!< UDB_DSI RVO_CFG3: RVO13SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG3_RVO14SEL_Pos (16UL) /*!< UDB_DSI RVO_CFG3: RVO14SEL (Bit 16) */ +#define UDB_DSI_RVO_CFG3_RVO14SEL_Msk (0x1f0000UL) /*!< UDB_DSI RVO_CFG3: RVO14SEL (Bitfield-Mask: 0x1f) */ +#define UDB_DSI_RVO_CFG3_RVO15SEL_Pos (24UL) /*!< UDB_DSI RVO_CFG3: RVO15SEL (Bit 24) */ +#define UDB_DSI_RVO_CFG3_RVO15SEL_Msk (0x1f000000UL) /*!< UDB_DSI RVO_CFG3: RVO15SEL (Bitfield-Mask: 0x1f) */ +/* =================================================== UDB_DSI.LVO_CFG0 ==================================================== */ +#define UDB_DSI_LVO_CFG0_LVO0SEL_Pos (0UL) /*!< UDB_DSI LVO_CFG0: LVO0SEL (Bit 0) */ +#define UDB_DSI_LVO_CFG0_LVO0SEL_Msk (0xfUL) /*!< UDB_DSI LVO_CFG0: LVO0SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG0_LVO1SEL_Pos (4UL) /*!< UDB_DSI LVO_CFG0: LVO1SEL (Bit 4) */ +#define UDB_DSI_LVO_CFG0_LVO1SEL_Msk (0xf0UL) /*!< UDB_DSI LVO_CFG0: LVO1SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG0_LVO2SEL_Pos (8UL) /*!< UDB_DSI LVO_CFG0: LVO2SEL (Bit 8) */ +#define UDB_DSI_LVO_CFG0_LVO2SEL_Msk (0xf00UL) /*!< UDB_DSI LVO_CFG0: LVO2SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG0_LVO3SEL_Pos (12UL) /*!< UDB_DSI LVO_CFG0: LVO3SEL (Bit 12) */ +#define UDB_DSI_LVO_CFG0_LVO3SEL_Msk (0xf000UL) /*!< UDB_DSI LVO_CFG0: LVO3SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG0_LVO4SEL_Pos (16UL) /*!< UDB_DSI LVO_CFG0: LVO4SEL (Bit 16) */ +#define UDB_DSI_LVO_CFG0_LVO4SEL_Msk (0xf0000UL) /*!< UDB_DSI LVO_CFG0: LVO4SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG0_LVO5SEL_Pos (20UL) /*!< UDB_DSI LVO_CFG0: LVO5SEL (Bit 20) */ +#define UDB_DSI_LVO_CFG0_LVO5SEL_Msk (0xf00000UL) /*!< UDB_DSI LVO_CFG0: LVO5SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG0_LVO6SEL_Pos (24UL) /*!< UDB_DSI LVO_CFG0: LVO6SEL (Bit 24) */ +#define UDB_DSI_LVO_CFG0_LVO6SEL_Msk (0xf000000UL) /*!< UDB_DSI LVO_CFG0: LVO6SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG0_LVO7SEL_Pos (28UL) /*!< UDB_DSI LVO_CFG0: LVO7SEL (Bit 28) */ +#define UDB_DSI_LVO_CFG0_LVO7SEL_Msk (0xf0000000UL) /*!< UDB_DSI LVO_CFG0: LVO7SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LVO_CFG1 ==================================================== */ +#define UDB_DSI_LVO_CFG1_LVO8SEL_Pos (0UL) /*!< UDB_DSI LVO_CFG1: LVO8SEL (Bit 0) */ +#define UDB_DSI_LVO_CFG1_LVO8SEL_Msk (0xfUL) /*!< UDB_DSI LVO_CFG1: LVO8SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG1_LVO9SEL_Pos (4UL) /*!< UDB_DSI LVO_CFG1: LVO9SEL (Bit 4) */ +#define UDB_DSI_LVO_CFG1_LVO9SEL_Msk (0xf0UL) /*!< UDB_DSI LVO_CFG1: LVO9SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG1_LVO10SEL_Pos (8UL) /*!< UDB_DSI LVO_CFG1: LVO10SEL (Bit 8) */ +#define UDB_DSI_LVO_CFG1_LVO10SEL_Msk (0xf00UL) /*!< UDB_DSI LVO_CFG1: LVO10SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG1_LVO11SEL_Pos (12UL) /*!< UDB_DSI LVO_CFG1: LVO11SEL (Bit 12) */ +#define UDB_DSI_LVO_CFG1_LVO11SEL_Msk (0xf000UL) /*!< UDB_DSI LVO_CFG1: LVO11SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG1_LVO12SEL_Pos (16UL) /*!< UDB_DSI LVO_CFG1: LVO12SEL (Bit 16) */ +#define UDB_DSI_LVO_CFG1_LVO12SEL_Msk (0xf0000UL) /*!< UDB_DSI LVO_CFG1: LVO12SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG1_LVO13SEL_Pos (20UL) /*!< UDB_DSI LVO_CFG1: LVO13SEL (Bit 20) */ +#define UDB_DSI_LVO_CFG1_LVO13SEL_Msk (0xf00000UL) /*!< UDB_DSI LVO_CFG1: LVO13SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG1_LVO14SEL_Pos (24UL) /*!< UDB_DSI LVO_CFG1: LVO14SEL (Bit 24) */ +#define UDB_DSI_LVO_CFG1_LVO14SEL_Msk (0xf000000UL) /*!< UDB_DSI LVO_CFG1: LVO14SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LVO_CFG1_LVO15SEL_Pos (28UL) /*!< UDB_DSI LVO_CFG1: LVO15SEL (Bit 28) */ +#define UDB_DSI_LVO_CFG1_LVO15SEL_Msk (0xf0000000UL) /*!< UDB_DSI LVO_CFG1: LVO15SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.RHO_CFG0 ==================================================== */ +#define UDB_DSI_RHO_CFG0_RHOSEL_Pos (0UL) /*!< UDB_DSI RHO_CFG0: RHOSEL (Bit 0) */ +#define UDB_DSI_RHO_CFG0_RHOSEL_Msk (0xffffffffUL) /*!< UDB_DSI RHO_CFG0: RHOSEL (Bitfield-Mask: 0xffffffff) */ +/* =================================================== UDB_DSI.RHO_CFG1 ==================================================== */ +#define UDB_DSI_RHO_CFG1_RHOSEL_Pos (0UL) /*!< UDB_DSI RHO_CFG1: RHOSEL (Bit 0) */ +#define UDB_DSI_RHO_CFG1_RHOSEL_Msk (0xffffffffUL) /*!< UDB_DSI RHO_CFG1: RHOSEL (Bitfield-Mask: 0xffffffff) */ +/* =================================================== UDB_DSI.RHO_CFG2 ==================================================== */ +#define UDB_DSI_RHO_CFG2_RHOSEL_Pos (0UL) /*!< UDB_DSI RHO_CFG2: RHOSEL (Bit 0) */ +#define UDB_DSI_RHO_CFG2_RHOSEL_Msk (0xffffffffUL) /*!< UDB_DSI RHO_CFG2: RHOSEL (Bitfield-Mask: 0xffffffff) */ +/* =================================================== UDB_DSI.LHO_CFG0 ==================================================== */ +#define UDB_DSI_LHO_CFG0_LHO0SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG0: LHO0SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG0_LHO0SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG0: LHO0SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG0_LHO1SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG0: LHO1SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG0_LHO1SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG0: LHO1SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG0_LHO2SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG0: LHO2SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG0_LHO2SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG0: LHO2SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG0_LHO3SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG0: LHO3SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG0_LHO3SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG0: LHO3SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG0_LHO4SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG0: LHO4SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG0_LHO4SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG0: LHO4SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG0_LHO5SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG0: LHO5SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG0_LHO5SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG0: LHO5SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG0_LHO6SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG0: LHO6SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG0_LHO6SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG0: LHO6SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG0_LHO7SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG0: LHO7SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG0_LHO7SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG0: LHO7SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG1 ==================================================== */ +#define UDB_DSI_LHO_CFG1_LHO8SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG1: LHO8SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG1_LHO8SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG1: LHO8SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG1_LHO9SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG1: LHO9SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG1_LHO9SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG1: LHO9SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG1_LHO10SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG1: LHO10SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG1_LHO10SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG1: LHO10SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG1_LHO11SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG1: LHO11SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG1_LHO11SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG1: LHO11SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG1_LHO12SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG1: LHO12SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG1_LHO12SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG1: LHO12SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG1_LHO13SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG1: LHO13SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG1_LHO13SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG1: LHO13SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG1_LHO14SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG1: LHO14SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG1_LHO14SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG1: LHO14SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG1_LHO15SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG1: LHO15SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG1_LHO15SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG1: LHO15SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG2 ==================================================== */ +#define UDB_DSI_LHO_CFG2_LHO16SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG2: LHO16SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG2_LHO16SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG2: LHO16SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG2_LHO17SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG2: LHO17SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG2_LHO17SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG2: LHO17SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG2_LHO18SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG2: LHO18SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG2_LHO18SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG2: LHO18SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG2_LHO19SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG2: LHO19SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG2_LHO19SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG2: LHO19SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG2_LHO20SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG2: LHO20SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG2_LHO20SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG2: LHO20SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG2_LHO21SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG2: LHO21SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG2_LHO21SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG2: LHO21SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG2_LHO22SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG2: LHO22SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG2_LHO22SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG2: LHO22SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG2_LHO23SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG2: LHO23SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG2_LHO23SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG2: LHO23SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG3 ==================================================== */ +#define UDB_DSI_LHO_CFG3_LHO24SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG3: LHO24SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG3_LHO24SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG3: LHO24SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG3_LHO25SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG3: LHO25SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG3_LHO25SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG3: LHO25SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG3_LHO26SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG3: LHO26SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG3_LHO26SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG3: LHO26SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG3_LHO27SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG3: LHO27SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG3_LHO27SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG3: LHO27SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG3_LHO28SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG3: LHO28SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG3_LHO28SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG3: LHO28SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG3_LHO29SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG3: LHO29SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG3_LHO29SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG3: LHO29SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG3_LHO30SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG3: LHO30SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG3_LHO30SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG3: LHO30SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG3_LHO31SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG3: LHO31SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG3_LHO31SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG3: LHO31SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG4 ==================================================== */ +#define UDB_DSI_LHO_CFG4_LHO32SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG4: LHO32SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG4_LHO32SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG4: LHO32SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG4_LHO33SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG4: LHO33SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG4_LHO33SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG4: LHO33SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG4_LHO34SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG4: LHO34SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG4_LHO34SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG4: LHO34SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG4_LHO35SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG4: LHO35SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG4_LHO35SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG4: LHO35SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG4_LHO36SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG4: LHO36SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG4_LHO36SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG4: LHO36SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG4_LHO37SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG4: LHO37SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG4_LHO37SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG4: LHO37SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG4_LHO38SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG4: LHO38SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG4_LHO38SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG4: LHO38SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG4_LHO39SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG4: LHO39SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG4_LHO39SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG4: LHO39SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG5 ==================================================== */ +#define UDB_DSI_LHO_CFG5_LHO40SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG5: LHO40SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG5_LHO40SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG5: LHO40SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG5_LHO41SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG5: LHO41SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG5_LHO41SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG5: LHO41SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG5_LHO42SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG5: LHO42SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG5_LHO42SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG5: LHO42SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG5_LHO43SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG5: LHO43SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG5_LHO43SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG5: LHO43SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG5_LHO44SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG5: LHO44SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG5_LHO44SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG5: LHO44SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG5_LHO45SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG5: LHO45SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG5_LHO45SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG5: LHO45SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG5_LHO46SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG5: LHO46SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG5_LHO46SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG5: LHO46SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG5_LHO47SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG5: LHO47SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG5_LHO47SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG5: LHO47SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG6 ==================================================== */ +#define UDB_DSI_LHO_CFG6_LHO48SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG6: LHO48SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG6_LHO48SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG6: LHO48SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG6_LHO49SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG6: LHO49SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG6_LHO49SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG6: LHO49SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG6_LHO50SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG6: LHO50SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG6_LHO50SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG6: LHO50SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG6_LHO51SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG6: LHO51SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG6_LHO51SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG6: LHO51SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG6_LHO52SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG6: LHO52SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG6_LHO52SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG6: LHO52SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG6_LHO53SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG6: LHO53SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG6_LHO53SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG6: LHO53SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG6_LHO54SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG6: LHO54SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG6_LHO54SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG6: LHO54SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG6_LHO55SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG6: LHO55SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG6_LHO55SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG6: LHO55SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG7 ==================================================== */ +#define UDB_DSI_LHO_CFG7_LHO56SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG7: LHO56SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG7_LHO56SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG7: LHO56SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG7_LHO57SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG7: LHO57SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG7_LHO57SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG7: LHO57SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG7_LHO58SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG7: LHO58SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG7_LHO58SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG7: LHO58SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG7_LHO59SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG7: LHO59SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG7_LHO59SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG7: LHO59SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG7_LHO60SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG7: LHO60SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG7_LHO60SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG7: LHO60SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG7_LHO61SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG7: LHO61SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG7_LHO61SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG7: LHO61SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG7_LHO62SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG7: LHO62SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG7_LHO62SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG7: LHO62SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG7_LHO63SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG7: LHO63SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG7_LHO63SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG7: LHO63SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG8 ==================================================== */ +#define UDB_DSI_LHO_CFG8_LHO64SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG8: LHO64SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG8_LHO64SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG8: LHO64SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG8_LHO65SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG8: LHO65SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG8_LHO65SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG8: LHO65SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG8_LHO66SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG8: LHO66SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG8_LHO66SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG8: LHO66SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG8_LHO67SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG8: LHO67SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG8_LHO67SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG8: LHO67SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG8_LHO68SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG8: LHO68SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG8_LHO68SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG8: LHO68SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG8_LHO69SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG8: LHO69SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG8_LHO69SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG8: LHO69SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG8_LHO70SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG8: LHO70SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG8_LHO70SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG8: LHO70SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG8_LHO71SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG8: LHO71SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG8_LHO71SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG8: LHO71SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG9 ==================================================== */ +#define UDB_DSI_LHO_CFG9_LHO72SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG9: LHO72SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG9_LHO72SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG9: LHO72SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG9_LHO73SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG9: LHO73SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG9_LHO73SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG9: LHO73SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG9_LHO74SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG9: LHO74SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG9_LHO74SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG9: LHO74SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG9_LHO75SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG9: LHO75SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG9_LHO75SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG9: LHO75SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG9_LHO76SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG9: LHO76SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG9_LHO76SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG9: LHO76SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG9_LHO77SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG9: LHO77SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG9_LHO77SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG9: LHO77SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG9_LHO78SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG9: LHO78SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG9_LHO78SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG9: LHO78SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG9_LHO79SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG9: LHO79SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG9_LHO79SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG9: LHO79SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG10 =================================================== */ +#define UDB_DSI_LHO_CFG10_LHO80SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG10: LHO80SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG10_LHO80SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG10: LHO80SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG10_LHO81SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG10: LHO81SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG10_LHO81SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG10: LHO81SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG10_LHO82SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG10: LHO82SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG10_LHO82SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG10: LHO82SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG10_LHO83SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG10: LHO83SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG10_LHO83SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG10: LHO83SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG10_LHO84SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG10: LHO84SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG10_LHO84SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG10: LHO84SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG10_LHO85SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG10: LHO85SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG10_LHO85SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG10: LHO85SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG10_LHO86SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG10: LHO86SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG10_LHO86SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG10: LHO86SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG10_LHO87SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG10: LHO87SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG10_LHO87SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG10: LHO87SEL (Bitfield-Mask: 0x0f) */ +/* =================================================== UDB_DSI.LHO_CFG11 =================================================== */ +#define UDB_DSI_LHO_CFG11_LHO88SEL_Pos (0UL) /*!< UDB_DSI LHO_CFG11: LHO88SEL (Bit 0) */ +#define UDB_DSI_LHO_CFG11_LHO88SEL_Msk (0xfUL) /*!< UDB_DSI LHO_CFG11: LHO88SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG11_LHO89SEL_Pos (4UL) /*!< UDB_DSI LHO_CFG11: LHO89SEL (Bit 4) */ +#define UDB_DSI_LHO_CFG11_LHO89SEL_Msk (0xf0UL) /*!< UDB_DSI LHO_CFG11: LHO89SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG11_LHO90SEL_Pos (8UL) /*!< UDB_DSI LHO_CFG11: LHO90SEL (Bit 8) */ +#define UDB_DSI_LHO_CFG11_LHO90SEL_Msk (0xf00UL) /*!< UDB_DSI LHO_CFG11: LHO90SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG11_LHO91SEL_Pos (12UL) /*!< UDB_DSI LHO_CFG11: LHO91SEL (Bit 12) */ +#define UDB_DSI_LHO_CFG11_LHO91SEL_Msk (0xf000UL) /*!< UDB_DSI LHO_CFG11: LHO91SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG11_LHO92SEL_Pos (16UL) /*!< UDB_DSI LHO_CFG11: LHO92SEL (Bit 16) */ +#define UDB_DSI_LHO_CFG11_LHO92SEL_Msk (0xf0000UL) /*!< UDB_DSI LHO_CFG11: LHO92SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG11_LHO93SEL_Pos (20UL) /*!< UDB_DSI LHO_CFG11: LHO93SEL (Bit 20) */ +#define UDB_DSI_LHO_CFG11_LHO93SEL_Msk (0xf00000UL) /*!< UDB_DSI LHO_CFG11: LHO93SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG11_LHO94SEL_Pos (24UL) /*!< UDB_DSI LHO_CFG11: LHO94SEL (Bit 24) */ +#define UDB_DSI_LHO_CFG11_LHO94SEL_Msk (0xf000000UL) /*!< UDB_DSI LHO_CFG11: LHO94SEL (Bitfield-Mask: 0x0f) */ +#define UDB_DSI_LHO_CFG11_LHO95SEL_Pos (28UL) /*!< UDB_DSI LHO_CFG11: LHO95SEL (Bit 28) */ +#define UDB_DSI_LHO_CFG11_LHO95SEL_Msk (0xf0000000UL) /*!< UDB_DSI LHO_CFG11: LHO95SEL (Bitfield-Mask: 0x0f) */ + + +/* ====================================================== UDB_PA.CFG0 ====================================================== */ +#define UDB_PA_CFG0_CLKIN_EN_SEL_Pos (0UL) /*!< UDB_PA CFG0: CLKIN_EN_SEL (Bit 0) */ +#define UDB_PA_CFG0_CLKIN_EN_SEL_Msk (0x3UL) /*!< UDB_PA CFG0: CLKIN_EN_SEL (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG0_CLKIN_EN_MODE_Pos (2UL) /*!< UDB_PA CFG0: CLKIN_EN_MODE (Bit 2) */ +#define UDB_PA_CFG0_CLKIN_EN_MODE_Msk (0xcUL) /*!< UDB_PA CFG0: CLKIN_EN_MODE (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG0_CLKIN_EN_INV_Pos (4UL) /*!< UDB_PA CFG0: CLKIN_EN_INV (Bit 4) */ +#define UDB_PA_CFG0_CLKIN_EN_INV_Msk (0x10UL) /*!< UDB_PA CFG0: CLKIN_EN_INV (Bitfield-Mask: 0x01) */ +#define UDB_PA_CFG0_CLKIN_INV_Pos (5UL) /*!< UDB_PA CFG0: CLKIN_INV (Bit 5) */ +#define UDB_PA_CFG0_CLKIN_INV_Msk (0x20UL) /*!< UDB_PA CFG0: CLKIN_INV (Bitfield-Mask: 0x01) */ +/* ====================================================== UDB_PA.CFG1 ====================================================== */ +#define UDB_PA_CFG1_CLKOUT_EN_SEL_Pos (0UL) /*!< UDB_PA CFG1: CLKOUT_EN_SEL (Bit 0) */ +#define UDB_PA_CFG1_CLKOUT_EN_SEL_Msk (0x3UL) /*!< UDB_PA CFG1: CLKOUT_EN_SEL (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG1_CLKOUT_EN_MODE_Pos (2UL) /*!< UDB_PA CFG1: CLKOUT_EN_MODE (Bit 2) */ +#define UDB_PA_CFG1_CLKOUT_EN_MODE_Msk (0xcUL) /*!< UDB_PA CFG1: CLKOUT_EN_MODE (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG1_CLKOUT_EN_INV_Pos (4UL) /*!< UDB_PA CFG1: CLKOUT_EN_INV (Bit 4) */ +#define UDB_PA_CFG1_CLKOUT_EN_INV_Msk (0x10UL) /*!< UDB_PA CFG1: CLKOUT_EN_INV (Bitfield-Mask: 0x01) */ +#define UDB_PA_CFG1_CLKOUT_INV_Pos (5UL) /*!< UDB_PA CFG1: CLKOUT_INV (Bit 5) */ +#define UDB_PA_CFG1_CLKOUT_INV_Msk (0x20UL) /*!< UDB_PA CFG1: CLKOUT_INV (Bitfield-Mask: 0x01) */ +/* ====================================================== UDB_PA.CFG2 ====================================================== */ +#define UDB_PA_CFG2_CLKIN_SEL_Pos (0UL) /*!< UDB_PA CFG2: CLKIN_SEL (Bit 0) */ +#define UDB_PA_CFG2_CLKIN_SEL_Msk (0xfUL) /*!< UDB_PA CFG2: CLKIN_SEL (Bitfield-Mask: 0x0f) */ +#define UDB_PA_CFG2_CLKOUT_SEL_Pos (4UL) /*!< UDB_PA CFG2: CLKOUT_SEL (Bit 4) */ +#define UDB_PA_CFG2_CLKOUT_SEL_Msk (0xf0UL) /*!< UDB_PA CFG2: CLKOUT_SEL (Bitfield-Mask: 0x0f) */ +/* ====================================================== UDB_PA.CFG3 ====================================================== */ +#define UDB_PA_CFG3_RES_IN_SEL_Pos (0UL) /*!< UDB_PA CFG3: RES_IN_SEL (Bit 0) */ +#define UDB_PA_CFG3_RES_IN_SEL_Msk (0x3UL) /*!< UDB_PA CFG3: RES_IN_SEL (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG3_RES_IN_INV_Pos (2UL) /*!< UDB_PA CFG3: RES_IN_INV (Bit 2) */ +#define UDB_PA_CFG3_RES_IN_INV_Msk (0x4UL) /*!< UDB_PA CFG3: RES_IN_INV (Bitfield-Mask: 0x01) */ +#define UDB_PA_CFG3_RES_OUT_SEL_Pos (4UL) /*!< UDB_PA CFG3: RES_OUT_SEL (Bit 4) */ +#define UDB_PA_CFG3_RES_OUT_SEL_Msk (0x30UL) /*!< UDB_PA CFG3: RES_OUT_SEL (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG3_RES_OUT_INV_Pos (6UL) /*!< UDB_PA CFG3: RES_OUT_INV (Bit 6) */ +#define UDB_PA_CFG3_RES_OUT_INV_Msk (0x40UL) /*!< UDB_PA CFG3: RES_OUT_INV (Bitfield-Mask: 0x01) */ +/* ====================================================== UDB_PA.CFG4 ====================================================== */ +#define UDB_PA_CFG4_RES_IN_EN_Pos (0UL) /*!< UDB_PA CFG4: RES_IN_EN (Bit 0) */ +#define UDB_PA_CFG4_RES_IN_EN_Msk (0x1UL) /*!< UDB_PA CFG4: RES_IN_EN (Bitfield-Mask: 0x01) */ +#define UDB_PA_CFG4_RES_OUT_EN_Pos (1UL) /*!< UDB_PA CFG4: RES_OUT_EN (Bit 1) */ +#define UDB_PA_CFG4_RES_OUT_EN_Msk (0x2UL) /*!< UDB_PA CFG4: RES_OUT_EN (Bitfield-Mask: 0x01) */ +#define UDB_PA_CFG4_RES_OE_EN_Pos (2UL) /*!< UDB_PA CFG4: RES_OE_EN (Bit 2) */ +#define UDB_PA_CFG4_RES_OE_EN_Msk (0x4UL) /*!< UDB_PA CFG4: RES_OE_EN (Bitfield-Mask: 0x01) */ +/* ====================================================== UDB_PA.CFG5 ====================================================== */ +#define UDB_PA_CFG5_PIN_SEL_Pos (0UL) /*!< UDB_PA CFG5: PIN_SEL (Bit 0) */ +#define UDB_PA_CFG5_PIN_SEL_Msk (0x7UL) /*!< UDB_PA CFG5: PIN_SEL (Bitfield-Mask: 0x07) */ +/* ====================================================== UDB_PA.CFG6 ====================================================== */ +#define UDB_PA_CFG6_IN_SYNC0_Pos (0UL) /*!< UDB_PA CFG6: IN_SYNC0 (Bit 0) */ +#define UDB_PA_CFG6_IN_SYNC0_Msk (0x3UL) /*!< UDB_PA CFG6: IN_SYNC0 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG6_IN_SYNC1_Pos (2UL) /*!< UDB_PA CFG6: IN_SYNC1 (Bit 2) */ +#define UDB_PA_CFG6_IN_SYNC1_Msk (0xcUL) /*!< UDB_PA CFG6: IN_SYNC1 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG6_IN_SYNC2_Pos (4UL) /*!< UDB_PA CFG6: IN_SYNC2 (Bit 4) */ +#define UDB_PA_CFG6_IN_SYNC2_Msk (0x30UL) /*!< UDB_PA CFG6: IN_SYNC2 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG6_IN_SYNC3_Pos (6UL) /*!< UDB_PA CFG6: IN_SYNC3 (Bit 6) */ +#define UDB_PA_CFG6_IN_SYNC3_Msk (0xc0UL) /*!< UDB_PA CFG6: IN_SYNC3 (Bitfield-Mask: 0x03) */ +/* ====================================================== UDB_PA.CFG7 ====================================================== */ +#define UDB_PA_CFG7_IN_SYNC4_Pos (0UL) /*!< UDB_PA CFG7: IN_SYNC4 (Bit 0) */ +#define UDB_PA_CFG7_IN_SYNC4_Msk (0x3UL) /*!< UDB_PA CFG7: IN_SYNC4 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG7_IN_SYNC5_Pos (2UL) /*!< UDB_PA CFG7: IN_SYNC5 (Bit 2) */ +#define UDB_PA_CFG7_IN_SYNC5_Msk (0xcUL) /*!< UDB_PA CFG7: IN_SYNC5 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG7_IN_SYNC6_Pos (4UL) /*!< UDB_PA CFG7: IN_SYNC6 (Bit 4) */ +#define UDB_PA_CFG7_IN_SYNC6_Msk (0x30UL) /*!< UDB_PA CFG7: IN_SYNC6 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG7_IN_SYNC7_Pos (6UL) /*!< UDB_PA CFG7: IN_SYNC7 (Bit 6) */ +#define UDB_PA_CFG7_IN_SYNC7_Msk (0xc0UL) /*!< UDB_PA CFG7: IN_SYNC7 (Bitfield-Mask: 0x03) */ +/* ====================================================== UDB_PA.CFG8 ====================================================== */ +#define UDB_PA_CFG8_OUT_SYNC0_Pos (0UL) /*!< UDB_PA CFG8: OUT_SYNC0 (Bit 0) */ +#define UDB_PA_CFG8_OUT_SYNC0_Msk (0x3UL) /*!< UDB_PA CFG8: OUT_SYNC0 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG8_OUT_SYNC1_Pos (2UL) /*!< UDB_PA CFG8: OUT_SYNC1 (Bit 2) */ +#define UDB_PA_CFG8_OUT_SYNC1_Msk (0xcUL) /*!< UDB_PA CFG8: OUT_SYNC1 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG8_OUT_SYNC2_Pos (4UL) /*!< UDB_PA CFG8: OUT_SYNC2 (Bit 4) */ +#define UDB_PA_CFG8_OUT_SYNC2_Msk (0x30UL) /*!< UDB_PA CFG8: OUT_SYNC2 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG8_OUT_SYNC3_Pos (6UL) /*!< UDB_PA CFG8: OUT_SYNC3 (Bit 6) */ +#define UDB_PA_CFG8_OUT_SYNC3_Msk (0xc0UL) /*!< UDB_PA CFG8: OUT_SYNC3 (Bitfield-Mask: 0x03) */ +/* ====================================================== UDB_PA.CFG9 ====================================================== */ +#define UDB_PA_CFG9_OUT_SYNC4_Pos (0UL) /*!< UDB_PA CFG9: OUT_SYNC4 (Bit 0) */ +#define UDB_PA_CFG9_OUT_SYNC4_Msk (0x3UL) /*!< UDB_PA CFG9: OUT_SYNC4 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG9_OUT_SYNC5_Pos (2UL) /*!< UDB_PA CFG9: OUT_SYNC5 (Bit 2) */ +#define UDB_PA_CFG9_OUT_SYNC5_Msk (0xcUL) /*!< UDB_PA CFG9: OUT_SYNC5 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG9_OUT_SYNC6_Pos (4UL) /*!< UDB_PA CFG9: OUT_SYNC6 (Bit 4) */ +#define UDB_PA_CFG9_OUT_SYNC6_Msk (0x30UL) /*!< UDB_PA CFG9: OUT_SYNC6 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG9_OUT_SYNC7_Pos (6UL) /*!< UDB_PA CFG9: OUT_SYNC7 (Bit 6) */ +#define UDB_PA_CFG9_OUT_SYNC7_Msk (0xc0UL) /*!< UDB_PA CFG9: OUT_SYNC7 (Bitfield-Mask: 0x03) */ +/* ===================================================== UDB_PA.CFG10 ====================================================== */ +#define UDB_PA_CFG10_DATA_SEL0_Pos (0UL) /*!< UDB_PA CFG10: DATA_SEL0 (Bit 0) */ +#define UDB_PA_CFG10_DATA_SEL0_Msk (0x3UL) /*!< UDB_PA CFG10: DATA_SEL0 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG10_DATA_SEL1_Pos (2UL) /*!< UDB_PA CFG10: DATA_SEL1 (Bit 2) */ +#define UDB_PA_CFG10_DATA_SEL1_Msk (0xcUL) /*!< UDB_PA CFG10: DATA_SEL1 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG10_DATA_SEL2_Pos (4UL) /*!< UDB_PA CFG10: DATA_SEL2 (Bit 4) */ +#define UDB_PA_CFG10_DATA_SEL2_Msk (0x30UL) /*!< UDB_PA CFG10: DATA_SEL2 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG10_DATA_SEL3_Pos (6UL) /*!< UDB_PA CFG10: DATA_SEL3 (Bit 6) */ +#define UDB_PA_CFG10_DATA_SEL3_Msk (0xc0UL) /*!< UDB_PA CFG10: DATA_SEL3 (Bitfield-Mask: 0x03) */ +/* ===================================================== UDB_PA.CFG11 ====================================================== */ +#define UDB_PA_CFG11_DATA_SEL4_Pos (0UL) /*!< UDB_PA CFG11: DATA_SEL4 (Bit 0) */ +#define UDB_PA_CFG11_DATA_SEL4_Msk (0x3UL) /*!< UDB_PA CFG11: DATA_SEL4 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG11_DATA_SEL5_Pos (2UL) /*!< UDB_PA CFG11: DATA_SEL5 (Bit 2) */ +#define UDB_PA_CFG11_DATA_SEL5_Msk (0xcUL) /*!< UDB_PA CFG11: DATA_SEL5 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG11_DATA_SEL6_Pos (4UL) /*!< UDB_PA CFG11: DATA_SEL6 (Bit 4) */ +#define UDB_PA_CFG11_DATA_SEL6_Msk (0x30UL) /*!< UDB_PA CFG11: DATA_SEL6 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG11_DATA_SEL7_Pos (6UL) /*!< UDB_PA CFG11: DATA_SEL7 (Bit 6) */ +#define UDB_PA_CFG11_DATA_SEL7_Msk (0xc0UL) /*!< UDB_PA CFG11: DATA_SEL7 (Bitfield-Mask: 0x03) */ +/* ===================================================== UDB_PA.CFG12 ====================================================== */ +#define UDB_PA_CFG12_OE_SEL0_Pos (0UL) /*!< UDB_PA CFG12: OE_SEL0 (Bit 0) */ +#define UDB_PA_CFG12_OE_SEL0_Msk (0x3UL) /*!< UDB_PA CFG12: OE_SEL0 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG12_OE_SEL1_Pos (2UL) /*!< UDB_PA CFG12: OE_SEL1 (Bit 2) */ +#define UDB_PA_CFG12_OE_SEL1_Msk (0xcUL) /*!< UDB_PA CFG12: OE_SEL1 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG12_OE_SEL2_Pos (4UL) /*!< UDB_PA CFG12: OE_SEL2 (Bit 4) */ +#define UDB_PA_CFG12_OE_SEL2_Msk (0x30UL) /*!< UDB_PA CFG12: OE_SEL2 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG12_OE_SEL3_Pos (6UL) /*!< UDB_PA CFG12: OE_SEL3 (Bit 6) */ +#define UDB_PA_CFG12_OE_SEL3_Msk (0xc0UL) /*!< UDB_PA CFG12: OE_SEL3 (Bitfield-Mask: 0x03) */ +/* ===================================================== UDB_PA.CFG13 ====================================================== */ +#define UDB_PA_CFG13_OE_SEL4_Pos (0UL) /*!< UDB_PA CFG13: OE_SEL4 (Bit 0) */ +#define UDB_PA_CFG13_OE_SEL4_Msk (0x3UL) /*!< UDB_PA CFG13: OE_SEL4 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG13_OE_SEL5_Pos (2UL) /*!< UDB_PA CFG13: OE_SEL5 (Bit 2) */ +#define UDB_PA_CFG13_OE_SEL5_Msk (0xcUL) /*!< UDB_PA CFG13: OE_SEL5 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG13_OE_SEL6_Pos (4UL) /*!< UDB_PA CFG13: OE_SEL6 (Bit 4) */ +#define UDB_PA_CFG13_OE_SEL6_Msk (0x30UL) /*!< UDB_PA CFG13: OE_SEL6 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG13_OE_SEL7_Pos (6UL) /*!< UDB_PA CFG13: OE_SEL7 (Bit 6) */ +#define UDB_PA_CFG13_OE_SEL7_Msk (0xc0UL) /*!< UDB_PA CFG13: OE_SEL7 (Bitfield-Mask: 0x03) */ +/* ===================================================== UDB_PA.CFG14 ====================================================== */ +#define UDB_PA_CFG14_OE_SYNC0_Pos (0UL) /*!< UDB_PA CFG14: OE_SYNC0 (Bit 0) */ +#define UDB_PA_CFG14_OE_SYNC0_Msk (0x3UL) /*!< UDB_PA CFG14: OE_SYNC0 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG14_OE_SYNC1_Pos (2UL) /*!< UDB_PA CFG14: OE_SYNC1 (Bit 2) */ +#define UDB_PA_CFG14_OE_SYNC1_Msk (0xcUL) /*!< UDB_PA CFG14: OE_SYNC1 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG14_OE_SYNC2_Pos (4UL) /*!< UDB_PA CFG14: OE_SYNC2 (Bit 4) */ +#define UDB_PA_CFG14_OE_SYNC2_Msk (0x30UL) /*!< UDB_PA CFG14: OE_SYNC2 (Bitfield-Mask: 0x03) */ +#define UDB_PA_CFG14_OE_SYNC3_Pos (6UL) /*!< UDB_PA CFG14: OE_SYNC3 (Bit 6) */ +#define UDB_PA_CFG14_OE_SYNC3_Msk (0xc0UL) /*!< UDB_PA CFG14: OE_SYNC3 (Bitfield-Mask: 0x03) */ + + +/* =================================================== UDB_BCTL.MDCLK_EN =================================================== */ +#define UDB_BCTL_MDCLK_EN_DCEN_Pos (0UL) /*!< UDB_BCTL MDCLK_EN: DCEN (Bit 0) */ +#define UDB_BCTL_MDCLK_EN_DCEN_Msk (0xffUL) /*!< UDB_BCTL MDCLK_EN: DCEN (Bitfield-Mask: 0xff) */ +/* =================================================== UDB_BCTL.MBCLK_EN =================================================== */ +#define UDB_BCTL_MBCLK_EN_BCEN_Pos (0UL) /*!< UDB_BCTL MBCLK_EN: BCEN (Bit 0) */ +#define UDB_BCTL_MBCLK_EN_BCEN_Msk (0x1UL) /*!< UDB_BCTL MBCLK_EN: BCEN (Bitfield-Mask: 0x01) */ +/* =================================================== UDB_BCTL.BOTSEL_L =================================================== */ +#define UDB_BCTL_BOTSEL_L_CLK_SEL0_Pos (0UL) /*!< UDB_BCTL BOTSEL_L: CLK_SEL0 (Bit 0) */ +#define UDB_BCTL_BOTSEL_L_CLK_SEL0_Msk (0x3UL) /*!< UDB_BCTL BOTSEL_L: CLK_SEL0 (Bitfield-Mask: 0x03) */ +#define UDB_BCTL_BOTSEL_L_CLK_SEL1_Pos (2UL) /*!< UDB_BCTL BOTSEL_L: CLK_SEL1 (Bit 2) */ +#define UDB_BCTL_BOTSEL_L_CLK_SEL1_Msk (0xcUL) /*!< UDB_BCTL BOTSEL_L: CLK_SEL1 (Bitfield-Mask: 0x03) */ +#define UDB_BCTL_BOTSEL_L_CLK_SEL2_Pos (4UL) /*!< UDB_BCTL BOTSEL_L: CLK_SEL2 (Bit 4) */ +#define UDB_BCTL_BOTSEL_L_CLK_SEL2_Msk (0x30UL) /*!< UDB_BCTL BOTSEL_L: CLK_SEL2 (Bitfield-Mask: 0x03) */ +#define UDB_BCTL_BOTSEL_L_CLK_SEL3_Pos (6UL) /*!< UDB_BCTL BOTSEL_L: CLK_SEL3 (Bit 6) */ +#define UDB_BCTL_BOTSEL_L_CLK_SEL3_Msk (0xc0UL) /*!< UDB_BCTL BOTSEL_L: CLK_SEL3 (Bitfield-Mask: 0x03) */ +/* =================================================== UDB_BCTL.BOTSEL_U =================================================== */ +#define UDB_BCTL_BOTSEL_U_CLK_SEL4_Pos (0UL) /*!< UDB_BCTL BOTSEL_U: CLK_SEL4 (Bit 0) */ +#define UDB_BCTL_BOTSEL_U_CLK_SEL4_Msk (0x3UL) /*!< UDB_BCTL BOTSEL_U: CLK_SEL4 (Bitfield-Mask: 0x03) */ +#define UDB_BCTL_BOTSEL_U_CLK_SEL5_Pos (2UL) /*!< UDB_BCTL BOTSEL_U: CLK_SEL5 (Bit 2) */ +#define UDB_BCTL_BOTSEL_U_CLK_SEL5_Msk (0xcUL) /*!< UDB_BCTL BOTSEL_U: CLK_SEL5 (Bitfield-Mask: 0x03) */ +#define UDB_BCTL_BOTSEL_U_CLK_SEL6_Pos (4UL) /*!< UDB_BCTL BOTSEL_U: CLK_SEL6 (Bit 4) */ +#define UDB_BCTL_BOTSEL_U_CLK_SEL6_Msk (0x30UL) /*!< UDB_BCTL BOTSEL_U: CLK_SEL6 (Bitfield-Mask: 0x03) */ +#define UDB_BCTL_BOTSEL_U_CLK_SEL7_Pos (6UL) /*!< UDB_BCTL BOTSEL_U: CLK_SEL7 (Bit 6) */ +#define UDB_BCTL_BOTSEL_U_CLK_SEL7_Msk (0xc0UL) /*!< UDB_BCTL BOTSEL_U: CLK_SEL7 (Bitfield-Mask: 0x03) */ +/* =================================================== UDB_BCTL.QCLK_EN ==================================================== */ +#define UDB_BCTL_QCLK_EN_DCEN_Q_Pos (0UL) /*!< UDB_BCTL QCLK_EN: DCEN_Q (Bit 0) */ +#define UDB_BCTL_QCLK_EN_DCEN_Q_Msk (0xffUL) /*!< UDB_BCTL QCLK_EN: DCEN_Q (Bitfield-Mask: 0xff) */ +#define UDB_BCTL_QCLK_EN_BCEN_Q_Pos (8UL) /*!< UDB_BCTL QCLK_EN: BCEN_Q (Bit 8) */ +#define UDB_BCTL_QCLK_EN_BCEN_Q_Msk (0x100UL) /*!< UDB_BCTL QCLK_EN: BCEN_Q (Bitfield-Mask: 0x01) */ +#define UDB_BCTL_QCLK_EN_DISABLE_ROUTE_Pos (11UL) /*!< UDB_BCTL QCLK_EN: DISABLE_ROUTE (Bit 11) */ +#define UDB_BCTL_QCLK_EN_DISABLE_ROUTE_Msk (0x800UL) /*!< UDB_BCTL QCLK_EN: DISABLE_ROUTE (Bitfield-Mask: 0x01) */ + + +/* ================================================== UDB_UDBIF.BANK_CTL =================================================== */ +#define UDB_UDBIF_BANK_CTL_DIS_COR_Pos (0UL) /*!< UDB_UDBIF BANK_CTL: DIS_COR (Bit 0) */ +#define UDB_UDBIF_BANK_CTL_DIS_COR_Msk (0x1UL) /*!< UDB_UDBIF BANK_CTL: DIS_COR (Bitfield-Mask: 0x01) */ +#define UDB_UDBIF_BANK_CTL_ROUTE_EN_Pos (1UL) /*!< UDB_UDBIF BANK_CTL: ROUTE_EN (Bit 1) */ +#define UDB_UDBIF_BANK_CTL_ROUTE_EN_Msk (0x2UL) /*!< UDB_UDBIF BANK_CTL: ROUTE_EN (Bitfield-Mask: 0x01) */ +#define UDB_UDBIF_BANK_CTL_BANK_EN_Pos (2UL) /*!< UDB_UDBIF BANK_CTL: BANK_EN (Bit 2) */ +#define UDB_UDBIF_BANK_CTL_BANK_EN_Msk (0x4UL) /*!< UDB_UDBIF BANK_CTL: BANK_EN (Bitfield-Mask: 0x01) */ +#define UDB_UDBIF_BANK_CTL_READ_WAIT_Pos (8UL) /*!< UDB_UDBIF BANK_CTL: READ_WAIT (Bit 8) */ +#define UDB_UDBIF_BANK_CTL_READ_WAIT_Msk (0x100UL) /*!< UDB_UDBIF BANK_CTL: READ_WAIT (Bitfield-Mask: 0x01) */ +/* ================================================= UDB_UDBIF.INT_CLK_CTL ================================================= */ +#define UDB_UDBIF_INT_CLK_CTL_INT_CLK_ENABLE_Pos (0UL) /*!< UDB_UDBIF INT_CLK_CTL: INT_CLK_ENABLE (Bit 0) */ +#define UDB_UDBIF_INT_CLK_CTL_INT_CLK_ENABLE_Msk (0x1UL) /*!< UDB_UDBIF INT_CLK_CTL: INT_CLK_ENABLE (Bitfield-Mask: 0x01)*/ +/* =================================================== UDB_UDBIF.INT_CFG =================================================== */ +#define UDB_UDBIF_INT_CFG_INT_MODE_CFG_Pos (0UL) /*!< UDB_UDBIF INT_CFG: INT_MODE_CFG (Bit 0) */ +#define UDB_UDBIF_INT_CFG_INT_MODE_CFG_Msk (0xffffffffUL) /*!< UDB_UDBIF INT_CFG: INT_MODE_CFG (Bitfield-Mask: 0xffffffff)*/ +/* ================================================= UDB_UDBIF.TR_CLK_CTL ================================================== */ +#define UDB_UDBIF_TR_CLK_CTL_TR_CLOCK_ENABLE_Pos (0UL) /*!< UDB_UDBIF TR_CLK_CTL: TR_CLOCK_ENABLE (Bit 0) */ +#define UDB_UDBIF_TR_CLK_CTL_TR_CLOCK_ENABLE_Msk (0x1UL) /*!< UDB_UDBIF TR_CLK_CTL: TR_CLOCK_ENABLE (Bitfield-Mask: 0x01)*/ +/* =================================================== UDB_UDBIF.TR_CFG ==================================================== */ +#define UDB_UDBIF_TR_CFG_TR_MODE_CFG_Pos (0UL) /*!< UDB_UDBIF TR_CFG: TR_MODE_CFG (Bit 0) */ +#define UDB_UDBIF_TR_CFG_TR_MODE_CFG_Msk (0xffffffffUL) /*!< UDB_UDBIF TR_CFG: TR_MODE_CFG (Bitfield-Mask: 0xffffffff) */ +/* =================================================== UDB_UDBIF.PRIVATE =================================================== */ +#define UDB_UDBIF_PRIVATE_PIPELINE_MD_Pos (0UL) /*!< UDB_UDBIF PRIVATE: PIPELINE_MD (Bit 0) */ +#define UDB_UDBIF_PRIVATE_PIPELINE_MD_Msk (0x1UL) /*!< UDB_UDBIF PRIVATE: PIPELINE_MD (Bitfield-Mask: 0x01) */ + + +#endif /* _CYIP_UDB_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/middleware/ble/cy_ble_clk.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/middleware/ble/cy_ble_clk.c new file mode 100644 index 0000000000..5f7dacaab6 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/middleware/ble/cy_ble_clk.c @@ -0,0 +1,491 @@ +/***************************************************************************//** +* \file cy_ble_clk.c +* \version 1.0 +* +* \brief +* Contains the source code for the BLE ECO clock. +* +******************************************************************************** +* \copyright +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_ble_clk.h" +#include "syslib/cy_syslib.h" +#include "sysclk/cy_sysclk.h" +#include "syspm/cy_syspm.h" + +/* C binding of definitions if building with C++ compiler */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +static uint16_t Cy_BLE_HalRcbRegRead(uint16_t addr); +static void Cy_BLE_HalRcbRegWrite(uint16_t addr, uint16_t data); +static void Cy_BLE_HalEcoSetTrim(uint8_t trim); +static void Cy_BLE_HalMxdRadioEnableClocks(const cy_stc_ble_bless_eco_cfg_params_t *ecoConfig); + + +/******************************************************************************* +* Function Name: Cy_BLE_HAL_IsEcoCpuClockSrc +****************************************************************************//** +* +* If ECO from BLESS in CLK_PATH_SELECT register is selected return 1. +* +* \return +* uint8_t: 0 - ECO from BLESS is not used in DWR +* 1 - ECO from BLESS is selected in CLK_PATH_SELECT register +* +*******************************************************************************/ +uint8_t Cy_BLE_HAL_IsEcoCpuClockSrc(void) +{ + uint8_t returnVal = 0u; + uint32_t i; + + for(i = 0u; i < SRSS_NUM_CLKPATH; i++) + { + if(Cy_SysClk_ClkPathGetSource(i) == CY_SYSCLK_CLKPATH_IN_ALTHF) + { + returnVal = 1u; + break; + } + } + + return(returnVal); +} + + +/******************************************************************************* +* Function Name: Cy_BLE_HAL_IsWcoLfclkSrc +****************************************************************************//** +* +* In CLK_SELECT register if WCO or PILO return 1 +* +* \return +* uint8_t: 0 - WCO or PILO are not used in DWR +* 1 - WCO is selected in CLK_SELECT register +* +*******************************************************************************/ +uint8_t Cy_BLE_HAL_IsWcoLfclkSrc(void) +{ + cy_en_lfclk_input_sources_t lfclkSrs; + + lfclkSrs = Cy_SysClk_LfClkGetSource(); + + return(((lfclkSrs == CY_SYSCLK_LFCLK_IN_WCO) || (lfclkSrs == CY_SYSCLK_LFCLK_IN_PILO)) ? 1u : 0u); +} + + +/******************************************************************************* +* Function Name: Cy_BLE_HAL_Init +****************************************************************************//** +* +* Initializes the BLESS port. +* +* \return +* None +* +*******************************************************************************/ +void Cy_BLE_HAL_Init(void) +{ + /* Configures pins for BLESS */ + const cy_stc_gpio_prt_config_t port2_cfg = + { + .cfg = CY_BLE_PORT2_CFG_VAL, + .sel0Active = CY_BLE_PORT2_HSIOM_SEL0, + .sel1Active = CY_BLE_PORT2_HSIOM_SEL1 + }; + const cy_stc_gpio_prt_config_t port3_cfg = + { + .cfg = CY_BLE_PORT3_CFG_VAL, + .sel0Active = CY_BLE_PORT3_HSIOM_SEL0, + .sel1Active = CY_BLE_PORT3_HSIOM_SEL1 + }; + const cy_stc_gpio_prt_config_t port4_cfg = + { + .cfg = CY_BLE_PORT4_CFG_VAL, + .sel0Active = CY_BLE_PORT4_HSIOM_SEL0, + .sel1Active = CY_BLE_PORT4_HSIOM_SEL1 + }; + + Cy_GPIO_Port_Init(GPIO_PRT2, &port2_cfg); + Cy_GPIO_Port_Init(GPIO_PRT3, &port3_cfg); + Cy_GPIO_Port_Init(GPIO_PRT4, &port4_cfg); +} + + +/******************************************************************************* +* Function Name: Cy_BLE_HalRcbRegRead +****************************************************************************//** +* +* Reads Radio register. +* +* \param addr: Register address. +* +* \return +* Register data +* +*******************************************************************************/ +static uint16_t Cy_BLE_HalRcbRegRead(uint16_t addr) +{ + uint32_t temp = (uint32_t)((0x8000UL | addr) << 16u); + + /* Write Address to the RCB */ + BLE->RCB.TX_FIFO_WR = temp; + + /* Wait for Data. */ + while((BLE->RCB.INTR & BLE_RCB_INTR_RCB_DONE_Msk) == 0u) + { + } + + BLE->RCB.INTR |= BLE_RCB_INTR_RCB_DONE_Msk; + + return((uint16_t)BLE->RCB.RX_FIFO_RD); +} + + +/******************************************************************************* +* Function Name: Cy_BLE_HalRcbRegWrite +****************************************************************************//** +* +* Writes Radio register. +* +* \param addr: Register address. +* \param data: Register data. +* +* \return +* None +* +*******************************************************************************/ +static void Cy_BLE_HalRcbRegWrite(uint16_t addr, uint16_t data) +{ + uint32_t temp = ((uint32_t)((0x7FFFUL & addr) << 16u)) | data; + + BLE->RCB.TX_FIFO_WR = temp; + + /* Wait for RCB done. */ + while((BLE->RCB.INTR & BLE_RCB_INTR_RCB_DONE_Msk) == 0u) + { + } + + BLE->RCB.INTR |= BLE_RCB_INTR_RCB_DONE_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_BLE_HalEcoSetTrim +****************************************************************************//** +* +* Sets ECO trim value. +* +* \param trim: Trim value. +* +* \return +* None +* +*******************************************************************************/ +static void Cy_BLE_HalEcoSetTrim(uint8_t trim) +{ + uint32_t reg; + + /* Read CY_BLE_RF_DCXO_CFG_REG */ + reg = Cy_BLE_HalRcbRegRead(CY_BLE_RF_DCXO_CFG_REG); + /* Clear the CAP value */ + reg &= ~(CY_BLE_RF_DCXO_CFG_REG_DCXO_CAP_MASK << CY_BLE_RF_DCXO_CFG_REG_DCXO_CAP_SHIFT); + /* Load the new CAP TRIM value */ + reg |= (uint32_t)trim << CY_BLE_RF_DCXO_CFG_REG_DCXO_CAP_SHIFT; + /* Write the new value to the register */ + Cy_BLE_HalRcbRegWrite(CY_BLE_RF_DCXO_CFG_REG, CY_LO16(reg)); +} + + +/******************************************************************************* +* Function Name: Cy_BLE_HalMxdRadioEnableClocks +****************************************************************************//** +* +* Enables and configures radio clock. +* +* \param ecoConfig: Clock configuration of type 'cy_stc_ble_bless_eco_cfg_params_t'. +* +* \return +* None +* +*******************************************************************************/ +static void Cy_BLE_HalMxdRadioEnableClocks(const cy_stc_ble_bless_eco_cfg_params_t *ecoConfig) +{ + uint16_t temp; + uint16_t blerdDivider; + uint16_t ecoSysDivider; + uint16_t blellDivider = 0u; + + /* Deassert active domain reset and enable clock buffer in MXD Radio */ + do + { + Cy_BLE_HalRcbRegWrite(CY_BLE_PMU_MODE_TRANSITION_REG, CY_BLE_MXD_RADIO_CLK_BUF_EN_VAL); + temp = Cy_BLE_HalRcbRegRead(CY_BLE_PMU_MODE_TRANSITION_REG); + } while(temp != CY_BLE_MXD_RADIO_CLK_BUF_EN_VAL); + + /* Check if ECO clock output is enabled + * In MXD_VER2, ECO clock is stopped on overwriting this bit */ + temp = Cy_BLE_HalRcbRegRead(CY_BLE_PMU_PMU_CTRL_REG); + if ((temp & CY_BLE_MXD_RADIO_DIG_CLK_OUT_EN_VAL) == 0u) + { + /* Enable digital ECO clock output from MXD Radio to BLESS */ + do + { + Cy_BLE_HalRcbRegWrite(CY_BLE_PMU_PMU_CTRL_REG, CY_BLE_MXD_RADIO_DIG_CLK_OUT_EN_VAL); + temp = Cy_BLE_HalRcbRegRead(CY_BLE_PMU_PMU_CTRL_REG); + } while(temp != CY_BLE_MXD_RADIO_DIG_CLK_OUT_EN_VAL); + } + + /* Configure ECO clock frequency and clock divider in MXD Radio */ + + /* Read the MXD Radio register */ + temp = Cy_BLE_HalRcbRegRead(CY_BLE_RF_DCXO_BUF_CFG_REG); + /* Clear clock divider and select amp buffer output bits */ + temp &= CY_LO16(~((CY_BLE_RF_DCXO_BUF_CFG_REG_CLK_DIV_MASK << CY_BLE_RF_DCXO_BUF_CFG_REG_CLK_DIV_SHIFT) | + (CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_MASK << CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_SHIFT))); + + /* Total ECO divider consist of divider located on BLERD and BLESS divider + Set BLERD divider to maximum value taking in to account that 8 Mhz is required for BLELL + BLELL clock frequency is set to 8Mhz irrespective of the crystal value. + */ + if(ecoConfig->ecoFreq == CY_BLE_BLESS_ECO_FREQ_32MHZ) + { + if(ecoConfig->ecoSysDiv >= (uint32_t)CY_BLE_BLESS_XTAL_CLK_DIV_4) + { + blerdDivider = (uint16_t)CY_BLE_MXD_RADIO_CLK_DIV_4; + } + else + { + blerdDivider = (uint16_t)ecoConfig->ecoSysDiv; + blellDivider = (uint16_t)CY_BLE_MXD_RADIO_CLK_DIV_4 - blerdDivider; + } + temp |= CY_BLE_RF_DCXO_BUF_CFG_REG_XTAL_32M_SEL_BIT; + temp |= (uint16_t)(CY_BLE_MXD_RADIO_CLK_BUF_AMP_32M_LARGE << CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_SHIFT); + + /* Update cy_BleEcoClockFreqHz for the proper Cy_SysLib_Delay functionality */ + cy_BleEcoClockFreqHz = CY_BLE_DEFAULT_ECO_CLK_FREQ_32MHZ / (1UL << (uint16_t)ecoConfig->ecoSysDiv); + } + else + { + if(ecoConfig->ecoSysDiv >= (uint32_t)CY_BLE_BLESS_XTAL_CLK_DIV_2) + { + blerdDivider = (uint16_t)CY_BLE_MXD_RADIO_CLK_DIV_2; + } + else + { + blerdDivider = (uint16_t)ecoConfig->ecoSysDiv; + blellDivider = (uint16_t)CY_BLE_MXD_RADIO_CLK_DIV_2 - blerdDivider; + } + temp &= (uint16_t)~CY_BLE_RF_DCXO_BUF_CFG_REG_XTAL_32M_SEL_BIT; + temp |= (uint16_t)(CY_BLE_MXD_RADIO_CLK_BUF_AMP_16M_LARGE << CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_SHIFT); + + /* Update cy_BleEcoClockFreqHz for the proper Cy_SysLib_Delay functionality */ + cy_BleEcoClockFreqHz = CY_BLE_DEFAULT_ECO_CLK_FREQ_16MHZ / (1UL << (uint16_t)ecoConfig->ecoSysDiv); + } + + temp |= (uint16_t)(blerdDivider << CY_BLE_RF_DCXO_BUF_CFG_REG_CLK_DIV_SHIFT); + /* Write the MXD Radio register */ + Cy_BLE_HalRcbRegWrite(CY_BLE_RF_DCXO_BUF_CFG_REG, temp); + + /* Reduce BLESS divider by BLERD divider value */ + ecoSysDivider = (uint16_t)ecoConfig->ecoSysDiv - blerdDivider; + temp = (uint16_t)(ecoSysDivider & BLE_BLESS_XTAL_CLK_DIV_CONFIG_SYSCLK_DIV_Msk); + temp |= (uint16_t)(blellDivider << BLE_BLESS_XTAL_CLK_DIV_CONFIG_LLCLK_DIV_Pos); + /* Set clock divider */ + BLE->BLESS.XTAL_CLK_DIV_CONFIG = temp; + +} + + +/******************************************************************************* +* Function Name: Cy_BLE_EcoStop +****************************************************************************//** +* +* Disables BLE ECO clock. +* +* \return +* None +* +*******************************************************************************/ +void Cy_BLE_EcoStop(void) +{ + /* Initiate Soft Reset */ + BLE->BLESS.LL_CLK_EN |= BLE_BLESS_LL_CLK_EN_BLESS_RESET_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_BLE_EcoStart +****************************************************************************//** +* +* Configures and starts BLE ECO clock. +* By default, BLE stack starts BLE ECO clock with default parameters: +* CY_BLE_DEFAULT_OSC_STARTUP_DELAY_LF +* CY_BLE_DEFAULT_CAP_TRIM_VALUE +* CY_BLE_DEFAULT_ECO_FREQ +* CY_BLE_DEFAULT_ECO_DIV +* In case BLE ECO is used with different parameters, enable it in DWR or call +* this function with custom configuration. +* +* This clock is stopped in the deep sleep and hibernate power modes. +* +* \param ecoConfig: Clock configuration of type 'cy_stc_ble_bless_eco_cfg_params_t'. +* +* \return +* CY_BLE_ECO_SUCCESS - On successful operation. +* CY_BLE_ECO_BAD_PARAM - Wrong input parameter. +* CY_BLE_ECO_RCB_CONTROL_LL - If the RCB Control is with BLE Link Layer. +* CY_BLE_ECO_ALREADY_STARTED - If BLE ECO clock is aready started +* +*******************************************************************************/ +cy_en_ble_eco_status_t Cy_BLE_EcoStart(const cy_stc_ble_bless_eco_cfg_params_t *ecoConfig) +{ + cy_en_ble_eco_status_t status = CY_BLE_ECO_SUCCESS; + uint32_t temp; + + if(ecoConfig == NULL) + { + status = CY_BLE_ECO_BAD_PARAM; + } + else + { + if((BLE->BLESS.MT_CFG & BLE_BLESS_MT_CFG_ENABLE_BLERD_Msk) != 0u) + { + status = CY_BLE_ECO_ALREADY_STARTED; + } + else + { + /* HAL Initialization */ + Cy_BLE_HAL_Init(); + + /* BLESS MT Delays configuration */ + BLE->BLESS.MT_DELAY_CFG = + (uint32_t)(CY_BLE_DEFAULT_HVLDO_STARTUP_DELAY << BLE_BLESS_MT_DELAY_CFG_HVLDO_STARTUP_DELAY_Pos) | + (uint32_t)(CY_BLE_DEFAULT_ISOLATE_DEASSERT_DELAY << BLE_BLESS_MT_DELAY_CFG_ISOLATE_DEASSERT_DELAY_Pos) | + (uint32_t)(CY_BLE_DEFAULT_ACT_TO_SWITCH_DELAY << BLE_BLESS_MT_DELAY_CFG_ACT_TO_SWITCH_DELAY_Pos) | + (uint32_t)(CY_BLE_DEFAULT_HVLDO_DISABLE_DELAY << BLE_BLESS_MT_DELAY_CFG_HVLDO_DISABLE_DELAY_Pos); + + BLE->BLESS.MT_DELAY_CFG2 = + (uint32_t)((uint32_t)ecoConfig->ecoXtalStartUpTime << BLE_BLESS_MT_DELAY_CFG2_OSC_STARTUP_DELAY_LF_Pos) | + (uint32_t)(CY_BLE_DEFAULT_ACT_STARTUP_DELAY << BLE_BLESS_MT_DELAY_CFG2_ACT_STARTUP_DELAY_Pos) | + (uint32_t)(CY_BLE_DEFAULT_DIG_LDO_STARTUP_DELAY << BLE_BLESS_MT_DELAY_CFG2_DIG_LDO_STARTUP_DELAY_Pos); + + BLE->BLESS.MT_DELAY_CFG3 = + (uint32_t)(CY_BLE_DEFAULT_XTAL_DISABLE_DELAY << BLE_BLESS_MT_DELAY_CFG3_XTAL_DISABLE_DELAY_Pos) | + (uint32_t)(CY_BLE_DEFAULT_DIG_LDO_DISABLE_DELAY << BLE_BLESS_MT_DELAY_CFG3_DIG_LDO_DISABLE_DELAY_Pos) | + (uint32_t)(CY_BLE_DEFAULT_VDDR_STABLE_DELAY << BLE_BLESS_MT_DELAY_CFG3_VDDR_STABLE_DELAY_Pos); + + /* RCB Initialization */ + /* Check if the RCB Control is with LL. */ + if((BLE->RCB.RCBLL.CTRL & BLE_RCB_RCBLL_CTRL_RCBLL_CTRL_Msk) != 0u) + { + status = CY_BLE_ECO_RCB_CONTROL_LL; + } + else + { + uint32_t rcbDivider = 0u; + + /* If clock source for RCB is PeriClk */ + if((BLE_BLESS->LL_CLK_EN & BLE_BLESS_LL_CLK_EN_SEL_RCB_CLK_Msk) == 0u) + { + if(cy_PeriClkFreqHz > CY_BLE_DEFAULT_RCB_CTRL_FREQ) + { + rcbDivider = (cy_PeriClkFreqHz / CY_BLE_DEFAULT_RCB_CTRL_FREQ) - 1u; + } + } + else + { + rcbDivider = CY_BLE_DEFAULT_RCB_CTRL_DIV; + } + + /* Configure default RCB Parameters. */ + BLE->RCB.CTRL |= + (BLE_RCB_CTRL_ENABLED_Msk | + BLE_RCB_CTRL_RX_CLK_EDGE_Msk | + (CY_BLE_DEFAULT_RCB_CTRL_LEAD << BLE_RCB_CTRL_LEAD_Pos) | + (CY_BLE_DEFAULT_RCB_CTRL_LAG << BLE_RCB_CTRL_LAG_Pos) | + ((rcbDivider > 0u) ? + ((rcbDivider << BLE_RCB_CTRL_DIV_Pos) | + BLE_RCB_CTRL_DIV_ENABLED_Msk) + : 0u) + ); + + /* Configure LDO if Buck2 is not already enabled */ + if(!Cy_SysPm_SimoBuckOutputIsEnabled(CY_SYSPM_BUCK_VRF)) + { + BLE->BLESS.MISC_EN_CTRL |= (BLE_BLESS_MISC_EN_CTRL_ACT_REG_EN_CTRL_Msk | + BLE_BLESS_MISC_EN_CTRL_BUCK_EN_CTRL_Msk); + } + + /* Enable the VIO supply and LDO in standby mode for slow ramp */ + temp = BLE->BLESS.MT_CFG; + temp |= BLE_BLESS_MT_CFG_HVLDO_BYPASS_Msk | + BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_BYPASS_Msk | + BLE_BLESS_MT_CFG_HVLDO_EN_Msk | + BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_EN_Msk; + BLE->BLESS.MT_CFG = temp; + Cy_SysLib_DelayUs(64u); + + if ((BLE->BLESS.MT_VIO_CTRL & BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_Msk) == 0u) + { + /* Enable LDO */ + BLE->BLESS.MT_VIO_CTRL = BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_Msk; + /* Wait for 64us after turning HVLDO ON */ + Cy_SysLib_DelayUs(64u); + /* Enable LDO Delayed */ + BLE->BLESS.MT_VIO_CTRL = BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_Msk | + BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_DLY_Msk; + /* Wait for 64us */ + Cy_SysLib_DelayUs(64u); + } + + /* Disable override mode and let hardware take control of HVLDO */ + temp &= ~(BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_BYPASS_Msk | + BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_EN_Msk); + BLE->BLESS.MT_CFG = temp; + + /* Wait for the VIO stable key write operation to complete */ + while ((GPIO->VDD_ACTIVE & 0x10u) == 0u) + { + } + + /* Clear the BLERD_ACTIVE_INTR */ + BLE->BLESS.INTR_STAT |= BLE_BLESS_INTR_STAT_BLERD_ACTIVE_INTR_Msk; + + if(!Cy_SysPm_SimoBuckOutputIsEnabled(CY_SYSPM_BUCK_VRF)) + { + temp |= BLE_BLESS_MT_CFG_ACT_LDO_NOT_BUCK_Msk; + } + /* Enable Radio */ + temp |= BLE_BLESS_MT_CFG_ENABLE_BLERD_Msk; + /* Disable ECO in DeepSleep mode */ + temp &= ~BLE_BLESS_MT_CFG_DPSLP_ECO_ON_Msk; + BLE->BLESS.MT_CFG = temp; + + while((BLE->BLESS.MT_STATUS & BLE_BLESS_MT_STATUS_BLESS_STATE_Msk) == 0u) + { + } + + /* Enable and configure radio clock */ + Cy_BLE_HalMxdRadioEnableClocks(ecoConfig); + + /* Set Load capacitance */ + Cy_BLE_HalEcoSetTrim(ecoConfig->loadCap); + } + } + } + return(status); +} + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/middleware/ble/cy_ble_clk.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/middleware/ble/cy_ble_clk.h new file mode 100644 index 0000000000..b02062e431 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/middleware/ble/cy_ble_clk.h @@ -0,0 +1,220 @@ +/***************************************************************************//** +* \file cy_ble_clk.h +* \version 1.0 +* +* \brief +* Contains the function prototypes and constants for the BLE clock. +* +******************************************************************************** +* \copyright +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef CY_BLE_CLK_H +#define CY_BLE_CLK_H + +#include "cy_device_headers.h" +#include "gpio/cy_gpio.h" +#include "syslib/cy_syslib.h" +#include + +/* C binding of definitions if building with C++ compiler */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define CY_BLE_CLK_ID (0x05u << 18u) + +#define CY_BLE_PORT2_CFG_VAL (0x66666666u) +#define CY_BLE_PORT3_CFG_VAL (0x66EEE666u) +#define CY_BLE_PORT4_CFG_VAL (0x6666E666u) + +#define CY_BLE_PORT2_HSIOM_SEL0 (0x1C1C1C1Cu) +#define CY_BLE_PORT2_HSIOM_SEL1 (0x1C1C1C1Cu) +#define CY_BLE_PORT3_HSIOM_SEL0 (0x1A1A1A1Cu) +#define CY_BLE_PORT3_HSIOM_SEL1 (0x00001A1Au) +#define CY_BLE_PORT4_HSIOM_SEL0 (0x1C001A1Au) +#define CY_BLE_PORT4_HSIOM_SEL1 (0x00000000u) + +#define CY_BLE_DEFAULT_OSC_STARTUP_DELAY_LF (45u) +#define CY_BLE_DEFAULT_CAP_TRIM_VALUE (32u) +#define CY_BLE_DEFAULT_ECO_FREQ (CY_BLE_BLESS_ECO_FREQ_32MHZ) +#define CY_BLE_DEFAULT_ECO_DIV (CY_BLE_SYS_ECO_CLK_DIV_4) + +#define CY_BLE_DEFAULT_HVLDO_STARTUP_DELAY (6UL) +#define CY_BLE_DEFAULT_ISOLATE_DEASSERT_DELAY (0UL) +#define CY_BLE_DEFAULT_ACT_TO_SWITCH_DELAY (0UL) +#define CY_BLE_DEFAULT_HVLDO_DISABLE_DELAY (1UL) + +#define CY_BLE_DEFAULT_ACT_STARTUP_DELAY (0UL) +#define CY_BLE_DEFAULT_DIG_LDO_STARTUP_DELAY (0UL) + +#define CY_BLE_DEFAULT_XTAL_DISABLE_DELAY (2UL) +#define CY_BLE_DEFAULT_DIG_LDO_DISABLE_DELAY (1UL) +#define CY_BLE_DEFAULT_VDDR_STABLE_DELAY (1UL) + +#define CY_BLE_DEFAULT_RCB_CTRL_LEAD (0x2UL) +#define CY_BLE_DEFAULT_RCB_CTRL_LAG (0x2UL) +#define CY_BLE_DEFAULT_RCB_CTRL_DIV (0x1UL) /* LL 8 MHz / 2 */ +#define CY_BLE_DEFAULT_RCB_CTRL_FREQ (4000000UL) /* Default RCB clock is 4 MHz */ + +#define CY_BLE_DEFAULT_ECO_CLK_FREQ_32MHZ (32000000UL) +#define CY_BLE_DEFAULT_ECO_CLK_FREQ_16MHZ (16000000UL) + +#define CY_BLE_MXD_RADIO_CLK_BUF_EN_VAL (CY_BLE_PMU_MODE_TRANSITION_REG_CLK_ANA_DIG_EN_BIT | \ + CY_BLE_PMU_MODE_TRANSITION_REG_RST_ACT_N_BIT) +#define CY_BLE_MXD_RADIO_DIG_CLK_OUT_EN_VAL (CY_BLE_PMU_PMU_CTRL_REG_CLK_CMOS_SEL_BIT) + +/* Radio registers */ +#define CY_BLE_PMU_MODE_TRANSITION_REG (0x1e02u) +#define CY_BLE_PMU_MODE_TRANSITION_REG_CLK_ANA_DIG_EN_BIT (uint16_t)(1UL << 12u) +#define CY_BLE_PMU_MODE_TRANSITION_REG_RST_ACT_N_BIT (uint16_t)(1UL << 11u) + +#define CY_BLE_PMU_PMU_CTRL_REG (0x1e03u) +#define CY_BLE_PMU_PMU_CTRL_REG_CLK_CMOS_SEL_BIT (uint16_t)(1UL << 10u) + +#define CY_BLE_RF_DCXO_CFG_REG (0x1e08u) +#define CY_BLE_RF_DCXO_CFG_REG_DCXO_CAP_SHIFT (1u) +#define CY_BLE_RF_DCXO_CFG_REG_DCXO_CAP_MASK (0xffUL) + +#define CY_BLE_RF_DCXO_BUF_CFG_REG (0x1e09u) +#define CY_BLE_RF_DCXO_BUF_CFG_REG_XTAL_32M_SEL_BIT (uint16_t)(1UL << 6u) +#define CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_SHIFT (4u) +#define CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_MASK (0x03UL) +#define CY_BLE_RF_DCXO_BUF_CFG_REG_CLK_DIV_SHIFT (0u) +#define CY_BLE_RF_DCXO_BUF_CFG_REG_CLK_DIV_MASK (0x0fUL) + + +/** + \addtogroup group_ble_clock_api + @{ +*/ + +/*************************************** +* Data Types +***************************************/ + +/** BLE Radio ECO clock divider */ +typedef enum +{ + CY_BLE_MXD_RADIO_CLK_DIV_1 = 0u, + CY_BLE_MXD_RADIO_CLK_DIV_2 = 1u, + CY_BLE_MXD_RADIO_CLK_DIV_4 = 2u, + CY_BLE_MXD_RADIO_CLK_DIV_8 = 4u, + CY_BLE_MXD_RADIO_CLK_DIV_16 = 8u +} cy_en_ble_mxd_radio_clk_div_t; + +/** Sine wave buffer output capability select */ +typedef enum +{ + CY_BLE_MXD_RADIO_CLK_BUF_AMP_16M_SMALL = 0u, + CY_BLE_MXD_RADIO_CLK_BUF_AMP_16M_LARGE = 1u, + CY_BLE_MXD_RADIO_CLK_BUF_AMP_32M_SMALL = 2u, + CY_BLE_MXD_RADIO_CLK_BUF_AMP_32M_LARGE = 3u +} cy_en_ble_mxd_radio_clk_buf_amp_t; + +/** BLESS clock divider */ +typedef enum +{ + CY_BLE_BLESS_XTAL_CLK_DIV_1 = 0u, + CY_BLE_BLESS_XTAL_CLK_DIV_2 = 1u, + CY_BLE_BLESS_XTAL_CLK_DIV_4 = 2u, + CY_BLE_BLESS_XTAL_CLK_DIV_8 = 3u +}cy_en_ble_bless_xtal_clk_div_config_llclk_div_t; + +/** BLE ECO Clock Frequency. */ +typedef enum +{ + /** ECO Frequency of 16MHz */ + CY_BLE_BLESS_ECO_FREQ_16MHZ, + + /** ECO Frequency of 32MHz */ + CY_BLE_BLESS_ECO_FREQ_32MHZ + +} cy_en_ble_bless_eco_freq_t; + +/** BLE ECO System clock divider */ +typedef enum +{ + /** Link Layer clock divider = 1*/ + CY_BLE_SYS_ECO_CLK_DIV_1 = 0x00u, + + /** Link Layer clock divider = 2*/ + CY_BLE_SYS_ECO_CLK_DIV_2, + + /** Link Layer clock divider = 4*/ + CY_BLE_SYS_ECO_CLK_DIV_4, + + /** Link Layer clock divider = 8*/ + CY_BLE_SYS_ECO_CLK_DIV_8, + + /** Invalid Link Layer clock divider*/ + CY_BLE_SYS_ECO_CLK_DIV_INVALID + +} cy_en_ble_bless_sys_eco_clk_div_t; + +/** BLE ECO Clock return value */ +typedef enum { + /** ECO started successfully */ + CY_BLE_ECO_SUCCESS, + + /** Invalid input param values */ + CY_BLE_ECO_BAD_PARAM = CY_PDL_STATUS_ERROR | CY_BLE_CLK_ID | 0x0001u, + + /** RCB is not available for Firmware control to restart ECO */ + CY_BLE_ECO_RCB_CONTROL_LL, + + /** ECO already started */ + CY_BLE_ECO_ALREADY_STARTED + +} cy_en_ble_eco_status_t; + + +/** BLE ECO configuration parameters */ +typedef struct +{ + /** ECO crystal startup time in multiple of 31.25us (startup_time_from_user min - 31.25us) + * ecoXtalStartUpTime = startup_time_from_user/31.25 */ + uint8_t ecoXtalStartUpTime; + + /** ECO crystal load capacitance - In multiple of 0.075pF (pF_from_user min - 7.5pF, pF_from_user max - 26.625pF) + * loadcap = ((pF_from_user - 7.5)/0.075) */ + uint8_t loadCap; + + /** ECO Frequency. */ + cy_en_ble_bless_eco_freq_t ecoFreq; + + /** System divider for ECO clock */ + cy_en_ble_bless_sys_eco_clk_div_t ecoSysDiv; + +} cy_stc_ble_bless_eco_cfg_params_t; + + +/*************************************** +* Function Prototypes +***************************************/ +cy_en_ble_eco_status_t Cy_BLE_EcoStart(const cy_stc_ble_bless_eco_cfg_params_t *ecoConfig); +void Cy_BLE_EcoStop(void); + +/** @} */ + + +/*************************************** +* Private Function Prototypes +***************************************/ +uint8_t Cy_BLE_HAL_IsEcoCpuClockSrc(void); +uint8_t Cy_BLE_HAL_IsWcoLfclkSrc(void); +void Cy_BLE_HAL_Init(void); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* CY_BLE_CLK_H */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/project.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/project.h new file mode 100644 index 0000000000..6013bdc514 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/project.h @@ -0,0 +1,99 @@ +/******************************************************************************* +* File Name: project.h +* +* PSoC Creator 4.1 +* +* Description: +* It contains references to all generated header files and should not be modified. +* This file is automatically generated by PSoC Creator. +* +******************************************************************************** +* Copyright (c) 2007-2017 Cypress Semiconductor. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +********************************************************************************/ + +#include "sysint/cy_sysint.h" +#include "ipc/cy_ipc_drv.h" +#include "ipc/cy_ipc_lock.h" +#include "ipc/cy_ipc_pipe.h" +#include "sysclk/cy_sysclk.h" +#include "wdt/cy_wdt.h" +#include "tcpwm/cy_tcpwm.h" +#include "tcpwm/cy_tcpwm_counter.h" +#include "tcpwm/cy_tcpwm_pwm.h" +#include "tcpwm/cy_tcpwm_quaddec.h" +#include "scb/cy_scb_common.h" +#include "scb/cy_scb_i2c.h" +#include "scb/cy_scb_ezi2c.h" +#include "scb/cy_scb_spi.h" +#include "scb/cy_scb_uart.h" +#include "flash/cy_flash.h" +#include "gpio/cy_gpio.h" +#include "syspm/cy_syspm.h" +#include "syslib/cy_syslib.h" +#include "trigmux/cy_trigmux.h" +#include "systick/cy_systick.h" +#include "crypto/cy_crypto.h" +#include "crypto/cy_crypto_common.h" +#include "crypto/cy_crypto_server.h" +#include "crypto/cy_crypto_core_des.h" +#include "crypto/cy_crypto_core_aes.h" +#include "crypto/cy_crypto_core_cmac.h" +#include "crypto/cy_crypto_core_crc.h" +#include "crypto/cy_crypto_core_hmac.h" +#include "crypto/cy_crypto_core_instructions.h" +#include "crypto/cy_crypto_core_prng.h" +#include "crypto/cy_crypto_core_rsa.h" +#include "crypto/cy_crypto_core_sha.h" +#include "crypto/cy_crypto_core_str.h" +#include "crypto/cy_crypto_core_trng.h" +#include "crypto/cy_crypto_core_trng_config.h" +#include "crypto/cy_crypto_core_util.h" +#include "crypto/cy_crypto_core_vu.h" +#include "crypto/cy_crypto_core_vu_hw.h" +#include "profile/cy_profile.h" +#include "prot/cy_prot.h" +#include "ble/cy_ble_clk.h" +#include "cy8c637bzi_bld74.h" +#include "psoc6ble_config.h" +#include "cy_device_headers.h" +#include "gpio_psoc6ble_116_bga_ble.h" +#include "system_psoc6ble_cm0plus.h" +#include "cyip_sflash.h" +#include "cyip_peri.h" +#include "cyip_crypto.h" +#include "cyip_cpuss.h" +#include "cyip_fault.h" +#include "cyip_ipc.h" +#include "cyip_prot.h" +#include "cyip_flashc.h" +#include "cyip_srss.h" +#include "cyip_backup.h" +#include "cyip_dw.h" +#include "cyip_efuse.h" +#include "cyip_profile.h" +#include "cyip_hsiom.h" +#include "cyip_gpio.h" +#include "cyip_smartio.h" +#include "cyip_udb.h" +#include "cyip_lpcomp.h" +#include "cyip_csd.h" +#include "cyip_tcpwm.h" +#include "cyip_lcd.h" +#include "cyip_ble.h" +#include "cyip_smif.h" +#include "cyip_scb.h" +#include "cyip_ctbm.h" +#include "cyip_ctdac.h" +#include "cyip_sar.h" +#include "cyip_pass.h" +#include "cyip_i2s.h" +#include "cyip_pdm.h" +#include "cyip_headers.h" +#include "cyfitter_cfg.h" +#include "cyfitter.h" + +/*[]*/ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/gpio_api.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/gpio_api.c new file mode 100644 index 0000000000..c22c50f88c --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/gpio_api.c @@ -0,0 +1,153 @@ + +#include "cmsis.h" +#include "device.h" +#include "mbed_assert.h" +#include "PeripheralNames.h" +#include "PinNames.h" +#include "PortNames.h" + + +void _gpio_set_dir_mode(gpio_t *obj); +uint32_t _gpio_get_cy_drive_mode(PinDirection dir, PinMode mode); + + +void gpio_init(gpio_t *obj, PinName pin) +{ + obj->pin = pin; + + MBED_ASSERT(obj->pin != NC); + + GPIO_PRT_Type *port = Cy_GPIO_PortToAddr(CYPRESS_PORT(obj->pin)); + uint32_t ppin = CYPRESS_PIN(obj->pin); + + const cy_stc_gpio_pin_config_t config = { + .outVal = 0x01, // must be 1 for DigitalIn to work. Does not seems to influence DigitalOut. Tested with PullDefault = PullUp + .driveMode = _gpio_get_cy_drive_mode(obj->dir, obj->mode), + .hsiom = HSIOM_SEL_GPIO, + }; + Cy_GPIO_Pin_Init(port, ppin, &config); +} + +void gpio_mode(gpio_t *obj, PinMode mode) +{ + MBED_ASSERT(obj->pin != NC); + + obj->mode = mode; + _gpio_set_dir_mode(obj); +} + +void gpio_dir(gpio_t *obj, PinDirection direction) +{ + MBED_ASSERT(obj->pin != NC); + + obj->dir = direction; + _gpio_set_dir_mode(obj); +} + +void gpio_write(gpio_t *obj, int value) +{ + MBED_ASSERT(obj->pin != NC); + + GPIO_PRT_Type *port = Cy_GPIO_PortToAddr(CYPRESS_PORT(obj->pin)); + uint32_t pin = CYPRESS_PIN(obj->pin); + + Cy_GPIO_Write(port, pin, value); +} + +/* + Return an integer representing the output setting of the pin if it is an + output, or read the input if set as an input. + (From DigitalOut::read) +*/ +int gpio_read(gpio_t *obj) +{ + int ret = 0; + + MBED_ASSERT(obj->pin != NC); + + GPIO_PRT_Type *port = Cy_GPIO_PortToAddr(CYPRESS_PORT(obj->pin)); + uint32_t pin = CYPRESS_PIN(obj->pin); + + switch (obj->dir) { + case PIN_INPUT: + ret = Cy_GPIO_Read(port, pin); + break; + + case PIN_OUTPUT: + ret = Cy_GPIO_ReadOut(port, pin); + break; + } + + return ret; +} + +int gpio_is_connected(const gpio_t *obj) +{ + return obj->pin != NC; +} + +void _gpio_set_dir_mode(gpio_t *obj) +{ + MBED_ASSERT(obj->pin != NC); + + GPIO_PRT_Type *port = Cy_GPIO_PortToAddr(CYPRESS_PORT(obj->pin)); + uint32_t pin = CYPRESS_PIN(obj->pin); + uint32_t cymode = _gpio_get_cy_drive_mode(obj->dir, obj->mode); + + Cy_GPIO_SetDrivemode(port, pin, cymode); +} + +uint32_t _gpio_get_cy_drive_mode(PinDirection dir, PinMode mode) +{ + uint32_t cymode = 0; + + switch (dir) { + case PIN_INPUT: + switch (mode) { + case PullNone: + cymode = CY_GPIO_DM_STRONG; + break; + case PullUp: + cymode = CY_GPIO_DM_PULLUP; + break; + case PullDown: + cymode = CY_GPIO_DM_PULLDOWN; + break; + case OpenDrainPullUp: + cymode = CY_GPIO_DM_OD_DRIVESHIGH; + break; + case OpenDrainNoPull: + cymode = CY_GPIO_DM_STRONG; + break; + case OpenDrainPullDown: + cymode = CY_GPIO_DM_OD_DRIVESLOW; + break; + } + break; + + case PIN_OUTPUT: + switch (mode) { + case PullNone: + cymode = CY_GPIO_DM_STRONG_IN_OFF; + break; + case PullUp: + cymode = CY_GPIO_DM_PULLUP_IN_OFF; + break; + case PullDown: + cymode = CY_GPIO_DM_PULLDOWN_IN_OFF; + break; + case OpenDrainPullUp: + cymode = CY_GPIO_DM_OD_DRIVESHIGH_IN_OFF; + break; + case OpenDrainNoPull: + cymode = CY_GPIO_DM_STRONG_IN_OFF; + break; + case OpenDrainPullDown: + cymode = CY_GPIO_DM_OD_DRIVESLOW_IN_OFF; + break; + } + break; + } + + return cymode; +} diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/objects.h b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/objects.h new file mode 100644 index 0000000000..04acee707d --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/objects.h @@ -0,0 +1,120 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) XXXX + * 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 ARM Limited nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef MBED_OBJECTS_H +#define MBED_OBJECTS_H + +#include "cmsis.h" +#include "PeripheralNames.h" +#include "PinNames.h" +#include "PortNames.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PinName pin; + PinDirection dir; + PinMode mode; +} gpio_t; + +// struct gpio_irq_s { +// IRQn_Type irq_n; +// uint32_t irq_index; +// uint32_t event; +// PinName pin; +// uint32_t pin_index; +// uint32_t pin_num; +// uint32_t port_num; +// uint32_t rise_null; +// uint32_t fall_null; +// }; + +// struct port_s { +// PortName port; +// uint32_t mask; +// PinDirection direction; +// __IO uint32_t *reg_in; +// __IO uint32_t *reg_out; +// }; + +// struct analogin_s { +// ADCName adc; +// PinName pin; +// uint32_t channel; +// }; + +struct serial_s { + CySCB_Type *base; + PinName pin_rx; + PinName pin_tx; +}; + +// struct spi_s { +// SSP_TypeDef *spi; +// }; + +// struct i2c_s { +// I2CName I2Cx; +// PinName sda; +// PinName scl; +// uint16_t ADDRESS; +// uint16_t is_setAddress; +// }; + +// struct pwmout_s { +// PWM_CHn_TypeDef * PWM_CHx; +// PinName pin; +// uint32_t period; +// uint32_t pulse; +// uint32_t PrescalerValue; +// }; + +// struct dac_s { +// DACName dac; +// PinName pin; +// uint32_t channel; +// }; + +// struct can_s { +// CANName can; +// int index; +// }; + +// struct trng_s { +// RNG_HandleTypeDef handle; +// }; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/serial_api.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/serial_api.c new file mode 100644 index 0000000000..40418a30aa --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/serial_api.c @@ -0,0 +1,219 @@ + +#if DEVICE_SERIAL + +#include + +#include "cmsis.h" +#include "mbed_assert.h" +#include "mbed_error.h" +#include "PeripheralPins.h" +#include "pinmap.h" + +#include "serial_api.h" + + +serial_t stdio_uart; +int stdio_uart_inited = 0; + + +void serial_init_clock(serial_t *obj, uint32_t baudrate) +{ + uint32_t periClk = 50*1000*1000; // UART uses periClk (50 MHz) + uint32_t oversample = 12; // this must match the cy_stc_scb_uart_config_t cy_UART_config.oversample in serial_init_periph() + + uint32_t divider = periClk/(oversample*baudrate); + + Cy_SysClk_PeriphAssignDivider(PCLK_SCB5_CLOCK, CY_SYSCLK_DIV_16_BIT, 0); + Cy_SysClk_PeriphSetDivider(CY_SYSCLK_DIV_16_BIT, 0, divider); + Cy_SysClk_PeriphPhaseAlignDivider(CY_SYSCLK_DIV_16_BIT, 0, CY_SYSCLK_DIV_24_5_BIT, 0xFF); +} + +/* + Returns the UART's SCBx_BASE corresponding to the pin, NULL if not found. +*/ +CySCB_Type *pin_to_scb(PinName pin) +{ + switch (pin) { + case P0_2: // P0_2_SCB0_UART_RX + case P0_3: // P0_3_SCB0_UART_TX + return SCB0; + break; + + case P10_0: // P10_0_SCB1_UART_RX + case P10_1: // P10_1_SCB1_UART_TX + return SCB1; + break; + + case P9_0: // P9_0_SCB2_UART_RX + case P9_1: // P9_1_SCB2_UART_TX + return SCB2; + break; + + case P6_0: // P6_0_SCB3_UART_RX + case P6_1: // P6_1_SCB3_UART_TX + return SCB3; + break; + + case P7_0: // P7_0_SCB4_UART_RX + case P7_1: // P7_1_SCB4_UART_TX + case P8_0: // P8_0_SCB4_UART_RX + case P8_1: // P8_1_SCB4_UART_TX + return SCB4; + break; + + case P5_0: // P5_0_SCB5_UART_RX + case P5_1: // P5_1_SCB5_UART_TX + case P11_0: // P11_0_SCB5_UART_RX + case P11_1: // P11_1_SCB5_UART_TX + return SCB5; + break; + + case P12_0: // P12_0_SCB6_UART_RX + case P12_1: // P12_1_SCB6_UART_TX + case P13_0: // P13_0_SCB6_UART_RX + case P13_1: // P13_1_SCB6_UART_TX + case P6_4: // P6_4_SCB6_UART_RX + case P6_5: // P6_5_SCB6_UART_TX + return SCB6; + break; + + case P1_0: // P1_0_SCB7_UART_RX + case P1_1: // P1_1_SCB7_UART_TX + return SCB7; + break; + + default: + return NULL; + break; + } +} + +void serial_init_pins(serial_t *obj, PinName tx, PinName rx) +{ + CySCB_Type *scb_tx = NULL, *scb_rx = NULL; + GPIO_PRT_Type *port = NULL; + uint32_t pin = 0; + + obj->pin_tx = tx; + obj->pin_rx = rx; + + scb_tx = pin_to_scb(tx); + scb_rx = pin_to_scb(rx); + + if ((scb_tx == NULL) || (scb_rx == NULL)) + error("Invalid Serial pinout. Try another TX or RX pin."); + + if (scb_tx != scb_rx) + error("Serial pinout mismatch. Requested pins Rx and Tx can't be used for the same Serial communication."); + + obj->base = scb_tx; + + // init tx + port = Cy_GPIO_PortToAddr(CYPRESS_PORT(obj->pin_tx)); + pin = CYPRESS_PIN(obj->pin_tx); + cy_stc_gpio_pin_config_t config_tx = { + .outVal = 0x01, + .driveMode = 6, + .hsiom = HSIOM_SEL_ACT_6, + }; + Cy_GPIO_Pin_Init(port, pin, &config_tx); + + // init rx + port = Cy_GPIO_PortToAddr(CYPRESS_PORT(obj->pin_rx)); + pin = CYPRESS_PIN(obj->pin_rx); + cy_stc_gpio_pin_config_t config_rx = { + .outVal = 0x01, + .driveMode = 8, + .hsiom = HSIOM_SEL_ACT_6, + }; + Cy_GPIO_Pin_Init(port, pin, &config_rx); +} + +void serial_init_periph(serial_t *obj) +{ + cy_stc_scb_uart_config_t cy_UART_config = + { + .uartMode = CY_SCB_UART_STANDARD, + .enableMutliProcessorMode = false, + .smartCardRetryOnNack = false, + .irdaInvertRx = false, + .irdaEnableLowPowerReceiver = false, + + .oversample = 12UL, + + .enableMsbFirst = false, + .dataWidth = 8UL, + .parity = CY_SCB_UART_PARITY_NONE, + .stopBits = CY_SCB_UART_STOP_BITS_1, + .enableInputFilter = false, + .breakWidth = 11UL, + .dropOnFrameError = false, + .dropOnParityError = false, + + .receiverAddress = 0x0UL, + .receiverAddressMask = 0x0UL, + .acceptAddrInFifo = false, + + .enableCts = false, + .ctsPolarity = CY_SCB_UART_ACTIVE_LOW, + .rtsRxFifoLevel = 0UL, + .rtsPolarity = CY_SCB_UART_ACTIVE_LOW, + + .rxFifoTriggerLevel = 0UL, + .rxFifoIntEnableMask = 0x0UL, + + .txFifoTriggerLevel = 0UL, + .txFifoIntEnableMask = 0x0UL + }; + + Cy_SCB_UART_Init(obj->base, &cy_UART_config, NULL); + Cy_SCB_UART_Enable(obj->base); +} + +void serial_init(serial_t *obj, PinName tx, PinName rx) +{ + if (stdio_uart_inited) + return; + stdio_uart_inited = 1; + + serial_init_clock(obj, 9600); + serial_init_pins(obj, tx, rx); + serial_init_periph(obj); +} + +void serial_baud(serial_t *obj, int baudrate) +{ + serial_init_clock(obj, baudrate); + serial_init_periph(obj); +} + +void serial_putc(serial_t *obj, int c) +{ + while (!serial_writable(obj)) + ; + Cy_SCB_UART_Put(obj->base, c); +} + +int serial_getc(serial_t *obj) +{ + while (!serial_readable(obj)) + ; + return Cy_SCB_UART_Get(obj->base); +} + +int serial_readable(serial_t *obj) +{ + return Cy_SCB_GetNumInRxFifo(obj->base) != 0; +} + +int serial_writable(serial_t *obj) +{ + return Cy_SCB_GetNumInTxFifo(obj->base) != Cy_SCB_GetFifoSize(obj->base); +} + +void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) +{ + +} + +#endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/us_ticker.c b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/us_ticker.c new file mode 100644 index 0000000000..c6f65934b1 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/us_ticker.c @@ -0,0 +1,129 @@ + +#include +#include "PeripheralNames.h" +#include "us_ticker_api.h" + + +#define CY_Counter_TCPWM_CNT_HW TCPWM0_CNT0 +#define CY_Counter_TCPWM_CNT_IDX 0u +#define CY_Counter_TCPWM_HW TCPWM0 +#define CY_Counter_TCPWM_IDX 0u + +#define CY_Counter_INIT_COMPARE_OR_CAPTURE (0uL) + +/** This is a ptr to the base address of the TCPWM instance */ +#define CY_Counter_HW (CY_Counter_TCPWM_HW) + +/** This is a ptr to the base address of the TCPWM CNT instance */ +#define CY_Counter_CNT_HW (CY_Counter_TCPWM_CNT_HW) + +/** This is the counter instance number in the selected TCPWM */ +#define CY_Counter_CNT_NUM (CY_Counter_TCPWM_CNT_IDX) + +/** This is the bit field representing the counter instance in the selected TCPWM */ +#define CY_Counter_CNT_MASK (1uL << CY_Counter_CNT_NUM) + +#define CY_Counter_INPUT_MODE_MASK (0x3u) + + +#define CY_SysInt_INTC_CORTEXM0P_ASSIGNED 1 +#define CY_SysInt_INTC_CORTEXM0P_MUX 0u +#define CY_SysInt_INTC_CORTEXM0P_PRIORITY 3u +#define CY_SysInt_INTC_NUMBER 82u + +#define CY_SysInt_INTR_CORTEXM0P_SRC (CY_SysInt_INTC_NUMBER) +#define CY_SysInt_INTR_CORTEXM0P_PRIORITY (CY_SysInt_INTC_CORTEXM0P_PRIORITY) +#define CY_SysInt_INTR_CORTEXM0P_MUX (CY_SysInt_INTC_CORTEXM0P_MUX) + + +cy_stc_sysint_t cy_SysInt_cfg_cm0p = { + .intrSrc = (IRQn_Type)CY_SysInt_INTR_CORTEXM0P_SRC, + .intrCm0p = (IRQn_CM0P_Type)CY_SysInt_INTR_CORTEXM0P_MUX, + .intrPriority = CY_SysInt_INTR_CORTEXM0P_PRIORITY +}; + +int us_ticker_inited = 0; + + +void irq_handler(void) +{ + us_ticker_clear_interrupt(); + us_ticker_irq_handler(); +} + +void us_ticker_init(void) +{ + cy_stc_tcpwm_counter_config_t cy_counter_config = + { + .period = 4294967295uL, + .clockPrescaler = 0uL, + .runMode = 0uL, + .countDirection = 0uL, + .compareOrCapture = CY_Counter_INIT_COMPARE_OR_CAPTURE, + .compare0 = 0uL, + .compare1 = 0uL, + .enableCompareSwap = false, + .interruptSources = CY_TCPWM_INT_ON_CC, + .captureInputMode = 7uL & CY_Counter_INPUT_MODE_MASK, + .captureInput = CY_TCPWM_INPUT_CREATOR, + .reloadInputMode = 7uL & CY_Counter_INPUT_MODE_MASK, + .reloadInput = CY_TCPWM_INPUT_CREATOR, + .startInputMode = 7uL & CY_Counter_INPUT_MODE_MASK, + .startInput = CY_TCPWM_INPUT_CREATOR, + .stopInputMode = 7uL & CY_Counter_INPUT_MODE_MASK, + .stopInput = CY_TCPWM_INPUT_CREATOR, + .countInputMode = 7uL & CY_Counter_INPUT_MODE_MASK, + .countInput = CY_TCPWM_INPUT_CREATOR, + }; + + if (us_ticker_inited) + return; + us_ticker_inited = 1; + + /* + Configure the clock + */ + + // us_ticker 1 MHz from PCLK 50 MHz + Cy_SysClk_PeriphAssignDivider(PCLK_TCPWM0_CLOCKS0, CY_SYSCLK_DIV_8_BIT, 0u); + Cy_SysClk_PeriphSetDivider(CY_SYSCLK_DIV_8_BIT, 0u, 49u); + Cy_SysClk_PeriphPhaseAlignDivider(CY_SYSCLK_DIV_8_BIT, 0u, CY_SYSCLK_DIV_24_5_BIT, 0xFF); + + /* + Configure the counter + */ + + Cy_TCPWM_Counter_Init(CY_Counter_HW, CY_Counter_CNT_NUM, &cy_counter_config); + Cy_TCPWM_Enable_Multiple(CY_Counter_HW, CY_Counter_CNT_MASK); + Cy_TCPWM_TriggerStart(CY_Counter_HW, CY_Counter_CNT_MASK); + + Cy_SysInt_Init(&cy_SysInt_cfg_cm0p, irq_handler); +} + +uint32_t us_ticker_read(void) +{ + if (!us_ticker_inited) + us_ticker_init(); + return Cy_TCPWM_Counter_GetCounter(CY_Counter_HW, CY_Counter_CNT_NUM); +} + +void us_ticker_set_interrupt(timestamp_t timestamp) +{ + if (!us_ticker_inited) + us_ticker_init(); + + // Set new output compare value + Cy_TCPWM_Counter_SetCompare0(CY_Counter_HW, CY_Counter_CNT_NUM, timestamp); + // Enable int + NVIC_EnableIRQ((IRQn_Type)cy_SysInt_cfg_cm0p.intrCm0p); +} + +void us_ticker_disable_interrupt(void) +{ + NVIC_DisableIRQ((IRQn_Type)cy_SysInt_cfg_cm0p.intrCm0p); +} + +void us_ticker_clear_interrupt(void) +{ + Cy_TCPWM_ClearInterrupt(CY_Counter_HW, CY_Counter_CNT_NUM, CY_TCPWM_INT_ON_CC); +} diff --git a/targets/TARGET_Cypress/mbed_rtx.h b/targets/TARGET_Cypress/mbed_rtx.h new file mode 100644 index 0000000000..f16e7bb69f --- /dev/null +++ b/targets/TARGET_Cypress/mbed_rtx.h @@ -0,0 +1,32 @@ +/* mbed Microcontroller Library + * Copyright (c) 2016 u-blox + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MBED_MBED_RTX_H +#define MBED_MBED_RTX_H + +#if defined(TARGET_PSoC6_CY8C_CM0p) + + #ifndef INITIAL_SP + #define INITIAL_SP (0x08000000 + 0x00024000) // Ram origin + length + #endif + +#else + + #error "Unknown board" + +#endif + +#endif // MBED_MBED_RTX_H From ec22815fee27f59def503b46d8346bf0d125b1ff Mon Sep 17 00:00:00 2001 From: Leszek Rusinowicz Date: Mon, 16 Oct 2017 16:01:40 +0200 Subject: [PATCH 2/9] Initial version with support for PSoC 6 CY8C63XX and both cores using updated PDL 3.0.1 beta. --- .../PeripheralNames.h | 0 .../PeripheralPins.h | 0 .../PinNamesTypes.h | 0 .../PortNames.h | 0 .../TARGET_PSoC6/TARGET_CY8C63XX/BLE_config.h | 330 ++ .../PeripheralPins.c | 0 .../TARGET_CY8CKIT_062_BLE_M0}/PinNames.h | 0 .../cy_ble_stack_mdk_controller_ipc_cm0p.a | Bin 0 -> 814258 bytes .../cy_ble_stack_mdk_controller_uart_cm0p.a | Bin 0 -> 805922 bytes .../cy_ble_stack_mdk_host_ipc_cm0p.a | Bin 0 -> 745418 bytes .../cy_ble_stack_mdk_host_uart_cm0p.a | Bin 0 -> 738318 bytes .../cy_ble_stack_mdk_radio_max_cm0p.a | Bin 0 -> 53906 bytes .../cy_ble_stack_mdk_soc_cm0p.a | Bin 0 -> 1496018 bytes .../TOOLCHAIN_GCC_ARM/cy8c6xx7_cm0plus.ld} | 160 +- .../libble_stack_gcc_controller_ipc_cm0p.a | Bin 0 -> 815250 bytes .../libble_stack_gcc_radio_max_cm0p.a | Bin 0 -> 54002 bytes .../startup_psoc63_cm0plus.S} | 141 +- .../system_psoc63_cm0plus.c} | 594 ++-- .../PeripheralPins.c | 131 + .../TARGET_CY8CKIT_062_BLE_M4/PinNames.h | 251 ++ .../cy_ble_stack_mdk_controller_ipc_cm4.a | Bin 0 -> 820884 bytes .../cy_ble_stack_mdk_controller_uart_cm4.a | Bin 0 -> 812496 bytes .../cy_ble_stack_mdk_host_ipc_cm4.a | Bin 0 -> 751250 bytes .../cy_ble_stack_mdk_host_uart_cm4.a | Bin 0 -> 744146 bytes .../cy_ble_stack_mdk_radio_max_cm4.a | Bin 0 -> 53890 bytes .../cy_ble_stack_mdk_soc_cm4.a | Bin 0 -> 1507342 bytes .../TOOLCHAIN_GCC_ARM/cy8c6xx7_cm4_dual.ld | 381 +++ .../libcy_ble_stack_gcc_host_ipc_cm4.a | Bin 0 -> 752754 bytes .../TOOLCHAIN_GCC_ARM/startup_psoc63_cm4.S | 646 ++++ .../system_psoc63_cm4.c | 430 +++ .../TARGET_CY8C63XX}/device.h | 2 +- .../libcy_crypto_client_gcc.a | Bin 0 -> 10040 bytes .../libcy_crypto_server_gcc_base.a | Bin 0 -> 20240 bytes .../libcy_crypto_server_gcc_extra.a | Bin 0 -> 29300 bytes .../libcy_crypto_server_gcc_full.a | Bin 0 -> 37358 bytes .../TARGET_CY8C63XX}/device/cmsis.h | 3 +- .../device/cy8c6347bzi_bld53.h | 1285 +++++++ .../device/cy_device_headers.h | 61 + .../device/gpio_psoc63_116_bga_ble.h | 1808 ++++++++++ .../device/gpio_psoc6ble_116_bga_ble.h | 0 .../TARGET_CY8C63XX/device/psoc63_config.h | 2394 +++++++++++++ .../TARGET_CY8C63XX}/device/psoc6ble_config.h | 0 .../TARGET_CY8C63XX/device/system_psoc63.h | 494 +++ .../drivers/peripheral/crypto/cy_crypto.h | 1678 +++++++++ .../peripheral/crypto/cy_crypto_common.h | 727 ++++ .../peripheral/crypto/cy_crypto_config.c | 69 + .../peripheral/crypto/cy_crypto_config.h | 57 + .../peripheral/crypto/cy_crypto_server.h | 125 + .../device/drivers/peripheral/ctb/cy_ctb.c | 1311 ++++++++ .../device/drivers/peripheral/ctb/cy_ctb.h | 1334 ++++++++ .../drivers/peripheral/ctdac/cy_ctdac.c | 656 ++++ .../drivers/peripheral/ctdac/cy_ctdac.h | 891 +++++ .../device/drivers/peripheral/dma/cy_dma.c | 318 ++ .../device/drivers/peripheral/dma/cy_dma.h | 1811 ++++++++++ .../drivers/peripheral/flash/cy_flash.c | 886 +++++ .../drivers/peripheral}/flash/cy_flash.h | 215 +- .../device/drivers/peripheral}/gpio/cy_gpio.c | 10 +- .../device/drivers/peripheral}/gpio/cy_gpio.h | 119 +- .../device/drivers/peripheral/i2s/cy_i2s.c | 275 ++ .../device/drivers/peripheral/i2s/cy_i2s.h | 974 ++++++ .../drivers/peripheral/ipc/cy_ipc_config.c | 143 + .../drivers/peripheral/ipc/cy_ipc_config.h | 137 + .../drivers/peripheral/ipc/cy_ipc_drv.c | 172 + .../drivers/peripheral/ipc/cy_ipc_drv.h | 900 +++++ .../drivers/peripheral/ipc/cy_ipc_pipe.c | 515 +++ .../drivers/peripheral/ipc/cy_ipc_pipe.h | 266 ++ .../drivers/peripheral/ipc/cy_ipc_sema.c | 369 ++ .../drivers/peripheral/ipc/cy_ipc_sema.h | 116 + .../drivers/peripheral/lpcomp/cy_lpcomp.c | 545 +++ .../drivers/peripheral/lpcomp/cy_lpcomp.h | 687 ++++ .../device/drivers/peripheral/lvd/cy_lvd.c | 64 + .../device/drivers/peripheral/lvd/cy_lvd.h | 423 +++ .../drivers/peripheral/mcwdt/cy_mcwdt.c | 100 + .../drivers/peripheral/mcwdt/cy_mcwdt.h | 997 ++++++ .../drivers/peripheral/pdm_pcm/cy_pdm_pcm.c | 240 ++ .../drivers/peripheral/pdm_pcm/cy_pdm_pcm.h | 729 ++++ .../drivers/peripheral}/profile/cy_profile.c | 130 +- .../drivers/peripheral/profile/cy_profile.h | 376 +++ .../device/drivers/peripheral}/prot/cy_prot.c | 506 +-- .../device/drivers/peripheral}/prot/cy_prot.h | 77 +- .../device/drivers/peripheral/rtc/cy_rtc.c | 1694 ++++++++++ .../device/drivers/peripheral/rtc/cy_rtc.h | 1273 +++++++ .../device/drivers/peripheral/sar/cy_sar.c | 1190 +++++++ .../device/drivers/peripheral/sar/cy_sar.h | 1744 ++++++++++ .../drivers/peripheral}/scb/cy_scb_common.c | 48 +- .../drivers/peripheral}/scb/cy_scb_common.h | 336 +- .../drivers/peripheral}/scb/cy_scb_ezi2c.c | 650 ++-- .../drivers/peripheral/scb/cy_scb_ezi2c.h | 491 +++ .../drivers/peripheral}/scb/cy_scb_i2c.c | 1230 ++++--- .../drivers/peripheral}/scb/cy_scb_i2c.h | 713 ++-- .../drivers/peripheral}/scb/cy_scb_spi.c | 465 ++- .../drivers/peripheral}/scb/cy_scb_spi.h | 635 ++-- .../drivers/peripheral}/scb/cy_scb_uart.c | 495 ++- .../drivers/peripheral}/scb/cy_scb_uart.h | 611 ++-- .../device/drivers/peripheral/smif/cy_smif.c | 1409 ++++++++ .../device/drivers/peripheral/smif/cy_smif.h | 1401 ++++++++ .../drivers/peripheral/smif/cy_smif_memslot.c | 1375 ++++++++ .../drivers/peripheral/smif/cy_smif_memslot.h | 425 +++ .../peripheral/sysanalog/cy_sysanalog.c | 102 + .../peripheral/sysanalog/cy_sysanalog.h | 561 ++++ .../drivers/peripheral}/sysclk/cy_sysclk.c | 1138 ++++--- .../drivers/peripheral/sysclk/cy_sysclk.h | 2553 ++++++++++++++ .../drivers/peripheral}/sysint/cy_sysint.c | 227 +- .../drivers/peripheral}/sysint/cy_sysint.h | 230 +- .../syslib/TOOLCHAIN_ARM_STD/cy_syslib_mdk.s | 100 + .../syslib}/TOOLCHAIN_GCC_ARM/cy_syslib_gcc.S | 4 +- .../syslib/TOOLCHAIN_IAR/cy_syslib_iar.s | 89 + .../drivers/peripheral}/syslib/cy_syslib.c | 527 +-- .../drivers/peripheral/syslib/cy_syslib.h | 924 +++++ .../drivers/peripheral/syspm/cy_syspm.c | 2064 ++++++++++++ .../drivers/peripheral/syspm/cy_syspm.h | 1734 ++++++++++ .../drivers/peripheral}/systick/cy_systick.c | 181 +- .../drivers/peripheral/systick/cy_systick.h | 284 ++ .../drivers/peripheral}/tcpwm/cy_tcpwm.h | 240 +- .../peripheral}/tcpwm/cy_tcpwm_counter.c | 46 +- .../peripheral}/tcpwm/cy_tcpwm_counter.h | 89 +- .../drivers/peripheral}/tcpwm/cy_tcpwm_pwm.c | 43 +- .../drivers/peripheral}/tcpwm/cy_tcpwm_pwm.h | 176 +- .../peripheral}/tcpwm/cy_tcpwm_quaddec.c | 26 +- .../peripheral}/tcpwm/cy_tcpwm_quaddec.h | 51 +- .../drivers/peripheral}/trigmux/cy_trigmux.c | 82 +- .../drivers/peripheral}/trigmux/cy_trigmux.h | 140 +- .../device/drivers/peripheral}/wdt/cy_wdt.c | 170 +- .../device/drivers/peripheral/wdt/cy_wdt.h | 362 ++ .../TARGET_PSoC6/device/ip/cyip_backup.h | 225 ++ .../TARGET_PSoC6/device/ip/cyip_ble.h | 2246 +++++++++++++ .../TARGET_PSoC6/device/ip/cyip_cpuss.h | 332 ++ .../TARGET_PSoC6/device/ip/cyip_crypto.h | 35 + .../TARGET_PSoC6/device/ip/cyip_csd.h | 477 +++ .../TARGET_PSoC6/device/ip/cyip_ctbm.h | 287 ++ .../TARGET_PSoC6/device/ip/cyip_ctdac.h | 105 + .../TARGET_PSoC6/device/ip/cyip_dw.h | 171 + .../TARGET_PSoC6/device/ip/cyip_efuse.h | 318 ++ .../TARGET_PSoC6/device/ip/cyip_fault.h | 113 + .../TARGET_PSoC6/device/ip/cyip_flashc.h | 570 ++++ .../TARGET_PSoC6/device/ip/cyip_gpio.h | 468 +++ .../device/ip/cyip_headers.h | 7 +- .../TARGET_PSoC6/device/ip/cyip_hsiom.h | 110 + .../TARGET_PSoC6/device/ip/cyip_i2s.h | 280 ++ .../TARGET_PSoC6/device/ip/cyip_ipc.h | 123 + .../TARGET_PSoC6/device/ip/cyip_lcd.h | 92 + .../TARGET_PSoC6/device/ip/cyip_lpcomp.h | 171 + .../TARGET_PSoC6/device/ip/cyip_pass.h | 130 + .../TARGET_PSoC6/device/ip/cyip_pdm.h | 161 + .../TARGET_PSoC6/device/ip/cyip_peri.h | 482 +++ .../TARGET_PSoC6/device/ip/cyip_profile.h | 105 + .../TARGET_PSoC6/device/ip/cyip_prot.h | 374 +++ .../TARGET_PSoC6/device/ip/cyip_sar.h | 627 ++++ .../TARGET_PSoC6/device/ip/cyip_scb.h | 757 +++++ .../TARGET_PSoC6/device/ip/cyip_sflash.h | 394 +++ .../TARGET_PSoC6/device/ip/cyip_smartio.h | 109 + .../TARGET_PSoC6/device/ip/cyip_smif.h | 378 +++ .../TARGET_PSoC6/device/ip/cyip_srss.h | 601 ++++ .../TARGET_PSoC6/device/ip/cyip_tcpwm.h | 191 ++ .../TARGET_PSoC6/device/ip/cyip_udb.h | 2026 +++++++++++ .../TARGET_PSoC6/device/ip/cyip_usbfs.h | 1770 ++++++++++ .../device/middleware/ble/cy_ble.c | 657 ++++ .../device/middleware/ble/cy_ble.h | 410 +++ .../device/middleware/ble/cy_ble_aios.c | 2325 +++++++++++++ .../device/middleware/ble/cy_ble_aios.h | 319 ++ .../device/middleware/ble/cy_ble_ancs.c | 1359 ++++++++ .../device/middleware/ble/cy_ble_ancs.h | 206 ++ .../device/middleware/ble/cy_ble_ans.c | 1413 ++++++++ .../device/middleware/ble/cy_ble_ans.h | 235 ++ .../device/middleware/ble/cy_ble_bas.c | 1189 +++++++ .../device/middleware/ble/cy_ble_bas.h | 230 ++ .../device/middleware/ble/cy_ble_bcs.c | 1252 +++++++ .../device/middleware/ble/cy_ble_bcs.h | 208 ++ .../device/middleware/ble/cy_ble_bls.c | 1318 ++++++++ .../device/middleware/ble/cy_ble_bls.h | 229 ++ .../device/middleware/ble/cy_ble_bms.c | 1362 ++++++++ .../device/middleware/ble/cy_ble_bms.h | 223 ++ .../device/middleware/ble/cy_ble_bts.c | 509 +++ .../device/middleware/ble/cy_ble_bts.h | 125 + .../device/middleware/ble/cy_ble_cgms.c | 1612 +++++++++ .../device/middleware/ble/cy_ble_cgms.h | 246 ++ .../device/middleware/ble/cy_ble_clk.c | 627 ++++ .../device/middleware/ble/cy_ble_clk.h | 239 ++ .../device/middleware/ble/cy_ble_cps.c | 2226 ++++++++++++ .../device/middleware/ble/cy_ble_cps.h | 483 +++ .../device/middleware/ble/cy_ble_cscs.c | 1749 ++++++++++ .../device/middleware/ble/cy_ble_cscs.h | 236 ++ .../device/middleware/ble/cy_ble_cts.c | 1624 +++++++++ .../device/middleware/ble/cy_ble_cts.h | 316 ++ .../device/middleware/ble/cy_ble_custom.c | 513 +++ .../device/middleware/ble/cy_ble_custom.h | 193 ++ .../device/middleware/ble/cy_ble_dis.c | 561 ++++ .../device/middleware/ble/cy_ble_dis.h | 179 + .../device/middleware/ble/cy_ble_ds.h | 1728 ++++++++++ .../device/middleware/ble/cy_ble_ess.c | 2991 +++++++++++++++++ .../device/middleware/ble/cy_ble_ess.h | 439 +++ .../middleware/ble/cy_ble_event_handler.c | 1611 +++++++++ .../middleware/ble/cy_ble_event_handler.h | 2583 ++++++++++++++ .../device/middleware/ble/cy_ble_gap.c | 1440 ++++++++ .../device/middleware/ble/cy_ble_gap.h | 867 +++++ .../device/middleware/ble/cy_ble_gatt.c | 800 +++++ .../device/middleware/ble/cy_ble_gatt.h | 994 ++++++ .../device/middleware/ble/cy_ble_gls.c | 1505 +++++++++ .../device/middleware/ble/cy_ble_gls.h | 230 ++ .../device/middleware/ble/cy_ble_hal_int.c | 133 + .../device/middleware/ble/cy_ble_hal_pvt.c | 1557 +++++++++ .../device/middleware/ble/cy_ble_hal_pvt.h | 179 + .../device/middleware/ble/cy_ble_hids.c | 2134 ++++++++++++ .../device/middleware/ble/cy_ble_hids.h | 452 +++ .../device/middleware/ble/cy_ble_hps.c | 1877 +++++++++++ .../device/middleware/ble/cy_ble_hps.h | 247 ++ .../device/middleware/ble/cy_ble_hrs.c | 1270 +++++++ .../device/middleware/ble/cy_ble_hrs.h | 209 ++ .../device/middleware/ble/cy_ble_hts.c | 1551 +++++++++ .../device/middleware/ble/cy_ble_hts.h | 276 ++ .../device/middleware/ble/cy_ble_ias.c | 498 +++ .../device/middleware/ble/cy_ble_ias.h | 143 + .../device/middleware/ble/cy_ble_ips.c | 2273 +++++++++++++ .../device/middleware/ble/cy_ble_ips.h | 305 ++ .../device/middleware/ble/cy_ble_lls.c | 709 ++++ .../device/middleware/ble/cy_ble_lls.h | 145 + .../device/middleware/ble/cy_ble_lns.c | 1566 +++++++++ .../device/middleware/ble/cy_ble_lns.h | 248 ++ .../device/middleware/ble/cy_ble_ndcs.c | 504 +++ .../device/middleware/ble/cy_ble_ndcs.h | 142 + .../device/middleware/ble/cy_ble_pass.c | 1335 ++++++++ .../device/middleware/ble/cy_ble_pass.h | 249 ++ .../device/middleware/ble/cy_ble_plxs.c | 1699 ++++++++++ .../device/middleware/ble/cy_ble_plxs.h | 393 +++ .../device/middleware/ble/cy_ble_rscs.c | 1677 +++++++++ .../device/middleware/ble/cy_ble_rscs.h | 225 ++ .../device/middleware/ble/cy_ble_rtus.c | 678 ++++ .../device/middleware/ble/cy_ble_rtus.h | 179 + .../device/middleware/ble/cy_ble_scps.c | 1170 +++++++ .../device/middleware/ble/cy_ble_scps.h | 210 ++ .../device/middleware/ble/cy_ble_stack.h | 2160 ++++++++++++ .../device/middleware/ble/cy_ble_stack_gap.h | 1910 +++++++++++ .../middleware/ble/cy_ble_stack_gap_central.h | 653 ++++ .../ble/cy_ble_stack_gap_peripheral.h | 391 +++ .../device/middleware/ble/cy_ble_stack_gatt.h | 585 ++++ .../middleware/ble/cy_ble_stack_gatt_client.h | 1567 +++++++++ .../middleware/ble/cy_ble_stack_gatt_db.h | 615 ++++ .../middleware/ble/cy_ble_stack_gatt_server.h | 358 ++ .../middleware/ble/cy_ble_stack_host_error.h | 301 ++ .../middleware/ble/cy_ble_stack_host_main.h | 2272 +++++++++++++ .../middleware/ble/cy_ble_stack_l2cap.h | 830 +++++ .../device/middleware/ble/cy_ble_stack_pvt.h | 148 + .../device/middleware/ble/cy_ble_tps.c | 1091 ++++++ .../device/middleware/ble/cy_ble_tps.h | 206 ++ .../device/middleware/ble/cy_ble_uds.c | 2099 ++++++++++++ .../device/middleware/ble/cy_ble_uds.h | 259 ++ .../device/middleware/ble/cy_ble_wpts.c | 1598 +++++++++ .../device/middleware/ble/cy_ble_wpts.h | 246 ++ .../device/middleware/ble/cy_ble_wss.c | 1473 ++++++++ .../device/middleware/ble/cy_ble_wss.h | 219 ++ .../middleware/em_eeprom/cy_em_eeprom.c | 1215 +++++++ .../middleware/em_eeprom/cy_em_eeprom.h | 450 +++ .../gpio_api.c | 2 +- .../{ => TARGET_PSoC6}/mbed_rtx.h | 8 +- .../objects.h | 0 .../serial_api.c | 5 +- .../TARGET_Cypress/TARGET_PSoC6/us_ticker.c | 122 + .../device/cy8c637bzi_bld74.h | 1030 ------ .../device/cy_device_headers.h | 85 - .../device/system_psoc6ble_cm0plus.h | 185 - .../device/cy_crypto_config.h | 92 - .../TARGET_PSoC6_CY8C/device/cyapicallbacks.h | 28 - .../device/cydisabledsheets.h | 5 - .../TARGET_PSoC6_CY8C/device/cyfitter.h | 6 - .../TARGET_PSoC6_CY8C/device/cyfitter_cfg.c | 271 -- .../TARGET_PSoC6_CY8C/device/cyfitter_cfg.h | 29 - .../TARGET_PSoC6_CY8C/device/cyfitter_gpio.h | 6 - .../TARGET_PSoC6_CY8C/device/cymetadata.c | 48 - .../device/driver_periph/crypto/cy_crypto.c | 1809 ---------- .../device/driver_periph/crypto/cy_crypto.h | 450 --- .../driver_periph/crypto/cy_crypto_common.h | 504 --- .../driver_periph/crypto/cy_crypto_core_aes.c | 405 --- .../driver_periph/crypto/cy_crypto_core_aes.h | 77 - .../crypto/cy_crypto_core_cmac.c | 272 -- .../crypto/cy_crypto_core_cmac.h | 72 - .../driver_periph/crypto/cy_crypto_core_crc.c | 117 - .../driver_periph/crypto/cy_crypto_core_crc.h | 41 - .../driver_periph/crypto/cy_crypto_core_des.c | 208 -- .../driver_periph/crypto/cy_crypto_core_des.h | 48 - .../crypto/cy_crypto_core_hmac.c | 244 -- .../crypto/cy_crypto_core_hmac.h | 37 - .../crypto/cy_crypto_core_instructions.h | 180 - .../crypto/cy_crypto_core_prng.c | 99 - .../crypto/cy_crypto_core_prng.h | 39 - .../driver_periph/crypto/cy_crypto_core_rsa.c | 993 ------ .../driver_periph/crypto/cy_crypto_core_rsa.h | 62 - .../driver_periph/crypto/cy_crypto_core_sha.c | 442 --- .../driver_periph/crypto/cy_crypto_core_sha.h | 115 - .../driver_periph/crypto/cy_crypto_core_str.c | 194 -- .../driver_periph/crypto/cy_crypto_core_str.h | 43 - .../crypto/cy_crypto_core_trng.c | 93 - .../crypto/cy_crypto_core_trng.h | 37 - .../crypto/cy_crypto_core_trng_config.h | 239 -- .../crypto/cy_crypto_core_util.c | 485 --- .../crypto/cy_crypto_core_util.h | 132 - .../driver_periph/crypto/cy_crypto_core_vu.c | 66 - .../driver_periph/crypto/cy_crypto_core_vu.h | 136 - .../crypto/cy_crypto_core_vu_hw.h | 380 --- .../driver_periph/crypto/cy_crypto_server.c | 409 --- .../driver_periph/crypto/cy_crypto_server.h | 51 - .../device/driver_periph/flash/cy_flash.c | 470 --- .../device/driver_periph/ipc/cy_ipc_drv.c | 464 --- .../device/driver_periph/ipc/cy_ipc_drv.h | 288 -- .../device/driver_periph/ipc/cy_ipc_lock.c | 268 -- .../device/driver_periph/ipc/cy_ipc_lock.h | 84 - .../device/driver_periph/ipc/cy_ipc_pipe.c | 345 -- .../device/driver_periph/ipc/cy_ipc_pipe.h | 191 -- .../device/driver_periph/profile/cy_profile.h | 540 --- .../device/driver_periph/scb/cy_scb_ezi2c.h | 424 --- .../device/driver_periph/sysclk/cy_sysclk.h | 2165 ------------ .../device/driver_periph/syslib/cy_syslib.h | 800 ----- .../device/driver_periph/syspm/cy_syspm.c | 1879 ----------- .../device/driver_periph/syspm/cy_syspm.h | 820 ----- .../device/driver_periph/systick/cy_systick.h | 170 - .../device/driver_periph/wdt/cy_wdt.h | 261 -- .../TARGET_PSoC6_CY8C/device/ip/cyip_backup.h | 221 -- .../TARGET_PSoC6_CY8C/device/ip/cyip_ble.h | 2219 ------------ .../TARGET_PSoC6_CY8C/device/ip/cyip_cpuss.h | 346 -- .../TARGET_PSoC6_CY8C/device/ip/cyip_crypto.h | 375 --- .../TARGET_PSoC6_CY8C/device/ip/cyip_csd.h | 473 --- .../TARGET_PSoC6_CY8C/device/ip/cyip_ctbm.h | 287 -- .../TARGET_PSoC6_CY8C/device/ip/cyip_ctdac.h | 110 - .../TARGET_PSoC6_CY8C/device/ip/cyip_dw.h | 230 -- .../TARGET_PSoC6_CY8C/device/ip/cyip_efuse.h | 318 -- .../TARGET_PSoC6_CY8C/device/ip/cyip_fault.h | 113 - .../TARGET_PSoC6_CY8C/device/ip/cyip_flashc.h | 518 --- .../TARGET_PSoC6_CY8C/device/ip/cyip_gpio.h | 468 --- .../TARGET_PSoC6_CY8C/device/ip/cyip_hsiom.h | 88 - .../TARGET_PSoC6_CY8C/device/ip/cyip_i2s.h | 280 -- .../TARGET_PSoC6_CY8C/device/ip/cyip_ipc.h | 123 - .../TARGET_PSoC6_CY8C/device/ip/cyip_lcd.h | 92 - .../TARGET_PSoC6_CY8C/device/ip/cyip_lpcomp.h | 171 - .../TARGET_PSoC6_CY8C/device/ip/cyip_pass.h | 130 - .../TARGET_PSoC6_CY8C/device/ip/cyip_pdm.h | 169 - .../TARGET_PSoC6_CY8C/device/ip/cyip_peri.h | 482 --- .../device/ip/cyip_profile.h | 105 - .../TARGET_PSoC6_CY8C/device/ip/cyip_prot.h | 374 --- .../TARGET_PSoC6_CY8C/device/ip/cyip_sar.h | 627 ---- .../TARGET_PSoC6_CY8C/device/ip/cyip_scb.h | 755 ----- .../TARGET_PSoC6_CY8C/device/ip/cyip_sflash.h | 186 - .../device/ip/cyip_smartio.h | 109 - .../TARGET_PSoC6_CY8C/device/ip/cyip_smif.h | 404 --- .../TARGET_PSoC6_CY8C/device/ip/cyip_srss.h | 655 ---- .../TARGET_PSoC6_CY8C/device/ip/cyip_tcpwm.h | 191 -- .../TARGET_PSoC6_CY8C/device/ip/cyip_udb.h | 2052 ----------- .../device/middleware/ble/cy_ble_clk.c | 491 --- .../device/middleware/ble/cy_ble_clk.h | 220 -- .../TARGET_PSoC6_CY8C/device/project.h | 99 - .../TARGET_PSoC6_CY8C/us_ticker.c | 129 - 349 files changed, 150901 insertions(+), 37341 deletions(-) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C => TARGET_PSoC6}/PeripheralNames.h (100%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C => TARGET_PSoC6}/PeripheralPins.h (100%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C => TARGET_PSoC6}/PinNamesTypes.h (100%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C => TARGET_PSoC6}/PortNames.h (100%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/BLE_config.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p => TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0}/PeripheralPins.c (100%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p => TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0}/PinNames.h (100%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_controller_ipc_cm0p.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_controller_uart_cm0p.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_ipc_cm0p.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_uart_cm0p.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_radio_max_cm0p.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_soc_cm0p.a rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy8c6x7_cm0plus.ld => TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_GCC_ARM/cy8c6xx7_cm0plus.ld} (76%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_GCC_ARM/libble_stack_gcc_controller_ipc_cm0p.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_GCC_ARM/libble_stack_gcc_radio_max_cm0p.a rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/startup_psoc6ble_cm0plus.S => TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_GCC_ARM/startup_psoc63_cm0plus.S} (60%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/system_psoc6ble_cm0plus.c => TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/system_psoc63_cm0plus.c} (52%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/PeripheralPins.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/PinNames.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_controller_ipc_cm4.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_controller_uart_cm4.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_ipc_cm4.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_uart_cm4.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_radio_max_cm4.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_soc_cm4.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/cy8c6xx7_cm4_dual.ld create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/libcy_ble_stack_gcc_host_ipc_cm4.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/startup_psoc63_cm4.S create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/system_psoc63_cm4.c rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p => TARGET_PSoC6/TARGET_CY8C63XX}/device.h (98%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_client_gcc.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_server_gcc_base.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_server_gcc_extra.a create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_server_gcc_full.a rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p => TARGET_PSoC6/TARGET_CY8C63XX}/device/cmsis.h (93%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cy8c6347bzi_bld53.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cy_device_headers.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/gpio_psoc63_116_bga_ble.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p => TARGET_PSoC6/TARGET_CY8C63XX}/device/gpio_psoc6ble_116_bga_ble.h (100%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/psoc63_config.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p => TARGET_PSoC6/TARGET_CY8C63XX}/device/psoc6ble_config.h (100%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/system_psoc63.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_common.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_config.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_config.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_server.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctb/cy_ctb.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctb/cy_ctb.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctdac/cy_ctdac.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctdac/cy_ctdac.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/dma/cy_dma.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/dma/cy_dma.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/flash/cy_flash.c rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/flash/cy_flash.h (57%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/gpio/cy_gpio.c (98%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/gpio/cy_gpio.h (97%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/i2s/cy_i2s.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/i2s/cy_i2s.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_config.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_config.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_drv.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_drv.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_pipe.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_pipe.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_sema.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_sema.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lpcomp/cy_lpcomp.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lpcomp/cy_lpcomp.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lvd/cy_lvd.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lvd/cy_lvd.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/mcwdt/cy_mcwdt.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/mcwdt/cy_mcwdt.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/pdm_pcm/cy_pdm_pcm.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/pdm_pcm/cy_pdm_pcm.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/profile/cy_profile.c (81%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/profile/cy_profile.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/prot/cy_prot.c (95%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/prot/cy_prot.h (91%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/rtc/cy_rtc.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/rtc/cy_rtc.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/sar/cy_sar.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/sar/cy_sar.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/scb/cy_scb_common.c (90%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/scb/cy_scb_common.h (80%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/scb/cy_scb_ezi2c.c (58%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/scb/cy_scb_ezi2c.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/scb/cy_scb_i2c.c (72%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/scb/cy_scb_i2c.h (55%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/scb/cy_scb_spi.c (59%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/scb/cy_scb_spi.h (64%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/scb/cy_scb_uart.c (69%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/scb/cy_scb_uart.h (67%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/smif/cy_smif.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/smif/cy_smif.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/smif/cy_smif_memslot.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/smif/cy_smif_memslot.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/sysanalog/cy_sysanalog.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/sysanalog/cy_sysanalog.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/sysclk/cy_sysclk.c (50%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/sysclk/cy_sysclk.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/sysint/cy_sysint.c (52%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/sysint/cy_sysint.h (51%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/syslib/TOOLCHAIN_ARM_STD/cy_syslib_mdk.s rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device => TARGET_PSoC6/device/drivers/peripheral/syslib}/TOOLCHAIN_GCC_ARM/cy_syslib_gcc.S (97%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/syslib/TOOLCHAIN_IAR/cy_syslib_iar.s rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/syslib/cy_syslib.c (50%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/syslib/cy_syslib.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/syspm/cy_syspm.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/syspm/cy_syspm.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/systick/cy_systick.c (57%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/systick/cy_systick.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/tcpwm/cy_tcpwm.h (73%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/tcpwm/cy_tcpwm_counter.c (68%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/tcpwm/cy_tcpwm_counter.h (87%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/tcpwm/cy_tcpwm_pwm.c (71%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/tcpwm/cy_tcpwm_pwm.h (71%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/tcpwm/cy_tcpwm_quaddec.c (79%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/tcpwm/cy_tcpwm_quaddec.h (87%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/trigmux/cy_trigmux.c (58%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/trigmux/cy_trigmux.h (69%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C/device/driver_periph => TARGET_PSoC6/device/drivers/peripheral}/wdt/cy_wdt.c (50%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/wdt/cy_wdt.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_backup.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_ble.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_cpuss.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_crypto.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_csd.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_ctbm.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_ctdac.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_dw.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_efuse.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_fault.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_flashc.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_gpio.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C => TARGET_PSoC6}/device/ip/cyip_headers.h (74%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_hsiom.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_i2s.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_ipc.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_lcd.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_lpcomp.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_pass.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_pdm.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_peri.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_profile.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_prot.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_sar.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_scb.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_sflash.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_smartio.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_smif.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_srss.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_tcpwm.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_udb.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/ip/cyip_usbfs.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_aios.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_aios.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ancs.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ancs.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ans.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ans.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_bas.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_bas.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_bcs.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_bcs.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_bls.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_bls.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_bms.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_bms.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_bts.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_bts.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_cgms.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_cgms.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_clk.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_clk.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_cps.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_cps.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_cscs.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_cscs.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_cts.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_cts.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_custom.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_custom.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_dis.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_dis.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ds.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ess.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ess.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_event_handler.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_event_handler.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_gap.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_gap.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_gatt.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_gatt.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_gls.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_gls.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hal_int.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hal_pvt.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hal_pvt.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hids.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hids.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hps.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hps.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hrs.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hrs.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hts.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_hts.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ias.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ias.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ips.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ips.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_lls.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_lls.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_lns.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_lns.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ndcs.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_ndcs.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_pass.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_pass.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_plxs.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_plxs.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_rscs.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_rscs.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_rtus.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_rtus.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_scps.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_scps.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_gap.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_gap_central.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_gap_peripheral.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_gatt.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_gatt_client.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_gatt_db.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_gatt_server.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_host_error.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_host_main.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_l2cap.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_stack_pvt.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_tps.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_tps.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_uds.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_uds.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_wpts.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_wpts.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_wss.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/ble/cy_ble_wss.h create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/em_eeprom/cy_em_eeprom.c create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/device/middleware/em_eeprom/cy_em_eeprom.h rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C => TARGET_PSoC6}/gpio_api.c (98%) rename targets/TARGET_Cypress/{ => TARGET_PSoC6}/mbed_rtx.h (81%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C => TARGET_PSoC6}/objects.h (100%) rename targets/TARGET_Cypress/{TARGET_PSoC6_CY8C => TARGET_PSoC6}/serial_api.c (95%) create mode 100644 targets/TARGET_Cypress/TARGET_PSoC6/us_ticker.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cy8c637bzi_bld74.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cy_device_headers.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/system_psoc6ble_cm0plus.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cy_crypto_config.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyapicallbacks.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cydisabledsheets.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_cfg.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_cfg.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cyfitter_gpio.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/cymetadata.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_common.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_aes.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_aes.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_cmac.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_cmac.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_crc.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_crc.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_des.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_des.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_hmac.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_hmac.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_instructions.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_prng.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_prng.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_rsa.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_rsa.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_sha.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_sha.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_str.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_str.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_trng_config.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_util.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_util.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_core_vu_hw.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_server.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/crypto/cy_crypto_server.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_drv.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_drv.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_lock.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_lock.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_pipe.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/ipc/cy_ipc_pipe.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/profile/cy_profile.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/scb/cy_scb_ezi2c.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/sysclk/cy_sysclk.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syslib/cy_syslib.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syspm/cy_syspm.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/syspm/cy_syspm.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/systick/cy_systick.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/wdt/cy_wdt.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_backup.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ble.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_cpuss.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_crypto.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_csd.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ctbm.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ctdac.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_dw.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_efuse.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_fault.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_flashc.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_gpio.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_hsiom.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_i2s.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_ipc.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_lcd.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_lpcomp.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_pass.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_pdm.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_peri.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_profile.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_prot.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_sar.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_scb.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_sflash.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_smartio.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_smif.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_srss.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_tcpwm.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/ip/cyip_udb.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/middleware/ble/cy_ble_clk.c delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/middleware/ble/cy_ble_clk.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/project.h delete mode 100644 targets/TARGET_Cypress/TARGET_PSoC6_CY8C/us_ticker.c diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralNames.h b/targets/TARGET_Cypress/TARGET_PSoC6/PeripheralNames.h similarity index 100% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralNames.h rename to targets/TARGET_Cypress/TARGET_PSoC6/PeripheralNames.h diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralPins.h b/targets/TARGET_Cypress/TARGET_PSoC6/PeripheralPins.h similarity index 100% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PeripheralPins.h rename to targets/TARGET_Cypress/TARGET_PSoC6/PeripheralPins.h diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PinNamesTypes.h b/targets/TARGET_Cypress/TARGET_PSoC6/PinNamesTypes.h similarity index 100% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PinNamesTypes.h rename to targets/TARGET_Cypress/TARGET_PSoC6/PinNamesTypes.h diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PortNames.h b/targets/TARGET_Cypress/TARGET_PSoC6/PortNames.h similarity index 100% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/PortNames.h rename to targets/TARGET_Cypress/TARGET_PSoC6/PortNames.h diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/BLE_config.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/BLE_config.h new file mode 100644 index 0000000000..3aba0931a2 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/BLE_config.h @@ -0,0 +1,330 @@ +/***************************************************************************//** +* \file CY_BLE_config.h +* \version 2.0 +* +* \brief +* Contains the function prototypes and constants for the BLE Component. +* +******************************************************************************** +* \copyright +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_BLE_CONFIG_H) +#define CY_BLE_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +//#include "cyfitter.h" +#include "syslib/cy_syslib.h" + + +/** +* \addtogroup group_macros +* @{ +*/ + +/* BLE_bless_isr */ +#define BLE_bless_isr__INTC_CORTEXM0P_ASSIGNED 1 +#define BLE_bless_isr__INTC_CORTEXM0P_MUX 3u +#define BLE_bless_isr__INTC_CORTEXM0P_PRIORITY 3u +#define BLE_bless_isr__INTC_CORTEXM4_ASSIGNED 1 +#define BLE_bless_isr__INTC_CORTEXM4_PRIORITY 7u +#define BLE_bless_isr__INTC_NUMBER 24u + + +/*************************************** +* Services Enable defines +***************************************/ + + + +/*************************************** +* API Constants +***************************************/ + +/** The component operating mode. */ +#define CY_BLE_CONFIG_MODE (0u) +#define CY_BLE_PROFILE (0u) +#define CY_BLE_HCI (1u) + +/** The core for the Host. For DUAL core device Controller will be compiled for different core. */ +#define CY_BLE_CONFIG_HOST_CORE (0u) +/** The core for the Controller in HCI mode. */ +#define CY_BLE_CONFIG_HCI_CONTR_CORE (1u) + +#define CY_BLE_CORE_CORTEX_M4 (0u) +#define CY_BLE_CORE_CORTEX_M0P (1u) +#define CY_BLE_CORE_CORTEX_NONE (0xffu) + +#define CY_BLE_HOST_CORE ((CY_BLE_CONFIG_HOST_CORE == CY_BLE_CORE_CORTEX_M4) ? \ + CY_CPU_CORTEX_M4 : CY_CPU_CORTEX_M0P) + +#define CY_BLE_HCI_CONTR_CORE ((CY_BLE_CONFIG_HCI_CONTR_CORE == CY_BLE_CORE_CORTEX_M4) ? \ + CY_CPU_CORTEX_M4 : CY_CPU_CORTEX_M0P) + +#define CY_BLE_CONTR_CORE ((CY_BLE_CONFIG_MODE == CY_BLE_HCI) ? CY_BLE_HCI_CONTR_CORE : \ + ((CY_BLE_CONFIG_HOST_CORE == CY_BLE_CORE_CORTEX_M0P) ? \ + CY_CPU_CORTEX_M4 : CY_CPU_CORTEX_M0P)) + +#define CY_BLE_MODE_PROFILE ((CY_BLE_CONFIG_MODE == CY_BLE_PROFILE) && (CY_BLE_HOST_CORE)) +#define CY_BLE_MODE_HCI ((CY_BLE_CONFIG_MODE == CY_BLE_HCI) && (CY_BLE_HCI_CONTR_CORE)) + +#define CY_BLE_CONFIG_EXT_PA_ENABLED ((0u | \ + 0u | \ + 0u) != 0u) + +/* Indicates whether deep sleep mode is used */ +#define CY_BLE_CONFIG_USE_DEEP_SLEEP (1u) + +/** Determines the internal stack mode. Used to switch the operation for debugging. + - ReleaseMode - Host and Controller with software interface. + - DebugMode - Host and Controller with IPC interface. + - HostOnly - Host with UART interface. + - HostContrUart - Host and Controller with a UART interface. +*/ +#define CY_BLE_CONFIG_STACK_MODE (2u) +#define CY_BLE_CONFIG_STACK_HOST_ONLY (1u) +#define CY_BLE_CONFIG_STACK_DEBUG (2u) +#define CY_BLE_CONFIG_STACK_RELEASE (3u) +#define CY_BLE_CONFIG_STACK_DEBUG_UART (4u) +#define CY_BLE_CONFIG_STACK_HOST_IPC (5u) + +#define CY_BLE_CONFIG_STACK_MODE_CONTR_UART ((CY_BLE_MODE_HCI) || \ + ((CY_BLE_CONFIG_MODE == CY_BLE_PROFILE) && \ + (CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_DEBUG_UART) && \ + CY_BLE_CONTR_CORE)) + +#define CY_BLE_CONFIG_STACK_MODE_HOST_UART ((CY_BLE_MODE_PROFILE) && \ + (((CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_HOST_ONLY) || \ + (CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_DEBUG_UART)) && \ + CY_BLE_HOST_CORE)) + +#define CY_BLE_CONFIG_STACK_MODE_HOST_IPC ((CY_BLE_MODE_PROFILE) && \ + (((CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_HOST_IPC) || \ + (CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_DEBUG)) && \ + CY_BLE_HOST_CORE)) + +#define CY_BLE_CONFIG_STACK_CONTR_CORE ((CY_BLE_MODE_HCI) || \ + ((CY_BLE_CONFIG_MODE == CY_BLE_PROFILE) && \ + ((CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_RELEASE) && \ + (CY_BLE_HOST_CORE)) || \ + (((CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_DEBUG) || \ + (CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_DEBUG_UART)) &&\ + (CY_BLE_CONTR_CORE)))) + +#define CY_BLE_CONFIG_STACK_IPC_CONTR_CORE ((CY_BLE_CONFIG_MODE == CY_BLE_PROFILE) && \ + (CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_DEBUG) && \ + (CY_BLE_CONTR_CORE)) + +#define CY_BLE_CONFIG_CONTR_CORE ((CY_BLE_CONFIG_MODE == CY_BLE_HCI) ? \ + CY_BLE_CONFIG_HCI_CONTR_CORE : \ + ((CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_RELEASE) ? \ + CY_BLE_CONFIG_HOST_CORE : \ + (((CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_DEBUG) || \ + (CY_BLE_CONFIG_STACK_MODE == CY_BLE_CONFIG_STACK_DEBUG_UART)) ? \ + ((CY_BLE_CONFIG_HOST_CORE == CY_BLE_CORE_CORTEX_M4) ? \ + CY_BLE_CORE_CORTEX_M0P : CY_BLE_CORE_CORTEX_M4) : \ + CY_BLE_CORE_CORTEX_NONE)) ) + +#define CY_BLE_HOST_CONTR_CORE (CY_BLE_MODE_PROFILE || CY_BLE_CONFIG_STACK_CONTR_CORE) + +#if(CY_BLE_CONFIG_STACK_CONTR_CORE) /* Check for the proper BLESS ISR configuration in the DWR */ + +#if ((CY_BLE_CONFIG_CONTR_CORE == CY_BLE_CORE_CORTEX_M4) && \ + (!defined BLE_bless_isr__INTC_CORTEXM4_ASSIGNED)) + #error Enable BLE_bless_isr interrupt for the ARM CM4 core in the interrupt configuration tab of \ + the Design-Wide Resources (DWR) file (project.cydwr) +#endif /* (CY_BLE_CONFIG_CONTR_CORE == CY_BLE_CORE_CORTEX_M4) */ +#if ((CY_BLE_CONFIG_CONTR_CORE == CY_BLE_CORE_CORTEX_M0P) && \ + (!defined BLE_bless_isr__INTC_CORTEXM0P_ASSIGNED)) + #error Enable BLE_bless_isr interrupt for the ARM CM0+ core in the interrupt configuration tab of \ + the Design-Wide Resources (DWR) file (project.cydwr) +#endif /* CY_BLE_CONFIG_CONTR_CORE == CY_BLE_CORE_CORTEX_M0P) */ + +#endif /* (CY_BLE_CONFIG_STACK_CONTR_CORE) */ + +#if(CY_BLE_CONFIG_STACK_MODE_CONTR_UART) /* Check for the proper UART ISR configuration in the DWR */ + +#if((CY_BLE_CONFIG_CONTR_CORE == CY_BLE_CORE_CORTEX_M4) && \ + (!defined BLE_uart_isr__INTC_CORTEXM4_ASSIGNED)) + #error Enable BLE_uart_isr interrupt for the ARM CM4 core in the interrupt configuration tab of \ + the Design-Wide Resources (DWR) file (project.cydwr) +#endif /* CY_BLE_CONFIG_CONTR_CORE == CY_BLE_CORE_CORTEX_M4 */ +#if((CY_BLE_CONFIG_CONTR_CORE == CY_BLE_CORE_CORTEX_M0P) && \ + (!defined BLE_uart_isr__INTC_CORTEXM0P_ASSIGNED)) + #error Enable BLE_uart_isr interrupt for the ARM CM0+ core in the interrupt configuration tab of \ + the Design-Wide Resources (DWR) file (project.cydwr) +#endif /* CY_BLE_CONFIG_CONTR_CORE == CY_BLE_CORE_CORTEX_M0P */ + +#endif /* (CY_BLE_CONFIG_STACK_MODE_CONTR_UART) */ + +#if(CY_BLE_CONFIG_STACK_MODE_HOST_UART) /* Check for the proper HOST UART ISR configuration in the DWR */ + +#if((CY_BLE_CONFIG_HOST_CORE == CY_BLE_CORE_CORTEX_M4) && \ + (!defined BLE_host_uart_isr__INTC_CORTEXM4_ASSIGNED)) + #error Enable BLE_host_uart_isr interrupt for the ARM CM4 core in the interrupt configuration tab of \ + the Design-Wide Resources (DWR) file (project.cydwr) +#endif /* CY_BLE_CONFIG_HOST_CORE == CY_BLE_CORE_CORTEX_M4 */ +#if((CY_BLE_CONFIG_HOST_CORE == CY_BLE_CORE_CORTEX_M0P) && \ + (!defined BLE_host_uart_isr__INTC_CORTEXM0P_ASSIGNED)) + #error Enable BLE_host_uart_isr interrupt for the ARM CM0+ core in the interrupt configuration tab of \ + the Design-Wide Resources (DWR) file (project.cydwr) +#endif /* CY_BLE_CONFIG_HOST_CORE == CY_BLE_CORE_CORTEX_M0P */ + +#endif /* (CY_BLE_CONFIG_STACK_MODE_HOST_UART) */ + +/** The maximum number of BLE connections */ +#define CY_BLE_CONFIG_CONN_COUNT (4u) +/** The number of BLE connections */ +#define CY_BLE_CONFIG_GATTC_COUNT (0x00u) +/** The number of GAP Peripheral configurations */ +#define CY_BLE_CONFIG_GAP_PERIPHERAL_COUNT (0x01u) +/** The number of GAP Broadcaster configurations */ +#define CY_BLE_CONFIG_GAP_BROADCASTER_COUNT (0x00u) +/** The number of GAP Central configurations */ +#define CY_BLE_CONFIG_GAP_CENTRAL_COUNT (0x00u) +/** The number of GAP Observer configurations */ +#define CY_BLE_CONFIG_GAP_OBSERVER_COUNT (0x00u) +/** The number of Security configurations */ +#define CY_BLE_CONFIG_AUTH_INFO_COUNT (0x01u) +/** LL Privacy 1.2 feature */ +#define CY_BLE_CONFIG_ENABLE_LL_PRIVACY (0x01u) +/** LE 2 Mbps feature */ +#define CY_BLE_CONFIG_ENABLE_PHY_UPDATE (0u) +/** Radio power calibration */ +#define CY_BLE_CONFIG_TX_POWER_CALIBRATION_ENABLE (0u) +/** The GAP security level */ +#define CY_BLE_CONFIG_GAP_SECURITY_LEVEL (0x00u) +#define CY_BLE_CONFIG_SHARING_MODE (0u) +/** The GAP Role */ +#define CY_BLE_CONFIG_GAP_ROLE (0x01u) +/** The Bonding Requirement */ +#define CY_BLE_CONFIG_BONDING_REQUIREMENT (0x00u) +/** The maximum number of bonded devices to be supported by this device. */ +#define CY_BLE_CONFIG_MAX_BONDED_DEVICES (16u) +/** The maximum number of peer devices whose addresses should be resolved by this device. */ +#define CY_BLE_CONFIG_MAX_RESOLVABLE_DEVICES (16u) +/** The maximum number of devices that can be added to the whitelist. */ +#define CY_BLE_CONFIG_MAX_WHITE_LIST_SIZE (16u) + +#define CY_BLE_SECURITY_CONFIGURATION_0_INDEX (0x00u) + +#define CY_BLE_ADV_PKT_0_INDEX_FLAGS (0x00u) +#define CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX (0x00u) + + +/* Additional queue depth provided from the customizer */ +#define CY_BLE_CONFIG_ADD_Q_DEPTH_PER_CONN (0u) + +/** GATT MTU Size */ +#define CY_BLE_CONFIG_GATT_MTU (0x0017u) + +/** GATT Maximum attribute length */ +#define CY_BLE_CONFIG_GATT_DB_MAX_VALUE_LEN (0x000Fu) + +#define CY_BLE_GATT_DB_INDEX_COUNT (0x000Fu) + +/** The number of characteristics supporting a Reliable Write property */ +#define CY_BLE_CONFIG_GATT_RELIABLE_CHAR_COUNT (0x0000u) +/** The total length of characteristics with Reliable Write property */ +#define CY_BLE_CONFIG_GATT_RELIABLE_CHAR_LENGTH (0x0000u) + +/** The parameter to enable an application to provide a dynamically allocated buffer for preparing a Write request. */ +#define CY_BLE_CONFIG_GATT_ENABLE_EXTERNAL_PREP_WRITE_BUFF (0u) + +/** The parameter to enable configuration of the L2CAP logical channels */ +#define CY_BLE_CONFIG_L2CAP_ENABLE (1u) + +#if(CY_BLE_CONFIG_L2CAP_ENABLE != 0u) + /** L2CAP MTU Size */ + #define CY_BLE_CONFIG_L2CAP_MTU (23u) + /** L2CAP MPS Size */ + #define CY_BLE_CONFIG_L2CAP_MPS (23u) + /** Number of L2CAP Logical channels */ + #define CY_BLE_CONFIG_L2CAP_LOGICAL_CHANNEL_COUNT (1u) + /** Number of L2CAP PSMs */ + #define CY_BLE_CONFIG_L2CAP_PSM_COUNT (1u) +#endif /* CY_BLE_L2CAP_ENABLE != 0u */ + + +#define CY_BLE_CONFIG_GATT_DB_ATT_VAL_COUNT (0x07u) + +/** Max Tx payload size */ +#define CY_BLE_CONFIG_LL_MAX_TX_PAYLOAD_SIZE (0x1Bu) +/** Max Rx payload size */ +#define CY_BLE_CONFIG_LL_MAX_RX_PAYLOAD_SIZE (0x1Bu) + +/** GATT Role */ +#define CY_BLE_CONFIG_GATT_ROLE (0x01u) +#define CY_BLE_CONFIG_GATT_DB_CCCD_COUNT (0x02u) + +/** Max unique services in the project */ +#define CY_BLE_MAX_SRVI (0x01u) + + +/*************************************** +* API Constants for BLE services +* (using in CY_BLE_.h) +***************************************/ + +/* HIDS */ +/** The maximum supported count of HID services for the GATT Server role */ +#define CY_BLE_CONFIG_HIDSS_SERVICE_COUNT (0x00u) +/** The maximum supported count of HID reports for the GATT Server role */ +#define CY_BLE_CONFIG_HIDSS_REPORT_COUNT (0x00u) + +/** The maximum supported count of HID services for the GATT Client role */ +#define CY_BLE_CONFIG_HIDSC_SERVICE_COUNT (0x00u) +/** The maximum supported count of HID reports for the GATT Client role */ +#define CY_BLE_CONFIG_HIDSC_REPORT_COUNT (0x00u) + + + + + +/* BAS */ +/** The maximum supported count of BAS services for the GATT Server role */ +#define CY_BLE_CONFIG_BASS_SERVICE_COUNT (0x00u) +/** The maximum supported count of BAS reports for the GATT Client role */ +#define CY_BLE_CONFIG_BASC_SERVICE_COUNT (0x00u) + + + +/* ESS */ +/** The maximum supported count of ESS characteristics for the GATT Client role */ +#define CY_BLE_CONFIG_ES_TOTAL_CHAR_COUNT (0x00u) + +/* AIOS */ +/** The maximum supported count of AIOS characteristics for the GATT Client role */ +#define CY_BLE_CONFIG_AIO_TOTAL_CHAR_COUNT (0x00u) + +/* CUSTOM */ +/** The maximum supported count of Custom services for the GATT Server role */ +#define CY_BLE_CONFIG_CUSTOMS_SERVICE_COUNT (0x00u) +/** The maximum supported count of Custom services for the GATT Client role */ +#define CY_BLE_CONFIG_CUSTOMC_SERVICE_COUNT (0x00u) +/** The maximum supported count of the Custom Service characteristics */ +#define CY_BLE_CONFIG_CUSTOM_SERVICE_CHAR_COUNT (0x00u) +/** The maximum supported count of the Custom Service descriptors in one characteristic */ +#define CY_BLE_CONFIG_CUSTOM_SERVICE_CHAR_DESCRIPTORS_COUNT (0x00u) + +/* Below are the indexes and handles of the defined Custom Services and their characteristics */ + + + +/** @} group_macros */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* CY_BLE_CONFIG_H */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PeripheralPins.c b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/PeripheralPins.c similarity index 100% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PeripheralPins.c rename to targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/PeripheralPins.c diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PinNames.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/PinNames.h similarity index 100% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/PinNames.h rename to targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/PinNames.h diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_controller_ipc_cm0p.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_controller_ipc_cm0p.a new file mode 100644 index 0000000000000000000000000000000000000000..2a6e381d38db3901b4e3cf092489959a9c658052 GIT binary patch literal 814258 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

cS?ZP5V@}S0&#+ulGJ`CVgg<29VgpYy@OT4j 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%0D|X6N>~rV; zh3m=rwO~I*h@SJU`*{1X^c#`xeu3Z6g`>G9Kb16n0avx5X}6}6G@Y#J6iugU+N0?- zO{Z%*L(`e?Cg#6h6bMI$sQJ%g{?XqWvo!xPnjWj^Y)$8AI#<)DW6_Co8$g%xc;wW8gSqv#~~QS@TK_>$q1icW!jicW<}MSEbfqSN5#^kXV_Zb*l3 zC^`c^q3BFFuIMbdL(yZPOwnV(rRZ$59hn;%J~qBt9>k zQuGWssOUmirRbU9Rdf;jM0(J0<6N>YD0&tgQS@wBqi7%GDY_WGhhu4kbK?k;XB0gb zb|`utR495r%u@6M$Wrt|_;$L8oz71QJgewZ=u-3|xK7cFAzjgB@C|8Tj2o7~2}Li3 zprV(t^&>?N+-OPpE76-P9{%N9pW-@*iq?-i&NWq&3$I@q!$yAeNB*~?K8O3J|FuxX zc|3&vcff2#H$$ePgYc_VB2DLl3i!67Ti{EI-U3f4x)ttI^j6rR=r(9j^fp+c=J7`A z!v__8JA4f9k2H>_1pf@&+s`#&2L2b|nx1J4?19E9Itkvu`yqul`DA#GYm-lbFxS*9 z4Ky#}=bE~C14j)Oa82(V29DbMcf8+4<4cDNT+?YWaPIZ9T-P(52@i8^hR=c^*VMll zIP-HU*VK&|Fc#d3&V~zkKcw_b{~Y)z*JgUT(5d+2dc2Ar56Oz206)b0VKlypP>Tg6 zZI*W$WGWihKg9bJ`J3r^;WXD~{%645T$|wwp^j^;HZ0FfDCC;HM;SO*`Vc?A6km?9 z5}HxdzR)x`oXRS+4>hGF^s`d_X?@5}Mdv|;HaW!!&*iAV6vi%;RksCjK((yXiRKW&xM_eo(ENmo)12*@w8(8 z7r1(s;a@wm&e(!5i2(>q-B_wEtrK z$edqgd<$R`9seo7X4?L%`Fv_*y4YGA1{ybRr{g$LrIWUJJVaYO-ouZF`SFANcppE0 zlppWs#~?In|rVyL5W#x-V|g};^S(_A-m{aLQj<^xL)3&;37xIV-6?OcDJ>&;yM9oIpwu~Jz07OwxE z>n&V=f$K2WU*!5OuFrDa%k@8Sy`SqZbA5p8b6g+f`US2Jas49K+qwP<*Vw37d0*nX zo$G((dI#74#PywA<4I-Z>)`rju6J_%3fH^1{wmkIx&9j0cXRzOT;Id>*SUTV*B|8i z2-hdLKFsxFT=#MPA+C>d{RG$da{Xbh@8kMOuJI

f<9^hqxZ#x{K?lxbEiqX|8*? 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 literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_ipc_cm0p.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_ipc_cm0p.a new file mode 100644 index 0000000000000000000000000000000000000000..9bb8405e2cda9ecaf553acbea67cb09391098d4d GIT binary patch literal 745418 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 ujQ{MCOOnc$x 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�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 literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_uart_cm0p.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_uart_cm0p.a new file mode 100644 index 0000000000000000000000000000000000000000..61a838bd2404bce505c4b82fb3980524385b8e66 GIT binary patch literal 738318 zcmeFa3w)H67wEjv!4>mY#yvLtNC#iNllXvWrMJR@OY zXA^L27ZNu=lDG{{y$Na3Y?|h4T^d?jTnfQ_?Xe;j!A&U2psx!<4job%S*8A}f*-d3?W>^6-Sseapk!{MzvcWhTS zgB3yq9u?xgYv0)CW4|cGr998vEJU%-S6YQw==rN33-LN0pYJ~5E5COB=Z1F(UolVP zMM)e9t$p75*#u1jL8LoAz|3MZkWdeiNuXi$F2YSAi?^%snmw=6PjE1oRX1eO$Pn>Q)iFoTuYn5iIseOo-r= zUj*N`m=L9x^V~BeO8;+q ze&?H_^o@G{_g+zY8BbY5pSa{_&nHCLe9!QAMVa?`c)2L!b7De0pLs--J@fhEpYQ&e zDC6^exck542`zbCyx~vlBO-LUPx2ii#OHmVE&P0JrwA4EoVizoF8BHCJ4EOTJ>{!D zAzt^h<87kc``q=*qWnrcKX->H=ksLWf0(D@=1&Ouyya`6qR?~DFDmjq$38A93O%Pj zASy29Ie$o0nCHJEF81@%VNp^1Gkm0VEZ#pA8@|6Y9!rTV*)y7s!hR|)+8hY&x+aoS z9;@E;ktCQ`dSz1bb$HY`T-QC+` zkkS&KF{?8sQ?qbzbigW2E@wKwv*>;=8i|f(m?_cZ2!2k*GWSP^V`F1OuoA5U(XRf! zef@X!PG+V^;b&VK85Gxqv7bu7b|e~`no38LEMs7`-SFhZNM5^4a&#g#=0!djbGvpz z)836wPsL}v{wd3`Nfl)ma(Y5qrw&D@lH>7oG!dJS=}ZD^)mK@cbOs_zvNfq|;?SfR zjUGzJ%(v>2MwB{M8DAvz?hcQl1S1gmWSKug=6=s-*Vo@mG211NXYkZ4;XK72o` z3d?i=rO6sIZK}Tt)@EyG{jxCfF^oT*GUJ@~(%I4-?TMvQ$%)a9;o;uN zVii>(GyNhOZRzWY4o{AcPfkQL4<@IE6HOvp)l_k$nO0O3G)Xapxc5&UI+TffdkSRX z0LoCsScbwbr872`r&p1-Q)$(zb6xbsbG?TXcV}Y-!8+5OoVdR`b|ju2VBK-|Yn{W% zUUW72BBD5X15~Vg(#f2Da_`}EY`hOm$`g+C#)=4PG`frAlx6I4HYJ`YRO-eqYCU}`S1u!}!lkl7*Z4o_Pdk3Pe`y+a8E zZx=QTmVIzkW~!?U^RRTKadVh{w~eeBtgEVX_i%Ob%O2nD&Z%D67||-fH?oep-Rmmp zwoHww>g={vbv92NP$M{P;BfDDp%^K2GI{N%(O2YS$bj;4GI8!-s4A-GPaJ>H>kg!2 z6PXmcUNbx;hLh1LW67?_sp@XdNPH}L7=4HA;oK~lBDd9p?4vbyDr!+`&_z!>EC*T) zP6y>=i#fkhV5*Kc+KCxedosgGr=GreHP)&}~Bor}EwOyxOs{oIEro zL$jc1Ield2tr)v3Kwz@x#gCxbEynk{QgDCgQ^wOefF{kBu=_E{N<2axC*9 zO^bIqho#eKGUKUeauO?oRBR|YhKU9P8;#OB6GuN!n{@nv=_E!GuHLe2%xYs}7_f$; z_s5T*D}N|X9vz}}VvR95jqVgSSSipFBY#xKB5TQkZ3yd!xWgMlaByy15ip!d-!H>R zVyX@wqe+w&=4#RD351?LlA4N-*!V-q8TglqWipJIJFq0yFlq|oVW`x&vq8t4aTt%y zFsTd-YdlwqEfmJ+A=DNO)2>9>k(-66Oz zDR|(vciW`m%u~Q)hhxbxtD4d)>3!17MvVolca%~E1?DObs={N$K0O!-H2d}^8%fi^1FbTBCEjFhBkCNqs7 zHLt?LbaLEyoRsyPOoA|7P9Y1C?r(DU{ zU@D0rR}RK9TQxUpn=Rdp8M4Qc!!fpNN$b^(`R(+SCfj9=Lu4gD5+iX|uPp6Q&X1U? z0xCi#k@WCTW*oIaW|yi2#!{6H1u-UELS;&&&Dd7-RjMZ$9+EZ_lT*nqp zoC*@XCPWwX&$h&B3d<%o;VetqNpeaGRdf*9d6%3aamk=3h}nvl9X?eZoezO=mvuAi z1VsQ^3lnT>+Nnte`0im;FR09#M2c6TiYmY zz+$4Uvt{qz4lGhFtJX+cw70*~=*(*@x3|9|I?&bAv2Xu?80}`?(i5BMnVRmW@Kdz}Y1`InQ(Uh=0BVWf zB`Bw%IJQ<3aqQSKtPs2qv>jw>o>2O;%K|o3>EFPNY^f1U=Cg|km7#4zhlbnKyjq1Q zR~@;$4A(Rso>`mpX2x@w{a6jj04Fhbn;e4#b|ky1$@;&4!VJf`zMy-ah>vkmBIRxF zFtCW!Lsm|_yW=`V=+op1P3>U-HyuY$?@C8OELPVO85XjY=zi=XFb`Fdx|3L^W%5r8 z#^gA}W|xW`8Jol&ffjTq#+V+XxO*U!6{iJq0;Fjv6+oj!4?mQgkmGRla4enVFrLvE zc%$=xgTJ(lTI-}Vs*v*BvK+>2DaSG|5>t(AIF=74sFa>&bD%~!87yX7$x$=y(3TJ+ zV*aRb$Pq{;HNyzDqEj=*297aBm*W)#k}9ex&IeFaHK~0v*`Tsk4dV)rT)}q9l!i~u z=r!aa6dwFBzCbvS`I+qw4MxqH9FQ4&l)tuIMTdk~p_H^l7V$Km(|+2i+|evY_MXbI z6hDDwmr*$i$EF7SbQSu5k=2t{>6p$@cnUg z2g;D90(xMVwbN&+(6~o~IT!ajS;84C)3k(K<(-Yn zpG!6ZRar*ZosVX7L`FpN*+`uZwNM^Fz?D&vXYXq20AxlgW-|W@rA_yo>G*vb&9w>p zQm%_8A!KmJ&~WWarw1-BJF?Z^@l6W)Y@VI3%t`H~b^xh1B&!}vU76fSm8_ijn|1W? zxJkc`lyS{vW(vY*z1AeDw%_!^dURJT)uu-s{_c~r?e_R#W2xqHS(G)QgXJzqzoXBY z_rW@6%Bbz!j%^Cc7jcxK3JvoWP02~ju9n`mXj^PzI6j70QIv`tHZvT>bgT={nIZFj{d;%U^Q){z#y^=dgW%sufVl>D3cN0FUv@$UG<=u|>xkC&ItymWGs zB4PkATf>5kQ(^ynz2(eV+Bi(R8O)u!;00*MX^pE{NJ3%k%%AW0m_ z8|jvKrek>Mo-`yhnD1qq30Lp?CWrRH7PDV$&O0nN7U^@##7G-q_dt0D2-G~IQ4mE# zK>|=GbbVkJD7*ZAvZw!FKS_YwtJP$zDY9s_*6gF7~ChtjL zt4}KN=o*i5X&WAIk4x!3qOKfB%MK;-w=6w2=p(4IW+%{YMY;BQQf_>wKM>BLFX={W z7_+U%;%yjM?{7Oa>TZu{rx<{+CV{4og-0$}R9_~Ow8(+@xU6ZG4je)rnCayPm^b8{ z%%aXp%QX81x!U9Y8iqmRJqLrsah1~%2(ELSqxPY|@+JnXHf()Nj>{_4L)`&g7T~nU z55=H;WF-uiZ0S1vZRm9}$wNktn|0V7&*z=npZ>Af;dnQi)Wq-+yU#@s`LacJZiVw8 znd$E4Scr)`bpUlQD3Tdhdz2l8QY$Rf0aC~o8$J>(q7&@(Dkyqdg_rGZ6WB?`&Ig*b z-7Zioy1B=vm~4LDAtXN4i@llo_<23{){?v+WWEkgvZpzOJKA0{{y^w-dkQTZq29yB z6IRrHsHmedNp09t6r*bDB7ZwwF7@QBjnPfd}GKN8-LK^5@cG_|O7HD@OjNzPcl*&H*-qx$KD zIUX7oVlK0#ck7Ow-njsKCG60;Du(Lxq!YCDe!Wi&mr{4kiWMBQhNy1P9VyLF<69n< zx`Q}fwpKPWWyz28a2Uw~#Cr>Ws5l?_``FbvV+E$A+oHIiA|jAsjaOCugcbfPFVA++-RP z7d`T!8Oj#H9tQJ_Hf{iSq|4PJ}h13 zV@4n%Z9T$*M(z{>uv5s#W1I{6%y~vDiY1>z$vd(uonpX+0a>o@@CF93Dx?x}dR%Sy zIz1IRW>JP2MLIT&X&5$3lf$h?_D@5QTm-T`o*7OjQ_!WgI_AP27XV>IgFeWS{&;`G`Hu4(6U2xLvzc%4{C*+3dxG=36jmM1I+~|7*xIX zW}ejs?@3N2FmYD3*UDc?4pjTJETwPmm=(XD|Ilr&D_;$ckpth07uVC#?Wr2Z6>aLSp1>Dzgf- z4^fs9OUq_z>Z&Q{_Mu1|M@m|7@Q7))YL3Op;|P5m8;nZ4+Z9;dvCI_m7{a(T=B&CC z%t7si#09fM&CcT$r#XlirZm=cK&GfGlMNlQlOsqrNxi6Za0G@cOw8hxZOha?>wHYK zE5lIK;>R@<^+(%>>>PCp3HEYg)=M>1EQ}%jR5?wLC_S3aU$7(2_;eVcpWQhxzFC zL8-^CW%<$lP%7yY1?=@nnOtsc5Zo}HnecW4Ouu8gZgMpZ&Nt+9!{hW*!0H6 z6qWSH5HYD8P2W|GXI9e}Zay+jfN4O!=qFT>N?9oafYE;dD_hmd(nFj_nCLa@nJ00AX=W z=t_q{=8Y@2ls%@z($>|=(CVy~o>uyLBT_z}$@N3pV1mft)#mFsg~Kw2Y$+~ zP{NSX@>c=73qcJfox@2CHF7Ozwp)}Hc9RBX_F?s>&sFjWQjTOn+gUSG*mPy!R{03Y zy0gH>*_YgaU}XiA$d-?cv8{VUo^I5YPM z%HZ5!RfJryNU? zl#H;$Y@yMbA#04r;?UO^=BWp@C71Qi1IVo<7N8*0sW7^KR)bq^GN&|~cq3E-n=eE;Xk!RQ51H443^%)? zW2gz(?UGtM`Ek@HQ={!+XRJjn(iyCVLXNL?^>mmxm{NeJ2YuODP(_Yf;(VJ(WG7X! zXUmf4jUJFzQpX6CRPt8ckF=Ni?YcX{DKd5|_9!FSd0g>OZLYPNj+(C5(Kxq8Eh4Ni zq*gk{9Sf1dIaqd#xKl&*(#$Oks`5BLJ9ax0Jv6+wrlOcwnG97pL%Lxy%asn69gMOz zW2ehw#p1|f#ZaCm!ht0+xwp$870@||fSSeQQ1+~g1xPztL7@UEdjVQ7qja%2CklCz z&p04ob$=R#eouCs#<8n(*rz*O=yhd#9h{alUYesYYAUJ5F*(CG0ND~*qo{_6x9-mw zqAWGlh){M=e==^I71(qJ#VBtPI26N3tkbP}S~DOTTdkUvt(MtCd0EIj>1UHynG@H8 z8RLkdhDUwu&iyclASi2)ox~&vg_Ftf-Vy9h(JnKb*E*KKj1k8;omxSxRjl^PM*5@9 znq!NWepUzOI>W&QKrC#~Ec&0r{7ban> zm)vgTp_JBrd)qtO^$GWA$KI}iu7QIRE$g0IH9PgrvQvwssi7GpS!t;E_b4ybX?ghN zcx4cb+Ay{!9VfJy#+peUY?Gm?cBC@ED6A7@Pnk)x7!th92Rf*1=F+jWkbNB?l46G@ z&xuNa!^^Xfr4!XF98wvqi_+b4tlr2~GnA&Oa>K`j-|50Q0T zX;;W~R{^lOjxF2p@&xN@ga!DzLFVB?&YT?Sbr$Wp5$RO}MVs2q?nF%+lRBkdzcj9$ zr7m{_ii0kQLSD)OxA%M&bkt4ZjFYN`;ZQ1(oAnqG7X)KVVPs*DTr?o=g^~U7e)M|7 z`!UDsRX0c!#tsb4$c!~rtj)~XbIS`*gHrN~c_AvJAjohsD^JCRmnK6|xW;!U4iKfX zLl~JJA9q>`&+OAO&oCvsNYhCqbbZqB(Kz}&eVvAfr5Z58&mQ}ilRqyEH>>EW4Z1ff zU~rb>1>xEUIX#33z@Q62Jk|!S{q}ln*lJiEffvG!XoJ7OU1m>>Z+45v_gIvTpDWs3lu>4gm zR9tmGg|r=xa^9>80ZmUH-*8Vekyb*S9Ao>-k0ea5@#MsT^zatB=5y#gy@A7%IqjOt z(ua)pA-5CjXXi;B!)!l-Wy=@6oN<-$1bKW*}g@?ckJ$9dm1M!5DJ1*I#}vRt&l5|hvMl;wSgtc zw7Sa&Y7I)UvQ5uysUFgT|5LahBcUw^CUKdi*d;ducw`p`EOZ`GVrr7>{E!*2WouKu zzB&s+Tc%%-MnHmN{K!&rehVSH?9I3w;!=pP1PRBHq_RsP#~%dWYQjh1D1j6&%gK+h z8T6Y-3P;r5CF3%LSY~ZFxuuN;n8MVgj9q-#yY#_bq-LlyGdgM`Sk}3-I0ukBbJHx& z*1EFGBlt#}eyk4LvsV+t*0~0?AKMGgA)Z`@vzeeK-~f1LbS~9T2%5*I$EK(AYvLw( zbuudvbObQTi|~%P&7KeaEcBh9?M=7qF98i!$SC#m<`z`Qu3lW(jGYQfvNla_b~Aay zv%2ZEQ%wkn$ZprF^PRb_diy8au!tZdyD>G5#zh;wSW=sVDG7?{dvJ8GnjuUrn58Tc zHv=5Dtej2vtexw;Zq|Aj9^z<><)3xLl(12R+&*MfSZG60Cn~x;;VGkNEVFWGW0T+} z8{3~M7U~}uR#r@ITk^&-jkm$j@!*jzmz5M0qaRXnm%S!esS~5&PtTS`f~#v9eJ8^Sv3}ED(Xe7RmJl1NW{;LFxe$KnXxX9* zzEejZ77b;yH+6*~ul?w!uZf_j^v|}=?T9qbg%fK}eEK2L5Sp#)66-^QA2|B0ql=Dh zkhs$i9bJ9?j5s-%5KqxviC71})UP!c<`SYIINKzVCF0r(%esyq|Hkp-tz{RRR~oH+B{GP`-pRZXv_}$}o)qLk@>YTqbC4I$rxDdXtQ=CZcqAx=H@a)e$vp7-)zfOqK z4~vt&lL?v9N0E|uUuf(UPx%H#-F0&t_Z%0i5~UlK4U|52OLuVPp_xZ&?oJIIFPZzw z%J7|^eTdZB6W1rs*L2mk9{t9dUv2%{i=uwx++gkRpD8)Hes1-?Pm9|VzbFpWG#`JU zCh&{FlY5Up(|X-^nj({tpC0|~$iA70$b%2~KNkGtzN5ZG;FI^(9G*E+vp3~S9F82U z*?UwZ{GY6;*_G<6eeTTXTmSrG$*HfL`9kZTTpUC^%P%A%rLyE0YySo0+NsdsV5IDs zAL>-AwEpv1QTNC*6%p~_)pK{%UN`qa@uc|bJ4)aAg~+eBE`4q?vcBeRM}Ivse*8Zj z_5DITQqo^rGkSbFGI{iCeZK!3KiX9r_@$>>U%c2?8+hsit>3%&+Bwmg+Eod!RasS? z^S(>EL__IpN!PKXC3U`(sB1|bONAn-U91Dk0=7GUJxd$S;DWC{9H}~25@z{SofY-0 zPgQFJUF4JF>#RD*FzLsuXG>9T$;kHAp_JHEHXA+>KGvw~seg9)-15#>&wc8l`yzu0 zx-JprvM!g-rk)Vxfmw}=(3RL&dBM0WGruCAdPuo!h`f4^;Wf!RmyCptid#dou@mJL zB^P23Rc-J;|5rzc`_3l+Z>hy=}h4(7K_Gu`h!RiyN0kCT#$7etF}r zaaT-aI}Y^j>l?@op>tpVfWF5bnOz9g*V5j#kEM|hpzJ)6=u77_o6QESB+N1aM zb>U*)mhSF-Z7l;``}P7s511PKq;6KvzV;6Myt`v>`#xN@)zi+<+V}VL9E?V~_VVuH zmTuTst}yZKAK2H2iU)goflI18`XViD9nt+Q%sXk>&U^n=WVB6hU)S9&xOI3-bgRYL zj|;oHBhmiueRQcZfbC75@}Z7lIukY(A1$C@-7nnch6VaMAzp(C$X0!e@V{rt^2H(~ zLcWkc6bJ=FC85$#S*S9!LHhYG*O@?)#?<2{cC9}7G_pFazwqZIxW7YCJ&uoZ_n{BBwC@S`P<1s@Om9AeS3 zV#+_h;^9m2uh#OfSNeA(>tE}N2QSyJuSvgVvVMWS6u<29V!mHmd8xdz(>5mkc<2p@ zPv|n^W7nT<>BoB>4Lru$bEWfU{9W1haZsqY}Lf)H(mY*C7<1$GC>c& zMDnvvN<92h$)7XMMX85h=AlCp&!SK!0gQXo{KIOf8?Ue#BaLjkocI3E*B5F=n8SrMK2P!yXZ=>))@xQW#kMu1Svo5+yoO993#3x+za`8SFy+Tx4v_Sj$SFE`zk#@ETAM*DF(8l=0 zD)D6(eZBZEF1l9yyo+8fGA??JIOw8p5N~(UVX@vt*NH_gdaZbca~o}ZVx9PN7hNyT zx#;!c(=Pf(@c|cIBT_E6N@=D$viqyF*t*YGU&`$V^~og;QFxlh3v`M2 zmJXlOmF502@mrc^F)#Or#8aB)u(I4=E{?e93h_=Cy-2)8(<=N*QSag}7K=5_E`GUx ziFgG8F+D20rQ$hFEB966_cYBuV7Y&pIIU^6`Q`rQ;+UqHt;_u@#GmQ>0*U+*0*hkD zEC>C|9{QMv9`exr9{Q~wdaZ}9@X$YSLTCJh_!AHPhaURBdgx#G&`(=5(|6RO>3`Cq z$se+4^55y9J3aI^51o~)srXyTlXbfh_=@|4IKcMQR; zROWB$_Z;5-aUovhds2w+^Bq<7jdG!cZ1~KV3S{=pd?V4# zd`}61phZQG5bxl7L5&Q{Z>tH)%4pmy-Cw=*EA}Jj9;^+w`jUW(;GG2s_9!b z-KJ?|mUQ2t>02}%(ewsQ@6z;UO?PUVjyFN7wFw&m>R@O_Y|2cfu^EeZ!u(3d$2N^n z5(9NJT(l}S!6LayZ+=RV4%Fn_-)PK*$nB+EYitNEO8T}8P+CqEr(h3znP{=g?s7Qw~=saR!>jLQ<|c9Yn| z{U7A1*faz!zfF*QL=PX5pN1U4hF@~i5aOOu-#viNmHcp7_6V-KRv?KCOn=kU;lWx) z!1LWu@&UI$X(|AzuZMCc)zs_j5tp$fw2<{NOQ{ja6Fo_}*{V*q8YZ@|_%T1V$qQ{8 zY_*y%n-MOsd58U1zJ^mr3VtY4?z!^-i#nOLUmU?o>(qfRaPjj!D%U!=vd`)b5Dtn+h>@++L8gvmj?%K~7^qP9etj z+X`~F7vyXy#MxFbq1$#8bhEV(XKTUC*;+7jwie8stpzh@OTj$YQZNs;Y=O!*YYH~} z*|D-w>*IFZVu4199;fQ-2ReK3@!poh+j{Ez>w7!uTkh!Iy0!km9o<{D)c508S4T(3 zmin%H>LDubzk6r>d;16WwC!nE*}SdZajm)D zM(^QUZJr!NI?wRvaIndQev@ZIjg`}@+5IWHXv0Suaz{#wX^oQFR_2jwg!D3UMn^9| zme(dVB61+C9})E!6N}hQlR02w;L4^AMxPYL1T*S7!&RT9^6sTl@3a+6-f4Ya8H1KIS-Dq1+bj-&VcT< za3H1G?D6mGV1z83iQh60Zq|b{{&7uehx>d1+#h*xa|Lks!QS@o`=G;l;`fZlzfi!P z4mgwM7d*Hs;FfD1Uk10=6Yg5zOkUVHEIVECYXB}xfHuYr*T!}_I)O_W5Z(rd<(CWh zEN}yPaGO2xqwLJYopAH}28}abQ~_tgqMiA@3OJTKf|I5i46cKXF*vUKnGR!!`=N0J zOT$~FafTIy=Y~hO<~Np=&Trb60B5(4Lbw*-+UY=>Lb%6(>og#|3*o+1WVq$!?sinj zzk|Sa7ZL8S6p4EUxMI?~1Hz4B!aW9DG5&oOxMK2e@uK4Vy9>Bt%J=7s^zTBExNFdv z7L(qCz!ej}UntVQ?-cMafcAm^j;UEJ#307BeX!YsCy1vC&)=hhq39hmgTd$ks9W%` z?h%KoE57Q%%>qaF#4#L$`TciwD#^C?&}tA?s*G$vxQ@wHFFaD6yFE#KU*C!x)o{Irfl3}aCpHi9>6m= zzJW_gNBDDhSO|!q9b<4f(J+adY#>jZoPa|1g8J7xw{F`i)vv<~>tD+b08=NnefFxG z#jVgqUGfd;ZbAbYx~Xo8Hs)!9&gzS8B@wZqVzwkKPVPyR&je3Pt&hIV-{?b@xTY$z{iSj|DoD5g|2Kmsnc7S6WZhov&9_LoY>9llrb#RYR|; zh87{nk!sPdwl;i8nrNI-7{lSBWyQi8b;W35aj3}EN~Kol{F-zeUJAK=J>k9{x34G8 zugC4rF3$67|8jbMIohOHsW|41@PpG=)K{tf>3D2@P<~_#b^aDxG-nBJ+V7zQ9y;iu zOFVR`hc5HbAyI+w*}#+udHCfXy23**^3aviKW2b3mEy!NGKZ@cJ~;%OJXO1$4iFBSK> z=qm9Oq>n+eqElz<2byLFN1d%X7e64r>EZ{)7hQCTc-lpmipO1anaF6Gb&NV(?{e|W zMTd*75VyMMMdBJwvraAdR|>9cjiGF@(-3%5rwD2vjv;p7AmN-Ds&7hn1S5i^S7;gwNJ(S#;#%8}g`%Xf7LYU+gpx*L zBpudtwWjMdjYv!WT1{guE9rHb#$rR#^_s>)UD8;9N&l-fjZBv`7s{8dtCBjTZ}3wm zMnT}C2TE%K$5N&e@?vJS$)B~xy@kEltIt|=_4he;MrXp&mdH_*$a*}E8`o#>jcD9g za6fjnyo>_YQf0tKy!N+&{MksP%_4*_aERST*y z@ZL7%KQD8XYa&=DGwDJstt=st*>g7oE&Y3<9d{2D+LbQ2#a(!ZyP%W*fV<-IgyEaL z{hhbj*p=*!s@YOWB)9s$;gwysXHU(Sq}8;G-|5Y_Kxjcf`{wQN3h^+4<9JYthlYJ6 z$3Tu9^HLxoDB94|E6k;`+ewf$=aozK790J3r21^lb?;Cc(-%00M&0=R#My&dj> z0=Rw;?p>fcz8J%?lIAb)*#12M+VIFX`S(>1?qmTRW#zViPZq#on0Db#fezy_#>9bh zBl>5|v-n|nv@^dyir+TwOQ79n2Z$De@<&MA%T z7*i|pARc><=+;GQ4~x?*mM!a52+turHg3CxgSQTjdw4ePP76nWjDPH(Y+O5Vj1R-D zv~ZXvx^M#)j`}dhKQC^?!qMMCxG4)~?qH(dG{o$fqR$fRDd%- zy?YWVY&cSn#2AC)8`ddf|11LSFa+KPhspOOZ^Tji3=7{0v!k&Ix5dybyeBcjO-^f1 zVx0){evF24+^?}aA#N_2_1zGfIV!3S=v@kct8iZhsq<%!u0Gvbd9kdsIl&uXJ|&tZ zN;LRpgDJ6^dm4D8dG+kIk;M_)UEnzpKHnxzzIyJ=nZG-uZbuPMb=C%E{ku<#zQnR# zaq3m+`c>Rf!|;x-{@R%e+}u(UsZ1=Mi_M4)WwWv4zuW4+7@i>?_sLwSUp-#?gEMDa z|JOz3mTB?Ls<@|cuSa>OSRYI*lCDc;hmMD5mai7;$Tu!uxtMwr_eFHsUfmG6x*=lU zdvf)zj5p}647uJ>jcgblQ7|ZcP;v7It3{wP4Dwb{Qfkj7Rd3aRSN`paTv2$faw7k7 zhTO8^@-Ic;=w-~!_`&U$g)YQc=yDDm;CkKSd8YAlMEq}L-f-q&3};;?KE^Klp0Fm9 zl=a_l(HvD1ptCXa2{+#_`OGzC{2qQl@>$Z#1U&qphadFtOFVR`#Iv-ODHZS5@nvlY zU`Bb5ra31KU}bA)&PxJfkwX&}z>Kt0<3WPc$04Q(3}GslTTJoe#Na?CXV?U(^0WO(G>`k z{^1z4T>H>|E%~jkt?6khs=%;CBR$ElV7t2K?t zNInWf@{J4}lVeF6896+abhXA~u_S3O3@%$Hj-Bm{JjbWywf5mQM>H*xKQIOu`%rJhrV6PYQ`0Yr~TJ->+B zeYQ`=SEWR_IXaaooW=BTWQur>P`gt{Sn{4aX`Pbk@tE5r>r!=s(~{hSBa4BWQ@ z#+3?-)E{b`iN_Mi577-f#@K&ZvpIt&x?BmxXvPQ-vq9`2;7n)<(7TG6%)Tt6!7nN5f_toM(ai3=3r5W-$qxt z3co*#$Ce*{1qAIWb7OunpIJUn;<0hx2Epn)G_( zH)Y}Gm8)7fTdwMr3qA?lKOj6~Oq=k^1>XmG_=98<>q8e~R?A@DZ1&0Eb4 z;ZoSQpswPr5Bb9o@9nua={yMZxVHpYoUjnj8vwo!@iU2A|<;^lCzb&eUXYzv2J-HxM9(3`G(Mi^04?QZo56U=UA1J>z!G0E(p7S zd5NoT87^duttZ+OzJxdt5R}eUUVnXA*`n*OU%KM@>#x0j?hNgg&WSMJi{?U7{#Q0f zDmWL4_-_qJnIGkkwEOW(**k>&h%4=sWb$WnPi~$|+OG-#uL=OK3IMObWw}xS=sMq? z+xmu8pVNR>u~NTk!ly>nfD6c*QbD-D>=3E zaFYsOD(~jc!-dnpxwrHM=e) zBzvY!iHQv9G2fmQ;wxVT=`pur05^s*$PE_F5!_At#f{*z43vS4&V>(1KJ!SKfQKKH zd^Kbf5tMw+L6uRop*X8^`(G;EXV*HV9{vgsT_(ahew9CPgxkS6=&?MN_8u1sA-${hb#(=21k z9DhsGY}>rE@gtgMUqhMWQBAYVD056|nl+PmAnw;RUZBgwU*l~IWsDaLfj8-AJ@jc0 zebPfud+2w2=!l2j?4cKud2)VD87A|`zg`^z@nfe$TlY9i;%J&u}i>=tI)>D+Ja@|saOs7BeA6{hjhtYXR+UO4({bM8RLT01I4SdBa%woyB=kKsg>{jW&Q)#tlR40} zRANr~QA|55#A#|eQ$QcM;OD~B_lh#ZiTKDg?*E}kEjl%$KAoOU^7{?WcZD2l{h0-P zlnY-ZltMW9rFHZ91$R29T@Zar^U7;SEq zsX5n+<<09WsnPr<-m>*Gk?Q8FhIunNxyjoCSzo;$ceP8|snAZFGA+;4^gON3u=2Dx zhn0vA-=C*_s3v!bqT&Uo&Tp;^xfX*a{<~zz9CMAqP$tc9;IEBq0?oeG7~|$7ENol? zG_l4Q9C{ZQ?lkCL1H#*cyBEK0|9%LXW418{$1rT%tDvh42yYW^2p}6r+W0}Z`Azr4 z8AF-0@q>2e_y59g8^?RIUbE(IhWB?GXINDwSwC$5yt3SC;Mxh$#`x#O9RSXj)fd7& zS)_l@7m2IIfL~0w2Y@Rk9Zwg)eH-bgyw8|9;5f(N_9vz*vOHKO&*5R(OLalM3>@ch z#+dST@=sfomgSe3e-jRk8~V`;TrUc-9>2qQ7$)o4ui>#}xu-FOuYn!oNB6|B-adiH z#ytxh-4n;UVQ`Zk+}D9)9Vd<$gWK)FL484nLmZ0G!EN{8Lcp1Dkwp$}od;KA;qbE{ zuED~wTul7D{xw;+`DE9f7H-Kr{vEJzm~IvfH(}wJ?n3dKv2d(!g>c6$9M{AK=apTb z0*?Ds#+aYu#TS4ygz)82+Az; z2YKHsCksn_%k6xH&Af(Vy^SZ$@yQtT`xaQ(ILTHaNcFzccm?BEY<3U(=O+5==3FyCPJ$!>N?v*x!Unm`=Q()H9Mo+-NnDNE4tSu#4VxO@Wacxe!r|_wmH-+ z!kOcV)A-))@x-FtpE`c@%tsQ(S_9vy=t-_Bukp_vYxO_Zvg)pyPYs?vdOC5c_3tlo zf0d6qNpZgF&Str%+9B^uTBQ8P6n<{2Cl$lz=*o|k>31mZqIyb-53u$*@GHVeh&^7m)2?EW<62xeclP~6?8SaLs4%Q1UCxAT44wy@hPo9=qV zxwVMT;%4KXyD!hRddrIUEwC>>|0Qai>lDhnh3X9JT_LybGRuuS+l@&-e!9#W7K%2U zmtSwuoKe+)X1ta02{+&Gq47;dm;0cHF7eQ%(toy1WlBB#GRe<+S?1w~JaoB-uJF){ zq<_p0Wfpn(m6Bg?*pL*u)3aFeSr?R9?BOqwe3q3mOT-Et`F2!O3=11`Em9CFd6Vz-Mf6B}K0NZ9wY@yye|Srd5b z7jS>v7@m1@>km|lkGc4Z1;3+UOh7CVB^E8eS*a)O%n#lt_JWzjOZr;zWfy&&_%ANH zM*O^sUMVszdX+fnqOTWkchR+Cy^CHg7P;s(;uRBl8J`=(pS$R=n%rtTpQv-rK+(zv zt(OnF@YjfAnr3}i=C2adnr8VggTBCzP#%l|^Mm>c|3lNPQ`Ar3H$2G?Nje}tr)j#U ze!>%)W;RnlA)#ruG3qCDyYOXVvkM;*%U%3(@hUuGcx*Gvp-=JOUGySHKcZgpE5%cq z&o;8$zgRq^X%+t^q969gP~V}=5O|Y@N`PZXbFFC%XCKv6t7(8FzE0CyG`(Ka z$W+O{QPYqsNE(Th{)3P-Ha8@_L(}V!s3PPrg}(7;=7ap2PBJr)9FM2_rY9zn6Qj1i zgWPl_L<0J!CR6iqV`+16%ss>Gi{q1Q-N}jjyJJVaK?wio=i z*!HX6SF6YO)rOtV?a3A_)kzkIlS;iljo{~bgB{>69>Tf@6g;|!|_ z`yeJxbZmY*IxX7AJAo@kH)jSo)_r44xL*Ix181kV5H5&@S4_CgMdIEATruIEFVerC z6p3qsu1_)Pm;$bt_&r-B?k7ct+l0zkRQ!O;7r!ACpsBMg`)7fh3kvZT{ASz1PuX4~ zz}Y%Wr=Yk4sJs`0b$~e1H+yiWEgZu!IO^Ql{(a8Ev5p(u9DdulXMkfnUyBDt=-__e zgZsMWANzCT-;*BPtc6=-;kcH!!+qWgm+M92-#s4O4}oJlXZ-Nf!EyYt{bMI-@{j$c z@o$|67Xs7x$NsVquExS$GY_u8!g2jw$iF5F2NnH-xK0blaw+8B0Sm`H;zGEDh2y%t z5N^i8VJTh^cih6&&VxH;;jol1=-=looH>uqa`cwlvlb4bgM$8j-NJ?E!98!`>MWdh zzy15btz<*fhHaC^yWj4E#UW;{HU`Hx+F#1pkD@Yl7y@sDQ_HpJP*Q%;$+|zWkgnP7 zjYZ#|*vN)$?YD=dmH}k;S6J7~PSe$m<*OUZS2vcg@W!&$;D*I}(6wyAQ(o>{UJ3pA zqrdj8U;Eb4=BKX@2CwHXF}s9dRY;VT1;syI`|orAK6k@l>wEuo{72#!|KIRQjFP=K zV$yk=E!3wIn5WfC{^h>dhc(@aH_uJ7@6MX6J{$SVaBk4_dBj}0KAX8tXw#*swoxQ@ zXf&FVtMMx?n{n&8pDXvIni^9V9xtR9zGLV1%f8cucOAcaR;>3&l99!!^JTu- zP}tvg(_Uzzt@~heC{kTN*!Jkkn;u@#{K?jJ7q%S`w}fYhPuz6kzqQtWr+V#OZ6{WC zo%nBOzOkzDzz5EJx#sI7zV+u9kNY>S`h2T+{+h^O;^xTt8tS5nhQNjJiRP8zW6L^U zJ=azHjWfXw-?}I^UUT7r@y78JYly*pC@E6DwJkL#)~MT%OGNNOptHGAypM>6h`Q03 zd0H)gif=lu?G`7)ZC&}?jSrXK^fsUw&Z4>U8DDDAUf?$1hU62k z90=VJ+7fE~;Y;h1;+DXyZ!I(fBd2za*Zx0ef*YT^C{DqDXnfX{3Y7=## z9$)>E$hyb}o2%FEZtGil-NOOoq_}YHF_j0eT>PPQS#@^to}jp9R%}=?`_5Xiwy(B1 z^xPTI@Z$^B;nudY&Z-)JBz(v6_x^Hg;6ihgxL>Rb4c0`e&iVANT;$m%c@|WX-@kKqjXXeI0q`GcT+sc(a$NsvvBGz2HBy;{u#j#++ zKV3vjBh*x+f6YjV)KNUUa*t@Zb+!e!OmCP)S31`f>Z?VpHXv4YE4p{LEn8WESY7kp z*EX)a5SS6SRL!;>zxc?njISHNcjcl;^IN_*v^o+w{^{{wTKVbt`=L=OX8&QhZDz&c z=G$>w_PWq;jT0s_FLk!{2~k(mv%DmdT)w1!HW;~B7TzvyDVeRC`OLaKZRNgi)HHAD zFDw7kKX~7*;kLF@W!1B%%8o9*epS`BgEc41LVr3qb6z}BwrKW|vX3l1x~j6VrRGDe z;-XmJfN(0ez5G(B@n2t3X=Hd;dVXrRTKc%YE6niL>+WwkCUAPjp!{M}r7xdZdg`xcPp`X9g(a_wWOf z&qOH`@bH6@&q7cp=;4=0J}ZqfB_4jMwV|>tqX7eEo<$BBco+N~xl7{?H zy2s*2(hxdJ8p2&kS8EzVTuCq2G+MZ%S7;iEmNXYfm#xQS`t|YH1QtYTTsbm|>znZd zDlE9KMCIDMV}=y#sXTRz$1D^xRc5wce1T6=3`7U8XpE{>^* zxD;F8N93-Bm!=MqJBfNzl|Rr${23l}qf!Qgm+U*9Q+&T}g9ysO$<7e;FdvV(>9DX|CdU5R*&fcf@;sz|- zl6m|av2gR!dV-f$naaGdfO9HvoDo5WA?Byd|z;;!n((BNxL*EIDGQqszYXPBjr`Tm%MlP6DS zBhPSZT7<=hs@d{As}fHqaO%3X{J8^(m4ioXK2R2%{Q#tYCsviOUO5PVwcqCK^OctQ zIr)B7;CEHvcU9nb1q6QGIB&5p(>9roZ#Io>*xhk(oGtd8a<%2O8NU}2lr3~tl>L5j z;VZ$I9eyL+nzN#X{8%V_4jK8~7I)4U&RwR*8iOc1+ilSty>@|ac3k*`oA39~0S_IN z?wM|7f*yW}Xw~6S4>%yobP%lx@|!Xus#XZje^F_(AcH*7y>D-qOPs zP1)5UL*wm3_}zv^_>?ud$8wxeb@7)7sRqFa!}y@7{y)`EO)nD9D~8mqUWPl0{|Iz7 z{Gh;;^zTTdnom%cl>m=*j1TG0;2pB)?MNS^(2R$&t{XK?JY`+xJ8sMd%DVWSJK|Xe zly&_O1Zl-Dk>6thDa|riK4u8KNvAEEvaLZ6z1O0Nx92LPskdqjX^5d5LmJ{I$B<^+ zj9Cksa}dhJxbEV2-J0?C->B9MI5H{MEWA6poAziJy?n1#Yd3$L5C=$Og8MGMv6va; zdxMr?!9DZE51AOl@na$@X+%oWsDzTnBv;aya7r37FiB$$C+TWUbE0|KvM_dblbPta z{AQMxK=F26h@`SYCv_HN0nrnDQDQFn{j=00JdUSv5J!g~@99l$g5R0M^wh}YgA)bh zQB$}lIXXU?hMWl}d7{oO!iT0OhNI@f;s>VV({YJHusBOLF)8GAvMvz9(w>bgA)A1W zacNl%>>Ft5jt;c+@98H(k$3Iy*xw=Po|XgA&W@JeXirDazP^LYcR3M5faGh{dA)(ohLX0i97335=<%SbpqfuP~GQyDd;WKkTn`2%J)DT?<=c_TY z{;0ZnIp>q|4)SldOp1L5`x~xvY1pPm`b1M{S)Axfkh2|8=d?r{O-hK%T&IAOg{iS4iC&%<_pV#Wp3jrYofi8R~Q_I zKNqeNIEF)_R$!Ko1a4f$<;ofQC=9AHMTR2-rcBrjt>jw_>)m}e4Qu}o4zg@hqwtDu~NcGx*wzZMUt;c&S zac>=EC0n4m7P_lq7VmJ?_Rw7^d~+-{NWHlAkr!WTlKOEhpMO3pZv3~lW6y|&8(ygE zDo-45z5aRsQ({BS?3#VmYlD%uuO4VyAGtkIwWIT3bM0cO^+x}j5}R*mIrs+$pK2|6 z!N_MCBR@S?7YS_?yl|rovqk2?+h*70$%AcH9<&@38#d0?t!9cV>%_qa+LlJXyb@_X#q_MeJ$+0w zQhu;<`}vjX&b}p`wDakF!2K85d|2bo2j-{Amsek6WR-c7WK*V|UzJc@l~7%kP`xP< zD&6FUO-onr2D}!QQ{^g9-2rzkD~eN~T1Z~RzOuM@8o};dXUtSZl<{FfV-D}aDRlE~4^F|q;aP$3=&-5ze_wWOf zpA9$Q;Rhw3bwHV*hhO5MOC_FpqD-m$E*5_?os^-qS@EX~ZHtTcd-TOHqjK?s;w3YY zlKz#5KXcKgV%VZ7Q|q#5%Fs5u=*8k17rjLMJ0q(Nzf<_H(LKX9hB7d&7pW&Uh&QhNk}{`?8`b)OvaxpZ*Q<30 zWn?3yv6wop?HOO%GyQarpYqK$PCowzh=+UW4*s4b4M$whGMv+z{v6)My&seN?W8ez zZ{&NGrXf3%w2`qH8Jdx?Vg4-nSU^elM!yV;DoIztv&)vLL57runB_3EucqSTS)rO& z^rRHQ9GMh#b|$9Bp(ZBX88tHS;}goM+q+?WDhnE3l2uSvm!l!(1UEhk5!eE1^I*VW6PAChZ9pzjbWwJ7zBd~kJ#BEy} z3yRw=PY`#-kMHHXTFFxvr2x%jo?ZT4hSn={YD-S#lnz`KQ`)#Ir4-T?|5>bD`J6Mw zd2^+7>~q*3mg1pdpTPdjn4tdgINmny6lgxi7~COP*f`3+(6u_o;Cei`1Hd&qD7^*+ z{ihz>Dd3DBgrobGhJCml?$aQ?pm}^5H(%8_!|H?whG*lxn=j+HSN3)%aNQP;e$aSv$ARNGVoV|2SBmtns;szh-&G{;bHL?`->)OWrfeAZ z7lAts3#c^VEgx?6)v*e!C{)`b_>V)W#Z=z zcfi8UCqo>uaJCH5>)(`xqbSaV>y$Qrrb#nZhD$r^WV-BP?>79(rP8aId=aYi;6SsW4JHC>@kga&u55hr~o{U^n( z%Vs+hkF_p&PTX8MD>hZkj%*4&ABt2q`VzI_L|bJ|_#x5Yn{9%m$`@Wc7*4BiR16L_ z*RGg7bnLUoDmrh9RW^>sd`Es2-;*wRK-487zGD@UhKT={DBEg)OA!vI|MDdnC+LTX zhN>6JySgB!t9-t!t9EVW7RvlWHO&d)85(u9d|F?t>8!6_JV{Q|Ih^yosb=qMZEuZ; z`XzI<;Vp?lxbr=0<88kDPA(!FLn2*Ur|~H70u6+E*G$TN0;{`MX4Z zZ9|5+@lP+*B@&V2yDq#$=_KoA6J)a{+#Ak{wUu21Ybpjs!?G6`^Ci!RTrv0kD*b7$ z^&{@VXR6MHBmb_`3;AW;vfVvvu8S;tpz`gDBIgFLoeM>3ahm$tL~u2wmZgz(z14}( z&QI^JPV8L$>HZ+3nibo(_1833C%S6a_s-z^B7Z9-nv9o`i@sShLRCMniU_ZY2(O9= z-y9L4Y;nV?w=DdZbJ5F@8Fs^6u`@Wh81`J9VhCcfsPmy0jB=oR84F1lLG zxaey{)I~25yf@Mq%39ALKD1&P_!0l@n$P@O=C2gDxadVNQrj(qg5Ax?Z+h_v9?E8GG|f6j+3dgT_|OgY7hl#i>l9_P7hU`k@d-_LOMaO+ zp=rE;4~g@58$;RZCk%l%>Gyi*sE6L?q2KPIAr5s6{kztol>a)rq%CE+yYZ`HhY(YI zZ&GJ~{a8z||E;)9-K|Tyl=M0w)@b{;@r}h^E8knRKM*SPlHR8D9V@m9kpOMGuO}ac z3#hbbK9S$Zcb%58qH~n=T1`V1D`_l*5v1@VQIbX^C2eH7SS(ArTJsTENgEk1lszSl z#h7#-)-+_nuS=%u(Is@Gx0(3FNHmiiorsM^rzVvmAa1~#iqDwO1VDB78ijZ}2rp54dIvt;wQrW2#OtVsDr4>4#D(XB6sBfGsdS@Y7^ndgN(|PKqlrwu8 zqqNJ@#`r-A*$@i>prDM(nQefQEY$ck(`tCq#?|OvzsQ?O+cYfRT#2{R%jCGhF@T1B z=yCZ={o&Y3^EEs+?n|KA&l+QJzXA&z_cCaXuf||llIA1$YvW!8J*HUlukml%gByXP zeE#)%a4F#K%;O)&COcftap=|<6E4q9*tnm7FmWf={0?fIaZiTvgLdXO_nqmVF+t$| z3iAgbt4ViH+k~Y2zQV(!s6s;KqPse$l`A zWb*H^aF}Wq^zR7^M}JLvz2QD>;V1$xg!_Vp!xXh3?n@R9Q`LgFKelje?}fts3k!FR zh4bz~ybRn1Q;C5yKba=h3uCT9=Dy#uFgU(poieynaM)o8ybVt7K@3eF!l|6`sUq~9 zn|2hh@0?)6u=XJC5VujLUMD_G8T!($@|okUi@&?LC+Mr(u^|yUC>qLU!>dCzNhy_A zy8um6JGLRQbi41}U2A;%rL6u`6D0IP{OIf>&)~MwQxj`S2RC&-SL<)SF0yg=t&yro zWs`5FDp4}G&i4nnrF1Fus9!wuMC*?(K2X~*yWLl}y1B;p;egaxhEDVa-`tInS6;dS zUj+|i*JEj4ZD-&qKYlN1TsE*$|6YpUfm1V5@46bdYnCTMcR|u$FHSC-^Q~Vsw-l~@ zr$RMC`|6wZt@qD~Q|DKTlMFp@>QU+>Z!EdsKUF#y?DQS!s`Wk45Gi@)hv$Csni>-+ z*MIdac4+GEi#!ooc2qRn{=zz$OFO<>w+FejZDpe3ptyO{EaSQ89Y<@IybHHxwjHhc zh1U9ukF~CSPJ~P6$|BLW->dnJR_uq=o?r+1{I0e|=@;&if)8bpBRc zNJPYOUqfiNF|i?XUha-S=rQXH<7QPn%SV{V)sRsM8kC#D!atm zMUl#Fy9bxd)%jK@mPGFBU7e`h`T73eu3ep2y5;lxS0_el?;CjW%$HjK@#3ln^sTK8 zi)PQ)mhCP?&w{l{Bso@xy||Ix%4lXtN7sG#y6zHR z<@UNnC+c18Yy)yM^bT>d0j0j=UAPT(Ae`8|+T=;)g>XXDcN|jQJ|tbO6k)2;vV-D^@xx1KrsrtCpw`=_g$P**phu5LoT37b$(lN(n3r}u9I zEEe8-%H4-(WuNf|>4`VLPQTRj1fIa`#B;e9zGAB8n6>zIDS2bZp&o8qR{W>S+W!hW zF%aVG(jRO8t7XMue{99Wml7{~%}TlQLU&;-v`=`S^yBi+2iW;^d1aNmx7R7-bgBD| zxo0pMr9Z`;!B{AtPG3SkEp(p455K&omJ1VYxW~8BqPZ$?e<#5w+)uMRq?$)(`oj`YQyY22qZ!NuAmDZ}b z_O|!?J13*Se<mg&Gg_PSOnXbkjO2hL#McHo(g^&m6`S*pn` zHk)NSa4!43`mjVMV0Yp7{2X~Y`%@X(FZg!~z_zd>-SZL?jn09m&jm^n{Rlq{n~Ioz zgoj~!HM|Gc^!z6`lD~%hCS4)?Xw33oC4P$IiF4ygKaE*_S;`;e*uxG=T+ML`8zpQhWoh0^h~33 zgq_To<`VFH)#7}4A37v($$UYPUo>{eF#;JNcXa68OLh%oPs1kp zR>F0R-6GxZA{%<{CmVVmgiX9u!tWRQ2vdHLO?^Fde*7|NOOMH>UB@!bN zTwW@1k;G*ZqY$}#sl)+^kysudHCDS^;zd%9L~%LR;c)*eB&JTO3tms-=vivTSX{?; zvDJ(mE{!LT?516lagM#%PNY?}LZ$bJeI|W8&tiv>IG)7@H<8|6wOO;%cce#doD;{Z zV}~85w}ipb*e=Cl-JmliqjlrTPgQy*F*q;&KT?igs_!pe;eeI_jua>h^Ocz;)W zUq@IhX)-gF4?@QuGsdDJI@?_v(!KCiKm45V)~mV(LS5~Vbz&zQXH;q5Ag7DI>rEVq z+NWq;#kbY(rRw`Gg;cSVZ+)@i3VlQe{Y}Z)9AbCH2U{siIlTeoV&8? z4o z^A`?GFcwa0i}Bwv7QPl(8IQcEGk8OAk0}yt#e3S|H37Rcp1NLS@LGTmYdodT zXYkGf*T>=g7H$yP>9`UBp$T9crSBA6bY3TT@zVR4!J~bMBDS`P^!~NM3!v>-tnpNO zKVtCc8)S7H-e!ZhHvzB8;2i~z+M~*-aKC2c-%r4!_KGr!cfaH*cPdboXXK`?KV$Gb z5X4&-cc;lxLzJm!;Q%cd6VPa171iehn+~@3*e#2YMVqn zKL&P_(booEldUarxJSXOPlES4c**2TH5%W^#BVrBUJSfs!p*~2eKNc-c=7W2hi|TnLepLUm@T2**$O_x6f@1)P>OPej@lcfPg9fif<54(@cagyx0Ivjc z(nlP{OEq{8fQSE_m!k20g=;;2kAg(;A$|0HrS$#O;5`N&K2!W?-lUypNEU0ws|cE?+uNIqOp1O4Wy?x17qeYy%`#Bk-^IaPlbz1 zTc61*)_7CRIasCfrkZn5ukmuH2)9M!>2nUu_;qSLd@3hQ$AHGeCuKt30gXrXL6w^s z?mZfhJ~ z+4u((>J6ks8pR{qt-YE9$TW00*hcYItgMiG&IPzR*SgV5D=U-UqppW0;b?O<0$Anz z=IGL^m#%qk*mZGJOJm-rQob?s--qVo9MG)Tf?)0lTe79#?qeyXD`R=V!_m~z%vf6K zg4o{-6+{a5zj-{h@K9ua#D!61E8qvd2)_mUS=pb*(gOa7YZ=Wp@bCX{gd~4Hyd$?o_kYqzGr-Y9!Xl@mn|!ZS%sRdg_qu8$%dt8sWp%~9Zy zM!j$~vcOYA!$aPPm<5qFYGLMp3o|p^SQ+aMW%1boG;WXfS%9&RjpkxqueH=YW?|(m zX)eUtTe3d}2F7lh*9GcU)Gb{asO#Mk>F(+3TNb#qyyB9;4gAY3aM|jc7&;R=IxxE4 zgEO^Y^+$Sex>bKy$3QpElMXBwqAh*xeS_#M!4|<=+dI16zq5B|S73SXKwtaL{zxyj z{oRedf6IHP2kEB=>8A(j-+@8;7ImYoFmAaH{^$^YsKpn5WZvtVYIieg;l%g*&aO=S zCc?e2<3uOVE_j&hdV5BhsYO8X@_fR5d*W4_X)NA|F15y#p_YmoJy&iM_UE(@1sadN zN5k|L@EKsrAz>`$l)DV<=6uQpVcdq?!{t=c!gvgM3YSxig~6Wxj`(0dGlkJG#)$#; zUc1!Zc4PmwE+yyKd44LLFS^Vjck}(#WMJ^`VKh%)89IaE6$egbgBqss$Xv|Po_Mvy6h5tiESLCUjxqi&F_kf` zfqWC5$v>4T?N3K%To9((P5aY*7`8HWrotu#VAFWsr3R+pSt%q{mV74yu=t{{1#9KS-t zo8uyh(YECniC9IvSrX%emg6jmG494O+UcAhkeC9!;PJ5VK^?ImFt4lha=(#>@8LAXH7UHgFT_=(gV*q4u4fX#OQ!WElT=QfFv5it=3h&votS zhzv5PH*9;?DPpL{&EAQQM{x&^uc&Ql-LPq6Q*S>m*EY0nYN@HanxFE}+Hh^l+c$Lc zw(k>%;_ZuK;o9z<0}R(<><%T~8X4%*9QrzyLj(h&*gJ4wFw(`^J9=6r?&;dOZ6M4# zc62sJHw|DIkUR_7gqrte$i-QMyUU#gtkqsqBu6ovd`GP{edv{}yIij^@oKZE_~&=b zseMmOZcDw}Yxus5#|k}@={-Y+o;^?SEAfZkM`T{ZPv@Nh#v|G`>iPg&bl&U0M{SmP zzY*MypUyiBfJdNhRJdym-eceeY}SOnDuee7c=Vo8M#b;vaDd1*X8=@K*R?Xq)|Ga0an)}BHoM2lP3F#yjG%T(b-Au7G+fY%>MbGgLkDO!B%0JyaE(p zGQ8`-qdZk6k-o1a$$JgFkWvOak-jU?8CxHR_m6N>X(#azcxT{1{k)6tqw=77@eqD` z|7Zl67l0e}Z&8@Uqv9FDPv;#3uL5qwqr6wVZ3gcIc;ugW#8Es-o38IEjfbMKd34|C zJnHYKc#}S4kAZ1`r}qb&yfYe)+94`_CXWs|RpFuulaQCC@z4}W$O~vZ>Yhs! zZiU99@Dq8VmZ~J+sY_KpaN=e?68W!M#ZWx5QH~KwW5tM6g95M>FN~Ks&Zz3% zNt@fj*!`5)#jb+)T#COdD=Jp6hTF>3t1hqP?&m&tbXf%t&^~uG%(}3z+-%;*#!52B zvgMU;EW0riXN`L0nkU!TEH3e|nPb#L=J6C~xMQqP^v+oUR><7s9tb+mA*FgrCIuOr zHA)Qi%ff1$)L=@`lkZC98@;gLbBuRYv2(&(*$Ju>ox zp>GZD@B7xiAM}wAR+7r&g0(ket~FL+b|hkdHi)pS5;td9B^apY{eEXh7p}_)rZP`# zL5M|Z)y|GQI{70qLK-WE>2C`A{a6K0cUn-`AM^`*R%4aF+8-DasBpNdh|st8ZLHH> ztNrfA0Qw6lo?ux6>8+hO6HEKt8DuUtEr?k&AxKU zE6Q~WD{Isn@;08>I~?IDk)`Poxxmpx`Cvc6qO?Y@;H0uysWDdMZuD?Wz9*P?uHh_{ zxsgkPbH*QFDK~hRr$2YG|6{{!MM}*3{*+C*(ayZwNXj@{njT||Q#KX*yM}1h)19@a zPgMlZ9Jkifo_-X+v!f~bEU>bX9lUEeJ?aX&gIKN^E62(+wmc(N8fK;GvC@%G2Op|U zIn@nBYX!ft_XFdLL*A;h$M0o-m-o{f*ow;7r*B~8D`L0St(t%M7%NMQS!LNVSJ|AH zyKFv6x_JDrqO*pd2)=dkq7VG)vhUT-JGnLJF3&wRcl^`CtbBH?qI}k=tnpbRtbAsy zq}+STH-6^`TbdRt2xe?p^nvfyx=y7dJl{CZi5Y9oJ9+G{Yk%-;UePsmW%KWC`1@1r zzWZvw{jBJHPDh%)^A_&wH928chS;K}WnCrupCi~eQk5{-x$CTDSuxkLnPaRl$IfM) z!2%_y!{k!W>m!9vh?RK8EXYLpyK#0(b``mc`ksS(+66aphKk+y9kgV5pZMQ+Ka6^? zIx;)LSBFMpk(9;|YQGh$E(k@kgKp0B%Dczn_o^Gc>E4JdK;ej*fb_7k(8kzUh>@Dr$Z@MrUX}A&&!pUSQ@vzkhYP6-Qn*ik+}R*)fc|l+KFH zSew4CExIGmQ<8Sl3b2FTHDd2i%JGt5)$#UdV_titO2&}~fInHI>1!<(2;!cK@)&?k z&r{EujnMjEvBrXp5sI&h6ZWzi^@LJl6l+&ZJgG^po;mOI_=WbKdb@@$`2INJ+qJQ2 z#ir)EDMkb)b0aNs$A)`_IcmZ(sYiuauRXl}(#nlzE_<_-PrJuAAR zH0T*vUf;OBZtXSo=&WjLt!Zk4gSty`S<}+e%1cY+R4CQA6CX78mrbZED%jj1+@ODlmPzp*dJn*T9d1kdF1#?Pf=kXid$H*Vfcs z*SfN`Qj=V>siAdkuyxbg4HSKm-86KJJ=MB8TRXz-ef@#*73J!`iihmdlaEFF*}KBN z!pu>pDFKW>qLt=Kb9+7B6mP0GO^gQ7cbPJH{U;dFI`^o}68Oca4R-6ia2-uT#}s>h zo;w~zZ-b8F3)G?a-8{{8T*%1Ub1&+7Bg%ZL{cq2GFHk=HrSYKp z@_(}qz20`dP38M`JYz1jj_B$6=3kH={kc!q7g|rruc{xobeNUs|5Jv>>dQ4uUn@(2 z>6tH#g`*VIHQ5-ebznE=(>*GT+mL$4-d)1XHRSWSd?J1G47uOX?`KP7{iHl~W5z(hf%90Z#1tN_ZU3d#iB5Ano^xO~ z`+);{*kK1wVZ#ob%62+%8r$r^URLkG>1?qB`&fzt&tR{rPFo(|40g(aXR>cO@GMLx zrIZQd#$1hk4xGidI&e1I=)gJb3J0Fe7CCS(o8iE7*dH;@qKq5;Gjy(yGME{|o_1hA zyH3M2_oZH9DlZG=wHlb(tKyf(@_;?SF7B4cT$+E2UBq5ag+Lng*RY>Ba3Oolfs5Gv z4!npBIdC!C>cETHS_fXjDjoP@=6B!{_9hMH*zqZ4FFJ4;`)3DU%D&~m`RsEJyo`O+ zftRxm2QFug4!i=Lz$$dg!wNRXfmgCWQ)WtIVI{}U9QYFUPY%3_eba#pm>2gCl?}Zk zT(}CNz7nQqgbO25e~bD-n99?IxkHB>IFo%;;w4<3#r{U>CqLP)Joa&5QPu+Q1EwlR zG?Kp}!=q;!%^iAPVtNPBUIagsn4U>Acjzk;(>sUe4t-K$YKPI>p@_t_9H+7CB`)UJ z%Pw}veJoAlr@4Fv`<+aWh))Ll7l}K$d?pJ!Nkem;t~c-+16LV%mVwV;&`cT9 zH)h}`3`~1NC`0@a1NRzulY!rF;3WpmF)$yTl>t(Cui>W*;a?ayX5ixn{-%LHZ{Q&V z4;Z-3!0QeCJ_8pU*lXaI=thx-(({i7e%!zh8<=+nX#V#Z^6duxkbys7;7SA2Ttj6j zer^N5s)Vpf{+xk-WZ-XTnCABVjfTnprwzQ@z&9DV(ZHn!ru#-2(yv9I6#>)j;QNG} zvv*9c(;5Hn`j)3oP8T$b7_J}zRWb^0c7sa^+t}ipT8FJTW7`u_|3dY*V{)%|^ z`H;v|VBZ5`Zinv+(%vTKX88KW90=c5sc(hU2R(=)^Lih z%DqcI#n=^u@09VpSDYd2dsxhAqzA?dAVV6F!z60yq|pgWjH9GBGQBWT|)M-%%@#)uaq5P-J|bovRsk> zLE_2$r~LgeVd&|EP4VRKKZKh~?nh<*L$1=n^D!*r_oz(Af0N_nc%#Iqv|N9)#36|{ zNsPkbax@Bf_*Y4Mjl`G`%;ncge2K&#k{FrK<+w??|H~x4PU6)P-yktaoPVRl^%CRZ z!~Hi%j7q}s`z3CbxK83WiEAWom$+8qEfVA5!o%y3_=D^(nA0mKCT<$&?d!s1&5rH$ z?E~#{)0YWZq@{a@y%&t_jHOcX-8;5#>fJif+(jF(i2Y+G{6H4oJ!H~a+M{M_X+46C=euhlh?Bi{_jT3v?%dkF zZIb%NejcSDb_bd)i>FbZnxt8x) zga>roV`TbK$uYdwimAEXh;D17hl!EgK3Vr#2cqKO=hm$~y&q}q*dpaP^G2Lq&G#mu z!BR1VNdwQAkKTGsU8ttnm@TeNCMFLEJJLG9?;-(l^JusOo0znA?V;mfx}lKZ7TkQgVHCg5xU;+uWIQ^$jo9P4L@tiF!_Cep|H`Xa_aMvSG4p&&A`vy~phNL{$AV|zniUtMo! zm(1*XK5K&437M=3ABIeexFOMl=TDS%+xlAV+(7no#}Cm`la}6KPdj#0!?-Wz8DKVv zcuBPG?#F5odl@f@d-$9Tn}BDfxSenlLrV9YEwk^l?v8d^9XxTnf!Q?>?&`y4NS*u{ zL4LQWCsk|jP6Kbm#s?V<+7EDB&!qd4YvBygnlX$NiMxSp(NpnQI}ql&`(7|Ng~0j%MwZwX3q3p zXMC@-f!=}kp1Ss)j@_7})zwM2G4A0_-Fq3TEpIv1@g+dp!m16z+b3w<^!2|tt9IW=o~iyY|<5~mHSMEurw zwm&C}%(kb^kTG?(J8h}f=2UKa8%b|(#*=GpC|%5BjHc)$H~x^H-yyTx zBl4B23-xBF!=0L(x`Wx=RI)ft&2y}`nmj*|ZU(**z%k3`-Ck$)b(iRqqJ9N3^gW5s zc-wg7)tv_K0k~(`EPRv8>pcb!T?4#NN>P=*>kXdQ5`8|3r}SNJ@B-l7qDZinKDEYI zrQ-qc@-&{(_h-1{Kkr8&G4*fabKf>f-_HylC2*O|nh5tt29MTq$K$I1yl}s4 z=z9>nXXAwXDT5bv$KQXA`d{(iPVZgd^~BNFVDQd@rN02FQ7=U74PE)Z*v0P zc7qoMuRe~x7K8T$c=7TDT~?0xy#k(IpH=*RChL_7%8MI7$;eGzzW|;W7{$s>26!3r znk>ar=L0Jd@m@pN%1~L6`Tu0NN*^hUr|)8Ll^^n#0n(LpA&rumybyTxiUd0m@2(_y zu_Sr9Gm{Hc*&$ABQv>hTfj>u+(Sw7 zUPzJ`z(XjRa66Oa9Z8Z$`|BlB9;>pGi(fQJ-V@*@6RsyGx%;geymlbZ=1n;0z5z5 zD1LMCQ~D^*di#zWOks4t^%LLaI` zLSCN6gX)C5Wf~8c33*p)yrL<1Yc(F_MWTGUQR5X)!Ryg@i>Kh-qVbkY!MjW2Q5z^x z{2tJF^jt{9dsO3oDQij4~b=ia9vi(VMo zeyVwFK8sv6v4S4E2TXyu-*WOQ5Lv z_5bJaRi4;(s>{AayXDol+#049g%i6B>^88+z$pe!WxrI76a-6aZpIwg#s1!b-Hg7O zm7)Dq?{MH0w!?u_*?%cAw_km0T*DT=vj5S6Gx$E7%8B+ny;}j;wBPBV1E;e#2lny( zTqz2aZM2{1DFDJ$>1a*DcO@2bH~W%9?qT$;PkbRyVYL4%Vc|cOwcuJAnuA=g0BpjT z4rv?0)Q(n$Fn!l4Lzuo-l_5-FDMNFb@t^t7Sxx;VK6vIBACVj{lsF(UK0>KIj-?7> zE+Zn%G44KU2h)D19HaAqW3*{G&XO3N9vq_q%;oq9<`^IS9Mi}21@BMloVwAvI}*Vp z5lr$D)8zDN98<`)Zqm%9pS}yM_9HX!IU*jdg-Qd zPMZCqZz(A;m(i3H`$8v?Ku&f`G+iR$w2*|eLf-a$N8gjf*Nk$r>q>XIA+Za{C{fKv zawQ$#gI)!SQNhl&+r(6_+IM#}`af{1(zAq~6J+@PD=zt8dXA9k!%yd7`m|&0N%818 zt@CPul?<2m^|c0%o{#kGR7UxE6b`z+CSWBauDUkI?wTQsr|$u{lRjnIa6#Yw%Bbtl z!a?VC0{=Nhu_k2Z7+NbbGMTZq&x1#4Rz`(o>if?m^({_NmFE=q zaqt3gSb%HQ_lnm9+limvr%H=X$Q`c~?w|6R`cA2wbY7OmBaY%xz0`TMCRpi17TLT- z2CqWnk$0_`>Yov*czsnXR#vVKXy%-KRTUMh1pVB7Rjb5}YwxK!7w3CN zum_;{CsOuK@5QF~s_^c(>F%iM?x^V<+4v@I{nI@F@xcyV(03*v-_OOdFoL1#GeizF5uC7Vg@v$=Dnv<0Y*POgpXUm&e-aoOv!4$nyrE%W9 z8Ain3?c>)+acj_hNZ*8H`28a;`CqzU$$SAnok#r{N=9;ZeTTuLeg-Aec@cw${;dzVBCFcIj$yxbL~Y?<*>K?CtOSJ*=NaMswEXTx|t2*RbM+(Iers@y;b%>sI^! zu#c6e#5(g{JoZ5C?@wg~BgZ=z-B|a@!GQm^es4u8-`)O^uoYM|SC!!`cUUY0hL=_<*HvE?&kLo2h2EUX`wp*TCkw3FY@WJOruRm5Pzy!96DiBWfBYEgQ4aOK1<{}rQYYZpgnMksD6NM*HuXm3_zJnDyr zisKXht~Q)TE0{a%8$VpMrtbb5MX6Y0)p;k5HRk>3*h96iol++W zVBmLj|54u;urF)ObqFUn#N7C6;T#M9ctECs(q0f6lBxHNJ+7r)oPn&;J_o0i9H{-p zsoc=dPE*>mLazIV!i9eCEm;u@r$S_-WZZ`+jUI$DGseni#44keW$d}iqLff&gu+<4 z(!&`n@cq--S~*cZogGbMnX#(qTU648KdKXix z;9p-~R}r>uN>3Zfv`PzOg{UdNEy}76^{ov5uBhEFu79au-i{HB%Rj~l}oO% zZ-u*YFUfk(YYKx-RhoYsz3u3{pkDtLu1~i1d3o*2k|mJI%Z|#@7n>Qnqc-zdQ5UVk zw2dWxYgYu7=;i9Ix%J3tD zxB1&DH||*(PA#hT@2x21c}1zJ!oB<}$GvPddQoFV4YeAdvahM$S%-XIoEfBZZLH<) zSjuxncC7z|8aNmC-I8FC*S(eU&a)1Ea^KLPy7MeiQ{&XP?@|rn#sHfbt23;>*lPVJ3c4$CZ08qgxl(BrhGz8gnJs{lAroI5pK2} zu70*U<$(xyR*)60jHr+oBDLA;ayFp8ClRW6!_af_^eGi4PQAaSf=+t3jdzq4vd`?_ z*BPjh&v|iD61(p+ZT49&jVv(Srp~Kj#WU7rtWTG5sP=ajiMy2QA?59Br&u5yNedi_ zWCdQ%M#A=hHr)X)T>G zc5?ov@C|usW3%`EZLR0If?)H$?ZL&t1rZ8^(({R0Z;Z|}5$^!2P&_rPLn)55Q6j}` z(5&OX8@*`l$B)ipxmxYX9HX~LbHT}D`)_2WDKS=tU-8^^b2rQ#XJxP9)Fl2kNuo|s zE<5W~z+YIgQq&k;r_6eNX7q5;%wXl(YwC)^&GHRiF}4JE`s(nSy5$>|Uw!v{aWehl zv8=tUWKnGS_?*3Lc|iNs7`;}kuR@(IuF?mPZ6U0eS`UB&RPjL$m(!%WSvxyARh{(O=XQzuqt6+nKH{nTnrD9L z&qXg!+xed}q^E_(Bx+_STjwUz4wyO{X7AZ1bwcDYeyT9i(0KeD4buou4sb{jfSqy|ms6e! z<1*xKE~oMn#%;(wTu$*7#$(7+xZG~AuoOd{%H;*hJ4WA}@k`@!dj1HLX2`u&pu&h8}eL3o@>bGa5=R%gqdT==W_W(`OY=u z^SFE>{qqdDpUcIt4~5`2^2AXux$>U!h#N*$_gAfjnTNLGH#4OjyrHV`WOIecxm$B6jyp-iR z@G^#DaBO3-&(}CZ|Hb_iXw(BBRfeX4; zI2RWbMTIeiOP0Oh(-~JJ3*kreyPlDl-kG%C?_r5Q%(0stkeJ?ybOuqk#PklNGl)VG z(=(CIAPPuKw^gTB^Lg3*bgM$%H^}! zHyk*ZeNtk2N94HXu#ZSA(m$8AN-XrvV;d!=XMT>$&sIw;^y7K&;4ffj5iyG2t(?D* zy&y3?!*l4&DA>x-`p1(Bz@{^0zNcZ5AJH($@6|BL_4T2I`waPZ19uvDvxZ53wT4Nb zHY|+zpL_jg75vi~Bx_;2a8^YV+4qS0<2xkJh(YC{a9v2u0^*}^>&b>ciXXX$$p$Z% z+~JSQ?~`Z2z&%QG=)Z+*=*Kh>?w{&4`3sN@d9lP)o`k6$le~g#gi{UM2fdVU6h2gO z`$5>mKTI|pbI2X>Y$N+~B7VNR#rh!M7ezeiOq;ui551&^!YLv?^j8yxK1v7aqxev| zR+A0+5V=EsfNaQ@kUQd2MHqUnBpZ5FI+PtGp3E2GgTnpscthV2@&|nxs&mZ-_S?#qwsH(dfKF(S>*oL6Xl@dJD1#%PpgQBaC!O=ZVS0XAL*ep zhj_e@7!|Jw@sSUxg3O0SZCpS2&4dyD9(E9?};PHCU zDdV$2;$DdxCH|1a>m=SR@p_4`lekLa>m{z0_y&pJFEJ9iio#zj@l6t6Einp*%hyQU zDlrnvlZnm*e9CewolFx)HrdNI#5B@{)!r1{_C4+0J?&e% zd%6b(oxX`i3^OUpeR4vvfrg$Fv{m(lN=>+)fWOIbLBHxiIlS)k{o=Dw^^M=Gz z=M6DB`jG>aaosz&_9Er2-B|M9y>ol(?wzvex;iJP!;#F^ErYGtmuS0_hH9^Jmhw~0 z&lmfeC*H1rDi+0y*Y_P=J8(zsq5|nICrJk#_<^$S?(5#U4Yy*)Zk)lv3qAhSdR0wj z@$YHJp+@k)H!JAxYVYd^tD+(%Zc~ITx!6rXF@;M%Lv-lCC|DhlL2m7cFi983?@-LC z#tn4wD(e*Tvw1eHYvM<4h_g0Y8`ifpwp=Gq+_SNc%nwa z{T?n$xVmBbxRK)N<3@0FNWuy-Ui$S`TZW~h9dlo%2uYKS;|CzE1Q7Ow%~ zP~>cUI7ErlPMVWybU5_IZ*bTYqp`so8O5FKyjOUMXTiI@unV6oA4Q)i^%14wM~1$Q zTKJXtgjz07+nUoQ9O^qy9fD+ zPg~n4-p`>-*Y^T=_t>n7aDQmhs2b`~DcfjnWxM->=}N z^PUB-I1cZp2Ja2<;^i|-=a*Ep}3QIK=NR5Q;hZ7 z@$&CtNR=NVR)DA9M@nY$qTuQIoQU@rc=bF6;!h&p*(CL?%1SPNw}7`ciEy7vQePGp zIVPj;#w2-1z-vh&es3hnYsyJ3eh(zcdl|fB%C{K%I3~kuOOp2hc**3;nIw7jxyj|r zLGY4E$J5{?Q=hZ2Az4!O1-xYRJ(#4vSCZsa%}p-cTfj@EJYorW^j=o)9IEcc^RU(j z0}%tb?#GXwYq$m3Ab5C`*=ALtI4^_Bgq|71qvvq5!CR~GC>+J3F>PI6CwKwKNgqTu z@4w(l=N$mAMDj?N()YZ`v&h8O&_g`SG>ap?;h|}zR>uQ;zbSK0~!yn5}S8}!8;6|Dqku;rH}Sl(bN01 z#>1n=<}EgOuWLL!8f@O1xYqUMEt<#|+@dz`w86U)JXNo7OWC|18@#pPseHjLW%K^t z;I)9K%8hK5UJScA;@1P7%9r^X55qPN-aT5l3p5@*BlPq>py^wv@m3kUC&3HAjp|h% zeky)&cIbN%4k}*)Q}ABbc!g8&JjE0GP=pD?&DD4mr$q59)_Ax~$XliH7Ei&e*LX{& z;I(KxYNL7Zqk3WHU#G^Sa!$k>(0HX&@D6CavMG4?XuPFU@D6LdWmE7T(|F6L;617F z%BSExqw!Wu!Fy5TRZPKqUE{5sg6BcutNL6y1us|QT`~o)SmV(>=D{ysJy@mjE}eo` zuklt-!E4cY7@AKQZl}hhZ=yu;8_;+dT29D2pz$yyosf5r#-pKU6)rvF-1sST7`)$W z4tUISgXXt`cOPzw4V1CcC?47H9#QTuqwpIPfUS7qaQALHVuzb^?QL>d)#a6fdG5VU zo}dT3cFxYl__D4T%?PH*74fNKo;BUkoN&4|;{VZb;gH%VBWrZV8h7xzXin4{`b=%c zN$;9;D<^!Hzj*J9b%)bD&n%2?yz$OjHii|=$7j<`B2Ct4dSm+4=}}j7VYsp2N5?X( zyqg}bb&b_v7X$2|QTqCrJ2bJAhFB}_YGfAQtz(~9r|xZJCFwCt9VtnTr8fG)tPFc> zgiho|uJQ))YomPyvSpZm9KHQ$>Y+J7thUF#4Rf$JOF?=1b0^EwV$HZd8%oEXB7eZ{ z7XNjc1=zvVL*2pZsOR8Y0dIdQ-w7d&Rg5hxpBc-?z8YuJGGZ2ddJb9EFGDQs^|O6P zYYWECq`70+;|1lf#r|}w#{_?(9`U{o8tSe@7uJ_M>`^NIwvtN91c0u{#Sn3P&%Zp+Q z%PpkHGxo}ObNL&H+ec%g8}1x`IqJbKAf7{yL|xV~#3Kvot1j4I>xz97aojh4B-*yC zWca~d%s0O4<>-HncLziJTgFR<=T#l7wN7OQZyt9C$gO0!4V(ve1;iQTIcm|-oJc&!?^3>)2B(xk>S$t zZLE#w1MtWr!z1hu<3iJs;i0^n#=rP8?0acr3SPUhS3!U3eQdn$XEUO+`x>Jg`>cC5j-=;r+;0V~ zuQ9%7Ng8v-#LhQW!Ixipc{uH76vo$v+ww*1Ma;f7{_-%ILSwg_J_7sCG0*+8tu1SE z!uR`64mTGZtbOg@N>E#W8&k1o`A3G@c71L5<>4DfYU={|ewi0XhX2>__F$;)x{+%C zM@~OA{*Cd&Y=D`DFFAtx{TYOrS*4IutOUiSobl7EG%FDcF=w`53$)VWI!>sJD zV+U(L`>ZI>@bEawHPDw5uufBK?ucz4VM`Ch?yvpzvlOqgk;44imMq^5BU|zhwQLWz zj)X_Plz$diHy~E0^PlB$W%+j;Yeih6Jg&nnn@0+RLwUCyyMF&fiG6j9^7VfWSNorS zsSL4rJhpw9EgeNjk3ZWqeq>nr^DOI11iL|%_U*wwajNKe;vTJM;&&iGZu|-Y(aLdg>%hx>8mY8m4CRIP)AM7#d`e_i4IO)V=#k;!TK3%k8lsx;%i$CAMa?Xc zch_d*V@477Iy$y_|B3mJ_{BZ9c_gDE_)=Mvm0_otG8Vf?gc+rpMIlw^Wg+*_x2L@e zQpVi&yWp;V^(Mf&sOEKnx)pUxmj>#3cSO2-y84y{E-kOPBya;CSq)sa`X+`WEIK-{ znF9^Q!s?G;&JxY_puyPwz;Yql(%0TclU4@0`nI-rbiIFP@6N8k@?QJ>H@z9e^kxv# zn?X!(1~I)EL{pR4xjIzW*!oUx24SDth-dH$^&C#LnYCDv>z!hSGCp*9kI}hzk9cQR z&0d*8t9Z2)!8Nn{HeA4}S@F>%K4}VI)y%%I-4k>@)RUE*o~c*dQx7Wj)?7#)Q?HR) zbuGR>F{FdjEYJ>kY#`WKusGV8_jT+ml^^W5=?3;c{S{C6uSzZ~v6@~_FZBfSus&g3 zJ)1rG4}ga8Y2Vhg#yCyG6gv+v<-RZ$bIM&@PW?i{xC}W?d4qpSu`q5!?%{IEO<}MD ziX;3KE~gqTOo|~-R$XZ+H5 z_*AQe!QE-=B9|O?#wA6t_!)T)>|$SYU^n}?1AEvm2TozF4xGw9;J|6@Vh7G)kJ)LZ zc)a@7{Tj9~@;v0gGuc)Lp2gNWa3-sC;4C)ZfiY6yz%%$-5tRekI9%>E#E&Rcr}!Cr z5>p+bHFu9nOm!v)3m!iqG1U=TbJs61)d^a2N8>Q0kIIPF+*M0VWkPH2N+qT{A;*=& zeh6C`T7&g>3cx0e! z<052#0Rj5ZarfV){U+H}7^^_oK6Ff8Nj5qFgJh#G?MAY}r+Q2_tx@%%!|^ED@b?ng zaQEPzqIg^j+lP)zTFXoBZ;%Z=wDylMl_T*~I;k89^K>qj>BPVV$EYL_F)Sq%I3O`R zae1M{7>MDxNMd9<$BQIhAaSw8=!E2Qblh|OR9P>0Z4Bm8(o3D@n)VO$(zJ5Sz{d&0 z9bKKf`?@CP{tMDhtfJ`L?R4$y+J-N>u0E$L%?FI55N_=QhFYSM`f&Ts&YrH;t$n>a z)U@4hZIJ>|#6kf%?G+0$;%IB{=%8geI|dLOy*xJ9NHPVZfJzaa~WJZcrq#dglun1vy*94S_;jVmT!z2-(l1$zy{iJn5;l#Y& ze(tS3f{*2ncKTADdi?;cMQBAt85L^}W_l86?TQX0I)*WB#w1!0kVr|wlM5;nE)@8G z<1oj#xyNU(Qn@C&r!<1RpKKTVUb0=LzKo<7M0PF8s#kS*bMd425YLO>^Z4n!TQnYpqj*OR-d!3G!P~q~ z7(ALsNa0Ypq)X}RHF$?L9#uodyUyS}3f>X8kv>#eo43l~wcrC*r8iCEp^4>4Z>Pr7 z=QWwU0gX3f3VjDO9@Phx4pZMf8V^-0A@8upLs2K>J*M$8r{F!Q@hE>1#qSx7hfAAh zj)%Vp;d-i2(x^+iH>h4HQ;Eq;b((|XkqzgF;_XJ;xj_Nginn6rs!PTAw)lIl@$gG8 zuT1(Z&qu|LoI-VozE~Eq0QMR8G~Tv1BWRUbV>Ega2xcAkKq;Oo}jTmE3clqk(m02fK*QSi8UR^V|5ZZs_|Kw01AIJP9{LiHa4Gf(vkk=R- z{Mud?PRGc2TC6teiRQR+>*g&>KRIv1{PEic>jw!}SQrx;c8!x=jWY(=bDm&P&{J5# zN7K-IFy;%bv}lz3$)O{AEu1L8R;0wd3>QIlRY$NKuqd#4AkrU$O32d<_EuBHdB-m`%##{+rl z5v-~9$wfDyJwj4~>vNB?Odk1I!*yKP9^lm0RpvtDqU)e*HR5wV>7l+)Wumyau)T3b z-stgpJJN(^qn#!dM`eFV`(UCmr4|iS3v(mzM0{|rszdJLawF?7=v-KbS-^uw7!3(8re{Q5i<5~4xGY% zlv5tl7|w3k z%Fvihn*y+DjHJ=PG=Ex|WX4qJyU~XmlfL(8Y-APL7mI!fa$gJVS^_s+4)<#5UQh02 zjBO!T-^n-F>fDXlWu2;FF2^iD=BTA2ECyW2Q6Hn29x%A9 z_|{FKwZ$7YHPzHL6gSk?R24TjY^*A7YHrw6RoqZh+qkEaHoHn(6S+{Yg~CCrJ>0=r zx3o$dM>@&xq*^CDIcnSmcl;a8t9Nw-;OBTe&@-C)0LjoZgPzaIP`?(Lf5K1a(X+FO z1kxzpmw|QO1HkkgRYvhX4hNk#4m^aPGKxpfT%FejP_0O?6_5Hib>4#j^>KJr2Jc1i z@Tjzn(w7Q%(q|jIkCcqu)b;_edDB%r_6~>$Tmmuaz|45 z*a3w}Ji?HA&$p-b1+7dC!7J^`3a>N40q$Gk9k-eWXk2yV>Anp)*?P z)BEACF?b~!kE)H*NB5x~ziRMQdeb!CB7+wKkMfJsLG2o)&*W{^cvJPmhczCOo={&@ z3^)enD2<4x5Me?;R^x>b73{`JSfqcI<4)TJtK<^B^y>OQSPDjwOW7ZJtV z29NRj*VS8ppnXeE7gn8}tAG8Hiq#dOC;r^)%{r+-we@B`zH%MkYwyAu0(wWuG);HN zPIt&ocgRk6$WC|2zNa0s;%VH07s7u2S`dG3gGKKu^`lpr`q8@)?=b$Owg$CJUd4~v z6ZCrxKWcMOI|D<3qF)5IdL5EZGW6aiqui-oK*q$1XUdhk@HO$bMFjvS>R)V>xDA;4 z*A(8&v4_vOz@;>=zV$BucV-wRc6 z+@w6gR_UM|b!+Z-g7;Y^)Oh3sp8dU0fcv>Y^QXK}-KDL9)dm&k`d(Od9`kV?6AxN@ zK2APn%$*%A2(e;MTYf07(G^X<$Xb#WbX%F>toP+Cet!N<5w|rH*Eh`nLR$*CzJK1L zU(f&5khuQ!{O$JD*M}4{uU}o=*w3sP;jF3?{^o+)`&rr8Sjw7tg&w{a0L^kyWk=b7 z-6$;Dk-}*E)D zdHBhkBb{6xLY>28YK<=XM$6DJwUTH~1jRuZ%vx~BT?Td=*u(u(`i1cr@)RzoJQgO! zkf$=Y43BiU(enGfYG`q6vH$77E*5iOH~XFgd-$9M85s1XurE2}sr+n8C8s$X&OYW0 z_Qr$|xigdf+<|AYryMww{Wk~pInFYqIU2W1In~i@d^GNXP1g$l5%HraQW?-3j$cSj z*+O$TPD)ICn!|BIV#+U?!*Nt%%41rG`(=m!RL9=>G-o3Oo-*_ejU}MANoJ150NB1_ zc}5|=iHCq)h4PF#G~Ov*^sS8MJ@XY!d^=Z=JJx^lZ)7yeIrdA8b}z@68^PsS66Z>c z0R=9{TnR2mVmZbKJjdtpP2JhGW%o9$ylmg0)@D+Ro}bJ?Pck|A!FKEHGF-Qa=D)q- zvRr(hCz`a-U9LVDFeXlyw91W#hR<#31eN{a-2-$i8u|*lw-gsQ<1nMH{(<6R>?G9F zy@iQM4rc3Y+bG?igNx1^2UcMb zSzX_OYvL*MA}*8;a#Pp0;#%ju4E%bW{+6iZslJLA@BpP}sWM8R>Tgl*FM>z?jmoI7 zOkN-@Io^%n)hlJN6X|;}NqsMXM`ff;B7G%DY`kF5Nn4Gx$-$NPXNU#J{E zjGx|b^d$Ok0#Zg{5|8pTgrClP5j=7y9mG*QdavlbSHL3<{ZwBR`NJ#E!FxmF;nLP; z@-py_RQhn4ke8?Ns9vl1nfjJ#JbE1_;$5lnsJkf`4D$Mem8w;RFxC+JZ|m9N?F zwg{1L)CyAZ$VQ!yDE~c(RN{U&Y`(Cwy@&eV&eiW$wW=cNb#NX^6pEF~oLcggYz6bI zsm3}kW)1m=!rnI8Wt9ur??(3@wGNeSs2=nMQ>?1+tYC@%Ksdc}Nz7B063Zx@S(X*c zF8kov^6~0u4%W(1@7U$xoItlf6uCUi$nMV{uZ`xErH--BROk8E6ck!~?@sH`<>BhR z)p^7yNa)+!zp6S*^Y4x0ADp_XFyhtrCVKINiHy!!=dnt{0ssCstF&mWB%HG(;HNl> z6?h~GMoPj~Au-Cr^8ye1V?$-(hy6|b??L=!aLelFZv9+Se}wCIm!v=UgEUWUA#~+q z?VNkO06SB@iadLb=i8alPaI7Px=U|*);-3`u8*;$n`5ESj-V$R3LOsK9(*fMvMapH z3LNQcSXUKY9$pe$ZDoDnn>Te99IZ_sTVm~*|Lw3@ZpT6=E}irr8P8ygFTYu(suHI?^>reOEn z|9-4HxMtV;qBC|~9%WW(i>ok;uMgZWb+{j?66*zzu!CuEdur&rr^k<3g;Wb}OUU^l z?E%|IobF(Ap11FY0(SS~r$xD`{e)?)WBuNty|aQ=N#R(@-u)#7vD-@WVyt}DSi!Q4 z*m#;NmcJ}DmOkFREG2ewnLD;{nHBREddEq!aG7f?b-ZAiSeYr-GNy*o!fZuq?B!v0 zuri3fKJ%A`AHPbhZbaYw=Rj?N4o z7`DO;DPyI+*hQA_>aX}0hW`vrU#Rsw_xS}s9CD4PhRz;;a_EP{NBk^*0oTR?B2~0c z@>#57ox8qza3$_-tO*UX#V6`&(q?a9rPlM^7rDn-+RSIX_UhHPy_W~8^V<3rxBX&B ztY2-DKIzU$<9B!aU?uKv+A}&75#h{3IJ92&hr^zyJiP2vSms#!-lx)L#qvvYV$G#q ztO!lTick+qNUfBm)wIo}e}?2wv4YaqVxGd+WF2@n<_qzSNcppMx=($&Pkp*ieY#J5 zx=;N*>{FKw-Ko}YPTeP6fcIqyev|v+#m=SXx=(b)*=94YYGz;9n$2Qc3;Gt(xUZSL z??B2YJh!{=aDCdUnZ3ugMQlNOK5@&_bXN1YX*z)~R2O}3{v~TU^?233jk<1r8+En4 zjk=Chx{|A7Q|+=#YxGQW9X=?Pp)n6Sb9Ta5Y!mQ=KZ`l#E-t6E z3ga^5ZZ4;LL>RXr_ZT>Z^XXm?CdH7aaygZ`FsX(-jmxW*7&HHz@%3^!)jwgphCH3i zsjdr?ZpeLH-loKuMd;K&gH>tyM|-ChIuP`Dz$xr$2To<94xGjg zIk1=A;lSxE>cBp>#erwA-`aUiiF);|f6*|ltNpG6XS0VKIEUTgz_Zy72hL@i9C(gn z9k7L+L!Ik@=NapO{p=Mxuc?1+7CYs@nd}PWCj~)ul*WV>NlbN;#)L8@raDMtLVrg3 ziBHdb8WTD#G1WO56Z(n7RL5v<*1waun&UKfzr?j1d)bJ@RA+K9X0=!1HjaI)Q)0S@ zb1>NR1K7&Y7}8f2fK6jg)TgQp;X4$7O?aa2lRn07(By=#Ht?*P5iS};&4PitQ zMaTDYrD=SGmylh7efVIzE@!NoZ0K1}{Bm)=wF?vUs)5P9lH4y9eU^l&f67-Q=a&MP z5r#j?4hJz}I~ zpnFGGAB~btIB6T38jfOpve@)gY;PK$z&AOa5XD(wJRx+B)lIn5^ii>w=ET;qloWDz zEK8p7A~&)W(`l1lOFc0xMXJSitnr5)38)-nOxvEo`_ z3PjsUwzF$bcSlz%#yEF(@d44kt{uGtU9Ih%oqc>PQy+UY$0qBpYo*z^>uNT)HaD!> z(9+Oa-*9bXUBf2Y36`>9cR$a=Ef~yw+g58|l5peKODYqEQh9ko$?AlX|HrqHjdx!f z_oRT@{ir!iz85D8`F$vy9>$Kjz_;m|h#9<{raQTeh4fl|22JOQ2xi`>+8jlnws!5b;c*Mttd zww?OWn4orsGAb;ScNRQ7{}S=4XC$}(?LFY>`J71Kc#^zj8OiC3Cdqp;Ngk~)PbM8V zf|pGG9R@F6dC;Cjs!mW@je}Q#GN!iKa{Q4-yTN-(<54(@M{R9A+-JcHz>UJCcDLfu^Hb-Y)%2mt+Pp;u&x^Tm zD*t9p!Sidp%qe&!8jtj<_?h8WX*?RkPs9spJR~V0Z?ne3WkOz9?5Tb%5QvC1Lpkst8J)e(6D)~Z@SPos9CrmuBHeBA z{EIPI4|DUqi9I;4)B@K%uDAh=q4K!1Y#y)FkQH^|yi|9g6{*Ilq%1ac6+e5Ild?uL z5N}qJGu9S2G^Len%Z{+hAp5Ql$ck6&iiwADhj{vn zza_Ae9bct3jWU(EIQN>P$?KM=-JuM%KQDBQR*wsPUtUODbRFm_PD01j&(-hN&g=SHKhgEasHExSY}_jLVR_xt#J*7`Gw!a5<$-7>^-O;c_ZVVN%$L zj30eZxbYRzrNx)V&6*w9#i||H%?cdY!}K#DX)V*|^bb4a$F0EB4yB)k@Mv5{8CrX^ z#(^_fg#*uI^Bg#xy{Q_PT%V6cWqimv+vR23fa#j@oW`YEB&Iy3aj9B~DNku!Dj+fC zA&pCANKAP~<5JIP;n6tHaRYzFzy}Sy*T7u{*3V2N{Z|)xf-gX6G6W06D2sasW3{BaF;i0pEq--k{Hh?sA&9CunR&YdDX6rS%A=^x`- z+<&q3zfAgvGF&nr#*0>wUCLN3*%hMS%eP3Rll0}mooxJPK9JGm=Vu;LynRS4JuhiI zj(D_>aDeQkV&4`TFQex-?GsGlkRAk)c#Rr9uDKk_Ie(VK_>SWkfpa+$$uas}E`0n7 zFPyG{a97_B+QC;_fo8vmTDRZ~zJcD}fpBZ@PWlpz^mOT`4eDY!%mu%i>(;IDoW&Vz zbjTkCstz4gJM&Jx)Ghw_5g#AIPA>gICDX9J?#=1UQ!K}F^lP<5O7!1ziMZ5N*)Cj8 zLs1hWfpMI4ubj*W2kixU6Hc~Y`@;09qUS6+Y)%}(aATy08SXv39}(`3@i4C4;i3m) z3OHLU)}0ffIb7|qG}o_45QEB(HIcb4dPMWD}8GX-cwq* z#8Et|zk0YaEnF&Q#am?X{AfE+`Y2rTpNLnY@$@kVQ(u+Fn`+DG?zZ7A!iMwz+QP7%OwfZcDp6b7%p}ul5feqaO4(u`cW~9IknDj4cnx#L6xYTNJAd z4dorEEsFi!plgK{bFauBOD$R{WA^=maPW>@-STWZe3!*8=Ij|U*CQ(K=~zF<_Lf8f zYdiDaH-1s*1hiF*l|*M1<*#k3dpP{9!6EI13WF!|GgeZ6dLWw7SeD8ogcZTj(d1aTw@hd8?9i>&gEsm|C}Ao z3T3VL46}i!IQLFm-?8gxm=%`zPw>_2VxrovqT~Ih{ZK$q2TR)vM>an;d18RI|j;vD{ z17ewt=~ywE7Mn#o>$qM&-yF>drXjzvrZi$5bR8@Sv1MMICYg$R3~NS*_t&~kErRwpkE?a2Me9;ot}GW( zDmDI*eCr66CB;hRVt1I_FB&hz8I&YT4L&&ND#<^E^|t?qy?23&^1AcJ&)i@bQ4vrF zMKfHC;1!4$a_uk!kAr|9U}|m!1d_p^P5{k#Ni#%EFfpwrX^U;znoC=INo!5$X1noS zP0}{$cK02$-8b1!woBWzWV_w1-F90y+qZeYzw?|koab={2ka*Q_y2NqIM4U|zR$To zw{w2KbBd-%b4JE^Dft!d^ir9>X^N!6omnb#Zt)zyr$jSfUm?^-R`mkZ$NXsK`dM|B zaOS}B1xJ1J&dtc*=%2a%G3@hsXt%71ez%N`>o=&KdH769){mTMuRzG+afSvyns%SpO?NefM3~2VBqb0D zT8`-V#h@1XDAj%HNye{k27B=RCmou7&{NHdN^lQe5xpw#@m%}BGF;VN8apx&8Mp^` zs=TYU4gQ>J`{1EqWcNMphj$F1)X5A2?aG)vtByC3k)1WVqN zQ?MhcQzJWMws={{K4Pn17J4t2E&IE-%C+B)8t;?n*RYRvMlBjr;cGP70tfD)xleun zP;8uTH&Eegj4L0UHLH!@s?x%5IPs!&w z=hu^=ZV~T)_uQ!Qc|SEhIyF5yH9a~tJvuc#`o2$(syE`5Dp=7@@1SuUeN9bf%9P&L zDziR%07j$}GWVn@0O>RwRAk*xW~kxTtoxIU$C>WL=c)1q!k5gO%#^8`7cbAtz5}*{ zR3d#UB7VJ$KW$2%{S&EEbvUh(=OLM;C*zw8t99b!aZS8^3UQuv596RB%V1u*E38`! zPr8gh<#C3`Ojdy>QeSGDZRK$#XR2eEECGrK%)qp4P|7 z6M~HHc{wPLVA91nsbCt3dk&axM!K^wquk2nUMa??t5I$HPUU>6Fx{n^6&So3%boMj5EGw0727A?j zXR@OPoWbrh;92Z81I}dE8gLeyXTYdWWqh4%;vZG81v4wX20WjsYbaPS3-=*|d;wcz zzzf+l1HOv=#yVC$3kJvkmjUOo(*~T+o-yD8Zi6mkuwbX19R~R#w#k66W;YnHo9nNP zoxhkl4e}!PZ*uYgB`BKvw0XghZAt!GZ7B=3B1FCZR5xxVMUWz0p z`z#uBNfq)((EsRMx@VFu)eeEZ9AocwfuTMFxsBZ*@J~6mvqb_|a_nF(fhkS0@&76M z8^ureJlebae+W$XfK2Fe9T%AHX=LNSLtwgxWnwd zeH>@A#gv$Eq`Nd-!L+8pe@Y>IlD}ob-&HX2pHVRJKW4(aO}N8^YfQM(gl{xqYFFtf zJ*W-E9ATw6yf0JVvEt2@`il#Vim5Q>>elDIDV*jDU3cj^NUoiX-6U`$`DnDmr%@^>)y4t$E|SLAOOI$D@OUqN#CJiZ=%UYFzn!ADk^t5=_^blo9%;PZ6h zQ~#rQrBD6Idbi+1PW>;If1JOJ;zK@t!mmvrr}`xxj}P(VKhNiS;cp=yGl$*qDZhQ> zgLDIhjYjaFbc)bFBiC4U^Fi0qY=3rYhZAU!gIV@;5vcV2)sdH=q7T0 zy}&C4ZV1zCwYz>VdwX!zGmVojpB#S%j9p-66SPy@}P<(;kF|*4PRP zapK}?VsXMre@HpCWoK_^N6Vc%usFt!?b|7nJ3~TE(2%I`tg4!SaY`cf4daNQmbar_B(LuUP{|kF*hp(`1UlP7)nl6-#FbZe z>Wt)cKf6}Mjijz~8@4jQ%_rWb2EBbddfM*lY}wYf9Udy8^RBL5EPK$hZAZt>?oNi4 zN6?hywTE_dZ(E2Nx?!k$Y~uv8fH#vN@Xnpx-K2$S3`BRjB(S5aSFAun%C+*mrn&~c z>WIGFNK4g*=IZ8Ku+aivj-;s%N|5V1`?O9hK+@Cc-?9D9uDd3<3j@^udbfqpfB6+H zvbkk9sPI=6R{1K*3*+sjVYnLkty_7Lb*;EWY z*s6aw(zgUTdgsmHNBSSTIR2)Ihu3j~zOLlW!I%zxhsyW{aEw>xm_sz&(Rz(4?+ijO z=pz1C#&@5IcM>PjcZqb8_Yo8CkKj2a3BF9X%*3+;)AyHjGCr4y*9zP!N$@4_9i(F@ z2YBu{yys24H^9RuLd?nd4w-mGsL$3IYb@P+OuPZ`!f|-@CLU!xUb;CZUITb%;>7oR zgn=4s-wcfDw8r86wTTx3??4>hmrOj`=O$kJ_M3QKbg;oV@!e+Py#ZcP93DOc4dtLg zws`fDf_kO$O4k6MY%2L5LIK%kZPVM?AvM znRq9`qx(4VC>_ar!o+(GyavG|j^yn&@!VM3v`Fx9i;MAYHSxUQ$^6mnL&mql#0!Au z5%HneF!Jj$<`lFL*LOT=FsAUzvED!7D)+ z#Ygoh>*W~}ZvZ?G!ia}UCC0lC$7;GK6dt;EjQ3#^?=|pbyV3JOrc3WWs_^J7KTjjJUa`zw@*uJSSl384jmeEs@8=IetrI zu?j=v%@jN|^u<2de*Y}}J(JsZi~Gs}NAV$p0Kuk9a4DdvGtl*fEj#B2$8 z7e+_%{A}gn#q6c4@@KOZ#q*-m-*Oa}MeT3diVLE4tl3sD z;w;XKE-z-o^RS{^U2!^O)y1=;HN}4zwvF6YJSTcb@xKpe!A2{t0T+%_17~oY67c3?mAd!lu*C(q*W;Ik-+#UJ-g_yS ziM?qEYr;iYxLZ5k^OHz^KU?aEx(7Uw%>%8G!GYtEJk7@InR#x)9%VP3wxdqSCQF>R zG($O8J+I4jo^9;BC9Y_CoNF7u;uw&mnA>SS-aSU7X%R>Eo81`A4roFm{Ewe_g zBbI{y9JLg-`=1Z#+~0(%7na_023CmnBI}#%stXY|^1Dc`r@>Esv<7xP&er>)C1END zg#>s=Uo;dh6d{%Mtf;*8-Y8qdZDO7%8!1F7%7caZl@09JM!(Zt*~+lHBjxu%?C90l zk-d!#Qe4>o(Osz=A5f3?k8xhbG2VHOgu?7tzwfp4`PCkcJ+Wvc7d7I7Z4T1-bgswe zcLp=u2m0Bd41ZNQrZi>vfd|HpU&S%ST^2s#`}^}0Z_0=Z7G%6+Tv8ey@csTgTW;gM zhr-E*&t}kI(Az6xXm((BE%h`O@uwI@Gk9% zdRp=Nzq6J4I^~dl8K-lH?$+FqW06~xt0WhFD-Ap+t`lcyeQ50J!MzR-uZ$rm9~GrX zt%uGI*fduOuLtaLNj~jTm~q-t`(LB4n+6Q2sni$8dKtRorJAo?Yqdu_--tZu4u&o z8@PN~U>6pL#ZY33i|l4$`COD1^`MPYq9X%cu`;KPq}I7co*DSbKv2sMswp{OmsgIZ zo@9MpHVxGOjOf_`c69%MZ@@C(yrc~fTdWOAkf(=EQm$Olyn*Anddexhy&McXVUEnK z%Ng+uu%bD`wlC{)$Cq_$K(zC4TEJO@wDP;P8L#T;!RGH_ilsbZ>3+xYcD@l7TU zwLBgk$K>ioEze~0qQ)_Y=Vjj&88=edCfm+xURLpVCT=jL#&Po`<51g&#(~I)Y%=|p z#vG+<#X&{ZeR@2;tXQ@VKt5@6tH&WcsdJre-}3>My>mz7AK`M=PdH z_8#LIi)+&LLSu?oYN+?;h=aynuQVTplZ->{yEpJSCf9e>>&TO2UYs_k-RW?qI8$|F zQ<{5`j_$V;=^JV}Xzne!YjAucWqd|YC=Y61KY+p3E7_x0txu{K**|Cu_a^+H+RjQ| z=+inDE(&+#e$~g$EzsKUxQ+eHUGkE9-DGQyW>I)b2Q4*O?A7l8n%t-|@k92MZ!4Ha z6Mh0r_Z!_=m{D%!@=7VjtR~4fD45Qt_XpkSa*1eko8Yen&eI{r@pH@r%9g1<*TF^vuMWpadA2IJKecV@@ZU7{abg_ zO!9OSp3eEy7j-w?B%i_M^xV_k43m5&myeZqrb(V*!m~J^-V1a$%Oua_a(b5NF4H8> z;&QsD>MqM9&o;@kP4d}X-YidNvrY0jTu%2}-OVw{=W@A6iebNLY#%q5(|uBRZj(I6 zbbgLWK99@k9YJ^VO!E0$-YUgxzDb_T<#eytU9L%f6MGBS2RXWDU}bjp_X0aP_OR~? zOdPUD{h9$|t$72sv9JN#S*rm%*g6AFVM`1+l}$HbC;J^`L^vDz|62y^V&663Y3!Q@ zoX$RPz|+|Q1D?UU40tAMGT;nWZosqH0t3!u@1@GzQT?Dl8gMpy*??!WV+K5jg$;Nv z+ibvYcD(`Tu;~UokNr4BO@BW7wgKm|XAJlzR-$0CkM#&l?QcQ*rzmpl$jpA_7>l3m zQ_mUjBKD#IUv01-wy?$QfI(iwwi<9TYcSv?Y>fdgWw{2tj9CqMIeW*h=5Gc2I|E+H zu-snEVMlNF83Qh1{RUjh?lRyqR%gK1uxku>70WT;)$Bc6EIHKY8uoJoUd#T*fXmr8 z4ft9%Xu$dGqXv8(>oDN!*?I%Mfqfm<58b|B#m|a=PY6uUKr4Fa9s{-3WqZVre~HF+BtXQdZ6@lIrj7xnC|ITXqBuL`6JFOtA`Z=)3L;~ z_k&fz{{ld#NIB_3Q58%4Enw;b5`O`hx-2{%Kj|<@H_Q4V_L|7=0|+GhQS1 z{a9dnhLSz-YXZ|Vlk9vZ;@!1PQcd*Dq1)AdC5zgG!N&oHw0 zwFrDQ$64%WxSpvjI?iUV3QW(WOzUj+8G-XTp2PMC?BRGWyH#L%#$;OE>_&q;hs_k2 zo*|jmd29rgMd`J2JfFQJa3ROJ>PK@&cx zV2ZE9gliN`@r}JJ==p&PO3cyuWA94TK6+b9LOw9Hqw86HEoj;s-Ank%v2ZD;>y>!a z@5!hBN?d&pRnt*jBOSEKH)!1{>M?DXiwKSp+`*jq&A`{}WKm(Y1%(EEYw z^Nih0__)Xy`X8@{A<^zQpZL};VP}jFQ;z!t_6m$jUqw88v~u|!0#^$B5rO>zw+LJz zaI3&I0=EfVC-4@5(fN4%?E+T`j7H|^uNSyeU=)t??-UpckR0D7@QnhabMW&w2)tF` zjRM~-aFf8@0@n+?P2dKBw+q}T@D71D3mg)-S>SsFhGH?#Uyr~6fqMmBC-6>zHGy{t zTrDu{^m%z|1s)Li7BteN?ZkyeX>FOmqM@Y;CZ*Vo1NNkSJv+KuKAzDFkb#&c@E((2niB(qh^Wb;46%A==v)FOkZaT`XDk>Q={w zDE-)=eS2qjWm{j{hkLqW`_ULVTkdS%v|SqeHuP?b8xcrNo!dK@rep*?3E_%mt;#al*0MCJ6meY+S@|SVQxCjGqfd^3q`EwuX=ljKaRL5xU;Wg z$GzJxJ+U!7?uoFVhIOBB=bd+U_KY=rELm>VCaWYC8rQy?mx3hH+O4OvTiU~MnFdqn zgb9r`eS#8>5&YZlj8_G*PLW91*x44h?nJ93NLNS`BdEh8 zD};S}*NT=FsAz~ibz6Gx?dod}ma`SyBya_7jRLc4wqgrxuvfJ8Y-`zdXJ<#_SkpgB5&!|FK=BO>fMIzYwm1kI^4FSr?aJ9zrI>R zbcG86nVJd{L`XZ(Uupe@?)I(@K_J^vd8Ps9VUrW1w z2hdL?3Iue^Yw5uy9VZmYsJ59cCNp1Qolm!!s$I=HDng;S_WH2O*Xsl|D-xttCU_HI z|0LwS6H6C}+iY@V{RRsz?X6^tR*#Sg8Rb|>Q*U1q@-{_pqGN6p+XB!+O{#a}yLv(` zut?sr^Da=^wsjW9?cI0PQb(+73)l7SZ0g$6$@FJQV^vc_{f4HhmgefZs`^dMB6!25 zx)$FiO{;2bsj982!}wnK0Ghvk!-n``I$4qUeVV_ep-GL)AE?-{ zp{lkiQGv=6E+n=}Z<+Eag{OCZ!==!`=7S%EjmO9bNW(GV^g zBu+X)5+@PE8>2Bcye;algY*_y*ue_%LMZg?pmgf1t!fF>H#N63HCOm+TB;jXHZ}TJ zhI)4N?P%Z8-MjKq^|1GKafnaZ^f56ShapGbt%v!M{>Ltkcbj-;5dM~sktcb#nRriP z{HQz*??w}k_WX^<%QNxPF>q8ACqBE0w+g)6IJ}=B97*wUI}$elyW{X)Ht}d&H#-iG z#?#gK_5owqCFW$k95V6F0LRN8t!Jvn_ZDz#EVi+F{-vqBHvrSvk#snXyIV~0)q*!j z2?!_icb$p%HUt=Ei8;xeZ{pE>RJ{7Ln0P_((qpk`@-4Yo4 z)+W(z`@l;ke`k{9*)x+%w*kCl(tRRH-Wy5sa3%Lv*0Du|9+KZd?k4J-jGDQ zb%U2ox-TRd-v#iJ=`T0Tj$ePIuYfKRa}n_9zUIa6N&M{M_YHBsqP0E99R`o)l%>1m zekB6F2wuGM(z@>Q9E#%tc#&z0VTz3P<45V@l3|a7hbjM<3+3tIUWCwnk$6u0cA9t* z@F?7iAEhICA2#s@6dpt|-nAy)5rrq~gyLUd;teW1y6ww!>A|6vd;=Uy#`7rf1o6AzED7;lYPKGu z$d~c`*u=Z2#7EbI}D7@lvc*hmql5uz^72eWu zcxM#evT=A(g|~bh-iX3mF%Iv7!dp2GkD;+-|D*nD$1h$zXDGbVad;kuS2hl>MB!aC z4$rIb=-Nq?zXpZ3dK_M>!do*AFQo9+j>C&6yz+5)M-<+*YNLK}Y4jeuv=Db*$P%u#v&go~_@9=yWg_RSsn;DrQaHZ*FL z1n?zqW$BvL9>vAh_*v`ml<;uI5zCP;jOcqTe`DmJ&+=x9 z#zt0XC*~hKHL}NErDSo_C5{Y<+nVRa?DbU_=@izc4J58^ir?8OiMdP zYbA{AiR6s*u;o3&tvHKWQ~e`*pW@}VdMrn8)KZRgjvU824Hd(-6YR(}TAr5nX@}S^ z`K4jYptmUFoNMqQpY;t&+ZNUHwRj|L(9`;*hy^=0ryi*saSU3Hy?jdU_RRL?qOA9z ztX_BI5G$HCoHm$t%o|R_T1OWD$%WXRdzfN-D_W-6PU!jcw6dZD(WeGH!7|P3*29hu zL~@QtC=WBw8&k0C&BfX;w_xQGr~B-oLpf*r*>cM;sX@+O=BBXQb?^ zVfHCjFi*35$}aeGM!@#mt);$V)v)h$jOiLKS+M`qoaz^u*X=F;-rY+yI^)H4uEFPW zmM@6RXID{;u%fRIKQsEC=#Qz@&kUpm^Regoic$-2^-qk_#X@UuEGwWRqq{gXTeE6` zz0=TxY<~9mYkMEjj|y8CrhLxX@6o(VXP^5)#DTS(?D(ZDofcgXxOjSQVd+Q!E6&VE zpV;X3mL47`9?7Xb{P5Ky=T7Bd=Wyz&b81S%x%mr&>-~@CeC7~anm&AY_$uqt@O15Z zfA-@0{4?u66#Unme;xR&Z^n66^uyuof?NEqn)$)k-DzEEHOG8x_=Q{9v8R0Bd(#rA zF28s>6es^wnh>u2Gjt6sV%DGcSo~jz&>g@Y^%h&sQ9c&6T0F;l?4FSb6MaPA&HjB^ zTSV8==;>_VwPMHADkD>?j7+UEGPTOc)G8w%^eQ9DUAdjl%Otz50gXXON8dAljtzTh z+(6n_(>HLkd7<;9`x*|e#NNA5Mnpbd@UhqT*yhi^tWb;CP+FzY@jKSB5VFVqxq|6y zz=*BvrzA)Gy0e<(HZG^K=+0)6+u8S&_{o0slmT1WaRY{ZngQEcs)EU0@n7W!3lg+o z#OAyKyG;98rkeJ%bh6hGADu#NLH1xT2ux+nv|8EI0#li2KT4YaCO-9@Osk#Sk>HR! zvcDlaFzE>Qm~e}N$-bw-gncHwT)`AystNyGCI+A6!wRPOPb!$?kC`w`M`Din9WkWa z8`UeA&ZlxqM|gn*@CnnHp>%|m?DG8_vmtb00CGL~9^Ed4tj zV>(t0FjKw3d{D<30%M?u%Q2wM<@jFb7z5WF(?IH^?J0EaU8v~NzHpsT<=)b@y^ZW7 zT6VSdbhT~i?v#r4I&)j!PG}}WZ(Jzr>!IBtd8=*fFbGITH`KPfdq-PGi>~z?Qz{?R z8#k$p$KMbQD!jDQnVue3e#i1E zrMO41yLv@HOBeRh>$(dY3o1(CcXoxbJ0NyvgTixIuMOkrI>DGLU1@u~vs4DxWhRa4 z-j1E5(!8Tb)(2P=ZY&+NC{;an%4?;{|(5k9A2)%qx>g|Z<)fQ{3PPtpzzQ%F`jvh zy%xN`gU#QNNZq9O0h?Po!P)!Fu|!F?Nin#~Wk6 zrgT-(W9&~*0hKZKY3KnLhd!yX{KHzdmZkZs{TtY0^GC3t!*F2n0_{HkT8!mAclc2s zMr{k(<6~jpIQ(&6O4PGDHT>M(Z$P>RqldTUuC7}i{;Kbv&a-8=McHQpSXX>iuuYqv zbL@ab_W*gWd9#-t3t(LEnqZ*tb@%#qiLS1D-R&v;{=E{v?sh%Ij#&!Y5Kmf;r}Pn$ z6cVx*q~+8+WC^pu0LFW-!AP&Cq`wykBif}H&wlv;jpFc%Jd;f_+z%02+I{s9<_?`ww7>M|T$X zV|fUl#?J0mFpY&ZD%gUzn-O3-o#LReEqc$Ej>dYHNC2O(I(9=imNew~z_|#p;svXa ze7ukqk&pL`63DG7V$6bGzOHc00v}tV0q{MJQ3tsfJADLmbM&N!74)~OxZmdD^Vxq3 zH~1qH-o~oB`sS(@eUI~m#<#0K$WK>Otz7Y!=2#zpzrQoh-+S~Ou}tY~)P=~k;->_& zRsbm@xjg=`iPu3q^hfDr9Om!1AU;0geV^6iM0EF!8PdFQyP`*RvqlWIseE;G=(FRMnB^>BBK)=Qvm{b1mqux7gUuF5uJnQ3@$Jo&Erz)pMp9=) z1DVr9&_0un|YfYX0qnXv#!2x_{u{<_n(F#3f!Jt3l zemTenkF4{gru?YTQ{^uS7PMTe_OXxY6R$b{y z3x@m^?!!AhuGe->-&N!a?9ydH%~8$vP#t|GR_|0KDobc+I!aPL+^~BNa-D+QTdYTR zJN-G;-Xd2xr+Qj&>G@g6|A22X@?YV1;48Dxnl_(uzc7lDUHgMmPy5`_?7TMr>+XjK zPWdv24~0{TXAVzWUzwK~r24Nu)bC3jw&WG@UXy}dr6@0<)3daZOY(DZC{>fY{p`g) zTd8@B_Z|!SpMG@h2KxS7y_qeyN9_e$HEUkEc7lI({`Nd8EUUYw{+bQbMzTG{!B)TX zc6Mw4nrb7buH|WVqBDczdzs3W2>u7Dd$L=?8_Nst82ro z^enHI=S|3#dt&F^)fSpyN_VyO^-b^;eNmZ7oYdFTwjC=r^h`9t-fa^t6<_P8rLV2` z?xeE0lYa}hb@sNjZ)wfe@ol?_ch{A(&!>dZ^Kn!eINUB!lqby#f&D-I-0q@@Y!d)vBKc800JJzq+NazOo9ko2xcd)?>Y(y2>V?%1w23x3p;0 z8!BpB0{mPhFPOG#YOZfYiNT~Osy8%OHEI?9s+LU^jg$!rti)mrW0|CohQ{ifp_kiI z+ES)SHer>cTCJt2ww}(^s~f|QnEKp~sZPvf_Vjutbzjgwx|G}Us~dkzJSn(nMj=Ub}wB72b0wvQb!7$cuhBt6ig&f9+@Hd z&+gvwx4E+RRnTnArOsv>3!||I`cN2i7WTjK0YtIs4p}tFtz1qmq&tue zavPUZt?Ld#gWS&L5hU%ils&0S=dLxfTywV8E`uLx&b@cCk!}^{WIdHAgV(edpRdC)fwp({guE} zN2FKutiTbD?d)NJsSYx&4n}r=(s4Z<1(Tl5Mg^0c^k$?ZxvED*@_CA!FxmG>NBoNt zz$f|76io8JGvRM5nD}2(F!7I=aKD0ye}{sJ?=#`0CajKC5nstZAFJvBpY(x9-^rD) zw*%?zoB+0Zgg#H6z88vXv2LqO;m1i{EcgXtz1l_kdb=)U;sMBA%k=WNU?@g&v=slh z$j9x0+LO{bL%v6>yN-0W1Ct)oF7m;Pz$e}T@;$m96zLn$u!RekKYccno)ReBzmFna*FnpEw4lv!@rIWmS5TNpC{rDe95`4+K*~DwbGwMhjUb%^P0X&*tkxs@( z&s!y!WkVok#FfY2G4b3GxagrGoQwmHJVSi>7#psYBt>TCZ3nM83Es=#1(M*o@Oqj| zx;KN@5GOtwh(eXc+zIfg4rweM>bJaJ@VH{n;HQqk58@ez$1GnR8(Imh9>rtl~onXWm$HxwS4Fd^?9g@-Cn$h)ZU(iNV0uEU8!{1|fSWIr{}b^HRn z8meI7B#(Rqhh%tZcKo>x{l3?=y^9pCFy9f=xk@nCvG!UyH*)#8jth7{gL6<@QY#n1 zpz*>G%X@F}G;P)T)pcbfPAzbC$Umox6~66%Fz1B>*Tq_~)eY?G-}~)3zi6d%u5P2h?fmc0?xo{`{n=eC$6K=h zp6cA9aKG<$XgJNUO&Q6)+M?a#|NG#foSA*z+`RCB??28rwKauiS7(Ko=T+v-owm_d z^zM0y@w_S*h0rTQ2 ze?mj7&{>zZ!G%%of5s@c*Uk352kUBey!toibsJ7P?cz`oth%p`KKRHz3*RfYo-Yh^ zms~t;39{ncXa)Y}MEmh~PV_APW<@PstT-cDfxpwE{rKyOTDG#{RLphEt#Q|-YcB1! z;L7mqkqix^)EF->T(rsmukPm_;r7UR*_y;duz7X`W+0`;+;96ZeqNjwEzGO+yR@IV zEt;?u$4Iv&FcX|PbfE}$ai{|Mw47fCO*lCh@Snp=s+ZJk)zZS*1D_36FFbTAJAb{u zG3Vw(U-UVKX*LVx546DwmKFbcm=(P{T$tbNzcpC6Xx7GVt#F{*|FpYX+t`{vaC>m8 zKQpIWJE|NH-5N1(3vThBa}V#QQTqp!a%2p-0M<}qM-&u8trG<^ol!EDiKb@NsiX}=xCd<5*p(*oA6L+%Z& zG&{k%Hu|0J1FdW@a*Adw{$-Tn&Q$XI{>&-p_l7BDyeVb8DP_DVWxOe6JUQj@fz2lH z8*)263_d_d@9dYKdC>Qv#;a${Ey2;mY=iYUFjNGCzqepbSJ(`^w&~7 zIyx`8S&KjK-qs#HdH%PV=V7;;rNF#S4WFo(NSW07d6vhwXVUef#zo`U=GhpYY30vL z^zkGd&7J(Eg6XUJTfo$2y0b8&+{)!tR^4Il!f?Kg%b%5EeAO7`b}kn7wjtlJJI6a0b*oH6DBSH=c zY+?Hh*vhsTu#IU3Y-iURu!GGt;1u?I8^x?U8#MIxE12eXx)f}|*K)l9&tj_$IFrpc z;4Ee_;B14U2%zjbGslH~x2>4NfsTi}cXXsvm=^J*I zHJ#lFOve&`7?`*^Kb-}DoeHKkFy*&3onHh@?JM~-ze4vUiT{L%DQ^=03Ye||i66rO zrA>X9=B_>}F!foQyCSXXi=K9*@s zW#z&{9Y5@WWqNonC6NWoA7KC{!bY>eB%G33BP8-&ztZu6TaVs zx0rB^39mHa1tyGXnwX0>_eJf7t!3E=`D++^n|v%%_YV2xSOc8=wHPNOAB{2(zN=Dy zrqFrIg#42fUM=R#5dJj^zgEnNRf##S>%<(FJP+xW5D%Ezn|u#^m&Vuz^6|w;?N0f) zoqWj2VQX35|EvMMZ<9}bntUD)eCos23cc@IeR`iIxkvB{gGTj7)NzD=_BRI7TD#^fB~G&Nc-kHt;}0^h*i)f(~_nZ9%HI2Du@@Y^ho$&=~M67k7&-vG~( z1n(kvG7dGq#Q-u76#hr>D(OHtDKqoDm}sn(B>0JVhry$FGwBlXeh41D+ew#*myuvj z*_^*t@RG^j*Anp3kOA2il&6c}okRsfU5nd>QC()>NA{kmvY0!8K)OEg3d!q)c+^km zdqm~E0Uq@i;!!%1_tz%g1%*d#E_t6f@tl}+mGKcr@;+wbdB8)IJY98;I%wk2o-~wi z${*b$WPE-TuN*uN!iblOpXAZCs+M;%cqau9RT<+In0QX{4MOo@7%U;rt?)2iosd_g z@TlA}f97<{6&|vhkQY#RI84aftni?Mmyj1!c-aaMpB%A!3l3Qryw&oe0G5Z8SLzqi zJ%_~pM1>Si^2i4-B*VXo&VtXun3FvHwTxRa@X7Ye&9#?bQ=attCf!shWv+cCzFIF1 z9nf+ExU9mz_xEF!?h?!Z=LF`hw_(NNJN((6Om0cX3Nb4VOT$ce=Dzn}W7v`Vr0@6V zEqVHS<8P1VYuSrg!5;tqh79-q{#W|9Xj-ea4>R|$fpV_T3}$Vg#R~EU7+tDgf&}C#?5g4Q|P;jTHh-^W+it z+>z|ORIT2hhcouLv-Umjb758Gc7J2=7WevAD^@+XMY%QCh+T7It?hERH&~JT_HZ_i zi`@3M%$m%4cQ89|i8~s+AxN{ih5KIc%^qfjKfHHd@GI`@{nx<)Y+kS$$HT1@lGU{z z>om`5qqr?RZlgtEXehHLke`b+ptEy+9?aOVEq6||uq%5}w|{l8Bd4`BH<+E{X>-FC zGQ-WfviUkJZ=)oYt$GcGPJ7yjGt&C2QCUM5VgH%!sr287wz33U-PV1UCH83Ql4()r zlADLKMj}C~wY8$w9z0b$;=HA-4(8@Oe?>u$I}%JuuNZON!j@Q~EZ?>9A(Z(>tqwKK zK9Lq&QnTTX8?{{6iRJ_&hq~OZM>5=zQ_lT4u={-Y;Um7nVP_ZBqNkd{CUN2VF1NF7 zLA7^n8sq~H(2Cey?$;j3;l6V}JC+%I@f2AJ7Q%uq8$Ez5Hm7f$r{%z|FMU1B%LrOF zdfff}8OYh${#n8IP$AB~5{*`bNiaTy|ll-?8Xf_i}5;{Aa^#*|ey){LHESJ_ld_e82lMVaHNiG(Avq+O7TjXvXc- zPhIO>HJQPP`+>us_SvJJlE_{sv^`3&;!RF@$!VFMv~8vJZ)Rcs{=GsuQ_qT0hjlAK z8*c?~$${M-EmxdbG6byw^og{Z`QfyY0Q4)CW96WO(5GM?S8ECMDL(D{?Rgt=BvV5C zxJh0ZnvU}p1gF=eZ^#YL7zq?K`ESel{NcawrA9s1q=rAU_wyo-3y9-s-@l!=2QG*> z|O)9l6%ww65x0^a@YLX>V@i)Dc)yT5v3L za^Z!!_18j=#1gf@HkTC!^0Mm!{^Fp|J#F(W?dG7j^m(kT|FPX{MRxSD;N!lm^AGQ~ zEXf#V`48V?S(ZLr99)s_cRO!AcYFUS?=^$FuMb{$$-T~!|Lf5UFX`G4G9}C-G}d|i zEB#BCdi*=Kg}S;sdzN`tuPC|3bDM8xS9gbJ?V39nmNIB>hq3{EYmx;{sJjb;AXpCy zU+%r0<+^A~Pg~D!yxQaA^3JyQ&KtMy*xu<`zQb^Tol;nsQdpQ$SeQ~+m{M5yz!ets zH{N6|A1|Hn#}o?YpeHlmug68-Zqm^lTt(J>2W$sn4~XL;{F2pUP~)L*y2-{v-y+h{ zx7@_^A#@!E%C~eM!9h%i;UP;G){B1iJKz0Y#WcTukX#w{cri^AbGvxFe;z%8KV4y5 zYTeT~0o6TP5XDZm4KLOGpfQYCy`eWuww})Lc$D?!fz9qYpTN? zFj@y)IvYl1{=tA#*;xa2vacF&T1AqNG(CmoC*81O81 z%78Nsd$?Oz7W=3{p3P{DC+RF0F@!WBeKH5bA>{)CWn&p-12|99!9K z0#hF&``ix+Onr)U9B9m!&Zj;^Iu3tC`3X~>Asq+W*Pbx-5z=vZMPTX^nN}xzPGIT- zna~mWxWLrrnN}CK!uD4290&YJMoP54O@e$<5bm~giVH<@sy2`^VL z|h%gfM*4Nxjp%~hi<_E@^55}>czE!v2P3i429ny zbPphZjWGBKVlJREy65NjVCVXpB_=ki& zE#jm0CLIW>AJVDlBOl=ya%QeFp+f<@OoW$^k8+g@>=l@jrt^3>SCf*H|J!xD*Ek|+603@0`vJ()h3>!=87dn~+%BiS zWAoHBAvrc#ZJOdvICo7-5}o0`#53-usdII1UC|DZ8y1WO#nlc-tOGFqP6vOs>GNyK zSc169u1zRelTh;i#ALjws!hbUE8WW!F4Su@w9fNOkR-U zdNu{iYgq;-x{j~dq*{JrR^U;_+B(~|bTP|P9Qw;vl&oP6KNdIY3@@)MS;|t<(=4+r znbvIUT#MV1W0_}JXroCk3{EmjDh@L7giFrd3?`9N1f8B01Inp#s_1$X?fxA2nkJevRO%^W!6!$ffr= zdQGFcBc2n#wI*H$=7Eb4PCQCS@@SoBH9nfp#w#G_p=-x@f5frMYXFbROYu=$GQJ;~ zc!NrOs@}jiO}vxfQTZr7>aH@rM@_sl3Xkq+k{2@Zq6&}dL-KAm@kSILl~3~Mey5iA zg2JQsf5|H_@$mT?D+ih|AumJWji;~RQF!C&E0icas>ek6^C~>j0Z7DaPRNa1CV!;2`q+2inzC_MW9l;t2*0qVEX9S84IbYTc552@@bZ!HqLpae)B`3R=& z#ob~gkXZkrds|3fYT&YK4Xi0IS%oDD;4Z(`KrU5;qW@69JkWn&N0wto6mz|w3wSjD zQfLK~K+~W#SBn-y#~=+l23OZtxyuoH_I~z=(~T-hw+(wV#&;%XgAbfqh;vHa*`>Oz zJ}W97Ub)Y*GGlmN%?ZrP&xcL{%l{kqt$lO&Jb2nZ>~fBkifJ}IBao+2dM^hb#_Gje zgDsqv+kfaghi;os$4mFy_F0xfe*p8r&ZRlSvq*mcbKvv&xsko3 zH{i&hK9V0~oWzB~f`8*)@QCLcZw|Z4 z9kRJR*wNfm;t%Qm1Mo9l6!LONo!{oIfj@s3O4nZ7b72s(cbi)k)Gp`Z6lFKS<&+7T_dZjozUj6K1%BZJb=Fi(W*y>eC+&c zt!Mt3`#*V#6)nJ=w)F`1uo=tIr&tJgv_48OZb5!_~QG56}^53&`X zKpD@DQoYdJeaTSv`s~`wFe{oBWyLe2jSJ763KT2~Hu>+!DL%L;ct=hUe{ah&uV?X(vkho4_`KIi@ zKRN>Z9yFyPFr^_dr6Dk-Auy#O@PTUx(EWH~`T_L)B^`~COnff>()nOa8}RwyiRlLD z@f6C;z^6G9!+ztHS$$SbUtXEMFDIjK@I{>Go3P%(rE~f;_GGr_PcBb-T=ZQc-7*|Z zMt4DNJDSI$Ie1y;GVYkKd~eXaIjzGy<}7^Pmdd0%eVt~B=qsM)b*b)jr?1m25q-6g zoZ3rw`Z~=L(H9fRsekECU#D3jT8WP2)NgdBuhT3MeWjC}%BZ^(zK*j*q}5Mysz=?W zvL6FWNAudWAG>rml;?Q^wy|RdY&Y!>?_jqW$$jLyMv zhQOH5fN2&4HLdPMNGZ)cI`3F)Y4+OG(s=Xhy1LGNA||I$BB=gU23|^@b2e{!`o!y)q>X%hgWXmodl1{ES)Ux zd?ZTgO7}K+Qbu9&IMc*?2fRPhgpF`A4m=Kx@nMoAAW4eM%v**@lVo^(;58=^-)l+6 zNAs1nNyK+Mc$G=;XudLDIb5h9G=0py16~R0Fb^S6$>Q~lM>P8-e(JoE8^LOP6Z@l@tfWkx36XtKT!oy*VXP(arLb#MVig5Cf>WSK0y2lYvp#(@C`3Me4 z-Vd|KozLnN(^;3D&stTsdJWBHB{QFOf+|*-&&omzUKl!f()GEkv}|p>=inl&mJ7ySsdFR^r2nXy3X!Oxwq6+aj(9& z_+D1hV0`^$XREsYvdqK#G?#$(pPEXT zno5|ON|>5Tn3_uX;HMHglb%VqbmabNJh=>(h80=6Zl1)xh!{|cxtn>M$y(7}ewE=^ z#Ib`B`Qm~Q8YBNl1=AbzKLAt7bZ22kxs}T)m%6i>W!X^i?l1Gcg| z4A{os=jGWn#vC03INQnS{aiW=zD_?U0elO_$iI&GC`u{=jS+F-S$>Utj8)P*G4bd-mG-jRKt6c%ZA`pY^1-8WS)ue-LO$LLDSj(HfH+1Z9ODCm zW4yR?OdkZ39?OLBfIj*bTgFXYOi&+EjBy}RR$dIXVURJl{$eLK65ie`$0w6J1(qSb z%G#Eb8Gekr2c233y>yot&gjAIe}+xp5*S5He0{>wQpQ)usOanK>Dschud}zXusKlI zQr%Rs>zca4rox7*!iwu^%gPEjUsqdNTG)i6>Z+=$(!%Nw7h+%ArkmFkezd8%#$QvZ z!?l2c+QRy#25gpFSmmoIFKn#ZSYFuBSk+WsSXJSx-c^Pb`(kYsw+krpWST!&y596x zKDC1AM$2K~^`!VFw$@(*oZTO}!s7FfHSUnRT zK-ONp}O_9&KY zkCt9#!=6&Jl|7}b(aeAkdrz^!{!^)3r?Ud9Z?R+3Yh3m+e|FwNXc>Mi=M>iQ+SKr{ z`-%SfL3{q|?(g@rV~4n&E#tdad2?wDL5>lSeyQy$+fvK<6ztyg3UdV9Zky)0{#e9Y zZrwto3S->zp=^z`XYE)mDJ@VQ+w002O+miO#dwBYt`HSrp7PVNbWpeN&v=Ako!qIR z3At^%+&doI##i`jTB;jXHZ}TJhI)4N?P%Z8-MdoQz;UzGm7e9*@;nS|T<+9P{k37j z0|0lmg(jHNU2T1R6Fh~cEhn5a!zAbg6YSkK(Ngh=>XyE?-n)}Zirf0FZ0p2AisPZwH3`;ePi9qhNd0< zH5Ds$=A~U!@7Q$}8!FaSHBtvpnn+hdeQ#U$%Fb{ImXe<3mDL;kwVNudTACVKDjFIP zAg=)&Rx~%aY}{0}sj9N&!;RI=AZ?Og{p(2PudS}y& zhN{NuhCr1bK-($R)mK(Qc5~H+%KF9@e_dr0Q01n&x?5Vb>J1gOEdhS6k{7(CHZ|8b zqQqcQ6xAD=s~R=D*|uz|XrxR~U}deE$q#JfCgYtsS$)S#b@;Z^vm`6o5rtH1s?BM4 zI-DuaRDC@pn%j{s9|!baba|abJs;{jD7`z4r@MDrzD$5e;}YLiFuiH~1u&IGcNS)p zTe+O_r#q`jZsT&wgYInXlS=$FF41SeR@P*|HZ~$p<^FHp`>uj%T;e$cPGL_Na4KJu zg`%V~(6|KIClaPS)3^lfyF!@qNaGT_;7dp225l0+CtR;!8fU05;pHZbp@W!xo#s6PFh;W(q zl{z+w+g36RRjsPGUGZ3fA?Eje*nsWFHAeRcb=)8fES>y*zXJg(kH!#}NfLa?qia~@ zy#cI#Z%f{g;KAcA8z)H_1;}GchvJit^m{U7W)Uc5i(PGWe4BERJ!jjJb>89f8n1Za{jt>i7EqfJcN;TvT5A?!HBY!Q<`(coa_OQaX}H z_eM3olK^r&0N>X!UV({sM&XS&ZV**?C{n`sMid_9Q|8Y+Zg2rS8UvC})}MLYU}t#(KMUU63v5iC({<6ssj~k9xw{1%Cgh-H#2h zMcyR~&ga5<*6Z$vY;H7ih!tf=bxU7QI2SgQrLdtq*s2`&j~#zUImXmPQ4U|#dra5LbuRnr4SvVsH8~%$ z{(kb>?6z8ZIp|7W*9j@8ter#N)sbPnxu&0R>;J%RUUOhm4^G&LL|hc)Ck z)YNcD5(7L_!y!VoV`?~LYB*#$c6Zwj+ZEhXdwM!*qwoJyV$G&M5HbGD4%qrSZ6ot6$4> z#{4(riyDGxtmQ`vrnlvDz*IWjS(s67<#LY{<4xBnw{ba@N_RGs+|K2cQ{7VYDkF{6+$k`XiR=u`c6^-(myX728YO^F*l)rsO&G&2F-LsLn{-l# z#EO@A`Zlt{e$7KZ?AGY}j>dH8MV$PL6b|_x$)|3Eh^%h?TZztZ5b_f8@v=|l$Ck_b z7!L-1IL13amt&%pW4zmQoFOpH*G*cNM8DX3JKK8NgDu@V+S|J6*0FtiXScxwjaz`l z6?BDhx7oI%qqC()*u&|DWIcxSV`C_>IC^()>ubaC&}0-y5-#s)7%q@wK6-I_#de^4 zcTc%~=eP@W@-lDh+?HrL%t>gAtV$Hu2c<_cPV>hGcd(#stWU%O6F0l0T+-xMJQ$=r zlHOnS5q1oh7~KO>@FPdpp_dMXqwjihJ@~1-KHx$U2q$^B0IR$~U|Q2zI?1E^iOPEt zpjndOOWrGjCq);)lQIgE$KN*beg|HPER-T!tQ_Nzy^BGP209Rq@IyEG*KaAIPOI4N+{CVj?T&-p5jb=*7dkG}qqJ+8XJBqo z%K2NW(*_2x!&ciszt8sOrU1Jt4R$-JU(VoGFs$eg!;UZOwlAa;Qx}+1@^7Q|6Vj@u zIxxHB7o%IXjD0kAv#$E_M_j?|MG?2ZpNG-TXTgGji2IeuRxNX1w#SFP_8gzt-%RMn znyvl}x2=tsx~0vvHLtX0?#uO*R}-&&V1Fa=au*TrnE^eHX~C_2<~ip+(n>NyI7VvV z!HVZr|3>#~K(qIGSI@||eVILGJ!(0^3bONyH3wfGER|g)?20^GPv*g$rLgXC>?(Fu z?8*!G@5&oUgKg1MVavU3II6feZ+HK_Pf?h#G)jd9kzW3Ct!wmdEeEBl@TUc=`L-a9 z?%l1;+m~IykQ3Xn40lE7Uq+#?OBX=`_lKdfYK&|Rq+x}+Y)!U=_08o0S|x6IV0n!- zoD=je&pn@^c}ouZ+~=}ALBHc_uX~L(GCzX#+h$_KkanQku9e*L0F8U)`}{Y%{~~N# zX^-Xx+$H}onxXxAbXVB=$&cTjn?G+ugTE~J6x!r$B&f07G;UZHY#W%>NQlj9ZyFbL9SfZ6{j?Y;2l?pvyLOIE)`bLEBADY4JT3&Q($GR`FXBC@J~wsO8WZT&L{3 zMf*#i_1vPs^75BPU(BVe(ZOzrUZ?yqx~1fO=#YAZ%eAAev; zkmWt?9)5uKY_#mRa2>W(mLIhgShbr%v#a%$2vb;gw4B!`@fhEmu^1!R*hP`YGw=Y# z_8R|-^&7Q4qqYt8H@!P*!QY>wE}P@@_l%*G^$a7ty6xW~l+`j!`Ib8YUKo1lqyzUR z=IPP`{my<|3;ot_%vfrTS_{~xR*$sqetNgX>e=n||73TX)#a~PnDW?r#TU-C?YUcX zS@ZU|{PX&MvM0@YOaC)_a{PB|xAf0lVmm(<8hl4#jW`W)WQ|B`#2*c}?(Nc;b)Y|Q zuhZX!l=NQCikwk9m@L0k)9-n74Q|zD?Z!1;TjBQvtD3VO2I6DebdS@I^Mfgahuj0W z$IUvF!LOnGV8m^KT%v2Lf!oG#3Gi0!Z0oGuxwv~Q4?KRzid`%pK@3fY5Qg{(*8o4R zV3KF0}|LbUj*^80AaC~Cpm z{v-Lgu47E^ABS*G>>8goVyx3OIGEZ{UQHhVETGeP@j%n zE{Rb?S8$&pMophl!B(|=|DnE_VBN@ql?3eWU0FB@Erv3zd+5WY1{ zjehS)+2#id57#Vv<8V#Q=tr@6OJ>w4#@*MSKDMa-^yzS9S%jG`-(caLI6?RD3HKO` zRJ=pY*MxqQKh#fuU+-rNv!X>C^1QRL>h@%Q)sYg^P2q;wDEVA}YWs--+~vw%T!$AY zrJ2}8b%^hRijzYzDh)KR#&|T)Pk&GKn`2gM&+{&T9aaWXiEnF1N>Gm;UN0&2U%Z#b z)vpd5t#Q3p(@uH^*U9fqdz7*#+uL6a-*ue!c}@Cgfp^h*KX#2R%U?HOv>W&LA3b^0 zjU8K)hG_0H54zpkjfdGFTTlfX;vG)hk4`}6h>U?0>5`<{s$+ZV#Gv3;ez-u=(ewf#@;uk?)VxA?r2V;%Re^c}G)*oO0H>1EXAPl@u? z|K(4KvLq()5#;ix#LJ%&FI!e~Lv}je`%-;MRL14WeoY+z^^e}OP4?@bdjgwkdM!n| z&iw^)ylwZdc^WRnw%gL>MR@6M#E#^_n7O?XJ6a#X;_=IRmt&7^lklG1=AbqtAQ!cmNS@L zZgM%L-*ToVcX2tT#d0{S)}}v+%c;&Sm!!#)xt!XS<&rgdilsjmK1GwKayj)w%cW{^ zH!O)rEdo=_OCXa#6D%i$?O9*oWc&-a4Oqo!)|^?m5jlKuQ3@m zxrhDCC8ZR9I{StVXE55gP&ya(V1B@cGuagiru{XN6-;LZ|IGHCB#({S@HF;08=lTS zV#71ooi>aYk~Tb(ZMNZAY=sTaX0vU$fEhMChnWB{}sevgPB_a6`1-2?HPTez|;rm ztl|oRsm;?_#hC(Aw&<+lU!eRcern@6Ft!*KnA&uXnZZs7Ol>#^3vC_}nA&WPnaQ4{ zz{1hG9_koUCBd|9crZe8NA{@HZ4p`d?Ns@jt0x zl7C3UcWHQ+hPNr0^wnv&Ou?jofrh7RSjiqETbl~VJ$}a4l7F+d*;Gat#XVeCHgeb)K|6CdCoBD}@gw}!%fk@Vx8)~oO-{I|&8 zz}V~LL(d!JBiya0{@nL zEFgKC{Ca$MM!LvfL+OLwD)OP1@=5vvH;X;e!8-{|yjRF?MEoR2 zIu8k-^HDA@kR0jc^#J}$gc1G}`AFYl^4AMnD&Rt3Dkl^juUAwVuSaUXW~H#TLgVFl zwZQWQhO*_vn5f}kMA1%MG!vD)CZqJ7%j!-VZ>dFu9qIW}O=;K18rpZ1lxzv| z?SM*3uUcybECVOnR(-KeBG|e()OT6R!CD<~`ZWS#u zb-pV|rS+qwEY|kqvQu$x`p$-m)|T+bmdM7Qy<6%0fcP=vK54nAT&nS77lN%D8CKiJ zOcwE*Yo{jNLtwmpjF>%+XYG*$T%nmya%|?ZGCwADGpk_;_I-lrR*_ zKJ73JOL3xcM#>zAUrCr~yhy~+ZG{tYV%$A^{;CL`z_4N@W0IlR( z3BKfE3T)%CbZd?%sgj4Ou#LAIJUq_CoaFr(ky50M2|*Px5PtN<=mF7L<-D?D^jM_!-8LsxO+4Jte|ZAacQg*SZy z-f@LDV*=hug-7Km>sK$AsKT2$0dGv<&6Z zBq7G5JW+p^t_-|#Wxzo<+L+q-|Xu#|Dc>=IR4n1F3hSNv-4!XmS7d&^uRTT2S zxbE!{Sx%~dX1IKl(Oc8IBEmw(LL+J}TtB*GeNJSs#{bR58v@0%Lp88Ff8f4_8y=~- zHhQbDimx2KvVp<+t(c#KUVq3~;2AZFvn}aREv){FVJq5~U)@72%R)G($OzXSNnSiB zTD5rQYh{tDvb$=geRFy}+3q#Nb}zXo&8(V5D-b+UFIFIY`9xXdnVOVQSc!6bx-%nX zux^(qdGYU~?t04#P}*9`e35ORbouCHXNFV#DgIiNP62Eim**cF=sRKfv8@ibS5Nj= z6}Y0!hYXzRk}<|aUFBe(R?3l8bIjY^Q|hN0m{Om1{~_$kng&bDoC;6lEY!-0 z{0EL4?l1LQ_LTG17{^NyywqSNNP&9R8 zz_%cj>aRl0pFC)kX2Y)1T6I$zYWG))_VC$4*CQpN2MRuO!bGb$wobJ=e0%sl|DyU- ze`aJ+JuCUB-|KgOBrTLOR$Ef*Ys-J)AX}6YttvQP^ZVECfz{^Rz}q99huzI*PCwpL zdWCl{%W2-r=I?C&@9t)QbN|QtZ|PxZPtnxWXxKm2lQ!h-89Q{Wn|a?JnO2Xr7Llrg zlPBC^-1tU4VRr-!tcm#9=+t`SxwJ@8f4hHum%GaiyI|u(MMu)tTNcKw^n1~#x^ukV zuq%*OskZ2=L>XHpjX`0!wm8Yp=4Wo)<}((gkJ1VQYNsi&c1mjz{5|ydp6=2Rdv{K0 z65pw2K`6)Tz9B4n%Ui=!8raJlYnz3s$1c zo7?=>$h!)jtNF!iu7GNPy%gypThT^V=#!4*k+i*suB-q~N>pA{Pe{z~?xa?HJapb%^+Ct*%`dDmWL3**bSrI&3> zFWZ)0a@$fdCQsI`)UqR_=N9Q|@Pqcr6?SI)*>$q^m-Kug-2wc#Fxy7U)>YMo&$ZBH z-&Ka5sV^j5U%B9PS!JcB>jc-O*!clZE?rh0>3LQ<(t9DcmTG#2xQ+`+&v;wc?Od15 z)^*=)=V_0t=8v91sa>6~EvcG6t8HGI{L#BPo4s*u?!IQ^Pj|m}#jlV(}ljkye zFDsn^E2eMS@HGDYC@!DQK5CQC;C5Ycc|N<%CeLJBYxCDTWjN|vMU9qHbnM_nF3RrA$!C>pgbr& zG(M0$;*SKTHbVA@l}h@_o^GCoGd27+!bwN=b-$DVKH*Ufzog-(HT(euQ~dX6xLd

7Ar>gq7@Z`#%~}JPpQDCzM-+{=#n(;lx%yq&Z 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

4Eyk#UW66KRMLhlz-s)*~s znGI8;hkH?bQDb3JG;PfApruc&Ei;KR*UVGT_uf1o(YCdYPM~2pISAGwTdHpF5Q@S1;^P=as6}ZE)9h=;O zrrn;TPZnT&DeT`* zS_Z-aJ_fY=7mocP;*Cr(AB!yTvC`|Kt2Sn?*gX5$nw)6L8!Oiz$bz6_#4R_}`UCp$lUnS_96wNG+Wk zojn#TXhvEn?@7ha78uXaFY2*V%hJbg^Un+)LyyewZ$a*7_M6YZR%$SdvvW5Tp)AY% zDJaXb(_}eD%q-4?)e~pt`+ssew~Sgy+@)19mh5E=9{a-|&z}9?ADulLh8-Co%>|Ga zvIC=3Sfyr;Ch@a8$QCKv8{_Pu@=Oi%-;1*laDR5;%$wx()(Hbv9*8ep!7xr(;3G`h z`uc(gBgP_El<{*qz?%DD7!Smw#{F`%T+l&wa;edJ zKIXUkEgfqy(ol)0Bd5FTm#34EMm=pw(3=Sxw%hz?i>nG|?s+7PGjB%U5oVG6u=ybF zcsx~^BgqKs9RCp!zlXEej#xMzKiz%Y{np*b-TzbM$DA-fQlHyFpWzL39gDbeC!lo6 zJUO+49K?mQdU#u*6H~1Fx_iVEsEVCe;vPv2;B1ul(n%^*c9`K5_3x8)>>jCNn26v{ zB0X-K9*mh~s$NSQk`PO$Y!{ihh_;5isi(o%!xp5ErUj~xum!2Ig$7dAH&s%2<5_Fe zE*MEi8k(VtT&0pH>%^(b5qE>(E#l(@mHzK>dW^yQ18Kp@9888!l#i5vbN(ql%6}$r zgS;Jw4@asZ*#8c#*nC#nYFcByYO9HRsh4SXl9+!+vb(AZk{-Y*CW>_Qb>Z)q4=y$DKDffS)T}$m;4d*t zeQeMwdz=Sjv-M0HH3s|Un1jYMNn(tnd86xDap#1sW(cE*`G~>q6m)Kv3u&ajMx!5F zkUWa?b@fFW`Q0H~++E3zH5I(@I;*!?Y<0wt^CXwI-Ou<8KG8hsm#5zzu8s5;xMzMb za?b(eKJvbUJpU2;YvS*hdXfKLo`3$=g}+}uu*6*ITVeVSEcGQHSZS{CedXXvbCqwc zxenz)ewoi0WFN3f@V&M)Rmt= z*Ype2m5p$69PIE{6%>bEk-1&QBD8;Ra~JOWV#K-=ePgysqq9ql&TpNzMrFEV{q%GS z^uUTYAkPv*QH{f4*yW}Lrbg2?KGs_-ES9NPr$pnJ`gIufKz6s;Ug`r$Y)T+M>b;c> z&hr=fy(_ZH7ahpN>2f=6B`$?eMju$RKljfG8(F6^an z))gyuikr^*$qJ-Jvo=11xr=L*$AxF9^uWo2$`Ql+OqkBMyA>(2&Xl8c{5ne5nu!pf z#wU5M(nL1PkNuhE=9JGFuv31lx4J8(xX5ok_jop@;VGi%F#I~o?Ss4#&#UHr9_>=L1Y@$3qDe^ci zkQMbrjD?v|wlIA(*Wo<7$`LgkZcz?+OEJL92Bq+OUlTBZGbKgu6*+<_^$U)Q@mqj7C^rd1XeH#7Qpqy^6bveZ%( zOxLXPp?+eGA;~y}u_Y8|$1z=#V@Mv-8xP~w`cfRLVGM+EUPEwffUhBlP-^>Pb^Pn- z`0J#TX46z2G@ekOkxv_R#+>XkI6p0>huVt76kd)Y6dtEvV&0BfL|GX>9Kx21^qgnvt;T8vD8>Sn$BNEpC0z$y&3c7h77;;zAah2Z=>_+ zwT#0>fD~2a}Qo{otJQZ=YRH^TIYVD z<6`Svw&RP{bE(?ka*?kK=~vX3q_fgTxee>JEs3%+B4>Z2yyE+_~#w;h<=hY6?K4sNmERBB? zJ!-%3BC{9LrV{8l@Ac4^T1Taomy1eA)g{n@Pb*ZW7nKeIq^3p8UoWa`FEl@DIz-u?cRJMivF=G1UnXP^MdRN2wiPu$ zmqLfzYWEkF4w{c$Y+lxiwstY)aVgSqDReBp1Z8T?+s~(cxHH@^!dKg>)qlm=>PXZ1 z+*2uj>8!f3_Bz<+$-RRP$vz)lYMQE`^irI!eyPT$OHtp&JWuDpw}@KCZCr;kZvp;W zl(Cwo7m=pz<3js@7v(3NHAdLqd2OHcJ1=YOQp?7gOP$ZN%J}imdJl8Hf zS5GP**VVGI`jS;Pvizn0CM^&Wj`p4TF9p+AayvHJ4In}@A(lvR87Cu9hPvLT^cgs!D(r+y#3D6v18eXE|rCeWp{;^b( zU&ZC|^1DitmvMQ#e#$g?xfZ@$lUHcrD>V5sE&MV~zMRYB?Q^*%U%};WSzK&|CSR$^ zS8DQATpk|}R%!A|E?*PVU#ZDgb9ub}S8MXCxtzXTS?+30ehrt$>*pFxzJ|-`ow()J zX!2_{yjIhAS4uYBhNs zm&e;J%JgC>?>$yCBKVGlNH*k5py=~Cs z4Vt_`lW*km_;|iilW*ekczfBT$v1O3eXq9MW=-Cxg>Tg4*K>J%K6Je%-@@hb{B2?1 z5%V{igSprZY*gSRB*2AJ%RjHo?`U7V$86YSM{L-|LN=VlHrQ}7E4JYj=CR>a_8VHL zE*$NPH)_M!r_F{v?3fLwvwLhfgSFW36jo=$nQWmAPi0eWIE(#knoJFqM>hL+8_r=P zHk`{oZo_$O(1xe6ZX2G?-f6=#*jgLTXQehglTESVS?p(dYWilguh?(_d(MXEuzPH{ zknOVJE7(>W_OenNE@BxrT+Dt&8yX1bVsqJRHeAA~4cD?%8?IxgX@d^oT+GjC&k*Tc81J99;Q+hWhU*#a zZ6ciuPnMf(cmrE$!wqb{4R2&=HoS?wg?F0Lx!7j*4I6G`pSI!a*+*@73tOaM+Ltp+ z!3NvUen%Ue2xqVe`<@N=vXeIa4)$>yKERIJ@IlsT!-v>58@`>bw&C}(LL0t=xoo(P zy{WvgGFU(RHyb|8PT26BY{-V+$!@pdyVwpJzMHMH;d|I(8-5?lw&4Nxd%XLV&R|E_ z_igwnJ88rBvX9&Fee9?W{~Zh4@VnRzHvE2ewGID0yTXPCS&|Lk&wk>OsiU_Y53sM> z@Pq6#HvAA9vf&S~+im!RY=;ehhy`qTJ6mGILoCOJA7=lPrl#i+_J$3An7wSnkFuw1 z_#^CI8~!K@+wjNO4K{p?U2VgUF|Q53nCMCH?u#cs^!(feqh5p*uU6tD|_CC+t`CP9ApP<_$JnD z!?!TM4ew-&Z8*eoY`C4BNm0{xEBg-{zKy+N!yW7sHoS`s+VF0+&xSkMyKVSp=Cffe z0kz>hY^n`+vER`KRl*spn|{^3 z7nq)zO*V(0n-@=SA?p5mEB7GH{KbL)5 zU`t-YK5diFV}B>`e9oWGZWDMp$5*m?ftxulWs3y1%3}fZ2u$xpOzcklQ_Pnre){%d zVm|gofvY%P%$^XqjpHTkZh`3;+r$p#L4hkczKYcfY~{C%d2RA?b{6v?iqDc)uI7wF*q-n}dC<*9q+9I1@|#;_WBLoXWBVUd-iL>=&ZFt>ieH z{ine6&Nau(VGoM@QhUxZSFo@RuVh;Uw$itXT_Z5PQ^+wZS&6__`c|_nf&E;5HTyjZ zn#!B%E62Qsy&*6?)8?3K*cSvY;rLqiaT|Xv8?fQ)*dBqc_^Vipz*hX#tkEW~VU@P< zK6Zt`^iCqjtYv8e!vn5kKf!#D(rfAWv#$tD?-+8-b?jMzy&MPF-w90pA;+v|`vkV? zcRgzq*ebsbtkQ-Xu=R`;ANBVfb0bR^*eah*?AMqdQhMkaKgZn6Mg_LyjqD!;w%XhE z?3ln-d|TK$Wjv*Q!dGZ`wuaL*{7Y)+!cq9IYxsE$4{A81;dL6mLc?ci!MzgScQmZ- zyHDwPNRzi~c(a1D!7o!Vg`cHiQ^P+2M>^tvN5fy$@Fz6j`Yvd@Jt0$ z`f1No=?MRn8i#O%zoFrO(C`Bq-mhSa|3(cj*Km%8dE->#|AkBpd`i#1E12|uUBjQ% z@Q{W(HM~K?wHm%w!!+(mNAY8Lj5)$eb{OrOKMPXNF@xU^$*1t1=L}Xw{-+GKo%~N4 z>{H~QGT0Z%{}+S(ko>P2><{FF$LA+lGmqO3^L)v$^y0b~*u-^yzx=Gh_aimoH_-KG zt?St7jcuWDsGK(Pv8%z0Px==M ztY4S)E7Kv%&57r9U51zW;Pr|0bAFF#NBay$_aRD86@1E9WAL!xz0&>naUEEeAKm|{9Ax>whcFIB=IM%vdKP>tC#Uqta=B2s z%nvVb#WZy9v=P+qCI>?&1PD>q9;Ae8A`R5B+}9hxqt?1wPmNgvcL!-rm6D_4lNx zclcfkhwHo@e^`_^e4c*ENBwXfeA#Zeo&?urx$*w@sAw1PdA^}f%DKLei*kW4>z}u8 zloQX_QwCcr($_#fur2&EB0PK0S&u-M^B^-(u-AZ?@W{xz#Ec z^CpXLZnxUGiJL6xH{WHock`WAe#}kczP`b#PxD4={$Rety04qKDR)q~jRxOm-`s4l zLxh6{yNmp0gWX5|Ew~?%-(s*w$=_kHC&}+H*eA&k8SDk}n+*06`R_5{aq_ zGuXGtZ#CE(v2CL{|4mWfWHm-C;#2}L)S5WP&+j%M1HX` zImg!u{5^qxFU~gjfxw24|43jcT~2!bufQ_|{ttnR1wJkCLV=G9yhvbVhR45H;O`2& zMBrZvyj0--68I{CUl+Jc;O_`rF7R6dFB2G(SsveVfqy9Q3W5Jy;FSXZAAwg1{9}PD z1^$`9s|Ef~fv*<$rvhIiFecYL{xt$WE$~`_zb)`}0zW2jmB45OJbbmlsCEkHF6gd`95s1pZ%vpBMNK0zV<}9|e9! zU^G%5-#-hC_3|8lLEyIq{*u6F1^$e{OyuW_0-FNAEU-)9mjp&<;QIeb;ADYc5I99( zbUI$1sRDmqV7I^{0;dUlLST=;!vd!Zj1B#{z9|BKPT)*|PYOI$;Li%2CGe*O&KCIJ z1kMro;{xXjd`jRvfnOAOn!v9KJYC>#2%InQR|TFaFa{r<{#gS5tH84b{))f_0)JWH zIRgKSz=Z;TP2ej8{-(fQfxj+rk-$-b=L$S3aEZXj1fD1GCj_1^Fa}wk{woFkmB6I} ze^THD0>6nt?V`{BT8iVNx_juXCUMkPd-vwf9h<|!u9lwm-8=2)f3)GF#d7 zrM(py?A$$$S!utVUb~d(jwd}I%-V)r^xi457 z+}GY3^mldcx+#Q$YH07)ie^i&rR`kBheMVeLPO$Qup|ub;#I4j!N$uJvMneUdy;W+ zTsh#HD9DX1;c@hdivVG3T6%hdUA+maeO+)jHM-!ImfdZgyEg6JwIkT2>91~VLd&UX zt8Q!S3U+somr?|YrPaaiy4|f^yqCWf|z zig(yFCK|bK>S_t&PGje_gsq`){1{DH!a081y4rCBX%{6f(HWjwds@1BAPjc(w0EmB z4-p(ya8pY=&0E04h}+qPa;KYxo($O^5_AWo0@8$Ypm;1u!?@;20nx{3zSC6~3AcCk z1~5W(j4uP6Du}^8VFn@Eh=VW_%8(UHVfF4dAFp>Mt9k}GVWLbR2j@tszr6!@YVfuM z!<}96+a{Gl>;y$5czj~5F)-EwCVPr1bls?&^2(bvb?wAwsbVVD)v_~)GgNoO>uTDG zgHbW(YHAU4gI&R0-N7CPuQlAuy$glubSMfVD}(o9gCJDPyg(zdUu z8&%tcNkn9c|XBt!yWba}9U3?`vu8ZAx%(t150ipA%mx zpu;h-=v_4O_s|3yLt;-b(!+M*qWs;)=haPn_6GOjh}j699J;Aa(F8= zcc620qY?Y@kP+hdXEE=H=@NcZXxoJz?#?9O6nriEAtoPMzW#Z6ZtAn)Q5e}#E z(qmGvtto6h%<)D_PjiCWg?nsM587+@uJ)d$Fg?)W$X|M*iyt72fxNA=i`PU?L~<~9 zO~~k`2fwBc#EB=rrd{;tmym}za8mFtdeloOZ>8rj>K~YgBJuPvHjdZPfd_}!kmA#`ZRF=IUNS%W4#-U0Z?FK%+( zPRBK`c08|nwc~-!s~rz)u5>)Gxzh2#=1Ru{n=2g;Y<5iaD#w$YS2>>KysF%(a8^3T zv(m9}Ryr2W3dh1(;aE5;91CZKW8pX^ZMkFNEO#uN<&K53%&~BmIi}zeAN9T5F$opR z9n(;;+_8o#mN`~Y#WKe_s#xY&NfpZ+YiWXW$}1e}siMNMqADsJYpSB$xtz+K%c|V>y+tb}XmzO2=|4uXHS@@=C{YDqrPTPUWi{ z%c*>oV>y+taxM+$!dN+h$hn+WI+xQ5=W<%%Tuv*T%W1iDIW2cCr{&J&wA{IzoO8U) zxtx|w5X!lnDxAxy!nvF(oXe@)xtz+K%ctY&X}M_YAI zPgnbny*V}GnlAEt?C@(MBieL40b#>(>^*5E= zu(fXMjVnvuyLH+TN&8Y?FP~vMd@YH|onGI?2zXMkz06ky<6iHoLcCr;xNK6=eeK+nah(byD1tccNLs0ysyLvToVS%oG^-u%wS90nFTfrfq z@@7t@IcE=HY+pE(PzkL;wkY)oa%t z8^-KkA#{@R1!BA?!B^e{B<;(ConiaxU>Bj~#D=$cR&iAu)8aDfGU7{vU6u8=ncffZ z*8_H;H4O3FO0c5Q(YUV&s?6~V zf}OSP4Ebh@)?C4pdD;T~lE5)@@B& zw^jQ#G}Sj=wRMZ{D!i@h>1^%n=)MYXsOVo4y`yfwrKL5vw3St_fIUo0uw_R(GZx{e zuVN`46_b7Vb`gv$*;uxSrDUWT*+!0;XU;J4jhV(QqtG=KOq}$^3|i?5OQp%X_rs`_ z_+;Zrj%>EbK2$nW{0M72e9++bwvv}5er(ftFppv|jfy$RyGrA|0nXwW3u|`7?@W#7 zMuI96@P2?b(P}=bz-vsv`?AIx1P`XFF(>2wgvNUlYn)&j6?2kzm&SV$g3=f(o{w8K z-WYgfCncTKw?X4&VQm@JiFA^;MB~+hmq=fd#_IuZjZ_9->ie(F>%@Uo;3WSNhE#_I!4l#j(4?@8c9<(#YW zUI$K;k6)wbsrkr4xq}*WGO6Fzc=_Pv#aQut3~Ri_;MFGJeOTks-U5kuhcw;`4)NZo z@lJvF|JZvM_^6Kae0X-Xl2)q=s|z4t1uG$7#Z}^F;nZT#Zsgsh#&3|PlEl!jo>BHcb&!?O~RY5@xBaRqJDJ& zgWlQ*I9>m-|t?_)|C91!>G+rlo ziN^UxjW?V`U$w@2Hi)Oy-BlXzJK!a1k8+Kdhs-6KuQD{=R`9$D()}SiqFR6Z!An$sf2Z+Y z1g}!j2Qhb_*LZIyN%uaD=Y;J5uh2mrnxDI!8qWt_qmYp&c{gjke((~_YxNrMcoKcI z7hA2DpC-v4J;$lMJZvuNNszyvgQW68;3XPI*zRTF-3wl#@_tU^odd5kLAnPuo)0!S zDiiRwX}lKj63x3eYP@g~9+vT2%5e<5MB@Y7gDkxBNq9d)o7=Xy0d$S-%H6XwFt14=LZm*Lb0`?o2X|lg#AOs9dGm0sL}zEgQ|ApS z(|OJ^YkyA0YXL7EeUGNedo4{~<;?W*7fh4)EO=@^O;+CDrKzuOR(ka^mL@NfCa=_+ zUb>y&wV-cEm#nx61VN4TG1CzUR~A{SLfz+M{t!dg+dVm(DmppC->Y z*ZN&5Sv~IuFP(C{m?kd|6LvcF+?pou(KLDI)8u)4>E*98P2RCId2fRkNMjzVu1YU| z!{DW(@5^cGBjW_=v|D4EyfN_7$zLQ*eI*Oh%ipFnd7n;`7fq8_iHF^E>Mxik@7XkY z7t-V{UzA>Z><6zUjedGAO?~dg>7}~~ymadC(`oXe;H6WJg-g=Q-!ORT=sTOHJ|`a9 z)6v%sUOM;7aq!Zqzwe~UE3HXS-_|sFN5N}NqhDP}Qy*4krZvCpPm}jzn!LPaiRH2v6QGChUuJNkD^9p?^VvKjA#%l#n)^o1HtI~Lz6n%LL zj|zeRV=k=d%U5_&B%<<0!IS-AEe@jAitLQeYd=_JORr13_^GdqY6<(Xhiz+;P zVu__&rSaZY(#13r#r0%IezgeA;u#c&??Udo)22`UNL=N*LbuDK$c^!!aJ(*oZ!iNo~Q8c)Oe+eKB{lo|2AnnFL*M4 zRSIvJ#;aBI%~yEY8m~^#w@~4|i43UqvPsd0N5NSBzN+y$6@7Rli}60A@xlrZk5Dn* zh{hXN(ydl_>owjHMPH4=Td46)D*BcxJj#Gt-scs4%M{*gxXG%#h{9X0@Sf9nZ-XcM z!3u@s5Rd_2jUai7grSQr$UMqNVKDbul zUBp9*S}$Qm--i_5>l$xd(MQj{vb=w*@ty}y*5CCC?`e&9PD%F$g?B*XMHSwM72bA@ z_bzx|$WP#}4u3L#Z5pri<~Xlj;a#usY876C!YkK!o4}Lf+^_J+rmtGhA@FEiQ2rVf z-j8io-cj)6eAT4zzOM0(EBP}N9?Ujc(mki7d!xd;TjRY8o-9W|;lb>jMW6d4abB~+ zgLyFv&!_NiQg|>UW#QE+ywwWtzi_SA-zJ4e?`N`o|4rkC!1E%E>Uj_@ng2p?k@YX53`!!xf;k7EfZ5r=_!o#CmEPs?&HGl3+@qU0uiWrZ^ipnbmkACl= z@?r?Ycr?eUJm2QHJ~VZVH(TRXgD1x?vYM1vr|^)4q`X#zhs&hAPKCE61uvxVZb`u# zRd`!d@WvJ1ttog%72Zcv@J=ecjugDJ3a>K-FQV|eQt+Y*kNTYK_j>zYPNnTlT-<6g;=W+mnLl zRd{<-@TwKw9VvKq3NM_3*Q)SFQt&zz-km9UA%(Xu1#eX0?N7lQS9o`&;2l+XccT67rhrz<|-!$u1xg`<-x;t2bHyj+k;?{xH4 zr-?PN5MJgzr*p!$8Ph_}W>)b@_N^_48nPzFSzT$}Sf6q6H^0B=In(BO`IK}1g;zXh zD5mFh)#|TKKhm%=GU>H>H;tA~kJxb{g&w^OZ-+qqg~rBlh`A zBNg+rAn7xlq3MCiwWd}RPYIN93|W}@{$s-K6;hG5?cw}Dp;1x$=38;iY{K@i6QSj` zuOgJRIs&t5UlG@~fVcJ^-opA+FJrI%>&1%~PJisA%a;|&_1!kX<`jfmJU6VnBZ}1K zv>>PBd$04^BMkD^sN1m3nO;rl-xTc(+w9)3(_d)JsG$%nEiLFX#`e}uED0RAr`dDh zj;F#w!?ySJaAlco$o}ZDG6()LAB~RK>Wk*ho zECcrO5K1?6hEAEFcsYSdk(@Qz73D%o{H#bEn`|0)Q+T^xX`BTp4^FT+Z4cNZW)E}o zwD+H86%L~$z#g$Zf&=rAVxQqPbL?|RCS4{+`_E*x^mqgxIsP@uPC32s7Uk22G()GI zEt!T*>I5eSf+rxWx_cH7jprU4y&2yS!VL!o|{gc~w#D-L-VnWAlj zU4tVXeX!p*NZU5A-#xIq*Sl!IGDjhDcWBS`@r|1Z=;`a)(J?eU(%*aij@^4=0eeCr zG6a47sueZfMa`GpK-#yvyMIql?~-)5AsC_CJ}|fomeRJT7a_Jg6(+8)Fa}Ht?i$#A zg^^SnhF2K1w|{9jZVUZsRz<92wC^^p%2Q%oab?h^-Yd=-MdF4C$yVtV=5c7(m6pmh zkvI(VgJ~tTXSffWmb-*C$t#F51T(gKhOQ_Aw~BfNF?zduf|sQ?ZE9WD)~?YK2DWZk z=kI83sc$#dwXIpwx?#Y-vVMulytLz(ySvxaudTnasf~7dr%j~o;OmCE`j_;EslmOA z8k^VpTQ)W}b!=$usBdjWfZRil%lh{Aj`bUxHa0bOe59=z7B4q!Y^4H0bR)_9EzM19 zV`xKD+s#dFT-Ms*hoG&#MWEKEw&vDAlNk{3H+QUA*VqKv%}r|?*R^%{*EDVbYTUSH z&E^iHd2M}5M}Wsw@&c2M8`{^kp~PU4isrTLO>G7&40UX*=UJk_Mr?qOXOco%+nR5# z_iyf~=~${rV792E#pu}3vW~KERyR$)eLHr;YG-$_YjDVW*=h08ef9Erv762FPV)M^ zZf_O-7IkuxCocQZv+dNeSbkwKF&nWwq@J1Gn@`* zrZdZ#ot@__umXYTsq{rB2GVV--Iu8vBXFnl^UsJ?jLy_xqp?$7ubG}RXm+i!Oj z@2k({zcnV->9jjz`Ev4n<*7PxeYIs;h`3i%CN+I~%JkpgyeqF4d=C-j-Em*W{a4y1 zs-8`}4(@!YzS; zHRVxt%oOFJ{-V1LS@94D`{l(}1=AC>72DYw$Z7nT&aTNbxSZw;(`9IK2ba@)U^<5; z&*XB-ujw*1d6pSpit*B5&0n@A&(`ElE?*vt@6_ZuTuyz_bUB*brO92IJeSL<-A$LP z$@93J#-8c&G_f@`>X|Lvb!uei_yM$=`wJCxz>W6Y^nw4uwT&!ZQ(L- z65&5va4vh!g7cVqrgR3&XJLyR^`RJegIZy=nMSupL(pfoV+J@!yZoJ|zD<#~JKf0@Ika|Y_2VKHJWReTsI3Iz9Anc`4+}bl8=Qa&ykPD zJ4Zg^zefH?v1eIeTBBk|AzT8}eVX*svzWck{MKxrWj?do>qWR<3r8k-y!B>3a=~AW z_^x)7=jvq4OBjA7`6hr7C%dB!T@Q9V-pYejs6eEep^>jgfKhlL$HAMklS zA{{(#GZ#oSp2)8d@zG70YlFxi{1OokkJ;#m!t4tKzDD3GfolcEpyT;jB`_+TV^k84k50t#hXlqT z=lD8-7YU3`%lXte@A*tUvU(;Ds>6{>1O0osiOjwHC>ngOBGYQ?5*&$#)3xYGjf4l@ z!Ezpb>Ei0}IbmS8c6tv_FJ_fc7*{nD$Kez$>JdqtO6CE1){;qEdwT~>24!9(A3J77 z>S&>JNiIV(js77^?E{IEio6tAs2ZR6yrDS&!Q@ zleQkXM>=ohw)8}zrkTCPgD`X`%%EDtPd`a& zI2!W{W=B`3Pp}3%b`O{*Zw#e-P)qFGmCK%^Vs<|m%|$nko5q#rtLP`Hpbd3%kR}xZ zSQkxlWK@h|Ib6kh;>KWXbeli1;RKB?bD-)crSNlMaA=1-HOG3g2_h*+ahO^$FqPvt zM7-{V$LYkh;_N8x)Q*l0e7o=1F&OGt+|#>l&yJ4mI18n>GO6A0q*lZKe|NS+Qk&&V zlbbA0ZkIf{S@Ietn`a=@jb_KGH8}il_iNeve_1wON?_oNsn z@fm=FG#(xg`E#BS^LItM z&eC{6gq@Tm`1DLn4nMZ?cS4yij-0luJN7+kLpl5$@?t=K*iTC)BQ9F@B13hi*FAlA`W>{-zkl^9K22< z2q$?D0ITUf3LYNmV@~pRYrHRmNAHKyNnQg2RDEQ7mfpjqL$SE)!3FW8Binyc2ZhP& zTQr^%g8#(#1L>p=YEQbB`t5ib^GcEuPHjXyWQ)5>@SNhBJee+DgDm-52wtPYlj-U_ zvNhbE2Jc1i@Cp=j$@H<@^wQOBdM4AS+w@GvBb%OqSnlF=p_kWzm-KXaEot%|O_TQ; zcUE|#go)_W7qdqQqKR`pP`i_A|?M6J}NZx6U_fsWZ8g`QR2O95p;L&_a z`e+W5yqy}aWOAIBt?(K(-a>^(<&^r!#-LgbvbiVIrEtmn4X#z*R)vS57vsIE@rJ>p z^r##d0x{m7X}ta5(RU2up)1CC_iH?|%_sARE)nDH)Oar{JamZ|51)N3<#4(y*ThOQ1Z}(v2=A_iNb^Gq`XRnhs&hAtLLv> z;Y~}y>rr@gUrMHLSmDh`!Mj)C(f7V&`W{tyWhr>a6drvqOs4NSg@;e0NqH|SJZ}o# zcNAWE3f`LvuR`HbooC=rx_7|)1Wi=JVc2q4h<{byK|~yv4?U1c9{J#fcqIH&C%JK&r^@BtsP_cv5Thnfd_HZ2`%pKV+lw7E7fn`nohcZ+AD z-BxgIaFeI7-Bxi^Gdn^lX0v@0Mqp7H3$`xLm}dLrfz8jH@~>vzT~W4VDDvSJZ*X)o z^X-lhw>-$aW9x%apOIIa`S{sWIi=qWKNv2u7yGB%o5Qn>LVxBHId=Eforcq2(|q&3 zoM82`hm8J;Z*02RU%K)@gK@sga9)3|^-oV#tut4Ct_m{W*!mkI@sfH_QWm`-Y8!W! zW;=T>_xP8lg*j3)?qNLY(5&!_Eo&%_Ib~H!&o9S@p_n5Vcm0%y((h@KWk3P z@D=mgs>}9Q66NF!9Xqe*0hlcLAI4i1@JLH*kB_k>ThKC(M?}VkHxO zV#RG1dl%Q|LcVa|_K%BI!GW;N_p=H7XvNEx`#M|ryGRz+=mvQ%O??LgXJ`H{>I?f$ z1P1R3RGk=|`Ku^f_%>3b5O1(*d<3C&Gk=WG??;NCvB%Q>$BFui;uDLGQ;s`F+`g=r z-Q}+7i%!&)vT_QmpS|drd&`#~-V2s^#m6U|t9*9Si(i~rAapTbL4?hoZX7BXI&q6a$Iy%?oze{y%?=rZsZ^otHB4ejsymoH)Gtn$9}>w?ly9vBlnWF z&j=J$la6Ym9^=P>zA4Ag{?o;49IQN26mVCt@+@9!-eBEGUDnj^x+`i7FQ57F_*XC~ zQXb5x_=cz2?D<|cZX2I%WZqO>W`<;?YU;u&{>*4r zz;mWtgxIojFuo~&*tg*Ii1pr?JRJw~Oa#%pizY}ur8#HpKm$8Jxuwqt3T+t^L8A@~ zTLh_01V@O6pYtPmEyrehk)z|h_A+PBHx87WaVWhEo}R<_*;}mgCvTbgbzt1m`tG8@ z^oV!F<|{>CwfUw-SjEBe&R9LvwSoczI!^8>m?MQ!lJ}L+>D;xM%pI{Atn!OxZ;L+dobcVs zs7KGui1v8iJe9TZ*RNE^?nTsA*?~NyBSsWTkr_jzJ+}XV?^P%_;=Px6CL$gye?4S! zuO{!mKaFK6#vH@;sQppq%fqZ=JHfT$URopWJq}hHnGv1R;)@22%+TaDlh?X%MXciu zwuyyCew6mK)OnmCYMGj`v4&r~k|7vq4c-UMy2f0x&`x*f%Kv=JY(1~>d){}aET-D0 z_Rd{{yJQ%%e+w%&Qvn{!36C{oL|CPaRf{&eco7e?aPHGN7$fo@f|( z*Bs@Ubt|2##-;Zhfii2%kf;Y z0JERj56%9U8R_)a-HIGxo|+PMV{gjzXkA5>VdMAMRl?6XzKYkB8A|}(qU%mSZ zTU;=KXU1wa-WRqV|3YvlAN@4y9DLMeq1XQY44eB~zE_6!<~RbGk({u-%Koxh2eN+N zMZctdMHPmB>H3+0nX`?_MuCxS<`pfO9hq&+H);&?NsemkUEY4!&xRJThd-HCg@5xSuj5}=WZoLz zT3@&(IBKgat-t3YI2Cxd2%Vu6tHMizhi%MzxHPcWy!Hlh-DzGQ9Xnh)cEA^YDtORV z9X!xFKm2;|5u3ZTzRQ%m5zi^&xdY&K`k?QC4Oe?*ij)fVim&5NZsvhP=ueJ$DuZ;ub`yQDo9I37CW_C--B+}uhQ7E; z_fcG2?XDF1vMk+PTwK|1hf8+`RYHdke~EV$UAo(ezRXJ3iHrK;aD1l{@RjIN>x3RA z-;X+>@?2S+T)K;k%5XJ0-mmifcj%#CN$QK=`wphv??I2+cU!Nrj#VA=-v=F6+tzA6 zu6!I`+UFMXvRwJjLA9@#b$WGetd^(tD)XYw4UcghcV6|}pytP{o4fgbtgD@0WSKJV zGxv2}i5@S?BAwa)mED>C;+=!V`>tr-Q_Dv0S68#^O|9#Dq2v9Uhs`my|K6*qCpAyY zd7j>%_IGk!SH4S;?gi2v!7pgquG%l%lhJHL(_K;9sXCv-PiytXcf|WR?bQA5<#y^` zdQVmRgS-#Em))vgLZQ`rsrg$V{RG#Dzv}0Pjh>lv!abfZG_aS;jP6@+VLvFX{&MM! zS28Bld53=e<@d|`Y^#gei(doO+PT|@}Pn#clQ8OZJN%;ta3Y-(^He_?3z4- z%W0M{U4|xia5??PYB~p(QxBDx(x)CGu{Hfn9-n4c(`9P2fr=i_7EXcWLrmE~nNtU9Kk2<8qp@O_!(1^SL};zI;tyz~wY^ zn65yRPvUaw*`}MM$=#aVt;q|yJU;RYHF*)2$IDlw$%{4p#hSc?%kP!h!zw^)`%mWb zc=;x4@+n+SPXVTzqRFRf@~N7GazaC9q#^p4tn66Bd&(yGA!?Sq&c>B*{cZ%`vg~AMc7jo=k z9~IcgaW1PDnC`i>4||5dW_tMyK|KBWTwcJwhw&}TPy4X{)`H#aX@O}DFS6tQD6pAc z5xd30FJ>zQrh8tIy@X{8Y^FDv{S4!m(wocWQ`kRQ@KpBK0-N@(S~MElc|W|7^`URTzw(?0Kr zf@$CO7c{KeVIcWlO}<*gD>Yo9;X(~xz%58R(tlRNM>Tv%!<`y#&~Sx@vo-wl44FFB z4`VND_^&m5Ov4}3aF>Q}(r~SYXDXQ5!=+%#k7~z(@T>Tfj@Orl=^PX3NPee=cW8K{ zhO0E3r{SMb=N69i|C53#|KCVA8)*!&5b!tKlC@W$;Pg zKWq3q8vX|je_g|;6-@a#q2U7xru1&t@Foq%pY6>2#h*n@tQ3daMW{r4*Pn>}|K}N_ zdC+x|v9FSk%#hs&l2?)s`E|k{CLcVqGvWF(*he7$1+#tZsDv*A+Z)XF9_rh+#A2Vi9__u|!vJr$s)>`H~3#5&18|j)Mrl33cv5;-lmvKCSVyq!?*xSccC{}J^CpX-O5 zhoipfzQ+5Jh{yFkC-lLW`gl0n+bi_(`o>`1N*F#bFZAvw{7uFlf^Ywp$j85kd?UPC zgnNkh*Fyd!VP^xrm%^ckr-yo}C48Q-I`W@2_q&k4mhd+i>m>gRqFg9%fH2m_w2==z zydKV(`!`&FBkC2ttXC?Z{S{`~NqJeMhe_-+6#pf2UnBXb3a;-g@zH)SlK(x^9*X@w zT$B9!qP{R*csapaE_fW@E^woeqq4Ysv%oz9e^lUJfo~CbyTB+M*SAC94FU%RZWp*u z;Ee*Kk$8IR1-?z-)dKem+$``efo~Fcx4^9e4+y+Q;E=$Z1RfN)N#G%YZxnb~U^E&p z&mMu%xE${lxJBSQ1YRd_Sl}%Jj|hxT$>ZNC@XZ466Zj(n-zD&^0^cogr@;3JYzRCm zuwUQ<0&f%epuimhj|tp`PH>g>Q2G{k@9OIA*wMQi#v*ow`g>s%`*u%^zQC~uoZSY5_B?Rpr0m=D)hGXhWam64okLX+{9u(jRb0Jj1?Fixg-HU zdIA|A>NUGfOim^bF#7y*EXE9-bX)ihK}!tSEx5U>zYit_dSz#^^b}!BX9FzHnnOgG zzv)|SnjjGdVutSM8}1I`>q^WN&Niwv%^pq?t2fwbH3UmE0|VPS`pNK6$M9_(p?*f| zONP2ThPQ=9aA?oA+j>W6>ftj` zP|Tp{MBH=@(}Z1v-9aRjL{3$t3Z;o_Sp~54-Z#u-DBG~6wPQ{FrjEv@o14i_(%Sas z_RTCkYdY~IF)3xs z(%iAJ=I`(A8cZSz_IBUaG&txd8$o6S+zXq!w|!)=D};{2Ufd?HLY0(d)8)! zZeXxZWSR`;op&4Royl2x$1FAUq%A$+5g=_weAJp<&V;E1=Rr6XczwyZ7wc){Akyy<;1{rwVN{0iq-=I|+r_A@M|l z9*^6n$Q{YMhmb=mC<%}=>=lJsr`@-8?Aa}9y|+i@TXNB{ZKPwcYxixEz?+YZd&__> z+#vAq)7MQM9I4X6RWdbo2byEs$S|I*l)zX~=qaTGlO#7s#WNS`>Kjz3v6<5>y5wWf z5u1p7V#Lfw*BC6kzmYFZgbfbtl2y~k%ZGt8(A|L;9W;|67Cll?7j9U$wh@NeV{<|? zpA?eVtx9+=*G#Hn4CRI)OuB&mU^+N1`ilA7hZ zCaLAAYm!=?x~3*s)>bA>XJyjLS(&tQRwS*Q6-g^+MbgSyk+gD>X6*yhWWAL&NjpeQ z(hgEn^S@((Ea7`$lIO&}#nx9vvUX*@Pl$&*`I;CPSl|3CuZYP=tLcW8P^dgf48>jz zbtdlP{Fzq|=W|i)l~9+OuY;F_#$E+25}M-n_NI6ZOu%lmye{%rKnv@}q_2OMp;@a+ zsENJyC5kLw`E(JlAY@a%QJ@|8ONGvhz3OR#B(Hf1SqU3Sd%d$nyyVsH5-GjbT@q+{ zrBkKa>zpdmU*)Va%WD}=F#ZZhO!4Y<$?KaUOZe)h$m6eV^g34A!zy8 z&IQ6Bf7I-wgPs1zEyckWj>G)@H4C4t$kF%0vo?Oo|ACmhiy2nlJK*5+Wz0$5ziPZq z_)tnZrIWmW(0C7lcMN~hN#37oyy{Hz8??^*xW;=3yz3+hzSOr{(=r z9V)0j#)|7(rtuyH51%<>PUICGTF1_Z)ci4PH9Q+kpTze{X_^pI2f|^6-;} zg?BQ~{H;t9(M`Ccyr}w~2QSe$?}1|CN%szTGA#;|*B!V(m&4jM)4dCxS6q`Pb=<7! zBi`>ZcSt9B^OQIw`*o4|8`b4_Hx#F5%kCg}YI&2T`xWq7WTNns@mwY8<*yCA#x(Rj zmL~6eX{K8-IlcVtOp|viP2PWkmri+an35jvV4A$Ir^$0oO)uTG;04lYw>0&A54?2x z)!fqb^0yPbbnx(0aZl;aWb(#hZV($qJ1dV2ZW30`{|<^4*UyrLQD zrF%1YiOO4#`L9sP&r$F&1#&D+KT;SFmbJg?BwE|5Dq5KffiND`sqE~t2;88g7C>_cB zXN`9RJW7Xnbgz)SZ)m*Z;GGjZ;z-^JjTc&A-Y-dCroua{@s5IruFun@XF{oOr^b68 zygI?dqhO2|(0K1E`l#Ge-x7`IUKrO$^(A@v8m|>RSuZYy_cK(cTF;%}$#Uc>yq7dy z7`y=FR4;i7kJjm_`p$yq6TEzdcb~?4TS*t)CRPqQk4e?X7RB>7N#R|q@k+s?dZYYN zxn;df(|BG*AB`Ky`xQE)nr^Ma!=pls_f3u0s_<}YkMWLbydZeBkW>C}i;eMiYrLb1 zKHTbJyjG3(Jb1FaxHZLiw60Js$5}-mZV@pat*=vg=fSInobpHgLDtK=xK?@2#qsvQ z)EeV`Q{#ETllh~0M(R7E@qCItOf@mysK%=UPxfa_H8Ebd#%l#n)^nM{!%`JXImVRy z%~W{HHQu@aCrAy{+(Qj!%}qcNHFu z<77PNl6ZSmrQnq+JWRn!_4yPYroyDWT7`!xBq=YT@X)oB@-`_v6g?>~sPJ%^lowWb zG@g>x-*P(RW#X0Qus9B``efy_}8WS`&LIXd|M{g zNArBmkwV{1ks{xQi4R8?uBI4u5$9_QZW=8OL@w6aYF9;Uz9z^nUTeE{al}6V!xO8b zFU+1{i%fr_VQ!@Ower<;RUXNH%{G5#WLCgkIyaK{wq zE&{IY;{TzCt$GYEOHZtEtuu)yobGRwaH-ob_56^pBvd2eah)7RhQy=LXDj33DjOK7y* ziH-*k_4f^9gJ+tgI$BPOkucpkUrsGzk6VJuXoXa(tkkf4(++#j}zB> z!;98bFF-&~Ul-OL4UhEqUcY1ao>;)1P>2>%UB7BY&86qQ2i9$%Q_$=EtLe~pI?KIp zcX$7uo?h*Qd3kKQl^g2s8pcvAS`o56y$FK?!voy|{Xf$Kh3I$m5hFYNvERKv)-?`GR)N_SD4NRw$whbrPi{sv8iJNegJK4^)70Z z!y1?M?d=`wH#Tj=0-%qyHDe{)hK;SQ>)P5Ox{+l5mS(IHlxRa!+s#dF9JO}%A!w^_ z5vaAPt+_SOWCjHM%^hpjH8w$ZbJN(qSWt)%B`;W$ zw4r@nTm6j`k5n|TZEtEb>akLBV?ECj1vX;kT|AQ%(%RO1b3NAN)pRUXBpWw0b+i~A z8(P*;_FFd$_*d3rcBI8ySfSP(>>3>M%AZ%$FwaQiJ3bSqYe(%;+hzZPI|jX_T;6t> z8JFH{rK7hI)kaEsdQ7`bsvdf~B|TSTFNe~UPU>;omvO)SW42}&8B+QB-`D5Xn-`K7 z_xH$$A_S3575Ysq?rhA8?Q8&Ysxi~qHF<`H9h^_OGM$61RrHgM26Yc3orUhP$ic8+ z2m6Fn#r=KLn@r>igTKD*Itf|jny|F8V6)p8W?IWSyX6&*E$5vcGVmS*` zuAjgXq?@r;cwi7~bem!;X_02)W$b1aY1Ob?hn#HHVY2mmNms)Czi+Kq()N&*_dZtl zRWDmHUyr(3J-xSg^>%IRV>bGv;$OPBdL_$@Kku@vyc}Dh4cq_iQ*EWTX}0OMnHlKk z^bpQ$^tHN39TLFF-RB`9GJOjtM`IyAcf@}ypgBP0wE{boROBlp%?&D#e#fVAEFFd? zcl3=w<&6S(O%eZB>gy3aDLM+Clu?+xzD48FdW2tR%2;MvgyzAfa^E9rYObkX&Y71#GbvKZQ;U6%ScP5I z7f)v!e|VC4`wSfQWQ-jwJudLtiksE|5}?FwHc-SyrV2u94S3=HamZ!^hle}6?qva2{@3(xjmWB z*viegWRHFZY~Ei8+}AK^A_G!qs5Tr3g~MYZsr|?NeV%!L{MJ!V$+-7O>Em@XC&Op6 z+*N~-+}FhEJHMD;e{1LupZfXFe)^Li|J&Pd{pc6oCmxyk$f+4s`y)B86|OQ_IS{}0 z8WCP&2dXCHyGmKruE@-){zzL@{zU#82Vs5w<*MzGi&ejw*z^Wln1K@(%zV7@23z#I ziB-nm2ePAV(QhWq&=&)%j5-fleSi6lzYWyQybqS%%`)Qrrh|6x*q*a*)Y925w})}U zPiL6f&yALcoqp89=;?s%#Hc6w7F!sJB;z~_&RNg5-+BjWp22A`e-r5p?=+a*eTcNU z54|4Fv9CY$bhyyJ(^!9q`Ibjm)zZjVL-qMAv`$8}%*G2NZ$6j|=JXPjCPWj0>VfxJHj<}C! zkGrY$@3nhpM7^(PzyAB^+tKeuzZBgSt%>@g)8FVbvOhKUkn@CdFOKEdYvwWuA^RCBIqAuk|aQ2Kw1bcJs-a_rL%RiI9%9eM+2Zf!aAIh=lVo3Z5(s|rNed?WI3 zL*sczxgBSr;B=$N^l0ZuIdt3nkKdagEiZFd=;gCV?6cj^*rK-CIkDXR`CG5SA3JD{tg(ZI-iLm~7T$VE z9uDylH}6LWFlt%ZY~*G&bT*s3VdQm~M(Ef9q33|>K*mKr7C{7|r*;9{xN=8%}<>we4ZEO!Wdsf=3{htrN8D8ml@Km+GG7G28m3#eEqxYXO&s1?nryOCv%!qow!3iY% zUiQ^D@qHM5H52_-x_eIN8xFQ0!WLCUe#_5?TkdTQJ?R|}b)cq3%L{L3-qzd4Z=bl` zJ?Ji9KR7-Z87$vdIMlUo{m}SOWXQGFUD1bAhbRxsmow41kJ){r<@=m|-zb}Fi`v&t zx}n-|oTTs8-WTy~!p{rw;;b(7n>C%iLar8PZH?|DEt$-PQ(@@JCeGl=WaepCKAde- z7+{avI-lOxKYNRReQ7q`&dib7t1PuSM=^u9+J7{WgQzYXE+;TO8T_m-I^ zPJ%H;#~jUUmUEQSGgCElM6x=5@>VDR*L_Bwbb{wW!xd-}}5qo*jP-{8Cd^tJgo zWrq1?M%or-L|$HGi_BQ$n5gCH+VHCc%@cM$XEWc7h`V{LAtyr59$Ar`GCCP3w>iHC zPa+e`jl8H6zeeCrHIa!kc`~D!%>|gXY!mjDV;(wfh@O+Duwt~o`*dat^^*hqPL59k zI0w*+lY-P_{^FszA z!~Ghc2rV}A8;U#cGEL@Rb-u2)p476@uK`z6HcDGMv#zi1w;(kyS6k1j4*J?A%VU0L zq+U^mzyA&U|2^`rs=5?Rx%((E9O3a0osIAnkszg58` zr=DjzQ!WvGDJ40LT+`Wk`V!HXK$26dm@Y$;JGh)$-*gU5p2_9$o|37_voxHoVJDAI zvy$nYnmk9tus4kS#`ELSYHuD-#7C$UC>DL?dEV3h^iS&;>2 zu>VrNp=Y26{M3Ro*((;D#lB*}+3ctVJJ}%%&S66q>|$FiIG6b?*ux^RzCk7U<;63= z^u99_e>T`>|C}PXq2&)-a4{RO;1agcf+w>NS@0BAZoyNTYQNWp71uw*$7bnluOedrrDjS2egbb-J$2I#lb z5`n4D({HDEz2$uBQ)Dmu=K@ooCVSc671-owv9kixEJXIQpB9+`l*xvK4H4=Nk^Faopgki;>GO~-z4nW-YD#t z*28W%BDn&l{a6l84CuC}U&fcQE!HA%9KC-z9%5_UK@~aovjFOv zU-+LPA3t(FM}8;L#keB<_mjUF?o7pj(als^kX9C11k3*`37T8kdJsTk-r-G zAio*qCm*~E+%++iD7U*g)_nNrY zGv=jm@I!)^N4N!TOa5AuhiT1>zeea?C(^;U!)l5r<=w*0?G9mw7MXI99<(#(;fM3( z#GfPZN`Yqyj7f~keF85Mc%HzE1)eQ1zFToVZZ2Fu{^7Vn;2MGF3cOU{a)Fl#>=hW1 zdHhO&R|#B&OuvVV-U7M}@H zOsxb+rNNFheY;zG_O$fwzJ#$MxM#R$;EqcLFc*Rp`Ukdk^~cRonl?g)hnvYDpES%V z11T#>1&vq*lORrG1IkgevY~HyTvSoT>=#>}qD4kV0-U20d+TsOM| zHqM5_!nEP`{((EVJ-lAFgK8WV*|2B(c398@=m?_F!akuyJ-w#ALSfI0Ghk#<7~xY_ z?3l}1OgpEfx~;dXhng`__?kWa!+ptw4I{M9sBI`_jF6j7l`4faiQ<7?UN5XONJJxiC z>xX0W+YXdhni5T-CaHb7q$}5!C6^>MJhwEd;kl(r4bLr2YItsGQp0msX zN)HrwCpB2RGpQoFE19>Qt2A>J|C0JYx>oQeJOkr@{;UR%Kg*EaCF$^J${oFfsJ!dI z2}u%s$#ZMGXThWQM(HH)HwaMmy$Ig0B*B-wH#AW4A@$G4Ry)8L1Di5fTig4Eso>yFxCwX)x3jU8d;{6Qo8`4QxSn#C2hDla^vb^&U zQN|%1+rYa{DpO=S?=#@xRU+o34xRU7@ET*Rcv?Ddu{%9|cY>FWzOR7So<_PwSlpP7 zzMIqJJpo=Ijdb5gQ{P++jzszEMukH~%=Lqp2SnfEn(*fke_f&|ILs2rQ2Pxc)o!CnLJEM7oqf3n=8jH>5n`k-sZ+^45u%`M`Z-wMtAQGcI@FqQWX zGDqRWqjabog!44s@4%z^ig?t=CGS6Qt?Db8Vg7PMJXt5C?_V_Db>K;TG@PWq7c^cw zcvL>pNAKN|cUM~G_)=f5#v4|6R6faDukrRP`J?x9$)h<@t(S)s zeY74~^6>g?;XSJ8qjD$X9aDJJFO%_}Q+Vh)NqH|Syy6tR?1W`8MBg%$47lTl2ki`O2l{CiKg%`7SYd>ajK7 zf5MK@nx}vx+%xmdQ)0c^!gnX+`ZKw@3+uF+>uiVnycNz;R!*zJOvW!y_ZiLM4L7Z} zd5rPCDa)TMv)%G{TWoW`QTpJij143k?`yW@8Kuh|x3W2z3v(h_3$r8H3-6l9GfI|c z-*U|J*@lV;T{~|1G}dQ%YK-g+B6ECUY)!37SBJQ%59e+4rAK#yjwrl;GFPO7sNuR zROh$VMjeKGdEVw3wi#tV*iurR+a}{=817{+ZE`L9)>dcr44ZS=54I$dr36GtAnoK;h?|M-g%%C?21;u-KYvKUmC1_ zpwwCVGH-oKpWJ@rGf(8yN2}XIL9E&LhMl(`#roO6Xcu4M9vF>c&3mSoWl)Oy5!ZRz zhSlqZq5AOpP+MzwS6ILhGQW!P!7@|Av0o>C#o^PAHLPuh=6HVO=iyZ-jN zFsmHDz2tVU;fNNFG<#TC;q7Nn9dCH|75B&}qm*FU6P6K}cY1Uwjv(F;ev0jDW1pR2 z-`94{)*jD?{Oq%Do}!Rf!iPOl@<_PY&z@jq8`?kQ+R&tN4Q4ctjJNu9v_|Q z++u&caCLL|d%+y^Z`bmYTaGs5zg*{W*0i?SkGvX0?rg47+wrV&TQ$YZh-Q@w9b8i; z_Bx;*P%d&8Pais&aRhcC3_EJkHCPu83_du>9-U>dIiDDv#dE+GPm9==U+j$|Ckzo{-<*f+`!dA_yf3k`X%?(*cf zWgIE&s|$}ZSE-}iu94%hehFYxEsYwQH+we!&E*aJAcLN5F7b_)CaKIvmfGmYXx1S?5&W_na;< zG7Sb@?!jQVb&x&$=xCo&%m`^w#`@C_T!_@Bj-lhJWqfFg1=B=N-HOD^5-{U#j@T>EgM<$^qr_7${+vKOV{F{dSSMTvm zYRfz_fwr82G3zRIm)nn%?i{qHyWC9S-M6sLIhL=(C$kLZ%^t6&k-Ik(4(x3XOf?P! zLt!5@%*A;07!It4wfiz)?ZX!Ny)S>_TEq2t7SGuY0bd1iO{N1DO4uAPq?D#}d_~mt zxX%b+?ilgZZT;)547(zh2C^UK+GlU_XBcxavt}%qHSwKkcB2IIpbhJU?elXYQ=(6g zbdOA_#_zaWiv35>NAjanuqNDH(N#veu|9Xg^<;%H%`o%fJhIDkyy5T9SBurw`H|Aq zW(gh-9`ro4CHsj-8#2#3%T0McYNO5b$SGIb?cpOq-|WrUaWHq;-ytWNk%m%dc^0p; zpS*=pIC?wkVZHybr*2E15g4_3oqOzovC*BzPf&}vm-}FU@btYW`wi~{-UIBBr$&E( zK4i|&&XevlS*T~6y?#0);E1q_ndPNCf96_Z%*||WpgB^07ppR`Bc}0uWg1@|qh*a{KIK$Jq1@4I_Ddk1+q(Bc9K-HH_ro`T@)yjOWc}II&_nt|N4M3gXX; zOm04Smv7Ea|3g9h?72%n*M9J>hk_YnJN=()qpO{MQ=566ySk`MhTCSBfc-%5z+IE8 z`}}QaBkBc|N+`B2+svm-=d1f(3KrRHvz<#n*JfTnIn%|jGqEcErQko?^MGF5_pP8k zSZSNS-sBt_qcp#|?;D8wKxtNa0k0dgG_pQIr%O{r^F^k_>eD9b(>M3yLC4sj|5?=N$Ag3ZMzoK-&TAWVp&l z`I`KAd!&}-B3@y{g+9Al^x4&@|Aw){?67A`o88E>^wxNKR~t{}v!L9m^&6_gX@P2t zbsP4}*{c>zOkE?#uj7j9jFr(W7@GkqP6TP5kB{T{cnF=Ih4R-%4vw(-DJ;;=6#JI&2#S#!NRqSbq4r>cY0Jee;8x{YS@Y@jO6rx***Q>GGP^ z)~E(qYXY&yUy!bVXZR@ZCA)uH)spBVMlh;@$Q;&HXZ0Qdg?ZPw>21bPnEg z6lBcQtLI=IiTR z&%St@G$LQOURl1>{=bmxyZaOL1H_e-P1Qj^@LbIpQgu*Wy;mLHtJI;kQybT@Uv8nh z>N?r_KIFyJadml7%k-J|sZ8d)a`(M<^p-2>D{5Xo`X2J4>e>4q^t>PaPR&dI`;?bz zuII|@_x&i(`>o^u>t*qvEu^~_7w_f%uJ)C?xvr}l)9+`V)b{@0oWIpF9eW?^`Mu0D zYTeLvL-Cc5Nwv)@-b0(Kc_E#+M_%#0TCHQcroN0h98WZ>i>W^*aQ(EHML60s+oxdq z0=pfUx{c{<%qq8QID_-!Maj_Q4lbw1Xwx|~c_x=rHJUC{lV@>xyvnmQc{Z0*moQzn zCUyr6iq&r%e_*}rfTw1E|2$zQcXUM%jprrbkj8XbS{tg zx9OUEh9;k($vs?7w@A}@GeBXO+H7H&*gHuEt_txCZDIt=V@}Err*cbDf1h* zFKxkgHr0YN*niTZK;dXl`S&e2lYPa4v)E@WIGY`^U?=Ob;2c(O!7eu2f^(U}g7esq zltqcOXa4UjxPX1mf+w+23wE;}3oc}IMy_-j7~k0zT+E_QDW%`BOW1Q3Jehsmf~T+n z3!chWTW~2`Y{Ao*&4Q=1@6qB<;WF3^cEW-^>@Eu~V{0sUCabXES$t1uT%VV{uB^$+ zVCC$~7F@yp*n(%XJ1n@8t+U`ctjvPvvJ1-E@(ft;eaV7-Y_o#NCcq5}wz1W0wgtB^ zrv)4-J@b&Cb3%-HfX~7?6ofcfj3=6Jj3oW>T?-P&b*U#u|Yw2t_ z?fYLXxRHI$f}7YEEZATVTkwtS4hs&jTP?Vm`7QV+MrTG-5IvKTd82<7xB_8zmdVZv zOmn;)E4UA0ejq+QQ`oVhcRl7y!gLSe_VER#VNEt3rU^{X7-Zw&sL)6EWU|?CpTP7C zK{gw<3rx>sWV699Fg=46*}vwkGgOhifc>$+ z^vqNQn-$vyHuG1=t`(S`d5Y{sEJt87f5q$#6pYGC&onS<&c0~Dli42#OwTMu_9^Uk zfxR40WoraB%U{Z>1>Vc$(^!VURNqDR>FhPkXOy0aXRt2_OwSZW*vx*91(&gP7XD0D zDKI@F6xnC7EP?5npvdlJKfwGIZ@+T(6@ia&c?J6ufz9-1vk?ofWa}+>4x1(Ly*&P0 z_V1X#NWY2av2P1(>hrOsBovNpBzQGU=P5`>@_&&4KH+a`_|G-`ISn6HFxhmtL&2o4 zSHmCCu%Thv!y%n+BZ6?H6v8L{Wg4b&BOS?=;&K}ic@Vn(#B6_igvOkS3&?*}*fjV@ z#?Q@g{eu|Cz-R{MdI@Qgk4mDo?=B1?j^S4jK5yD}cfG<`C$Jsy(EWIN)W3*7Q}}a5 zIE_o`UZB-;3m<^1n&`|6wrvX~y#shF-+^#a~=B>yK-9)v>`&-cHJc%^7C(nIqJ#V?_7ka+u0IAIi?mlGH&IFIU) z#}l|s;LapCAmp2be2T!8guiR<-6DNGLhdCw(%nWr!l}HJKbbG-^Ll}NxsdBv@_7EB zZ@bVJ68vF-?-iK$SLoyZw-~D3{6hkxlW~kfbN;OY z-zV@Ef$tZ1v%nt{c&ot3Jdb~iz?hsk-Xt(O4acnlKPd2^zz+$GM&bGSxWJgiIQ|2H z(J43{7r0yChXw8u_z{88Se*Y!fp-Y}sK7yiKPB)^fgckXjm+c!p}_qD9}#$$z)uL= zC-9R3-zG3R1uy@wz<(t0kief2c(1^p6?j14qXO>{ctqfk!01F={~ZGF6Zm$4?-KZC zf$tW$Q{a09ZWnk|;Ee(w5EwRe-WQuG{tj-A;Uj&+!GS%nhcFbvVT5t>DY4z@g4Z&z zdxsy#W_5MrfI^&O*w>96=X-kNCQdFNp|N+Ud$2DwJTRC%R)QpA#!d7TtlZ0J-!ME7 z^6%Riw^!8Y40|r5)l@=vcZh}O!bCH17*4y9LwXNT@g^{qRWUpl7P@i6-8~5}j z%plRZ8Iw?dueH$0+koO+Nt-3+U#3ziQi2R6s=G_6Y3Pm{U`bHTracpWaAgk}0O^Cd zjYKIog}Z}YyLa@$K#*$cM`_o_zM<{`SQcp=?AwJyI8!N0Ol=rR)^w6@t)+zdOiaB@ zEhUbWJU_4;vb}F`R~H>U8mlZaL_~dCvwJfXY9FW%#YY0stTuN<`zWI&5l33VNlg>B zaAZSU6 zV9A!vku2M5*yk_-~K$;#MdWgBV}k{UvCfsoWD zG}rY-_tIQwP0CH7q3z0cdLeb%O`Fu*mQa$=gro%D|2OB%?wq6D^~$8=J~ThA=6v)0 z&o|FAXU@zw-%#mwQ!z^YiQMB*jyOgyLwYz{2M4;Fb|;?sI0WWCj1Ft-aOZHMR~7(n z9wcrh2V`elWzE)9r>xqV>YCq{Cy|*L=3AIahxitZWq5Dlit({^ zXrB?x7)GbSnoDBH+Db&sW>}ggnf!+2X)q1rDSb3Bq`^^&A-sU38osCEOGEb*5M$Ur zm1`QZPi4!)_2gXBP<<-IG)zyz7A7SHE7kDa#Gg7eH?gh5a+x`0NG>yz498`*X(&FG z!H3~hJ**10V^`|ir|@5#osMJE8xm*MU?4j@&^^#U#Lpbz|Ki&nK2oE3n5O!8mc9l7 zk2{(lD>tsmvm4jfTX3xicNskLRO5QK1&684q;~V@{98<+^K}cl6;pKF{uN!56Y&Zg z@FIP$;3kg_G2u>Ic`f+PEh^+|A# zTX2s67fgcdx8U9ft|tku!Gi0^*4K;$ROI&>3+@HrJOTt?;OOiCIln&yE?K?(jRn_= zg_Lj-d0(~QqQE74K1km|j`yt;xF!qEg?0bBB=KHl!PTe0{Q!~5@s0qOEPbafxJQ5+ zP7?1?3(l3JuN?`fDCa&4?kI4{;;pyfo(1k%Aq>8dx6p#ymYZDO&u|Z*@&0c(1@6x+ zxT7g>SlThkdltAO2op}EuLA*cymeSGONOJmlyNTum#kbqWAyhTo)~ZUGyaL!34 z^2UM7B)@+NT(W%Z#(M@sj<_q=7(0b`;a3qtKRbQ}_|e&87*fUEYs-yrgizfQ&V}Dv z3+@7N6b=;<9*@8kTW~*=a=h^w$_Iv)aoi=`AeYPI zzcKdYp~#!0apM%wPzY1i}aB$sGN`W5)NH@9QS>6 zHZrb7iWgmL9QO?it_?VmUv!0W9NE*C<@HPPY7(y3g4-v>TOr{{&rz0l0JwVaDZiBx zuEK(QS(3Lv!u>0*WqGejxGD+vXBOOf3Aa$fJ!rvQ08W(4A_=$Mf_qoO(b!+q+iD9g zrzX)}s6P@o%9EUr65t9DM&)vC8eElxTb2fgWy82UydqM@+bH4C#ihixNjN-GDRDg# z4n>p_H!R_BnG$zE!quk1JtE;&rNKQd;i#@s)yH!ZZcQ58%MxyF8r*pacU>CX4<%e( z8r-`QZe1Fj9fc;^)%9s`B@*t2G`K1Ww>}MSwS>Dd4X#nb-INB`CgDDo2G=9u>eJwc zC0s)q+yM#aO@n(x!uitRo|bTpX>iX;xTZ9?mnED(4eq>zyEzT+hY~K32KTOnYfgi+ z<6#u-Z$lbfiGV$<{&nV;_LyXqXBm5U+N$W!-T=m!;>3zHfIOf zlI&>2>pbV!I5+ZI=>b^Kte;alXaDH}ZjG4GWY0E#lW*j%;9RAAUdboeva6zONpZB? z?}GjIha%5;bI;|iI=`LaoPwVD=iBOmM6A`tcZ^3qF{f|~SvFNw$M99`Vb$i z-_{cO?a>gv*M2TxViY-{Tt>95%6TN%u9FI@EjsFlHuzO0-@xK{GSsR@g#%TR_( zf+3#=7Rfug%~t)4ge8#V-iG>V#fb{A*6j%fYZ^+kBX{|ajp-pSv;mxXU{DR)*s;!$ zTYa#kjL@TDZKPlbR_%xS{8{{o=on!Y{R?m^gRihPVYmJ&bVTohET_dApJ$u^{#Z_}F@^x%XSybqs8|y$gQ>bN=t@aDAv&u3fJ-N*hZ_Z?P zpcDDYRvIAJRqcYkb!AaxtWbMpNUup{#bePYFH(y_n?e~lFmSyz@!3*ILFJ?bR?JUnTFUmY~C;R-bjyIPtfwlJ9;P`mqZAE3- z?pty4#H-`SLfP&~Tvg2*KlJqJBVOC!+<#Wc4cwfg^5ZU8wi6dGaRGz6XcUCAz zov|gT;llk{6~~67!*-Oio{B#~T8n9L4fnH&-#eAh(-}D6KB`tJ3um3okEiuxfkLF! zbt3m@)`^^>b&=6X#H&myn)_((qxr{`V>rWNf%;6HKZo~?S^hja(PBja^-_NX&*BMZ zl#QJ5Hcl$b?NN1kS#(9rG4kHUrSx=_QJ(FdTBO@`cu}+J&JMb6bCr3KzwCR*@W1)q zmqJzZN@CZ<(M6uQ=jJxU3i09Wpz7Aq;qrn?^(4tETK)8Cw1)=|pj>bQ$C2jpTMxJ& zC9Bp4yicApQWSNaaD?0e=QAuAE_YNokGf)Y5wyVrcFlD%vgfb%WTTYy{EuA}WpoLB z>fuvNE63>`?xVKv;I3mq{{si=HV1jj$w$jka0&r4tQYtBbC0|3e`vq$HTyB!QE^U# zovoQ%G7|JFd-_Hi@S~PW&siUyhP;}F?Lq(8o|pHac6sZTB`eXas=2YC|K(A(ta!3< z!BW5TL@qCJJG0@u8YP;$Y}Tahnb}7C?xSqke1w-Hd``5_pEq{378!hPP(|K!`^xU4 z*~@H+6C~p8AJ5XHfjFLzn%CP%KHBszCJvoqi-I^O;@e|tmFuKC-bR)M=+uJi`~`TH zm);WDUmaw>&&t?5`%(KdPPFfwFY2xPTD0yZymjA&p7hwE<uLT2sa~^qz4rNE8FTnmJf-541~qy^fb#D;asB4( zqjkZoud}jndDhXq6UtHch1|!oAI;(U&-2`jTs0vN*+)tixcztdR&JadJX>0SebLUd zzOzcv`C5Jg&fv%$p-+TM_w@NaymlKF)WV{-ewqXGEX4hX4v!zozUGiuc>`&_U(XTR zLUjD_NpBhW*9WtYB+6#|@YCgbX^bB-m&OUBG_s>X|G}|3ULx7NL>@f+w-?bH94XxI ziuVV4e#fQ$fNFfUQQznn&>t-F%eB3V*LEj+r3~W_KU0tHAKmWqt!zHJKRei5W;;f8 zjW;AxJbtL8@`(Rd-;xbQu+Cn;E_>&zzE_ok^X^A?`rRXQ_B4-tVo#_4jd1Cpa~JeUtgYIk#+P3@wOoH z{m#VrsT@C@JOXL=&-2gr8|O}W>L(X(D5)q4cKQ;z$wU3(ERLbUkqtwyjk$(xC-u{C zaPK}U1<|6=!yJl)%L2$*kR8n#tM#w*2aWeq$z;|^5l7x+&hjjjUF1;qVf3_b%+egO zyZr9uxzQZ_>`2pt_Z+$Zm3y3M&3fI@`6;t1-n*Dv@pJwLqPioOux+o8Qgy5Ev}SNM zcvH`Euq8RmAz|x$-V|Hs?@i2tNsdBpA0MNFxPAC1BWLE1c^wxj{d0{JI$*J0x8<&2 zJX~y?B&DC61XEyJHfg?m1zG-3?>s z{n#rAZz$B?hYb|i7J-dNL)vnk)isFiRyYM5TMBn{cK6=6dti63wtPVTj+n8RK4UL^ z#$LK%{=9Q|@6bwZdGlqpK=;nrOP{fq{u{HGZp`U)>u)K2?er3yjd$|bGId{GQ7&^b zr{YwdHkaMyaAmoiy4iGEw-W9#TznXlsG1N2|5sd=WD?w4+^>#K&!lzL6nT<~>BeMRL$NvE)064SabfY9)?6o^uUn&FP^g6!xfbAd|Y@c3VFSiv9_g+bv$Z4tPGOo<*wJfLOHzbGFs2YkB z=>chSYn%y^>>t-kG=0Ub1Wo0uJB69~D(7p0%~T8D#`)A&>&|B3+d02pu(A4Omha$v zdI#&yVc}q^x1r~lG=hORJ zcZC*y5$DspM0Z6Nelh3M`%8Dl7JdomQ(vUJ5)1z-&esH+U1i~4&H0Jv=4uOnHs@2{ ztGn42ekrE&bdDV!*;~z(+CSOH{i(DDX+!(|OA~Ele`uoZ>_HRlU^`887Hc!nPIiNd zb}`LFXS4SmM$&ou-0ZB0p2bd?=p6Q-iOyxTZ%a5Ete>@-=zO-^L>I7J6J2Psw@UVL z&r?Ae&c=$_3nsdRec41`#SWP0t69)Q&t|PAx|DriUfe~0M0$L}DX_+O(nMdwe$PZ} zY_Ex~V4pP6m5lZ!38%0HY_W;1V!0-IAtU`e;S^ZWd&5L8W`Am;J&g7h38%0n?68Sm z$_7nzIooEUuVpux=w+sIgrQUAP6hGNZz0shl&nA1Rl?F|HG}%i%Z^)-Um+Yg8eUQ}0 z7O6Sx_Y6MusYPlo+hfqwhmw8NEe5UQ(SI5=^^rwt0n0aN>Jy99LiP?4PFbKnknE-Y zjX_hNSELp*vEPvTII@@egu&N1eHDAaps5cdd#QIBH1%0U>TI^fplO^`q?WSHMtOk* z&Df0=dbx$Ju+UD4CY{W;Ns!@4-d_p=KGDxu=!Y!yu!U}yXp&F5D#DRG(sdG!=tSR4 z^>4NpO7uJdhEMp!yF#a>>~MRbRF3Y?>T<9$&i9kKyN&jGNFN)j(92i`oI1`}J^2XV zP4^wv?JyF(g6Jc(4`@I^%bu95!z z`kqy~|7qeQUMfH02gtwQup@bwZgErR?z9?vlhsul6cN6(Y-`(UR9zc0Kb|YN{M!HJKe?Tu+ zx{u1=eISuOT=M(AK|bPn3qHj|BI{Js(L4<_=*>jn3{O!q@h z4)G&Kxx%laaI}X!BfNlo$XjI4y!`-IO}K4FyIE_{T?Som&>Ic;xryQPPZB~3YXKj8g!#UBl8^ZGw7`bjmqNqHiL$OCZ}&RXcRi9 zZ#QT(T26o5paTZ|34^}bpzko~CWHQ@LHiAQyFo)CkIVa%LDw4e?-(?6#W)|G4^KZ7 zTshrg&`<#7bf-a+!s-gF2(5tf*I-}Q-eI!BH#9sr+}Q;`D6R&3`&abzcI~|rhPXO+ zB`li7Ex2se?NM%#?6OI`TLy;vcJy_d?bb>B=G{GMxU!9qLhg8htm>NoZ7@(&K|vKkm9srr2L*5KaZo`HMJW(pJR6o%{c zdv(KgXmheL4T`#RP&dnY>)zhIy_ZEb?cPJUDH)L^HTEXQAg^0`cXjsdhMCWnf$q+J z*q_|mckfhT{=r@;O;h6HMJgB8(C9AyZ1r>wcd`}T1G{#i%-IUe#kb$RqqjW>o1DFa zc**v4RaK!u!ba-|DZBuwD4S!vi(vaAU!Mm!} zDGTTSBZGIpeZz3lyP7&!={;JKDmryq~RHt0||%yO2zc(My-^Nb^ok&Q83K zQ}LyD@l;6sO_n?X@;i9y&BQgmf2TsM?_PnRjwk(l*Mv;*&XqBi_w7`c@vfc9;BQbl zSbj4m-m$3=;{BS6FW#*(KjnK>23g*zGHc5Fl)p!>+`3kLar~pTu63(TpDW42@S7Zs z)oENVoZYynwcvUXPTy6+30$@XhtH~{@_wY6<9!~uMj;HokoS@W_da+}B*A^rf_og_ zpsh)8VGHgp;P5FGcOu?y3(f<&G>%H7uhD|52VIf`S8l{?ZN{t`VdO~bHK&W z_wK-TAAa?Kn@scbd??nslHAx;`VR78=TW}YELzcNbdZ!3^`z*M3f%6zRyu#wRb_=e&GEpv+ zP9cxR19Co=NjM4@xKayly@bOnEROqU#VoG{IFS!@>2ci47F-W-)!A7F?Ai4_!kXNAl(Lt(N3bd$8k2?GV{B;nqv?%G2OlB;33-xa|^dei~fA zgu5mUZl8qH(%_CrxQaBm$0Zz^V#;!PR>D!4+3`zOelJKkT&BdmCgB#Q!CjDWi_+lU zl5jMpvg4O5eeX*+Pa0ef5+&N{k~Fw-3AZ#2ZkdF;HVtmQgj<#d*COGTr@?KPa4XW_ z`XwA~e@#_>`y^a-8r%^HSCakL`xY|UBnbEdx3YHaT1|2_YpU0*t6jb7x^t2yef()>TZ$h7w^{$gVPDYiK1cZSvDC4Pooxi>dwW7o3!hN96)6g$$5lo7Zh>Zx)x)=IET(E~AzPLeRXrt9 zJAMV8qUhq#s*Qg!=TYyXXvu{depL~5U#Q-2XwJN-vb1P&PE4u9ot2fLf4-WVJdu%%q}%!1THNX?I~iP?^`WlH!|RME81A6_iuDXXum zKWsa$gui<6s+Nl29_*#uc=&T(_hjTQ=J{f@0k$QMM++)#d`If%E+Tc<1FCY$!46Mq z$Xk8gnVrmYFj^mEp8Y7j>_|iDk1pmd+;@@J0{$szD=Kvs_`NrgS9O&?pLRhmspd8i z6wk8B60OGH;44RpT)eDQKkagTb-Wm*q*f}iEy~&at2aLCb$#!ujjzp_6;)uTLS5#J z+LjeWuf={xeZQh32GzDnLD~H*=0x4WI>ho{P1Xk$Lsq@=t$cxbi>Hy&M`@$I*lumM zzc9>}+oJO}6h%JI>(-9CEvd}&-|j2h;HWAJ{!l$#s$G9>{3~8H+Ee}&@7t4)j6duB zm$MHaddB+R*4oxSd3M=!=amXboE3@Rj1G0V)Iu8 znU+&lfv4la@h@Rd?f9Wby~)AB5HAi=)c&g;9qV@iro_B^3c*W%GidJ9u~be!g3}C}&RSsmPY{hfhBhUJ(3p zTdn(Rkp;momfeBShk2;F+zAG0w%nsHYZQIG813O|3mljk~%uhrL zs&it5(CR9J>~N%wES50$cxfQ?L?m4PM3}|$7S|b;NiIzs@U`A~GJSFFg^~{InOCYLA}dk_Dge6-=P6tL6q@ zMUV07PPQZ~+Kj%!#-C`ih?1uj81?2vy>o}iUz$;P<_|uCD(m*?t_4ZC> z7J>~R1y6I6FFSyV?V!hKTP|Mmj%c`a4u5Vne+Xq4;&*<4{^*Qr{^q-!%A&gMTk>oC z$Ld|)>?rPEb}f2Z-I@Z~D5;7mRqtMe{fEed-ucm2TpOH(U*-Q?eW};Y@x@W~>&i2U zJ7(dIpW%*h)N ztm9{#wrI@hnp78Vh^fcJ`8P*n4&}UUp)Uqaov7nD^_2|mT0zU!Tl!C&i?Czg7QGs8 zZ6{h}(0^t`@9mUm{=&tvQ%>7=VZ&oY^*GK|J01Mm=26Z%7M8`bR=QxfAUyIs>?7G8 z#SZwhIScb*lnN!PIql~u1zAzeVgIfpz((*sm~^2Izhjhxs_Jz~|38X-1QczYPhB0=B6#}&8;i9Zt<<$Jk;60vUemjFbGo?jm@|C zX7-l<#`cy={c$({SYVgmS+4J3rrA*8Xa)v@fsF5^nKt2QwxFT-cduy2qb7vFKfvWk zyOoVCz|%<=&Fl#mz=dfCFzC!=P2G79Wo^ikb|_C%Ru%BVRb#5bB&(tL?km}qE$8)l z2>&pa0c2Spd`MZE$SC|*xGbqoX}5Ui^mbv(X*5L{@-6pG|kYNX_fsPe0rL6r&{n_K_&*l6?`f@G&JkF<{QFnP3em>_XYC7M- zFW`J?UAima``752s+9I~PD=Gp`(Gzaw91Z~XdAoFMBCX`6YXGho}F+u)K`ItcCvRc zK`fjNs|-;Soz0#z(Qfud6FrNKnCKj~%|z!iuZhkx?f0~?eC9Oq3)mylw;jXtK+ zM>fqmO!RE#H_@eRnTamrd)5;7&tdPypB*amx$N&ubUCB7RN)ltetX75&&LO_;L`oq zu)9sP#z<#MI2g8NUK3r34{^bz`%759iC(~do?wH26+4UaAqYJaDpvRYt3lH1%8K~o=6gb(S*44V23+VAraquZ&0<9cP0u{-5B;f;9(sm~R2Tb_LDMry`$6w8@pDhV;zP{?G5g7moHLepL|giGI*Rk4QA_XT%nzxFdRfoYL>FlISbh|48fO zZWIo!ce$~jN+bVPeSe^PJFZdgZtNSQ^5^@{$p5&pUk$izgl{zV8)C8M5Yavc1FSl( zgXmlIkt5w7F~aL89QU^wG}RCBTMU}YpW>l7;cw zH-rGf+#8@fLOzIB;FFwkgBJ3I+}|<6sqqnx%9ZXD@mCTJxs+a#8-}l9KN`Ks)e5~{ z+_zy}i}(QXblz_4AB4Pj4IGzOudl(=+#aXB2931@PGga6HQ^T;Gzd;FHt015z0#o9 z8uS8#zRsYR8Z-)<-;c#gE`OatV=t_TB5}z8y~EwXbOqoSfVR<4vKYuRCz4H( z7-je&_loA!l^!5#J>KxiBZPQArq_1z&&;_&&40rZZQT1WV zsLY6ODD$?p5A6!I_YJl8?(QBO4UzHCb~I=s{LbFt_FbJLGIM9|X!{Tvb$h5^M)mYk zMUef`y@P$jWO8)J0J}5s2uyeT)|%>6JHFPWVywO{B`4)xu$k>ny;U{8{q0Ukx>VXx zlA=2mn@!AJsR&KgjhgvMyU?i+qx+o7Nc0@Zd5M16%%9q2n)&AL(#%WQRZfK^? zq%P9J6uqC`x20h6uF=e!+AV&_?LVgZ%a3*o5VvoGAz6HH1&u2(+>AR6iMgAP3mG?p z&_)U{oZaw$jW8Ma0*J>22)@8wu;9q<&e0^eQx@Etz+u=JcS7Dl3y!`cTH~lhymYP{ z{^I#1eJTvA;!enGu;9)BM`a_Nz|FJZ-UaRj0fH}Zzs9v3?F6>C2zCX6$ zo&_%19-z-#aL;8W&&Pch+?&81K$vhMA5`{oKKh-y4zd-8A+ZT}0J!%A2)>XvY_u!E z+UH8}C`{mXT5w_D6r@o&N)x$W1BYthZVVq_f=2=38bkf~HHGg7ZarNXE*0)ifC~r^ z{8YHCd~^Ftg}WU%eD=g$D%?{U;@$?XEiNr}`n(01#rsf(xbFeinnAov3p0!N?hJ9? z0xpwyi!gzZNxj_xTw@0L_%d*rl=Dx4OV+MFg?5U+xT}T&dJNC7A0hOkc8?-u*8`Ld zU$}xYJ-iA5)K&p$m!QZnWS|NjSm_d1V&d^T3IGP&o+PFL5oG zOBA?jgi*Y133tJQV{;PqL8~1?-h>5L0Gx<7N5UPm;5?GNTnTrN1y?7@Lzfhfcbf&* z3Y;iEbPaJFz02hMZUauV7ixDR9}6tFu#~=%G`OP@?y5AnCnOxrHKmI8l!Tj|26sln zQF*757nN|R>Xf*cgu`V@+&dC(ZWnE7*E1x$GwT!Dm}mj9;5sB+Wg1*a!cm(O^+t6g-sQMtVc-r>hh{iD-rV6eV8Yo^7&lS}WH^B% zAM!#XyaACl2?D;r-PuVNX!MDiK^#SRIUV>qp#q=DIfPX4k`DZGSaW;_dZ>BgB*L&Z zKF?pwwb<8gUMFd>_hmW0yA(Q^T(6F8pVY<`eg>App!HkPhBIRxj%eeL_&b^kq9qGd zoJ({cP9@T=KRdo~BWao1zOFu_pAV<78za=T94(!h290n!c_-{X?q0|u zC)KO{(3g%jmqQmYTCni%V~Zo_V}1TQo+1a%(9uu+W6M8{Q**K-f9$<)Qt`Y8UG)av zoq_tG<0$E>*RONqG$x$Wcb@cU^SEy6Ea;{xC#d|gVp^T@X`GC-haG0_);$HsX@3At zFN^MtosK9ct93nQk2|_6=02`OO0=7Oj^lM)$9K%z%}cAKV&mq3Z&vxp6ZBkt$YV{AecBb0rD=8SFhbpdkg9zjdZv0jWzFt|&B%#6 zMrWFNe6yh2y8znk4Zb3jsEg~`lH7cpNT%PB)4Ty%*Lr;6(^{DJTd+6W3qO0hGxGdt z)ZbY<--E$kuej*()9H6q<9dBN{H!vFy$0&gl8Ac|TM~)}akk>WN5{N7Uw1>h)EzB6 zPP(Gm$JtTrz(CuGgqKBHW9;F7zgVFC;-cL+J1L9W!XYX%wqgyng+otzSE4PfoZQx2 zqBRFQe540{2CY1@pFu8URXX@HgV!D3Mba|49<7dfoY4}k(YFD4)p(vhiM%)Z{DHoR z5i(w1KIR=g=Lz3~5-N+X4-@~UfP0a+qrUvW>1E-*$P>uB?e#jI_h;T9+1sHjy(ZcX ziIsk@uO?8tu|8N(s`}~4e9W5@^+ar6&w7TpO3Ke+JwMse+8B1GJk;kulXWJ~Wt=+b zev~b#iYlHe>|D^#lFDN9sWskr#(5P|<%!gnd%|?Ooomc}9Q_+ko^l@#Mz0C;+(U+Cts;}vfk~R)5Z+_cN?W0&Kg%?(zsH^ z@D^flN--RgV!*q`h@%eYVR#0Kzwh!t87Yb!LqExu zsFP@;lTU>!_uZQ1`Y!XlHK}N-ufm^KBXq_8aq_9i62Go%U&o&=lv)Lyo2KAoJZOev zpA2O2QnT$-D`xpr|JZn5E!Ctr8B8yOk4A4g{yv>io1Rgdo>7~gQJbDon{I90yrm5) z;Q?QBd+V0w+Z%kJXs>CnZQpvE;M}&gslCPDzO`jD;aY!#YSW@S?$+M{^q*c=m)D-w zwS(#VU$_;xxRSG4G$8;!*|#vAONFzV)SpgIQ{J;Y8Ocbm87r3$ z#BsNWCIk#eda=7DnnsR0K~sI}PGM%g%K6m3bf;SQHqNKI)t$}4w{w0XU3Lo}=ZYYH zdIogou<)}uzeBLG`eaU@lk=(kb?3D3U7X(|*qG5X-=EF-)RuIY&2|{&Q;z@}o5eZ| z+QsQy)@0CxC%w{26RomeOOq}(ApYJ&+u8px(GK=i6P?8#FwsudW1?NAb3bgDiTo>R zPKWe7pOa_>GiHyO=t34Y(M4>Bi7sX>CK~71nCPn*+1wG1zB?|(>z-Ou9{VQ~ozMQt zpzCo{A@mj}44T9g;@pbILDRLMKMR_Qlzzm&85eX5wNcW$tTJe7lcaZf3FSk4YJ;SA z`2&NdHdmzD*`FIUwK3AW`~!pT;B*#?7&NsZ(!1PY&^?@XF`q$G8=-SK?xM&HM|zU2 z7J7|^o@1dC&l<^N?5~9|_(aqEw{S#%SrG7v4qNC?S?Fd94OP0hqx-AklrC?cg-(1) z>U=5r{9FnuM|Xp9p2H2s`2y=0+ehK+jdK+082dY-Z!+`?F_BGc#ctr&l3#D=Bl?VU z9lVU4rSR*azljLlq^Czd_+)ER#r*-}{w>D+`^m?BrG!KLmE_kWU54L6J|g=x`Oq(X zo_y#ZQad4e)IP|k@*q9Y)dr2EGZoAZgAN+>HiPEj;Pd;C-&TZEdHfFfH|q8&N$w(| zgdu&4A-R(_&yB2GfN+uARgxT*T2DWIwSkr`s{ zi@5sT3hH{U+yr-Gt*@IktigMwv$wOWk0~_n@YSxUUdtRl?A`7iS-z?IT9%cQtrRLa zKTMsilqzM)9A&uU9%*(f5v?jEaIiJ)9{LpJ0b5igvdA-)>ScNh&zEhVZk*5*B?jeV__l> zT5xn`Vowqr?ah(nEkQzQ93z~Fm&Q6WZXa+|hQbNl=Kvy{aHoJ1JPH%n*eHrGEc!0e z9qG)~8`tCs8A9h!un2bvc@a+FgnjL}yc}J=z=?P>8s1jO!q1bTqg2f&JgFqBPq92Q6Klx^}dw2 zWfBfeA|-CUghNtO;#wpeE>q&ROE~%t7WtshCD8}rl965SuTVoaoVc{=(&VFJ|A>TG zaD<1vkO)76@3SUBz!&m@-F@wyp+0EQXxv>+mu79v>eV{(^7bSPr~)KinnkdBTQ`y8 z&%w%bev~cCg)J_9-CB)~jVM@8X4)B_7Pbf2yt)@%eyo~Cv@p|X^|V;S^F5Kn+|4=A z14&q$)bF%M?Sb5C{hsis7E0VxFu^LD=f8UTkT>V-{o5P2ch}$FM*n?n2exmoKhU0pQVMpj@H6ZMDQM|s@rL_FTf(hvUEU`!3hNchh4AA;G z;X)IUQ^hRD@9^8B*DQ0qksENqLS{~&zWi5Mv$uyTanEjleK|?GMpNfjm(`auF840K zR-vyO|L7tHD3F!4!8Jjv!;XOKMd-nVvfa0aRE~AMcnJ?4VaWYQuMNlB$IPnm%&PFr zs_@LJ@XV^PSo{6RR)wh##-k^?;_kEy!Iv{@O!-6NzJdvYUniJIT^{>K6P?dqHPHp^Kbz=6_IVRs z#MjA0kb?E)Zb86TV0Y#y@z!XSXsQ#kGt&ZJI9e~nl3m=99ha&&MfmBTYfs;aZcG?p zn9O~8>{ZwUq3>z;65||l_>@2QGGo1PxjrvIe98y;)pQ>=WUMA1ABmjS3>uMe8Xs<) zk4QL;bvI7q`;F81?&37Q(>RSn;4~uPG}hHPjSo9cW8IC@RM=O%enzi~dteEnx1G)p z?!>XT-2=OK_jYpw3qjER!luMjWM|La?L*z2yW3$DBQ&sksJC68!{v5BrowOY1sb-r zcMcAAjv7m0DKG{XwjBsCXe^(#_tKHlFxVi@_ipdT@zPz1g;6miJ4U&0MMD12J)NQUu2DMRJd@LvDHl7CZe(TG07_a<8l&KNp4z*+ zcmPEY(-!#9Zr4kH`X>sfG(1uJ|Lw}l)P^>-1@x_$ib~PKlR@Ryosy5^X)|xtaV%Q2 z)Z*k|YeSFok~i{cFRW0Bn8uSI@uJEC<9$H=F*)k**7Ga$2bqaFhHF z6#1~OmC)K#m53C+z->i1#VcGGgy2z_xZYsF9RU4rN!CEDYZjxJP?qaM#AU@z02dI6 zfS(HYYv39)z%{rs!yU{J_bPC$8N^$bomoCQflHPTFETFL1VwiOxOWgxh3g9Zs6Gnt zy9PM0;_f&a6_N-`l6u(@j_6DH$+#yZ9K|DWe{I2?kZ^<%xIePsPDwap^*H8>#; zmnm@t5{|}>snVxOxO8h9)e?^4PbIHj!qNPGDjcm5ihR)UP~fa<2OYrOD;`GR#3jkb znn2ur51IT|so@G7`M`w)@KxNHZ0%rWZJn_eklEV7nmU2M{My0G`Uj(f+7R{TbJ4=8 zC)^v|EptYWvEDlldYzNBTF|lOl9pW-32iB#6N;X8coc+|8fV|ooz)Z07U!nQkCv#odB?^P!wrQwm#&6nb*b};s{iMHnZPch9E`ciC5 zU~4mrWCzc%rqUCmis#Cpyn_ z)1)i*gZmWh8M{6}YX@s%>jJ;JsEsOWY{cc$cNsHJJ@y$Yqxy+X3uA&SR#nu)|(e)k2^_P$67ik2XK(M`-kGCER!Gytfz4anjDr`90~bPr z1H%K|1N}oQjqf>LYAdzn&Eh_+wa{@5>2B@qukFSM+qBmt?(7UrGbXY(FwI+xA@=lg zL^ll&cJ9V!_uzCRgdN3cCQ+Xs7=~fTjBeb^mp(dshuXV$b#_nVmLYCKa#}YG40hhx zJB>SfyL*C{g*R=Z-CPz}(!kcOn|UD4Dtg`7Eqn*(Q!(n!!R?w0iq;DXrS#g6 zo_D1&Gwr{MnP}_>GSLp!CebwiPjV!34g#s4@)%N-zm|AZ?@3Y z5>5Ce7Mj)zgd@I`e7>KF>V?)3NRFy8hCik*(B}t;rg|Yh%^eXPf$zpTz~kgEX6zaA z0s1ESi!ir9{tA5mAtKuUL-R>)tZ#V8hY+e)6_JvTq*@7^oa9&FgN}UkGsEO#ePo3E zh1gd`KKdz|A5xLI2>Do-pl-&!(nu%dQ5U6(eMMN`SWPs(HF>^J2%N?TF{knU#_0ls z#>YITa}2t~py@;VL#=aQU(lU*_728ZI)+E2bqMhW7#?Zw3ML8P!&eo$dZw(2h#U97 z`ZOP%CcU|**Wg`logw*xLShIOkA*hdz!JA`$ zdj@v3clPvP>1K!rh4u~w+lL3*H*dX_)4TWX;>$1M&JY$_dWUsv{{WU=+PiwV0FI{l zX3%=!wC@<8Lf*aGpgDpsfEa`LuF)xMz<2cBnJi%jho<5wz3szf=A1GiQifsUAYT{i z)iWo;d4acct_iPKge;+Nce_zA;@%yDy}h*51d;NG2keGp@o4Yhpp+C+?(l8igp=YL z+i$(C={6i4*L+74*&OFWP)(_JwbZ3zq+G%IziGD%6>yR#PG1`l<*Yw#<}k~XW@U<} z%o;A9un)7yA(F+L$cm4C4+-_(=u+eB4%83QPdK}A@eq6&7X(dxu5bdk3js3jC}>T9 z;0xSsxR!CJKp&w1!wFm+Xc@O2?=X622`6yp5Fp*og1`wLVa4@dSaAKoWsAigiHBF4 zN#0&pX7lhb0@sFng%fGA$}7a=bE5#kPldY;xIhNDF9DZqUF2K17g>zE3&0iF7^8Vv z(z~Z}!E2Cx4L`8r?k&6vDIBj*o;JcEYyA8a8TY<~qj&_a57#m-2ZDq=L?6f9YQdEQ z7eN@sOR|JKYLl`&+G|2%6T->s1Pd&<7XT3PQu>8FEABN3NAaY>U663@G`P1UT)K6F z_az*PG9IsW-aH3mk$(hVIMH6L^XC5w+=EoWh7&mQ5gZcX`!EJdHg7Jyq=rcG{&G6^ ztJc=6%~a?96)Ffx=RTk1uwP6#{nrHYU>WcwHb20ExtO(P9-I?iq4Ig$IW2Qy?{KYj z==MYxhw9uNp|6G1M`Pur5ns!7^p|zej4xXZTad8AsGoDbvV+dNo)ws1_rZ%lFaJhZ z(XyIP>~Te$8|pFV>k1c*?Dzh7GC%w;(oF9Hjgp7<0=@h~E?J+g{Rro1QRXws>@&*j z)1ElihdwjYv%@pfv+WJ7t+4kcmMC!9(AK7ZCp5Nyd`oj1J{RIP!fqy>ucf)^7P1k> zsjW?0Zg1Mcsn&KM7+V@z463zhOLJ?WNe`f}kWHH#o4~uh>6XULTiSh_8n=RKylvB_ zPqh1+Z)s?05Ab`XwBRFUYun~6IN};e64881ThkVQgRiOmwuZPtvqm}&JD$kjhBCV` zE+4{>+=Ev_rn8?kO(NWWT$m1j1w9>EB|;E<8XBb3njRM~d4OmR^8tyb(cAr?DKWZJ zn3=DdZ2Hig;?2_iG^co8+{*o*T>9@4tzh)^l!?w_{kWe*P@FX9*KE*~3DV&`CgEvL z>Y#-lve4Tln&!YZSZEp>3P*fQ55*nHzuX)cRhk>)CQM&3HxgM-KIVk{ak8^Fv)2GeWQB(ol=CoA;DH$K79)i-RK zzCbSlP1}L)cBG-bcVsx#v_+cv4Da5){)Ek)p{lC3z^3-*tqpgt+Elf*sFB ze}rG@|L7Zvob?<26@*b=ARHc1?#A(-T1}PpC&2;5^-w4+Qb@l5y`L zkirQ^@d%vtTa|=UJcLX4?OPz>sE&j@>$jx_+@s(NC(6b8ZTZK*$@@tJj(qvs@_u~h zrT(_$y8e7m_vOAVSFc%Jo$0q_4=KA@zAeiq6n_@1#nacJLYCn7=+{{-usl9lT%kqy zcO&1|O;_cHZq7RsGhVpwo0%H{#baQe+0kp8^;E*5_hfK% z>8PifsjAN%&W2W0mXQN0196YYQ$duiyc#-Gulg#&YQ>Ww`$=sc<*BSW;+=Si+URP88 z6|K;NKAP`sqaDtCZqIyf&wOsr>>Zbs0;i}=&1ggY$7@6B-SPCkwo9Z}NG+~uzw>nW zZdXY%x-gQl82%nq`wh$A63)1MUK$M2clU%u(@5_$XiApu6lUhDoKI2ePUU-F1x4TC zyCiw^9sa90mQX*r^aF{e@9%H>Nrat?iINkv;~W z(l8~)tYwl!v1O{V3NqEx+uwILRDooz7Ot)_b&GC_ox44KLq_V6n>{>T`XtFz31-!m zDf%SF4O9S^RW`BQ+&S1C6uXM2-cK2#i5x2NpBFV?da_Ji$ zMUn3q_`hkoCvCIVr+d;h=?|wnB3_yw>9h|^Ht!?%r8Lh#j>6E@#OH_laZUPs!U^2N z2#|u=n;-;_u;O~$f_n?NU(*DL;e?FEpv5(@{ulbLMgv2h;8}6Y(ZRPR!HppduZOrh zKraFW(7X>VX;b==&HEfc-{}F5x=xCdaC9s6r|4$m?pffT2SqrFN8qgUK0SymlX;(E z372l(=Kyd|#Z!?e7wf#wq8yyTEfs($Kl0^ypZR#_q?-3ZH_(o)Ds&{~WpxT_Yp<)# zbl&F`Dl}={$7!^dk75oXk*AqSgqcZ%nMs71Nrah6gx{tCx_E!w&EE;8e+MLrzSZS# zJ^Gdw?=*r{(z`B$Z=EYstp5*Rm^7_PPGi%mw4x}LWWy>HhGEox2`6|XMuZC|;TwLs< zpTwEGurT0`^^NN1V0U0`3j6Jks}*A*XP9Xpyhs|C*4^bjbqv(j=ffFGmKCQ8QDbAydpInm1i3%jr*oAKCz>n5Y zg7Af-HHT(Fz^63?Lxq8d5?>x?5?_j*k26bwbYqz0Cm-`MJ@8e$w<#XdCFFDR7-P^l zNTtC~2IErb0@M_5*hAlC5bb>P4Pc7jy7eHlB@7nkR&3GH-sl-I6;SN;icG_cE9o z2pa!WJcOe;*#-E?xE}&X_Y;mV0%!eBco(>R;0q_xZv9ROArg7+Tj0pIN&B+iLL!oV zC(sauFO~6KS=wdiP;08MTcvNzy1YFzR|QXf{5xSCtS=W#D5KvR$yVLIv5^8}FVuSz zc7J%J0Vkxu?pBoa!nDyJ;XA_N+Z$aUIEZhAtjZ_n-4N)B-2f_oGB*0PQ5^btZ06rRsLUY?Ga%9$pgf z8G3@*)Ii`=jeG2+U+cd0e*wzv%m}`p;^o#c`s9eJYNG`{S2Sxw(Fj{=pLA?E>QyEw zy|Rt4Zp^)ZFrj~OG0zg{9I{cHXW=BPD!!$7b5X1&_#+l9^^UTov!czPEZA_&>*O_4 z9kf+=N*T{-PkG(Q0q_4hXM+x;E0m)JLJStwlm)g*-8R_=Mt&&W^!-*ap{F7=!K$)1 zxo^piRaJEQLfgm7HjIq(y?8z4KRoS$%%7fPnkN*J?hj2=EzN)3)v{njy>?c#YT-^_ z)}}Yxwv~B9VScAJQeUn~cN9#V;o%DZy3}(Xnm9P}a(RBNV+3~8RK@3Z#73UPRZ*_u z)7#>%`9D5gHIFU-@ni_6-iR{$#l-$oOzXOZ9jzXj?a%S6Xh-UC6({o8J>V}4AZL`CZ9Vv*~JXc2-#}Uf{N@Q7J%sW5I zv}>EIL#Wf32efli#9SDw0u9@FNOvMnS&*zk>$74sHbQaE+gyj3V0{m$oY;a`HN`tw z%uC50RgOPd{;ks<|M8pim#b07a%Xf_4Bz}{wJsmsZI7|zP(9$St&Yp3P(`Z?F^#P6 zC7yz1)VadRa|7>8yfk7TajRn^j?qG&TWuKm?5RRuwwmL6X%wM)*r@FUh2`@2ltpYY zTUHWP(TW41R}O`$}Wo2y4gZ`?h-O`7!mE}RD! z(vdq?yxEh6m146e$;@=~X^BV(e7e388FGGTF5^n`LwhQP>%xU~BIio;h0mxf%9mU= zqz`)~Wh2YD(sXEuTevUa!lZ88Ts*AS7vDFXvXRT#jgQHO;(HS&93g)?vNVw}_;mJ^ zsm>Z;4)W#crA=;2OCeKkOHx$)@|V(F0L|n5T%zeq-At?OXW&zQbq70wCcKUFsh)Lb zv+(VlPwi57b_?HOp|d!i@}Rpc3*X84RMxt4TKF!`H$E2uaas7;7TRs0XYu>_d0;$( zSr&c{=Tm#qT@HKOD31UFY&dP`O@pQ)vtefAPo?srdC;d!w8}nfqHS!aiMF#=6YXHv zndmHbjfr-$_h=%;a5m&WYNE5*e>2f;_9YWNi;bG-9F`@~G;jM0nxKKB{L(p9|76gV zU(EWl*9@94utLdBo9GgD+(ci+K5e3}W<4f)HrrsLVgKDkm$9o&^c?oSjbhfF0*mqg zV4};}t0uaToifoytODgpd7(C@VutG_gQh--=B1xDXnH0{w}0HA=@}rqn!5~|+C16S z++xr!PCM8-gQhl4=Vbi~tigVgfIP~79eDVGO;S{fma2`*m{@kiJ zqn#4&Q--_-Jw5I_^nTI})t)27-)NK*5`BW`HM-qe_gY;qnbPqs3crD|AClh+oo?jY zjg2i-P9%rQ#r<*YWg$Pn*xlqKpJDRrVJibZrRNdyH^F`^`L{8C9wFuH1korb>R;TA zjCGLTh3CNVkHc5j8|z^;M)@Lh)f8T9(AOCBVuQv2g!55IygoF8USiN<&kH&|&PSng zJd}$#jXg4)M&WY0!l0KM^a6uMqB$Rn10287peqd;ft)`NiTzOPcY8xHwAzdP7sD{) zLCZ~Doj3!}*vKMnqKPXr0NUAOJtWUq=Woa1d$45>!>L`;t+2w{g|LAg@ohIfV$X_L zCyd(~!N!LEf!%ku5BCo4YTwyAO8Zjw_6`kW^*G749>a{LAx(-h$?lkhJrk@#_uSJt zh>b#ngD~=Hm2234HKQcihHVTo$~wGvXv*z^Ew&g<0d(#i4#rCYmTrutcgB$69h>B2^r6`d%VyLa@q2T>2b=$u;mx~i(S=*3i31#W*|7qeDK`~bpT z17u5=(RP{?1#L6UJ z>5b#50CR!ySMbh*0Imn7sz~{;5Tk+ z*w((KY13v{Eo*GLz1i2al{Sx2Jh&6bbM~N5FnYy%f;d#Pzi()`eK6EXJ|U^mP(Rtf zw|9780MD|#pAh^6gEpg~m+0Q9=Z!jy-YeLMmO?>cRZ3Gut5VutUR9ea{@QgZIsYe| zxQX&NdUsMI-Kle|-834!&ba(LQ^%pnrs&3vCpZqXyes43 z)?K7J!~FI$$x8ly)Ni9_gU;VIy&KJ}_!F+bcXeha??nAwNUy*TqXNTYB^!Jn=>|vo z7Q-LQ!jBw{-AeeC{*T7y#Qc;Qkx|GVXEU}`RK6V-URMhy3ueVUi#LO2_9)xeCD}xVZjj zfG9m;>R~l-RL8;z8Dxh+ToaFQ|Bjz!uPRLsceLuk?thmPKOZ=L`tAR@vuN5}} zTqE6JxK#39$Ph%6Fao#Of_n})kv?kv0_V2iUH}fC z=3E~2u>$utuH|^oOE{;5`!fsfE#RoUD18*akoWr*-1}1cC?0{k*MhTS9!2ECE#bCX za5=y|fiQ{}k5pV9^|5k3o&`=r7~#;guLsBH>6+GZk*Tgu@h1N?gB$ z!&Fg9+&&41DWo{gsw;W~IC-NX9t-ZMuIc#`?l5kwqXus{fg>NdkO==XExE4f%2l?;!OR1qtd&~^jd{^S*dU$Z4zaP^SouR&&&1PbA$mRA|VLNGGcdu?H z*mB6_jRl@P(uGVjAZO zN3@h2zFw<=Nw(@}d`Y(KstuZas1xYxWB3^0GzQ%?hE{0|bj9ms#x${hjv-B1(UMs= zCUt3{W3+z&>tbS!L0@e$Zs03sd=hXMrno}`_uy^ckBO-MD>Xkylhv2o?WWICV^Co% zAPlCO-%UA<{9D=qH;q#6TXESE{xEZe$-9A%bm9=rwGTgP`)JDCQ9GueaP&<=&N^2W zL|A}x^nU{PC6My7bPBZK5mH<~V!=HJ`YMqKiD#WNdKH*P@P!j`S#h~|7UlE_+!5SJ za}2_5qh}UOJnHdp;sRV#eeXHHXZeU7)jfZaL;kd4kU#kIDG1l48DR_1GK4Tg?`ow)N zF=0zSXVSTe9S?Rsd0(~G;1i+BBzyE^XC1!p$U)A%XPjs9g&d{XH72fEg<}J(&PV5Z z)U&og=;pav>zK>0a}~TnKA5O{()KD;MUGVl*rKeC2f|sEHU2Q)!!~b|qE+4K3GEK8 z*u$#kZg#}_`eLlUly>gu``dng?i*uokG+lEN3Pg2eJ`=wTMw0fA^c3=cdQ}# zM7%#cw|mbw_Au@3J!gEL{hrU9aXO-|O6-Z_UzZ=em=)0XsL_5ndhNrltkSc^6ntyG zhy8Gi{6(8)#ZL5HWa~=DN0lY^$upmzG@R)B_N_hTC$J~(oea{kqHFgaeHUTD#FD2= zUwhyb8qp)3uatbp_Q;a2s1N6S$NsSD_XHfDE1u(N+3#HvbzfM#@oeebsJgT$+O>3U zv?@?gT0XfTrd(SQtqhccQ{*Y(y9c$F|IOaJz*kk>X~XMWa?Z&~$Q3X^z?~2(7J;HqOP1%C6HjQpdS_EZLndFakz?_UsSbrMg@)muviUGk*P!f9(03*YS=$Tf4UF z!JHr1^z%bV2lg@jqlNjU@^fIOs)A3r<$jOc?~wybyLoL7trQI9-N%2QWFo=2W9{$AHN zIrPE$JB@24E=pqctyt{AB}vS46oAi?IbQLndhj&y9qatE5AYEe_KT0Za6sJQ!a=do zg>%Ge7Y>PKE*!=(-Ku8zpFUmFT{u_#kssGO1h7KhOD>!zPP%Zu=&&$-y69uYy9~ek z>BF@QnC;Era*OYSMS^e}iPuw&r}a22pBf06hdwij6V z31l7=DQBPdmtEK|KA|z&7=7mUY0P^Vedac~J6*YP1yuQBsng3jv&8uK1RAG$J) zdC#E_-G8AV%+D7jj*8!E%sQYC-7^~V8lVr|KO;7Qee8d20Ak|LS(rXyAGR>%{T_Us z2fxjOXM6D3`uOFw3WEw0%X1IRa~|zd=Z5i8V6H!7IiQ*|uU?ZiIHH|jBnD|9~5 zfOx<5U#am$8XF&<3XMTpN?w)5bsE=bj7B8o7i$ckDT%8!29S8J#u#9cxKiU~8qd@C za*Z90>ouN_Oq}zW340?`_RoX6wsyl{8HNvB2Pfr{!}oU!rgeEpvEeK*s4e`hgR~2Q z-lH4=;@y4gdWKs1d)5!H?jGtfY1l&TIH0sA1#N>kNQvNFV6vJN$9uXGZK*uF_P6w; zlfY9Ub2cC}**I^{A1pisrw8dbp$4jqP4;!o@y4|sT>}GMyQDO|9k(1>!kRm9gW0kT zj$z8sLiul;F{ETI7pZQ|#^mReeWJc2X+?=^U(iv_rY-7@Sg9hqbx(07a7K%GkZYr*VYbPIjol8xo$Axkgk&gfwkBD7;p=8l8fIMM;8|M&31DU>wT&B zVZ1fS_YJ<2nSj?%87}wm8n8DVZ?=cm4j$j{O)&a$JiMDg!0Ssg7~Vf&52(pLiup9!1^@2J`e8+@Sab@d$))8 zFkVRcy<>t&mvv>Q`z`SJ4s8P8V;SfdK%NOtKwxxmpV{6E5|1~Zr%!@6)f|M_=)2XU zkG$XKq=+W1?V4xw9f$JT6fK#qm-iBQMhEF;+spe+mb~AB7qZgLr0>-%_5EiC9zF?@ zd1Z2c0Pm_a>3Vs~U^~ET!~~N+FYiw9veEbLEO~#(GTj(Hgj-DJ5NFEYJ>X?ij{g_D zcozERz{WhA^1eGu-Y2u{=CT(Ji+SWXGq0l}{MLYns!fK2CF;7W z#2(fid1xAPPI{Yn$l@^_!<*sJ_prs|wPkod5AO(g{HA5P3NwRms=$;cbFcszfZ z^c}Exv|Gx=J7n?D-I0-Z#Nv(T=kiU9S3ZuuCoLZPkTT`(l*OAf4(~;ahbdk%>U-7V zIpgpmc(|E%RblbGHehAoeS#OR4rbG91NN0^Ld>%sG=|3**J;8We-f43Y5-!xj)m^$|X+3z3bN0F2hv&-#lXJUYC)SFWMyAK2F<g8lSkPZl^-j?F)xkWbu=e7d)4fC z^r4ZaC8x?)ee}X_G%Y^)Dg3|qQe;|1Zw7;nuhGHcFn|<*nn`fH80X@?>^rXPyq=l_z39@ufgp(pVZ(a6r#JL{tdcK+?o+Gym~ znTO)|L4ND3Lr>xtc?66^FrNEB!-dS%|9$~$=w6NfW1J6J7pHM;jO52k+728Q)w4&% z!dat5E5rid=#1gw#Ejw7HPc4h%4Z~eu_Ba=8j3LIe((sla^eoou$pr|0{gN^?2j*q ziWgsC`(Qx3YrpU4^jKjmN6Z~{sv0Uqh0@W0wxzZzbR0QSA+;84fWI*6tA2ph&%IY zG|r3H#2hKfZEL7(xWX@M#;MF{E0J6NN0dL@bEtQQ2K=V;AFc&alQWu+RRD6}5tnmR z9E+lL{NV-TODAvz`sFnjjF+IEBXav!&|}*2OR(9z>u8}9JeYSV`WaEZWb~rg%vH|S zGvnWAT5z&3=3M=aruip>3#v{9F0MS~TjZR||Lo2=;l<@Ar+hZBc*d#TSTIo)ZAo5T z&D-zV9;!S(J5RRX-dO$vje}Dj*f$u$^`BoKlzVwK!7C5>6yj&P9o3KY$MRxMqC4@Y z@c+ZrDD5ljkJUM#4qt8h$Y#MH09Lgh1ZY%%snW04W;srEgW6OSCbC03RQ#NVCR9NR0enuxrAy^i`0 zJNsjW@yKU<3um4xSY3d-)bx|n@xSzB;Ns#_fklO~RvU4@+L!oFqB!c?&RXRiv@3R8 z>Uv%3;x$-1GBq}J`3L14IfA=!XtYGO23Tm$2_LOJR)p)x}G$C^TO+oZ6sCJ`x238aPDYghCVluV^!cVycxEb=2>eTvibG1)lopf4%Z(@qMrS`(ORpfBy3q-@ov^3%~uT-<}K{ zbv|_R?rEbRDIcn;{nw9vr?q?MP1DxC`+q;Uq7; z_KTB6SFc%qy7RVwY52wiH$3poFZ}qbnaB8vp2=v_YqVG;A4cjQT^C)`q&JoB9FCUW z)`)NTiRk1fs|j&zWNXZs&ZrV!hRNVytLYp(M(r}b4jql9x2C3UZ!GP<{T#|@=c`ug z+(To}3DpzJW5RB1xauC$!0#@-Z9@9&dS4^;X#>=q9TPS{bxg((vwNqp^nJ?Uv$=HV zifHNk&ZkXWDfQj)5g%N4uZfo4F;QI(jyFNI**(SsI9A%ZK3clx+>LG76-DFLiJnWl zJ+LR>Tnu&{Qz*nYNgcPP+G$hi=FJmq4|bl|HqOP{+QD%qs5WKgDOQ^3JdZpvf9H}X zcG;P*7#p?+_(bkgwjOS0XViSA;kT_vo%?Y-(wAHPSF{zr#=`8WY5`_NtKbuExnIh8 z!%@NSkq4xlHxm^C9(hp8c@tD2=#l4m($De8LsHJhsY1vj4@)^OA{D|Oc|^*2(W(&f z$aAHfHwYDSJ@TmM_^3yoC*`RVlIM}%eg98F$np}T?$9775 zfhe-tA8na`$pH!-IG@4yT{s|)xNuP1@4`8r^&>)Jl}jELvs^eLe#1`dWO}*cM=l%{ zf9}G0VxJ4=i!ClZMXYh*0x{c#3x&^xi^R{+acn|B6pJTZxJ2CV!lk0Z!nB<(*Vus) zALC4Ww=P^RzV5=a#e*(9N9=Xs3&kcEc0{`iSBNDpTq(+2c&>Qe zbcW0PR*7G_@I3J&7oIP^>cVBx*4UKDhlK*)=aN^8ZWpc*Z7#e(&gY*xeukhe149FT z#h9Qz7ns|Q#wBQ|asWI<)v?czM#=OVTmiUtztK)N$>t*mB z#`QPWXnCc?VKG}{-lJ$s{4&}L)8jpfw!~cDgjmU=;;6>F=g^k;{TlNgLtEl)E<8o7 z)tL8?64;_&s4?#uCH_JY(Abf<8qsovk9_pe9n-=^1p*q+kQ7l~-E&Ie+i z|0v`!#{B}LJ4)V(*k7aUAEKKDu6XS4Q#ROsD4`zzji`I>NBU9@-a^f5V7x`OZ>INd zV#J#mgO5KM4>P_+h`orZZ$D$COa0`@a-n|Y@#Z*SnXZYke~#ueeID-+L(cO;J(U_4 z=vd|#@+OU!XkLqs*XaH7c<^e0{q5RD`cjRr)%Z${(Fe=?`eFMm`3)K`(zsFMi#0~# zl8;PFezV4lHAZHn{B0VyYK+WEK2DmH*J*r>#t=$*Tw~aROWdY0Y|kZLt}z;;#49vL zqmp=~#`PMn(ipbmQodSaWJ2OK8ZSd7oU;wNp5z7H3fWi-yQbd3G0NIh+ty-^duDk(~0qZBElgotzc2bNb2l{q$Sq;68M*3-i zm^UOXx!t=uurfn>y@}pkY130S&uf-kwyYzuV}sNqm&{0X^$nywz}Qx2QV4_Fo`Iph z!9Fa&F-~1%ns9ueC((aqPH*nn+B3kqaA&u_uUoC}LF4NUy=UZi{KGQSTjE$Xeo&ws*94cVDAV-MXIc9RsivUeU8l zwypH6mN?{Q0R|Ytx9(iOtuc|%dtmswt_O}3#!o;sinTcV+qSHd3&gy0pevEUq7>Fe zcWYOoW5ceYo=1_@r+9% zT$XW3gv&0?l+0zd86}wnOE1qTS(;H&mr3$J%F3N?32%)Bd#d?n^RP_e(-t$26lI@3)SC-*HWYflf2-(c>pCr1g|9x?_(ZbJ`|*@mjMrt zYh;wC(bwqVu|I*|2qpl^P~+i^L6EMz^v%X!vR?AhpONnTo&d+@HGo&9l9K;Tx?lD1 zZUC<;4e!Gq-X8GqnUf4gU%!X<6nLFUR_c7K6Zy3E8o4PHAB&><6V z#T0it&BXgCc-f@;i!AkBRNy|pnbN%#yll$x-7NK$7G|ff13bI^Wy;@QfY)Lw8F41w z%USX+FUl_64}zCXx_^_UzFEcD>FWS5o<(`Tm?iJuGw|l&!oV#$8S2pyRT~z9{fBGu z<8_ImiC00&MQlPZjKduObp6P4K_0K$Cq29a;PH6!n2zCb{b5_*A@F!SdAwE)Z@-84 zu$3-3hQ~FUY<4Iy&(sT#H$2XcZRz`NGkf!lx#y!Nc!;t`zuyLltk!SEP^moWR6pfXwwKx}xITzXlpbmh_i&N}~d zef?5JJ-hEu70Q5+^!;hZo&Tkgg4lgWePU{S`e({x7sM*y`E%i@xCEXai{R;@eLAMV z???G`gpUL(uZSrt`pA)%L}jcdwpaQFRm3XmHfx)DdSEC!^GE&*g&vuLCB%y22anEy ze}(cZ5{su<+H17--dM}6m9e_m9BIj35u20LSOh!cKe^zu zWyrNyuy9n=EJ*4rstg{PBE1nJM}i6X0VOK(_a!O{9#4d~UjYxHEAsbkzoOvr?V*7> z_z2bI?;EHqczhsduqN6#Sd+hRu%_Vg!CF|%EB}C0S-yg_UmE$~(f#mA$^XohhkS{` z=rxJL{0}B_p}Q;Q+uj5Zq<{T;LmM9+(l`H!vgr@qrlyzQI=Lhwl8xq2D*u zGE@=WH&l`T_)tZGZ^yLxew12yFN9^?J&Lr#%jt7~b(Ee9!RNqO`k%Re(wD&HnoGgC zVuR7N$=;2%iU4 zFOlTBOOJv7`bfd5=)A~7N9FoWuOHhQqmM=+@m1vDrNol$MbX6euWc`jzO;QQyb}@w zo6&BRp4XFlzADod!z`(iTdsY^Ydl!ZJ(2(=$KqJ%J`l98RX^gNvTLgqZ<;@ z{6EF{`&lAquCsk}Y=%Ay^b2}irh5x~Y|SZtOqsyicD?iC^<2DCY#sa{JePX6b+8lSe0A_c@?3PN?;jkD za20-Ul*i8-Q7`N~GG$`^JmETi5bHpDeA;KGf={dlW)oDwC+#;4V$UPxZ1O7jJ@SB* zv&pFt@W_Kw&fAF!L601BLqk8Cm z%6Upv$o0shQqHEQLewMA^XSj>$n&K<)qL_j@+nfzTbl~Xe%2t)c+2|XZA*m$&+&y) z&L*Hjp;!pM3AA_5bz#5wmDTAGK+nQ)7Y>TgxNwfxVyTsR_vE{wU+{U$f; z$B2q=x^P}{?rE|D=vm$2l1~xubm0PVu?rW9Z<-Denapoaf7Zh2oe=w7c$(Pk!qeqk zOD2atae-Lol9!2c7oH(tqMZ!V{ymA<7X$lu7l!@23&Z~1g<=2h!mxjLVMnZV;S$$a zrw?13CpG3ZLHqGrHLjF+ig=gC zZ1c1qU!*bHIPJ%0BQ_x$du!^AuGaR*i0d_u>3A*URch>-JeHgBQXMyBkZ;!e->YNR z5A`@YX8DO(uZ(F5%a~&a_I{R=nDxP!eVL3SI<7_Rf4j<$AA=7PzeD4>8e=E(>qq9L zyiVhV8ZXg!k;brFmi!8h0VH-bhMlm)s643;nU@$RQDQS^w6PCHrAj$EOr`t^jnTm? z@s%3m9ZBN1X^akAiP3oE@rzN2H^5$4zf12(z~Tkg!@Ye&Jv6iI7)W%bwawK0!J%yl zX|sE#9c_|qk*c2O8wCw8dg867aGPyOAC9uU-Qya@EjK|Sw z&!9XG%`&Hi!Phq0d5)LUZWwvpLK{p@{ws}y$7Q2XY7XZNIq2_)nb@}Ojsy%wVFa5= zSJH+{PdAK-i8sJhG=tKvoVJ7@e8Rh9}B&EB1OSZI)JzASF&!z1wR(}Y4YUOw8mxC=J1T|4Bp1aPLXOwC_6^#P&UB9E!Q$oX_gTFwZnMySKnfQ;6;Q zeJzAXIRl^T8|9Yz7u4I!J-kEMza|auA`kCHaQ39({U=^J`QB;L-3ZX1hIi7#8wJK| zQZktQeZ|9j4VYyy!SL?z@M@7?zRQ_lc%0J}f64sOua)mUCK#UA4ss88e3v)D@B$uv zoRgXFpe7jJv)Ey$%e8^hrAvDfo0pIGddDb3Z1mmZ;VlFYuXV{_c)cDTza!Gs3tk;v z=_bINn$(s`_s@`T=Ff!v;F+|z&ul;B;T-@k*E9<7j1Jlgm~9?^ABX@7 zcAAM-6V1+EZA+HCuV%^n9eCN~uNB5l+3-G*CGQ`>Yhgv|kg;Cy0hA4IOP0K^X36^< zc;wfm(lmP9$t&ZLvfP4 zM?AcCi^t2(=)29sTW|5g7O&mIyUF4)pGKe8?rx*SWBCm4G`8*X_FFt$DoNf64{ylg zp=l?1k9c@{EFPLzlJ@}*Z@Cf#hdHlJp>-xTLpgX zlQ8w-RSj-Quy&D--V~i^smEOuT-JH=dp09*gH#`n+~+ z_kuUV8;}mTY-RA;wKd{oeVUol!SER4zLYTgpGT#ow`;q+&auMT?Ak89v^HzIwu8I@ zSaxlN=$)&_T&%hADY5<1BC7sapPp%2R0l^fBd?sL8B#H@SpluZV{9+{DTekx>Z zZDMx|ER;G@i<>8vn+?Z2ps|DY0%rayCC7*-f{g2wD0#9{n35Ld^Ns zZnrS!8|$&K532;bzu7{<_7N%bI#*bT%}`U-=OaG#8e>L-6I+)nOJ;o0}o7L6IN6-6OL@y zC8y6Y6K7ETh73qF?da>@*f=ya(6?a+rt7GxS|4B8(YCH}=cOyF)>W-(t!lioeaVul z8?J1xtE*avt+v+I*1D>;cUE1uu65n@%c^c)w|+(QiWUVg2aLB@tzNgLvAMOXwW+bb zYHjPa^;K)uwyvwMYHe(4+qncz_-U#y*`;b#-Ffw)o_WnSvR!rcVCh8RyBM3zOBUBI z6FJS>28Mcu7p<(lScLL(eZ{^K|5X14zB1no-%Q_}06)y|@+W-!!Y#3`1i*2^wUCi) zx~#dO=9n$F>vu?Zo#38y(bXwzqhA2Y?GrCM=n^PwZ3Rv_NixNz2Ro zDR^;1LTq@v=B-Z&QN`+lkl)GX+ne8NEAg|xfvY0wde!vgw-4*e<}C#ee{xN6SD%T8 zca^2j?&I)&E4N!bRuAis`n}&sH(}=ou-^nzUhg;3&%x_6LXgcSWBVIv1@1rTzmcxE z%=$!f%r{a!Jc5){kosR&Tf1!8GRIl6BzxbVXIQz`H&R%)mN(;@2KSU9&XF|fsjyhT z#NmskslBx$zIxsIj&r zq#JWDP57hX=B~s9Q@XipXlR0m@V-CcobjOK!m<-gaB#~+OQoj%8NwpdStYeYew#>} zge_g&6F3BO+YRj)oX`Q=2D)zUnZOY}-5Yz)N^iYk&FZ!5J+!nt*Q{IJ+_9#;aeZv{ z+Lf2AS+}iuS>q*&d1ez;4SQwds>W+t*Rp|UP2`oZda$eilAhrNp3KgombO*R?bo%m zcC1^|(YR&}c9_ctn~m$&cU*g2>vgRy9q(M*wjQMG%$LG7lr^`vwXRwZqD1Rj*IwVc zR-!c>%@C|@Y}aT_>)N(8@m95iD{Ze_-O>u#^{uN~RhB z)-cr?_E>p=smi+btJk8$*iRL0tJb%!jp0qGN^zn1&B&cc`(pk>TuVz-Pd_25N>-MvDqUSLR?|Bs8p;}WiR$nPtduBy zj*m8lM@4nc=*IH;;r&hj`m}If=emc(3&6dzta$r^USGwXW!G-6>1`-`{TLG~nacn4 zEe^$|#Kqj4-YN0maM9Q)(J-TFmsk)T6_uY7Ke+K5O@R|16D4KQ&X&G^h2jc?y{iV#W(T4Z(k<%5v?V=)Qg}>?^@&2_XW%noA%KvjzR5Whqx@@O0F!$0( zPV980A8x&3ZvLv0v8BB~5mRSuNap;78~*|+IlCeW;rPZ>&VTw?V0p>#$D3Y!I+gdA zMnvVw=IGvn<*@;uNlIZL28Cd9C zwz&3E=SF$YaV}r>9swJ`?rz+3X>iJ0Z=$~s2A^uW(LraC5^Wgh8rap*w-uAmZtCjp zdHdFFTYH>E+pKmv*@-{di9h+)JK2dp*@B>{o+QI_&&hC3RT7!ob;;?Mz)w zZ=kM*bJi6;qn>E^0pDZJF_tcHj!+Z$&2yK9`R05lFi)EbKH--8rJU8Mg5M(#NI9F3 z3IUHiDCInrDg-_994T)wV!VyJ(+^2Gt6qhWM;?}PR)Gp((QB2DV>;KkuwN{8VXVsI z!l)su9s|hFk6kz<{@R7ZB5q-RLoT+k4>lW9U3iN4gUKplAABgsT)0qt--V0BS6nzM z?swrlu^IVi5xo{Z#we1$YP0p28or<87#k{W zDUZj8qQn@zlo)nh6651hVtgD*j7pOjMrIPjj!5FE8Y8n3vm@fX#_SS1275Wl|LS$u z>H#~xr<=Ly_262^rfmZq8#bDuHsz{hc**^e#R0%Gd2-xtpl8cAc&@3gTr0702K7=Y zb@jtZLat3iirX!YQ zoVR~T#(DeyzvODf(_}YWb(Y6(vMEmH=9;m!XaUEbUCl#}+m6$I)sgAi?)i-5nisb> zb@*03Z+MRl;m5%HPp{lk|AKn^uMyk4hk$v{G{Nvbiyby^40w$pAvU~OAlbZHfT}b+ zGahX6w;nv+qfIdSR$+&&?;!x&9>egwl>xL>-I{JW5==oQOMrnRwS`$@>g=EhbSbEpNI%%TnJW^wHY&mnna{vgCaayma~F z`wyxt8S*i1Jc=C-_88mWB5Xg8A5CE51J=i~hk zAvtI1LcA59Mjv@pU67Xq0zS8Mf!*!IKj#&G?nOd znTN!Ps4hKGQd4{~chwZ%qcfb{CDnPOoxP&kC(B<_Q86H##I>FKx(1xVgiJTQ9DVJ+ zyJcGb6S=ox!jI90^5c({RKNUm;u=#X->&9eQUBw^#m(X6cbA1meKmm-`*xZ9e`i-} z`)dE`)3qa_BHTVDRx&s0E1D6&{HA}lrnR%Jymj9XAIljmsd@S7TA6lY#P7?GPc7@* zeW0oIL}hQ+-95cxLBVKs?BF$+2n4YlNpYOc&V3~not+ivJ~#P(bwtdIu3j9g_B}D9 zVs}YR?kG$5jx{W;UzT=L=cavI%K!DTl10CM`c;`8OY^4KvGi@}889PHlRf&AJ^GV9 z`jb8SlRf%xWsm-lbxS_?e*IcLKuWE?c;IUM&fc%D`o8&cY(f<_8cW}|KX4a&<0qzv zFPkQ?(=od|sD5syYeFwJ8cSVsNA6q^ExoM~Z@m-IsouSmR(>2}{>TZ8F{pgmbweGT z`%}-kdCqy^hr-0hJI>6DI_Kw~mxWedu;~q)H_Zf&DSX4id?V+&>O5U4_=H>TmvRO;gBeD;jnmx z*Q^c!d^P`r3+IY{3v&!(t%ZG}P}I9{k(lGc#e(a{nBapa_pb~<%y|GuU3jYaOBbFd zKI6hu@+Ze|@xSkL(+Z4w<1~uk6;+Th-w~yz9V;&7! z&Njk%1vx(fk7t|Uyn-B;AZ8ojn8$wr5G#EV@iUE;zFe^ZG81_0^#&j&zQTiNdoa8I zO)zO2%rOw&LZgfH7|0U6F8eZ-P85YsK<=N4Aq4W^48nRK=53MqDvdGRAfmA2W4na;IrK1v%c)(r5+r#lyVeGVst=BjIj=h(WxUbKIA2KG&W-* z6&k}ATgs8BK7aCS=Gx3$mA?Uvd}S0*kejX2Sdb-b;d)!HE^#)56oCC_e^f8 zVJ&7GKA-UzRqD59R0ckx`k7+JJ$R2B!q0@D-uOLYP?O^~N3hNNvk8XxbL_BrW56wj zgxK(&z_!h+0$|!E7~U7L!{*%pP-RGn4etXU-X8FH-!{SUwqu8_?@<6guS_t!Yq7)T zJp;h!nF)r+ID>)SVvQQA;21B}U&C5AV38 zFKqEvdU#J-`k21a$7{Gvi^nmgOuTxF2lJqeytu_H9fx;=#hW?~uh-(?6*`%&cbse(yjA8V0G`=onb;mp z_&zG*b?bsLJjUQ94DShKKHWGOJQ0-->?PTalhrM$(*tE^_ggtoB~wq1lU;)=9&55; z%&KVAH+;Hg3fA?@gV)9nn>qH96Pq3P9jJ~y0&j})`0K}J#T(|p7o~!-8LNY_`r(Hm z@l~ji8imV74?C^RCGewYc+c_X<01buWFJlV;A3$B<4;cxy+g^(AZVi8*#t~BNT_E(`bG21?KE?R{pqlp{Tw{)?pRaM65&|PHk7USlX6*U|-Xm z(UMic*x`!W-u7mvtYNn=oLl(MiMzwTXO4#oo~`Z0Y*S^&cQdCb5OqLUi;GcD=#$or2@i?O{=k)?vqly2*@WLa`f z%#3qo#WK{#A6|I>;tNKnw~LCya^=c!Y${UuCeEa)In$oSCqjoJ`|4#r3ddAkGj9zC z#G(LZ5o4~=x?`a@w}O~e?8mbG*ynPV!#4i@qvf$_$XmJ08_%R_K_zV^tJsE6|MJ=k z#|qK%|Eg))Xi$2aF( zS?6&z+FJ}6>OO|tR+h;8mc-F+J4;sA4%a7eRl}#P7-d}0+tqxxJlm0H@7evaP|mZ} zb*g;Ir|p-I)g8FE=~ozey()3$S%6QV&IA3>!m(+qMAfvF7mOWtYI-}H8_VLmc}*PH zy*HHiY`ycpb~W5|XH)3J6?LIXRmb6DJZR4m|cr{w{+tI4uhFYDoTGjMy*$Qe$D~8K)e>+@R z-@6`H>%M{7;p5?g(fZz^N~dhKZgchWn(e5KRukw{lP5cJcA%K5+-ru0Iy7_>F8q>T3G$9!pO?2PenS zC&$ny$IvIo&?m>x-}Etb&Wd90!`=ENir@6HNFWl7sfmqdhB-jkkoT7CLyYgvtPml zwu5sqSFrP=%60Dfv31=f^Yg~IvBssYbI+H3jck;MR_h}WP9(kUWr^=J(k>^V}+l>nO9{Ch0f5?b2 zW$!#f4{y z1uk4Jid=ZM_zzdV=^VlJYfSLLo8>z$?1&>STp>Q&cF|R4Ew>i_Q58BPxc22}UXJK_9e$vA9HGa&4xn76~4znZMr|A!6d6TbTSGcrbmTOrYGht0Ml85h5nO-NMwr*@Lh1;ARW+_@y4q z^JD_$9IG;c`mN&0`PC?o-Xg>j#yx60k8vk45+7#VEyTTyuUGBbe}fQgAO3d=@i5~J zYWydPM$P<0-z~&D7(?$pjNc^$+duh-7Q9gdy>qx9@+QWe zLO>)aXM45f@_5LhLdtu!oZk~skYzb<)a$&yN2TXSWw&eI8hzY)#ub{6bnAIM>O<1d4OrNto9KWKwG4W^0;3m1SDMdSb2KqMbf*bYVw*H-6 z8?dflV&_nYbftIk2C=9k9R9odJ9=*Eu@-Tqj+9J$=Ys(wG_xYDqDW7DEyqmZeH&#W zFvD{bRYp9M62Q8QN(Opv#x!U2aT>(GIzy`VvcrFrlqg_$2ZNy-`b z>!gJD#Was1m;B7fkV~wq%KZpRGE$G9W2G_B)d8e@dVM9V}cxJ9Gqi+}o4W;4HHrCenYkm zCGc7d39;eTdw5H6V%WA!FuW^J|I}wfFL*}AeP+AX!|Mm{w@BLrqho>Q;WWt5nV-_Z z9Y!BMWnAfQ1P`Ar$zb$(c@Klvo@AwTczM4DZ+#ZL1{jRSv)~;7FB^T&XQ{8MAiH$? z!ONyzXv>>TIbO<=M_bfv>UlqSEm_pxlUeGUikn6@>2_wxdlbBM=dBX$6o08eBi698 zM{UI>+bIqe5s-2bCj)L8tmi8H*ha~V;Kw;0ZC)HaUW4Q@9mD$@4{tAcj^^>2F}x!l z-oqA;9K+l1;T^YlygUu>Js#c|c=bA66g$bg%EK#z5wIyQ%W3p+9W=YVo#54KecW$& zuVUNg9R!bhs_4`kJUnM+ zN*^wjB#&*GCmtzSpgtOcB_p*P|ngi(`cg1GPC zY3DC`s}nWx;DH+0J&S|;o0g7-DzAw7r9Hj0=O6SP`sHJy8aCmF8p@w|tP~c!6e=sC6fTV+HYGf-`jG&OZ%{ zRiQ0bPcMFDG~|ebIq|o}#Bg2A_aH4&fAsjt<2xfwgpP?5j<| z=cJvkvdI4QVW+tnC7UODFNwkSb$5Pl@B#Sh)yzI|xcudc{Dz9Q$kN>5uQpA4PE`2r z^WQgTyqz>rhS-#jBmyU1c5)g5s}{}f8K{lz(dU)+*F2}R ztj`&i9u^CHCwz-@MkC?8XXCIOk2v{b5!A5bM8=Ao&{)t3j>UNf9Gn3s2mUufU6w$* z@)2Q~O_^X%-X?}~hYvL6oxC4q3&CrmscdcU=>>t&$W6gE=1tWSj}l^<%ujxMCC*(5 zyf2(sVQrui>$ZT`xu>C`A=FS1Y3>}ViFL|*h2L=!rrl&ZSG?DrMj3CIeb;0Aj$R1g z3~CFC3r78iob6Y}I%lgZqp{Ngb*F(+{E^>(%(2{McUqzGkcvGk0?=M|(Qazl3EFPCbtLJ<1jt zzVj%2aSpbXE02uep@p%%!@UF5dwd5=mTueQTbz61w8MMwFE0!}AoLnRm!6nAyE4{Q zu5j>B!!QQsPB;m1i0u%5L(;?LbJF|78EyCC!+AsD2n~+wz<0=Y!Xk; zjBOs6pV&P7^Mvog`iA0$uI&$R56#_BUKi6TIp$8{!x}}sF(Lhoe7K)-o9!al=KpeT zZ*X}-*}H1z$a+t$fRh-xzap|Sj{8k8)=<_^+i-hHbx3+(Rri)uIM~y;)3kx2kvoTj zm@Uv(lXK!^Xk++f!N$TH!#5WChJ!W5ry7TSH3g@x&CNe?U-<4qUrprH@!_KCoKxZI zz|-M{zEk0geb33O7G4henjOv?E(y;HmlVz_e6T6-^xomS(UyHDee_qseZbuN8`rM< zZ(XBDc9P2H_M|hyq%*>#Gs2`Z!lX08Tjq=)KcKqtp!V_m3;+C>kxG5M`C+4nEedk* zX9)sSb7uzvrD4+We^KJcNP3>&2m%QC#BbZ6&zdQX@-pV&l= zXIl63Jf82wh^u7z&VMpO*4e~74bJrDaiC)&=gDrzTV?vYCpf|5nUiS7q@IaRqN&ae z^KZftY`CuP=F*-1)!AMTDqnV6UM}@b{CcqKh?aQgdac{n#F*4$E!f4f-JmXt@y_3P z_b}%3zw2197nofqFwAt-37{u@ot^nQ(BI>$7UpB&&wF}fRr;A zDg-?8paTQI9-N%6Z3A zA#)-xQC$K+1WSR-wQnFO+gVZB;1r$csF5nc>>RCeYtxs|)+Z8W#?T zOIb79P@>cSE6fD7k}oh}>|H@a}1c!vw;iwj+NipY220`W&{ z3_O5&O@HRXMdAl8Tr5UhxI`Rw;ZpGd7oIA%y6`md$6%`boLBW{7WRo*;s-8VF23Tz zv&F|qG#iGE47m8P0V;qabPhEJX_<_dkvn%$OiKD>WHuxiG zj~we5!;k(j35|Krq(97Bjd_pcJh7K)%(q_p!<17bhW12#yl2oK=I0t$NgNh` z<&sClr#0q1uEd`!hBf9rt;8P{@6mX^#L8cd`guLlAErXfReDoIfyNu9yg>XH+8g=2 z2hktq7aA*lMdF7V^PW@UFBad>nD>|xe~I{li(e`ZXv}*^iGQj{XzWNlO?=dXkqIAsD*j_Z5F0{lLx1sohm)HYZG{UtpSL6 zJjb3*pxny7^w(j#itbUzMUgmMFC@N~@qiGIGTtu46O0Fi_zB}4b^ZC@FT{(${vAU6 zn(+s)#yaEM;kU*3E@f*F-K(yzXrK1KxkLM_yj#e5p`#xZ;*;PIZKPkGoX}hjNhk7E1jK8NW|0cgypKh0k47u2iskMvPgna)zicPrZr*85e&kWWWUf2TQ&kuO=U8&&$z z4xRsmkn>tc_X+V?%|D`#j}YVh%x65DDi7<$-=+2M(&a@t<^GkreDxZy*Lab}4H_ep zlHaKD#Tqwhj6z9yv&L`J7?m!|3;!G`Z`Jq;jbj?uX?%^wmuei>7zfMa+cbWM#<(d; z{kS(NvG z4sAl4!YlLpuwy~$*q8K-ij)64uX;ZbFpL^qufgUqMcSrXI>-b(A2494v zu`=Bd`d|PJ4-~sh>1aJz=`&RXn*py9ER?FfIks)>-zBqsCb?&8chWb)lF|lyyfSz9 zW2sU*3Ht2}8P_8g+Onvo{{?E+o@QJ!l+%qRN-ej#b#Ulxem_(JpPfGNQk92^nO*x$ z3rWygeNanTIO$GeHb0}JtCTDT ztB*%z?Op^T3Zm21^-l$+JxXmX&JLNwjcKTqCVJp}wr$&nj;@`!P`Wns_0wrf7l8!Z z6G={xZtqaZYiA?vvgGzN>R-Z3XH(xW{A#+Z$yE0UT^9GBz3u7q^YgDCTK z^blUtsJx|`Rtn{>4L|N9C6Y`^DrcQ@|~c!^MVbhCpm5Nc1lmxnYG{o-Ir)Juc4 z!@Mx)U721Ml-S&uJueDc$VEK7F9}LyKi7G0cD*2Ertsz9OlgJ}0~gWtQlKP!5V&p} z@+BxGo9OdY9hvDhLP;~dLTKq3uMc=G>DPvH_TAD$qHn76)_lMEo(Po?2;ZV~(?eZhDfzq?E@`o87SmjK2mMKS=&VAeD;`TKJS@X3-4hW8y$ zy6ht>PqLKFFyUbjk8{`XJHiB$zgs=L2Jjq1LTq@~d3c@R;nOb}3~#ZAcM80llB|@z zLJw~#6!4swVD$YPc7U3!=Uxc#37HIr_cz#M^B#sEUA=tW!}}I^iKMnv{{F7fV5&KAu4(>DCYqUPYD+litl-UI4iJ?{V5Xn$9MfHDb zDD%$ki|{kY5I2F>&J7)m%**=-c<53{hD^L4frl=DWXQxTDR9?cCf)|{T9VpQdH3e; z3t94h1>X8B^u41nyK;O0ylnFKqb&866lJIHdhoJ2A0GoRoAdFLEP0j1*`2om@Up3w zzXUIv{JjodHs@_^Np|(}kt}&X0xwwA;SrJKecQwP7I;jD`fy81 z@*ei^o&b;eCJ(ooByZ5ed&bg7y(WLxdU(%+=Ri(<%(vk!@bF%<(v4cYJP$8_w(8fV zKHEp`S6V+J8LBK^KK7V&e}HYf{;mSg)C+E1N#0QpuLZmY>|?qG_!)hl#rSDPjYO#;$;u1*m+C04H!E>;WJT%!PkIy_if3I2TqRA$C zb3MF#bZVRYaU9U(&&w;fcr(Z0Ewp&J1TyNo%Hp9(WaPD5JQOJ-?{n2_iKyCXLF|f zy=L)v-^#?x$4M~luVx%xxy8c}Kt_EFEgptKGV-pnczh4cl)rY1x5(o0TH$@zgqy&7 z&U#Sbb|wR_Wt(>yPX52~hO2|&F$OPT_RmEjTMa;Lc;|eBsmR;Mqy|1w>8Y@_` zw=UYHw&!4bx!$hE_C0#L9@{_C+gFpnVSC?!%7(H?ty=qJ6H5twYzGQ zYmylM5mSwck;uwNQIf+>Utec)Q8Ix&kob%gfm8Z+z+wQMuY~JgmKg{08 z64%s^1mR~X4k}Nj)T%X+6FJMp11CB^f7_>h?<#Ak6ZhTMNuMDGe_T}T>wLUZd9z{1 z$On%GlD?Jk#1HTJVW{-kzE~s?c_00O`eO0Dk+}b0B!0L;U2Tz**jQe^zIyki!-ty0bG3=JSVbr9@4RY_ghc!T`+t;fM{OxEw&y<^7D1HbdVVXO60 zOk4h2EX=pvUSQUz3O?bM`=y+9q=Mfg4|s4;@>w1gf*yH}l&A8UVC{s}R(;U6{OvC67xP^>Af~%; zQ21Op$2IppZOi}O`c?^`2WYc}X?xB7XcK(+LR;p-#iHDWO9ae=lYwguyl6gHu$Oc5 zbM8J9eCS#EOBXH_W-fWwS21jV4`?~n7GrMvA&psI#jy45(3nxNKToW~2DcSIPrMx< zXyH0w(|<+218n+>h&i`Bze9NpaR``sG5A{4Cw9p;N!#eFHLk)w+D6khn{w))ZFHH& zvY*C}l~6Ti8{=95uOg%5vrW-9`X4ktEOA)cd}31u+M1p+05NS%|JsAuKV<^t_Zxti zc-Vt)_TU>mIPSqPt4oG#Y+pBn9ffTn%r8Y0Hih>vhLUe0_M?)HGlnhU6O7-6wFVfY zBaMAa(Ryt|3Lfh#ib`Z(S9Gbi?ZbYaJL+M3h{8tjO2%(jV}(%w=HI_Wjd?JgHJZ=* zB|gIVDmA7=J+;J+wi(37y~Gt7muWmpV|1uVId1;Ql7Q*A!swuqc$&uO1Ce;T#^@uE zn3GYRmrWvUlLoqO?&;XlwG|O;-fYu7Ie)QbfY$>{r@`JGu*%wYtC`%I-3YxDc*q-u zB-O*jUd1!Ea2_+b4V+-S3lkRa+|)z08+!&Ut2UVq%&%x7fD_WUp{i=Fni{;S3J3M~ zZ4ln_Bqt$ulW9%X{owe=R5eeKu^>o8@?ri{4MG~}oO(=}qmXPAX$8rVnPV6-Nb zx@6LB<1pxN-qq36-rBKlsH^*yYkG!aJzYaEpKRW?byMHX5H`VF61(H5)s;P4whinW zXOd`U)izRd8|B%vQOi;p+qU$^W1K78FsL{yTfMAowTx{@CIhPaOoEKYSpO3&guIOz zO-C7r$ZJS#%4;HZQCd4K63ts&7muRZ*JyH&x<1u)$;h1dw+dP8mG`ydAc-7$HHlGZ5B+BqU{I~Vh12An9Ou8Gf!{+sS z^cfz<1a00Pfb~WhV#C8D&cz!A?`Rs{3C%O2y~w!H!F^_%brr!6uNgAz2XCt0W@LEZ z#WwS20(t4|4A|93p3yf9<#-GxgVE>Z9R$yuLy}EeUfw6cGv|Ojv&}IDa}4(%0x!-D z9gNJ&8_SYcjX|<@qYQB-eM8`7lkT^`!)rt`WYYI)miij-!jn$l2vRV0#KiW1_YzJ{ z6}Bt!*Vn%ftIRcx(sckz;tB z*tYdO1s>BOk7g`}cddu_40yGg$97|QyasK3LA)E9bi)>Ju7_6+o+$@ZC-r%G3oRZt zGxDyoc+_k1=hfG4@ruXc-DL6X@msIHev60K&5Y^pv3R`RP5!*&Q}=@RD&!`ZcFMd4 z%udAnQOG0K4#Q)N-3dcoh{Q6FPhs_nOpWTF1d3g8E-qTf1x- zMy4)bQd=)~XE8q2iT7xPMj;?6gb+Rln>RXU=BKN|3 z9@{rtjoBoQ-Z6-rYH=A}E(G<`H&u{n0%fUn}jz~RdE%?o-<-g7eKe@0Z^ z68p(O&X>f;HphzhsaXU=M-#_-W4`yP4)}c&4Y?dQSv5Vur1Ao=Dd^G1!O$6~H(ylLt9kxnb1?hn=P*y9FS%zX<`aFGdlpxo*jMpGQ90&Y%y}r) z>h#s}ILxa!aJqV`p8Kyiws&_fO5vN=7yI!*4rUt_2SbM%=0x_XItyc_%$zor;;Wwe z3!}l8kL2qb6i$Vlxe&7l9@y99lk?cAdMM`u2%+}t(_+EpcVouMhAW=Br6zVbR{O1) zvCeBKy909qHVj`pEc}7y3*u#MY!$h^;jzP&8$4~|cW4u($u?2Y79EaO9Bj%Pjo|!0 zIOwbV$>3MYeV=$>pPEthj$`7!FPDqT9NmV1&j@eMxLESKoE#jR92}b*9Ge^*n;aZ_ z3kS!{-MHKHG^hqX`*@g|>5A{fCU9HM{B@VFtyDbmy@}|lGD;ACU+Nj&pL1961A!0v zIW9Kjzwzv|N{u%*w!y0tcp~|;zh&o3U3>N;XA{z4*HyjN5xgt#fr;vIaI6VCvB5Dv ztp{_`ZHt!fY0R5Q+3b96mimT`K9fu`{#WbWoa1J{vM|5!UI1p=XLq=u_J)dfbUu5 z<+#|FUDz)^HxRx7P;z{HTFJjd>3I_}W{eG3(rqFYOof2OI0F7<1<4BDj zj5+#~f$2p&_}59P%FmdEsqe=Y=JEEcHu0A|^7}ma4i8R#@M1rYzriE7`)VjpwSC1` zpRDR2%B|u^pMgqO<9Apy*7$>_hUhY^_-Rdj;Th_(4wVxbZ0s9^UNf^snrSW6@p6WP z0gTUKIM1GYL`lcjkeUR*nj1r|KFl#E?Q(31%updET(;IbKA2%35V~yFXzJ$pmU|Wx zvo~FyD08_|YlrFN{_$4P)eFXQ$`q_7tB2_15FE#1&Ri+i9(Ft1qPH0)Ct5fAa?;bMcVobDGaG20kP32uy~c z-uf5BHjmG${YjR3MiKr1Kb!Xoa6bh)7=4cb+q_PIQ-*}t@b2{RI8PuR*~wsdeIDLM z@bE}W2E$|Lr=9Lz@c6!Ag5lMHM4kz>VKOrAGus?%wRx|B_c{lGbTBeJ<|Pke8D5Jh zyB-ab`Yyr_a|~q>3=G8$$&z__YrtEd1@AC;?OE_%03adhr5&C}J{j%#H6s=2tMqjgs z_X>EX9AS&c>)I|y6)LL?`=}39p47*>w0T#7hd;?fm1pF&TfF>ncsE(RDdX_^Egnu` z#&q{sJQO`6?_P_C&5XQd{J-|@7V{dyk!K&i zZC*vLFDJHAj+`~jxa%=BM%6mQ9e?h&%H0h!?k+o0d2Mr~3|?f%ibjklmx;L!((5B) zeooB)$+|YNJF@qY+m^;6WtX&F9*gW%BW0p`?Wp)vb5(deZVOJ6$ zaorVn;y994TJM4YnTv~KT&<8~j%)-%60lqxM1mb~92XoV!H%1dgr+!g@>18dNoo?| zxCu_(c4b5BBu=}yPOwua!Ec;|Hm>zP|2Z?ea}K*=!LIXtzaImuInT^<{&T<2nbCUm z7{1dR@Qs2#Skhkh>XXlO9NTrI{=!Rx{L43uVa1exn}%(yLyzy$_zhNu`z}^AB%ekP z9otpCv$lj*CigyR+!W|ywjo#4cGw*Ygw?f19*g3Sh802i9b7lo*ld;LyIR}_XQP|Z zy5-Gg-VotGSk@4# z(g(_YCCvZ*E}1^HdCs$w%ds<9+@V*c5Bq&3-|wi>wKcwyx>%L&D~Sb8ZBO5nMYr~~ zmbiPW^sj>1AJ9_wr(vBstW}RqXyF@|-?%iO<7T_cfyo`A#ydY*Up+KXF*$r^sD90G zwJlMS9QMC)-iV?6vy-uAn6E`bW1~^r7Z%hzOHOwLb==R08vz4wrHZ=}&`EFT3&QHJvz^Dma*S%%io>E1X;*rU6n%$FY@s0f8VR}!1^lRaOqcO+`d2A|xIHE(yA zV&722BX)i~TJ|yRb0v4|8J;egzkBgCzL1nmN-uAdH|h*~;uY`o2KA zE{ab4?b%^*N8p<$7DqmM+!41OW|Q~T&;HSZ6`kRQ`xh*Cch~6SlSeDsLPI>C*b+9x zE6PH6bn=mss2(kI4t0iU9bbc9&`mM5um0yR9;q)D=AI$u*TqWp!u`Z_3=KZ{&PmNj z>7s|7aoZP;`fdpY^cl!+i%M39d?jQPK#tJDg+ZiztMNP$&voLt3eS7R^FlnI63-tZ z{`!D^>dpghtW1}kS~KilSW?%^{5DY%%_S>8>RE!6(~INo^)3k(!SfSKA zjMS62C>rU~ePY~_B7Bco@uQ>Vj&RYk)gi6A0QdhHp`lznIzYa!)`yXMBfYpk(yy(F zPDCE>cZaL>{rvt(GWFq0U1Fwll=lSlJHp030y|%Iw+$IJp^<;OPk5JjmpbwNY>_^3 z|8+=}Q0UCMqj`mirZRitv66QE!TN#(o9Rl-h!4-OCy={#eHnW%C?v=0&zrs=4V)-g z;tY?|M50IaM<_dyYln$-MDPolkfBtj2b<@S7*v83#L8s@dxwTAP*;4VH;-L0UtPIHS7!+kYv z8@T&dliw~43;E&QhNT=btV*LvJfUb0%sW)6rj*9a*k-|Y_6P8(?lP3!V(;MgX^{?# zy_4Ig^N`bG@3P=L&Zly0s630ko7+?VF_hb4pU>?npBgIPV(;Ph6xW9GSnNk}`*b{x zve*}JdrEgh6>mXtd9(+~ zd@q}gec5DhXS+<;!Iqh@lig&(E`E;{$tFeL=F>e^QrR)%{WeXC3q@xO{F4cL*pnta zir-U}<`=L&ll^G6+Jp;Py$O$DRVM6Z1tvU}U35t4Vdel8(8k@upnfN}o-Gu$Avll278ontB znd~cAwFy_UF(y2j{nnNazlI$^=6lzsvS&>8rKUY)w1d&Sr>xqtr)-*KPuX@yoZh2W!e+=7s8(ENIJ{lUV)(j zJJTlY2k3;O|)Q;|eDEhb;JG7TjaOEfyTL;D7~> zw_qi>d`}(Or|tpUY4nBYo;8v~_prf>%!7@7$d>#bG+OJU`@srHN2a8Ff`DX}kX6!N25xB3AelKHBlMed?bX%vmSFPJv)3+hBzf9(F ztl5&jL+oXPIrrB_V=a<+Ghpx08Cyd72E!k=yN$hl^d6O45Bx>t(S!H!3dilxNj?uZ z%=-o2M>^i$PddoNCmy*&=9Q#x7v{hX!agGG%SfNfSPZ(S-`Jby*~{2Ngts#GD(UUw z-a5R00oaCczePIyYjuzB5yboCuBT7zNkn*7i}%)w_uOQEm$)zO4kMjNF83ega{mF( zB|gHlkaW1u-GhCAaFeh{U^!kXF!mO5{2_s>1+Eo%y1;b;PZPLa;Kc%m1je3DE)SmL z{<%ruMuBGw92OX!<@{R&o-Z&0#ou2fFbW69*jvf@O9T!Iyi{OVa{FZh&k}gK!1DxN zAuxn;ezU+e0^cey_GZ4zGfUFj#!^>HrS~z?tx@aSTg0s*eVb`3Szkw7y-7@L&NH^2 zDSIO`Z`wuhN|?N#7S=nw3zpF@Hga3e*w)$Bv8toZIPpa6G+lu!+;AL9%JtM6(cbJY2tTE`bYMyphfZWN zZ|KNmb4%**6?zwE$*@^+x2ZgsMs7dDcH7L`PmP^x!TIZVAoTIgsI@a6Oha1@vficE zy|o92@QAqE*x8#pnZ|s)hdhwRY|6Jraw9r&!^9zj)UH!b5y$697A3K2&dG*9%(tG= zRteK_GUBWoXl>m)nDDx>!IW|cYwhSYB&QE2Nf~i(5hCaBGLFA7$aJz#mi?&4p*fMd zrk2LGwunq?ah8r^ERx!6acN2$*(TD~39Hc69KCbdgKst<$I~rkvI3$gGjM^=h{F@ob?DnQFpixP8i~4ePgdZfvi^rHh^GxAt}P zR#vW#ENh9bs@pbaS>>wA=Elmp#Z5Iem1`F_1%s8V@Dy!qYz$UL|DW5f&9D5( zs?|$FOB)Qh05H;2xnfmwU8u3LvA%9$<;uoe7gjc}Y+SXlvazl{x~(R4hgfQBcB+jv zYPziLtF&(IY18F~caxcAGrVD!sZBL()b`Xcq1qyITbi~{x1);LW!g|HQ*A%fcA^+( zXoS;k=Ot_rou)R^AZ2VX4J)NF>712n-g0O>750b?r@~8Bq!u$#iz=pd=`)%YiE-nTCEc3)RdD%xBKf<{orgW-bd%XRd;LZLEe%(rpv860KCbUYlsA zt%=xX!T5A8oxhl?x)%dDqSH8u6!nMEjZP^V-;rvw@GulKorxrQOD(*E;Jr!$gmMUd zl7&ZSQWi)ObjkZA%vJyO1JIaBD#?4^BJVNqiX;iT^dHSHsPgC=yqLn1^8VJs^Fn~0 zf%ioVFAm;=8F-s5Jcr#F6G*CbcZG#F7d#BFQcCjt7G4azrW7k3f7bo?Pk`sk!221@ zATpH?o(Jz@2Hrngc+bK^G}e(y`tPq`pvrp-7V9Jly5t?Q@R~87-efrsI6N@e3cpCfM^ zHd{BPq^132bvFiHLk_&7;N{}KH*)07EzHf`IC!~)<5}=>@m~RI=3L~h1uvI)c?`T< z()T6sa`B(fn;TCDFBkvOzV%%E_ZoP)#LL{Vxw#t$FO$2Eq8!PxM%nHu@B(h*o8DEx zRF2>kwgaSm=u*8}%9syeCVo^lh=28;k~8s$Q{YM z$HE(j?|-HLJPL2Ag;%NYMk%}-Exfr3uR!5hzsG3+PsZP9g?A3mYP>XoM{NMbABu7+ z9RFb9?Ni)EkxKEtZs84pR|PYYN8y(7@<|KtY4Az}4_PtA!&I-ye{|=aj6dqfNO>zQ zyjK+-KE+P)s2`_>_bu>byo^(L6&BvxiaZp7lsqf1pe*e_WQnZ2GKB}xS$Q)Q9v-vu zZc=zRj=*bDcoRq9ty6fDM&NB!c)k&MyA_^)1m1%RuY3gFV+xPbK;{E$dOV@K&OEZ!WlFDcUTb%^ecrN4V9JaKo}+x@*K2g+B4 zM#27bCALouRICko*WDd%?xt^q^7vbH!&W4=f2SubzlSJ1$z2kEFhKQ%W{0Lv_k}ih zb$4#;=$YZ0H!Cp5cL$&3@hzBtC&MA;ZEe`aPcy*Kdb>AbKDW1{jb{3LeKQTK^*yaU zJ8KIi@Xg#zvx|K4W7CGtO*k;~+Q$IbJ_fkg%lKL1R6^{J04)lGQ7zT$_dZKS?KHW_Za+u?S)UG6+%|16CYq#7?D6rJYAq@umA zbWcrMY0M6seoy1~*re@of*9<{Z-%n5*W@E~+RON&3ENmq!L(QJ76oe<#mzEdoaY8i zULrrx-m_^b0qP;@YkCck`8m0YCd)3l?3*wXm(>MfMyo__MMjK%vTubH{ z>;y>1AcDpc*m`DQ^c^_H{MNhM!$4W1do$K~jYEXe%jm6bZP-9yEX9jW3_a;p>1>P8 z+1H#it>w0~pfl34p{KiLR(r?#ts7eI>S^ujs2t%Ejz8KulqH^w^^uHmbk%DQrc(O; zE8o-0JBQyEjhi8>{m@K6y z6gza!%{*{accly~?`81PbwgUlM#w|aOQ{l+D=&ng_@(Y8A4yloMK`0K$viHa7gUBtzSOt~rpCDx#$S0R{+#)Ng>(4}mme23QQ|1$q9J_Q zV4O7J6(>&o|4(O;?pwy9VR`37oo)-e<4yX$a3uZ-eb%zE`qA>4dVT1t>$EBP@fTdb zp1RG>rWO6<`i~UlU03+yd#8o&jL*cm5{qkBx-sii{ehu1uC6ijhSubb8Jd^;@x8>l z{v%da73_V9dEu7$`JR@YQ+vPE^Jvfd@Ib|fL&ZyP&|fH76FX5~GW5lrcZZ{S(J^Ct z{JU=L!58v}+QGhnL5f=nVV5|wqCD)W@YduBbS!W5+48Wr;`$nQ%091R zT1~z{dY+5h2WvdS#Jl9EzewML6E`&9bD`&4t~0u;mO|<4x3i??(;gY16HYLeK7bP` zv?|vSJG>))3h@)*=O?IPzj#6m*XmmNKHV7)$7A|R=RthwZ!a$*eaOxE7f-r%f7n}I z8ssroTQMQ*NQHM%cu~#y^A1!B>iyte_zkh>yH$T!U!}i1Y51o9zR8AL3&!?% zPe%3^a^HAQUPS8E>aKWW-0+j}*LQ#&q|^PY!WI1X0p`01W*tKM34L^YdHi<$VaFld zM&PmA&Qho@o_uB}n`Yy;6Cg}0j+TE&?+JZ-U2WwHp%+}BA4|E8y2weIV!#&; z&BT4|OxJ>e60N*0wkT|*!jdG}O^Ntm7r;3wv0eUq-L+a(Ng@`n&6{~vJ4~lBOv2q3 z?seyO54yfTVOyDRmyzD16ZWbZ39YIyVXGRG@FxA?h2dz>IG@6sjK%-pch|Fo}Edpd=bv+ z&^~9_yfEa8zt)}S>+Yf3I_7eIZC=6IBXO3Oe>NHSR=E;L!%2qEZ;X7KpIO7I9El@w zDe;T(Se%thiH{FyzN&85VSm_mK<6=0wS#0Ez8@8}3E#gKw>{2%jN0i|UC-P7#4;**J>*9GxF?Q&`cJ9+Zs56uvxhRu5wpP|o9{@UFTD6bb-0+9Yv1ly z?i~!BdNQ_qFf{n2r~cTG|07!cUkp*nv4uUg+O*Qd`g^~;>-yTFJngJIR5WyMw^3qj z;l~ljMi}xE9nt3|8KG;749_xf12~YSZjPd$-5p?oh0o`A`-P#^O$%YO$S2)2&XV zo%3s2`53?9pPfl|*#7wFfRooi+T%vL_`^csGB>jWD|>hX?Zp$HeC8 z+v$E7dOo(5*CZjW%EN1tqO&pDxA?rw zr<7-@&LMSyw}tl|x5e!b*T)?X-={a|o&&z{=AHR^VPMj7+d-1-^*wV#va~S3cn`zz z=uuyNs5F9FK<`Hj$g0Nvgnd@~?BZ~2e`nanbC-*a8;b4x4QfetW2^_Qw9S#MqW%P0 z>_MBIx7PWhwGM=xlt=d4crJCJ-kIIQ>^OT0^`TVnaDUq3?BRdhc}x6$`0^O@;K-bO zy?-px_4!V(}sJE3T zZW_{jwf6h!#}09Bp5&tbN-Rj(7q=Vj@h6hWt|ifAz_xp3nXQi< zrqvJaAho`zZP25m9$|Hj!*7Hy*>%C6ziwRh4T%p%wZoEi&l#t$)?xUC{NaZ5`Mj23 zRRaXjdEupYMrBKRhp^Ch_JfPX#SWUb?y(vVuLpAEc1Qk zJo1s_;Y<31R8EcFUhN8MSJS|g($r}=gLImiC`vLSE9v~aY>F5+JEF=tJ(Djemt zpdG9OV4)xC8+1%bYJNgfhbj(~>pwfcKcvU};HF)YQXOc^j1+zG{8;~Ub|Jy;OgjBh zNN__Qr6twwRFhG!(UARLkZt#ui$2ZwQavTAuj=&sj*muvkv;s(PHpOg`X1N)Q8sPg z@_d~=8cZC;Xz2h?@!m7kM@)7lc^G2)4)6Z@yN9Tk8qoLPyt-RrV|?y4M*clQ>5RNU zrGcmOdX$ERlp7-J4aOiCd)NEI1%Uya9Y${4y@c{rt6p^mz11PZtps=L`SbSj7o1kp zisZNI#|)k8VtO*@EvH<;s%8$o(&ep4)QlGKzAH&NczW_s{dki^GmG+?=EE6#yd)k- zPD+l4>_Us|HHmsrQ`AMMe*F;o1V-8T{rL$MpL5#6kA{9QL^)7Limuo5T@Td1AzU@$ z>}uocxQMIbz_~7p!_$aOirMW{f>28g@^Thw^P@*?l#i+Csn_VpH=(GlA3b%K4{diZ z^Gyw(?(JU?-%Y*Bpk7xJ3mPGiCb7A-IQdXJ=q3K%VPA5)Y|)u-pOS0(*{D<>?Y`p- zcjmD}W4Da$snZWHA01y2w}19Q{iuIMXaH^Qb9X-H+I5!3Aw@LuNHkBR*fY|%pQmqa zMS=g7E<5kN`NFY)<6!?Dj5tyLTqu7I)Vl?VH8ik3=6Fr%98L62?EZWwt8&xm ze20d%p5jdpQJlqg;RAU{f}HkS+CSd@gZ7xdAGw0^Z*6ceu(wSA zl5jbkrA8B7dbzN$Io#ker}WTBf@2kpFt&lG=DTp{P^xo z#gB+*ik};^#?K(H!!@**RF~&%aXjMjo!*|#v%mTIFt4*8IPdnw<|enhMJx0eZ-tET zoclRTDYu*I@`b3sp4qt!r*0n5*|huwTDwDbos}10)J}DRFTC*N63i&&pN;DIn(Hi$ zunUFVh4Wey#!`&N(%q0#7+)5DP^a0D2NLEArSc4r2{lQwE^AUqQbcSEM zPhy`#YMig7<}ohftkl|6|K$R1hHOf>!!*`@hxch)^+DI$k$cbV#hB6;t~szM5Y&yZ z#{zrzII6cKX#V84#{7ws=1c z<3F|iu5(5o3Lmp0j~7rK>gz`>6=~bwb{ekXxjoXpzx{MO`Lr57bs2LPypR4v9-e=Q z4!YKyiRnwc2kRS#zKObE9Lh-%%83_qU^N)A7_}DF2H%Z-Cz7vg$sZ-ZmZY-r@pDwm zew)vm)FH23^c#IDDzQ{fFZe0U7^`Fc%yBS;@fZAf!JpZer}HSztv<{q{n4Z~)_S5&J0^jW%n4tL(e|P4bm4jCw`63ltsK#vnWtkUecytfA&-L z9}=~oQHN0qEW&7rIjH=(cr9m)pIKF<7&}i)eyYCG^p;FdswG@QW6KA8AJAX0>o~`{ zK9+~DCcCDY>PZLpuQ4x+x#TeUIW?Z`r#N8jHz#WKy~nk9L%d%P=^xf^KZ{iboQgY5 zpSc|O_=f(~H3MT&+nEL0-{IWffr{Hh2TGR5+)3w@`L4gN&mS6?@;UDom@SP}>-l#Y zqnuNyDTjmoHCph2*fW&xc`Z4FXYV4)!(&^Y=~^D7r(0W}n>0RoDIa5=8qVh|;xCZ= z8=paaqtzTj*`WH`c3AUkm~~07D%A3D-Hf)$ft8X^>KJWQS0pg!l;^=1hxck8H+pTd!@@=kgQ4c zo$vA#CKoK;dcJFL!J=;Thl5M`-~HXmuED@F_=|Ix(Pw+;xj^8d!O|qT`OMCuyrMDB z^pKn6ay|ZP4?j?^y)ZUxPu>!Z*56u!S>hg#=c7IO1*dw98pm0s4HY7s4l!p@6*lHr zFoRJM(|_VR44*EF?ysLTv@q3wcn+h}`Aan4fWJtubx{6_#2o0?9S%huRLfKAkPN!} zXylD~cf=B_svV-3WQXg{R6|aVkM%oOsse}BHV zo_3$Rv3hDKsymLL4@GMuuJD8JXQQ;hrqJ;TvqU(e5#F$n+2@O|0CX&heBgKG({ z?c%()i}Ttp&TG3kukGUeqweBNRmfMikCXNyN%a68uJ(M`aZ(6$Y6P$BEYwTS-Tela zp`5!5T!mk@y`|RsnBNQkRKh)}y0KZSu2?xMwyt>F?Z!3He^h_Xu==aMc$@8!E5E<` zy@)S0FV!RBC@3sYy&LY3sI{I4rnA7L~EAgS0=VR9TrLMTo zwr=D$;c|C5pbEXBc24!r5o;S2D(dzBy6r^tX9gQ0lBJ^q(rLoy)rV_Cb}k z^F5UH;JcKiror1hPbmGD5c&zfx$-nn+xUls|E{KuSLHOl3pr{SALDW?VXVFKFskYK zJePU(`An@Jrf^yB?v9LUBCf8sFQbO-*t-myD(lDZQkEJ|^nAJT!+Tv{sqSBE8_j2j zsqulNF{wM1h@)@xKCEEOiZe5|S+L!L9Tx1gV3!5wS+LuJ^DWq8!J{m=z=B6xaG?c{ zv0$$SkG0?;3of?caTa`?1&_Dj2^L&p!KLg^kRFayij`XIujlqu#~JE+i~S82T*moS zZy2h~Vt*sIr*_LwH(Kl`TJR(b_VM?r4KG1e1_T?5_!TE1XakwekoF6N> zJ@uCiRcW!G%ta5X|zYa(k*94K>wbU&ZZd{AH*ri+we>r}3hp zsx9`@xIN7Q7z+0%n9ARDZclR;hMI1%pTX_xr8Q1iGrvER+ta*|p=Mg_XL0+YRD#Un z_LT~z{72(&LmBoGF*cjOPjfwnnr)FE;Py1`F;u`}ALRDb4>45GVqe4UsqbT`8jJlL zZr?7g*&H@ii9h;A_YFm!d}*H!eiM7O}L1SHQ{3RA9A@J zZrE|+*WE@#J0xPpDkge%!L6Q0a&H{mI4wh2#VP7|(T=jcOI zq3o=heanQWvCo?Dbkt~$$srg z`%hzk%FdW@3;UJ{$JpmhxRrg(gx9l96JErYn{XSOW5VsM#DqK8|KzLwxr@DG!W-BR zOju`MH{r$XQzrZYw!?&PVl5{8LDp!(H?!#`{2?~hglpOFsk0}P#_HHlO}L(Y&xAwl zaT9J}2TgcB+h)RzY@G>*S-lD0f^DbLb?QAvSfL3=*;{$4{Sx+L6JE*&O}L4D#e|o! z2Tgc6>ows8>~<4g!9HZd&1|v>-^xar@JjZkOZDF>_OB+qnw>P^HTcw!!fC9T&>0fL zXdlwp#{S-f?d+flJ6Nj;<9;m@cCpbWoX1{8`;eCJX3v;#KKqghd)RIh9>rFgZ~>ca z!lT*$pnXWoFJ#|0;W6yfChTQ*nebTlArmfQ#U@I-NQy;U)R?YrSVCqvA*`~2a z1g1V@k!?ELAaFgGH-jw}_yLY*vQmMm&sSud#r_lR1;D4ixA{6n}`{oEAveW7e`=Sm zQT#L0eRG847W-8eTyMce7JLpeq#}8P7W^#>e$s-!X2E}E!CNf2L&0?B&g~YwOu^)z zIt!j>!Ic(FGNq#TofiBHDhxuA{Xbjq2@9t4U8N%aCoH(vf}1ROx&;?n@PA6-&`JI& z3qEeaU$o!@7QDrRTP^rj3$C-^8Vgp>NFx7fiani?g#XNQQRx3A^#2z6AB6sn(0?uT z3qpTW=)V#A{}uXMLjS4I|4r!sF7%|(&k6lyp}!*Z{}B4CLdRjb+@G%r{JPL5YV51z zf1k#lCEcU(cE>haGwx9<&@keG`5WS1wx2WRBRomtXHk(}EAVom$Ao@_bjYK2isU^( zI^_At9F55=(s6m-V$%K8GlpKNv3}AacK|xQcbIhf-Y<+h06bGPes;fSEZrapKKxJf z`JUg4d(F->wvw=0V|S4bdAp&LynfOl57j#NUlr;9!`RKFgTI#a3XMHX`gn~|{_~U= z@#1l5{C+iZ4?*B^7%~LOy@_~}HGYqpXR5|@!q;i6k94^IQPL4kYG*vMMe~0uklx4qja86{ztfZ`oR7L!ecb%7XB;{{;a3>;qGlh z-$c5|r({m$g>=eiWR9rf{(uqp$6R55MCgAb^wXrne?KN2@A3RZFOffhD@liafOPn; zR_HqE;Bo(Yk)H6U=T|6Cq!($7`ePLS0O^R2THzkgFObXQcY{_OUT?tNKNYx#bbL$SPdem0 z2%Y2{CLMBQd?m>q;Y8Nr@v(&5g`6Lfj&%At>9EJ-1ULUE>F_6=E8syokAqHf%SeaZ z8DtLra?%lwb)>_6Uanxy;|Gz?(^(Vs0?c`SgMW{bf53l={0X^FlMcD0lYgEU=4XVt zkIYfnxLnBDNEq+$Cmr>(bT>vA2M{6)^Y~v&I{f!d((&Gp1%8cmy#G7WQSUh@-r*0K zUwJ%(&;5^hYKL61r}~ZjN#)G;C2{88PH_g{*9E>);QIvLEift-N)KC1;Li#i7Z{1g z?e7ry5rJ_}CU@^qfj=zp=LFs%@M8k66Zp>s-X-wo1#S`e3j%Kw_=v!_3;acaaR@ti z|H}d+^Kpzs%JIDS&#O#=V5z$j$g{waaG1^%eO{Q`eX;4Xpp z34FJ}_Y1s7;ExOZ5rL7Jd3ce@xO?d2aoj8L0|IXl_!9!(Bk+R)qj2!|KPhmhz^JUa zygq^dOyJD|9}@U3fgculrNEyO_*Q`j1YRNVrv+XvFbX?&uNj$s77mu2)tb7m3

C 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 literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_radio_max_cm0p.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_radio_max_cm0p.a new file mode 100644 index 0000000000000000000000000000000000000000..0eac688d65a71d109cdd36e673a2c063c3584a2c GIT binary patch literal 53906 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 XN_dAOIS3xw;2anJf4DOBzO?@bOX#HK literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_soc_cm0p.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_soc_cm0p.a new file mode 100644 index 0000000000000000000000000000000000000000..5205deffd94498f6b93f17724dc04f5dd223fef5 GIT binary patch literal 1496018 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

EL_B zFWfQ%hfft>T-?Bov~F8t;6_@vrTsSi$#P?T(DBpt7Pq8Z50H00z`4)7)O{rHJc}Do z88>wMCB^L|F?5@d$Xx5OioZXR(CxXcdO+s=l_!G>Ps($g^wlG%a=KKMz`}( z9+N@4c0R5Um%+|QVdCzCB6dULjaQ4I(A@Uv-za;q?!r{`6|rb~>N@uWS59nr2g~doEiIPM6f=}m>uYEu87nh=sGVQ z>EGWKxi<~jklWwf9U0sY+3D`%gB6MBl30(39#00-`(-*|<3z6E-g`2Ly7JuSre+d|hd(=#|M0rDY|^i6~ZF!^rax)`0_+p9v03k6=Bu8nzEaIueT@ zHsg~bU6KsoUMTkSleC^Y35`OgU)2B-hSFWCN;g{>KOr8HqOkTwi zpIO(uPcP?>68FeB9mD+0`$(xYXor(gJ$x=D!B`B#6wY&zD`Ex?tY>QuA?D0ILj+{ea}r`3q(v&hJBAaJ%9QDMok9Djuk>)~HKEFz zcUD(Ts=c{;!qtKHNwtCI@mH?^UC|tDUlWPc?~Yc~9vfd*6{`)@uirVj_};3@+S2+! z{mtE4D+2SMgLvf+z>dq+|1*2-&S|x4y92WW?LR1-25D<{HjWR?h9QpnHF$znFsN5h zf*tuR6A$efpU*+g8ufv3B?2;>=dhv$slDK}HW8Fl9%Z~x+~^45uq znYX*7oR94(_(bp_eleX%y<>gXjQ$#I32e^~lwQXjVbi!453 z@x>M&wfJ!sUt;m&#a|lvMLmMYJbX~}diVmd&clbq91mY8c$R>6+?UU@oVCNMw%F_8 zBVxOUFBWwkJ}PE<_;KPiCyn!&3taB00 zx6Wd}z&eY)%sPvGnspZYbn7hk3&oO7|cn;;o@Em#L#m|iNQD@{I4W4=fu%hNV^5*;u`A=E? z*IRtG#Rn|@$B>~N<$c}aKW_0&7JsG12Q1#S8zJR0@ye0kZSkutK4$Ub44(P*Us@O_ z<^6-jKWFi_-Gm*M|0auHX7Nxta2>wC*8a(MW%I-je(v!H#vGE_pBz+(K8-=)w z6cfFBNUu|8Q$q+ui0Eao8$ep4>=j%t#AnDuALNUqm!h7LULnLcNinH^j1;SRD?x*6 zoc2PB>MiXNaK1Hqqq3(^=gdz>*E#d~(RxMkFtSKQZ&J^#LYa~Opn5K$p8Jq94<1~k z^eVJo#$v@!SN^jVU!nLa#g{97j^ec*$3=>_^*~|@k5@MHIfz28CY`7FnTnsUcucTL zf2{|C#x41U%Kv=DYdsZC3ZK1Rh#H}*UxR6J(;B`*4#kyZE(+jSuO}mt$j<0RmxDjqKSvfs? zR!ua)s7Iqz5RddsjgWO3l9&m(Dlnr!KUqs*F9XV0%(I?0`?OxwAU1X20aXJs<)QLh ze`D)%K9eSFKids+B1Y5f*t%((4p+vIbA~z`c~WJr)Q$Xvr)6e`KYE_4wr@Xb=Dr_9 zovW_fk}YE7mdCWqgT8qp@R?+?=Rt4(XnBp+-(|x+xtZ-fO7&IwbOh0Xz@9D*t_?})oX3%75RpY8v ztCmzXeyHlE8&}=X5TTxSW!>YA4Rcmfo zbz@D{sugvOJC>@>o)zd!I%QRu(xsK@b>gh9602_jMj*9KjLXfxgq&ArmSZ( z4JtdfxqBS%AR$X&?uT@z<_FLA*B!ZjJ3FPK2L_Iuyk6rPy0xvFeWN800h{B8s*R!w zs>F*I=|5`9)?a_!x*M)vy?WIRO{juRjcXR)ctibS)Qk~kkl$PFKiD)=-(UPDq2pNI z)O!fYyU?YxaNJAri1H)RIQ>1RPvpS;2cE~D{1&2j3b-^cl+*J5*uovew>Unb zT&Ho`K8X&O5#ns3b{euK1E!IXh>IS;c9`yCynbg?tgH{OvmlOah^jvje8C^ zOxz|P++!AQs}HWIwHD;Buv77b42|Y4<>$JQ(P+xQ#pl5tM>@#6LkM)w@|ExNt_+0@I zir#f6Fv-FAaqft+h-15&VBum=Mythr;?Om?xPQe%ro3k0v^>hv^8U!e9RQBuP#&V` z;<#7Lly}g;vCq-+ZntnpfMfb7ugJhr@7k1i+`ut>E$jn;0$Hi^8aBmv%Ls7dpzAw!9QF&aa7e(#jFzw{Ql^QtWbvkTZ%)mj_&KFm0 z;5a|#C$HAPAxXZtH3klszPM%s$0;knaFYfOQ(eBe0Rx9AJYU?9fn&e#7w&!ohbcH; z+(83}sX|}eF$0GwL0??Tz+r09#W4nMI}2dW`;GDmC3=eU45RG$f_f6KZ(z&MeTH!y$QYOGlzmY8i@nbT|+b`wABp zrAjNK$p?}RNk{*%=IC_rgUO$tEIoX8G%_Dy&d(Jl&w>dhYWwE&iC|&9h;<|)N#~58 zKzzY)M`C|pG3=;Zl&Wleu&yL^?~Dg=BGvQd57vd{|AJI`(2_h=zNc<{>KOhOF{SEx3Zz zoQ65z0?4sQa(~nbKbn{ajlqdBr^7ha2-E)1Fb%|K4WFNO{FwJYIm!S3aT1#?FD^{A z_sw(DwnXV07Nwtse4+R;59w@*U$q^&I z)MeW5;e#ICoB}*?tH(bi-sj;9#cU5B79kH`Bpx;gwaBkK4L*P~Pd@D7Cy06vKT*u{ z@THzJPH5wVXKH8{z!@F1F`^x9q&%lO3;#o%24Vt5PmI-x(!ir}ZP&eq15g*PKK4$TETKo+bzue+yTKs?N0ly4S zNSiRYl#by&Zu$3F{EZer-{M0S|4&*tDCIwE@n5v~Jr=*o;@28Hb#C#|Qqm%dN3GqqNYG=$pQ^_L{h?2C0BKcCq zBNHV*N%8o$lsqN`Bp!*D`~=10qgC<~A?)mRQm|l;6(z1cY~8-aU1n@b-T})Qi*U9= z)*6Sq5;>Bu{k&&w1B*#s-2_Jx<6*9Bw%^&**4@1g+h%q^K}JQ!294yWV#-9Bt0Jy} z68cNYw2!dJQmx3XFQJqPu$-gL)M%paPH(@XWuO*iw#y?$>|pt=@2hp7R`ih2jYzPH zxT^-Be33amKHg;@_c^`l8$QB8{l+>+4pr7vTFOHGqehW__!;? z^5g0~UKHjShvSMcesp~IaeSy9h8@zqj{hd^2Jm?0yH4Z&40lXiFL=t-PU9ZM4HL&P zL#}Y`wa??g9nr!-G31o)R{S^R4S@N+@*~kW3@<#m)rb(sLE32?&)cIs?bZXQ{diAb zzaO9ocs*3V4Y-y1Ap^JEl1JQeEd)3nmc6D~g@q(jo*%9qxYb6uez<4yly@pmc`K3l zEAt3<0Jwb8@f>gsIpkf81R={@SAvD8{mAr6+~NEHvl2r-nUUri)zc_k4DsX`mw7@Q zf)KCaXX2hSa12M|{?x*~0vyBPn3-j+ald2X-Z115qjC0HTL|OWHSniAa}DxCmb`Vq z)hZm@s+PyLWv1g1;FvzjLlL^T*%t0G;B-37wLly9w1GpCeC0iB;Be`S`@Vt0klPpc zih<)$T&LHL-x~&w>G8w8ZQ$@J;Nt8xsuD!X{4Uh(h|jRRwQEA8Dp_F4X&fnVNqv9! z)ZA-Sio~`M zTEE!j-GK1&L5nZ2_>g$nc%F0af8gPR;yw>wAeuaU$T(A-5%|gJ7u?u!sE0Xy4<8j@ z^6*7+u2SC$U}W?I$Y&68jD$JxKlJcH@qmXfkY}J}@FB5H3j^hx>nj@ z67lP?^_y>9$(q8^IpnP;zA&qf_~JbE<7~9`?J;VrcyA|W{sc{z{f;>=!#+zp_78NQ z!Oz6;TRazTvxQsfgUgy9@xlE}$pevY9scv%OFMo225vBZ+O5aMKWR@~Yrnb1HL+LV z+lq12&JTB2p1AMki3=mcbA|gFBBJx0aas-B03wAhTj=l8Qe1QG%KRSxKKfvm2S3S} z1}2^SL-?7vmkb=k(YRI%_lkkz_o&9Pzc=O42Coj67>%24;obm_@n-yR>5F^Yz)`NB zJf3;0MYye;|qZ+)P)au`qKU$UxL6^83m+qq~`ZHb?{f=o^~3ycC+vYsBQikU0j4l!jpyvp!!Pta^7=osw()tX*mL^Wmdu(DXmi(GLV=tYY z(-n_4cZFijNo|Aj)X`rY-gA&o2Zut`lkECrG2t< z?Tzt7ar@v^9f{)p+A@aF?YUE!?kg`ywt6X%;@>63AcrV3xVwIN;>P8G(-4Hu+~aDL=@u!0%h_jp%$UwfiB z`f68ES0U_)Rt&FhY@EesZb=ota{cvUQ4A?tjFhcRjb9WVZb%ozZ-ed9O{ojx+fohJ z1fIIEo%Rp+UX?Je8NWboGDi)-<_DWvpzV z+_4~fWarN+BDF;GsZ%>U632>)`;SfJle5!OA5=b5TRuy28u=FTNAy>e-CG`(_DXqD zW^>m!5ras7?Tlh4oC=0R88X!BNY~e-|I|j_k5rZ|q2HS)PoJE8bw^@ydwB2ARn1+% z_BpYUvSiE~`(kCglixl$J%+Owe|Y-zL{RPi4ZObAG<@~3LsR|VtgVdYx(}03yKQ(sg~PO*qD3>7YcNmz+@G%) zw}RwMyhJ%#99^J9^5FviCvoiIVN5TFten2$G^nl$Gbe+4bQHa}8K4S26wdH6!n z?ZJn|2Nlmc$$cmPW`xgu6~h+)ti^xT;JIe^kj3{|{7Q>2w)h`%Qdl|4`$LQ0WAV)v zzue--Tl|mMFbw&JEPl}9+bw>T#ZR{QA7MRGJI4P{E&g*B{}GE{Y4LL`{v9f(DM$H# zZSe;ze!${yviRi|Ki=YB<7BZB-k(|g=Pmvt7GG=el@|XN8Jl%s#j;=g3^+bzD<;-^^rzhFICJ6YZq|0Rq6xW%ur_?Z^}3#?yjNBMtd z@t?K$trq`V7GG%bC)n93NBLi|_`5BBoyE_#_&2#2V#xcR#ec!#TP^-#i~l(nI1G8i z7XOsR@3HvXEPk2AkGJ>}#zGMDHd zQ9Jtok;UI{@gK7I%PfAJ#s7dWa^)!hNsIrO#b0Of=UMzuG1kzI@{U@(Z9~1)@_(Pj zms$KzAX7Wa|DMG^Ve#D-f1|}Ouy}mGx{mUxKr!cVgJf7HT3 ziT_KB|9y*p#NzL?_@u>mSp2mHZ|@T&Zwx=M&(|4S=|?KTvpc5k@=DV02yrPX24hdC z``;#Au57F0{!XMf`e)deN%|+SbxwLri0_g@AwErdg%EF(ei!3bgb}7PT-o%A{9do74DK@8!Vw2D05P3(>tPdqC9K}7J7Gky(X;|RM8QsPMY zx(t5P*|!=*=41FP?{hpE{JIL~h_cE44d#A9nT^V@+D@C;wTe-Uq+x>{AYYS%{~3AD$2?g1@KsE#oGtj0isN?DGzOMTleM z|3HZ6NT0#}9nyWyKBM60F)kyIa9>jNgrct~npX5RMPFC+4MpEn^eshCDf+ge{Ai+l z?%5)ZC|aT@&q(0?sfv~NTG3^shn?@y;3v@z$akV0D7sS72GaY` z4oL4oJ5cv|_DFCy+5zc1MP8(vP7X zkbVT^Px>j8KWPujpR^z4Pr3#B(Mch1FX=;0KNjpp`IGNL`78eeq`Of5q@PCltNYI= zdPLD@Nm1#Jk$x2APm0QRoV3@mI}l8w{K>bY{7LT;;shx=^H)fBI{ju4o&Rg(w+rz) z>Boh5gLFWMH%WI0@fK+xY+;dp!s%y&gRBJj+lulh-G=ffMLJ6qEmd@?qGgJfD;iU@ zN>QF6&gc0ZPFk(#GDT&-j{CA-2d!22W&aLd_V1vwe+QNQJLo!vAlVzNbpAVgX9~~4=TD#(E-w%Q2wNAQU2=w1Ee>g{1ttKbPdX%^g}3r(hs8i zNv}frlP1vqNv}isldeShlh&jCD|&=<71}@PI+Q=@YLq`IUdqQw8&UqGh;NE?J<6Z- z8k9fj)hK`EpC-K?T7Q6>ZZ$tT$ei-FX+KTre=|;4F(pr>1=?Wog zNs-Q#iZ&>^TG2I%u2XcqqPHp9tmsBX+ZF9pG^uE>qJ4_)QglGkJ&F!0`hcQCiaw&~ zUPT{MbiblckhTfw*uRBv#rhdhv_#QTQuJ?AN$*kP3gF7g?-n9PivF#N^lmk-cmVlH z9{pQ2Df+i%q*h{-%zz=|Ar!y@|sD} zzoDoE`?q#d^lu1C`X@v*@{B*_7Q~ddgpRf3-ieI4kX^KZCEn~RnDgI)`m*M7F z>h3R+>gF{6u?SWudU{3a{R4eWQ2@ryuyTz zYHq>-+uQt=9);K7L$=A1y!H(wyE}HYwDwCA20a}+acqp-D9|lT515*e`xE$2nn@AK z_WmYi!$clDLS98nr~_j_T9eZ1iNARSWh-S%OJCES?L6wJv!e$`S|A?!OcqD?9g*6K zgNC-WB=vo{=d!)2x6e6=$hBvp_Bl8Qg7j?Pyt%E1XJbe)&M`M`JhgEX^++#}*b(8L zqhX8e>21NWJ^F+d?2TxWPv}%z(j0VmTWgy%^D#QKZEI_Hf3nv+<--=q(>`);TJZyV z_aWp!b)&GiZNc6ad6#y{WYmCQdpw@kpyt zQta3-k*78JWi_I=QJp0-O7MA9gWP*KawLT{(AvS_gL3MyV`eJPWEFn(zed+ zGDGacy>d#^|JjkbE`T%Xxoakw4z(jw>Nel$g4wEU9n#-wW190s={bM8~E~x zrU7h1+iNwB%CoZ4kd?6vwgsKD-CeYHwzYJdEypitiL=^(4;Hnv2?nT)<~RaSbq&Ce zB3uua&g4z3pBc4SHPCs>j_~Sqfup`Vvyi!8o>?%T4%Ni*E$iC{n7|QVvL2u@+|pIa z^jEK0jN15~9pOc5J~YCc)`aP{nX41@;JB;RXUJvZvNzV|O3?^!TU%Jp*R2#BdC9C~)H{%yUD|O>=!j zXi1>@MeXx)b&>hJH8q&8%`<)*s)uqkYJMbJ=UI;2SUnH;exhZgj8{jNr_OY-?WNA7Q$e4ep7SkEJ}cQ}JQlK7E&vux?U`5pGk#WqV#lt*(v72^-g5ihoLJ*qbYviAQbx+UtS>b0_naMe z7CifHVn5>c;@b4CbNZ}VC3K(SR}%gmxgA&zr1z^T>jB@MKMR@puJR1EY#jS{Aca=Pm2OxG&87+Pe$SqtZE_iB?~ivj9|r@|^YY#9zJ3Mw=<(Gw2!I z9C2*W@@@`G#2dReY?cO~RVM<2;~Q{@IZfB_2|4(5=4&%IvuCF_aLl=NQ^#gM(=xut z5HI(8;ytutjI^qvQU-_c5heJpVGh6waF0;S6FFeoXH!y|bavZe#(1#Gy^IhA)x(-R zkZ9|clqF4h2k1ga4KRbu6<~H2{U#U-%9NdPy6}kWPnl&bHP+E9=UTQt=EKd>6B&Y``@w~S-i7pQ~x`kmZP114Ql54oy zK}|ur5(~%m*LB(x*IZ|%dlf%Gg_cLXiWqq9H11otVdAJiQKdnk8uyrmixfC((Hg38 zSR(hxquv9ScU`BWiluH3j(QGedR=*l9OI`Q^%Arn@9FDy3rD?$zt^6?X&H6uTF0Y3 z;^@3l7M*^?#=QX?_grb`hkLCgKY8ur^TW{wZ-ovNRHvgxUF#^7PH=PxG*riLuJH{0 zs(|B~zjj)ljq3%DIs)4H;f?`kmYW~$?L6f*OmuVKE>7z~zcxGak@& zfMQ~$LJXknpfVtJ5tx6tC1_i`7*xCcsLWI!fQo_)lQ>ijsV`{ajsQnp2;vxy#{C1X zO1Z%;P^)oq zP@$3a5k$K6!0kr)YNs!mcHIZj@8x+o8w&b5+G!jqa7lfC=Sn|YVat}s3^$tX?#rt$ zztn+`Zo6AJ@p5g2y-!@>*b2L7{Pi7)a7=uT7NBT5%CQx;G;z5)tMsd|6qfD^dn|1gii!F2KORU0arcGD3u6AA_wD>_I8Z4TME}0E@7SCL^{vUT^hM@OssBpyM|}(G zf0Vp`=dI!B-+ZO-6#RIv0Qb`Uq1k2i>8|5Dj}?Ve>Ap8BBK7HHtiQBA28&NRw^0WV zi%Q0;^r*H@PU}+v{7l}x7NM&HeZvE_^3>Mh0d1*@a=cP(o*}-+cA~a9+CW&<8Z#F) zW-e;XTvS7SamAwAN>C@PHAjgsNmd`)DQhn`~ zL<%CINMR%#Day7D!g0h%&yI91YXr}ZZf$*JyBkdHuQvRV&z9x*a`ZHeEF-^sI2SVB zOh=N9vOPP;GS!nAjz?`wLJA63fHzRYU|&o9DP!81ON z3ka`&Q2H|r#|16_0*en>e4)jMExyR&BNkt5@lhEc_9u>uTK?lKzQp3kTl@s^w<nas`;(I_lwz#HT%cMBMJ-i^ZiL zJ}ROf9_RcTA2S8mrSWwSKVIDL;U~y_Ksr7=L*X4`QXzm{9h^_oE&z+x=Kkyeb{BJB zly(7poqo>4mx)~-ewx_e;it=eVwvYJ6pK9m&SoD=Jmv=^A6GnH43fv3hV<9_ismaG`vI;gUhcw9wA^R2WL1)k>PKd4la7qBLZ~VWqMb`W zK1(WawpK;%v#7JTVqww-Ps{Y`M4RWoJRg8lD-IR%#4LlIf;@Y^R1O(c#d^}vM)1nUX)eBJYLB=wYgdvH6&Erp2ld-)(1A zFY`S;XW0@zRfbD^wI43=Re!i-sh_l^m;3r$>g#ifuTQm~&yvf0eSGuaH{=8%-O&6S z{wQyWtPa4zdz#@0!n0cC$k-fjhO7vT_EyO802;RO`tYcc=SJsxe`F!wMVFZ+%jjIZ zo87XI{_h}HgTm+ib3CkZ zy|_N0{75v8woOc2IT(KLXveWE-Q5=MBJlhU(N5$3(25_wDRfxGYTW%6ZmAD$ofYn- zKH+}YlE?G6bA>z0l2_*=?>`Y&c)9tv8jLyDqGkV?h1=*O?=u#z(+79Eh3oaf)mS*% z!pT)0*Q$I0T)I8L>A3TTzFukJ27!BBdjbbmy2}*~M7ks@SgpDy(KvjTxYxXY5IFPu z&JXtna4Y$Ma(=k#qWt7_0+)}xgL&fK$`ePNCHRH#E5+|L1S2Tdt%E`Y+hq(t zhDjWfOg7SNV+9&88}Q;_{s}Gn3gw^Zpl;wXX=*N>8LVr)X(ut z$1(%Q`s#;UY2c{G;)h#j;4t;$i`!`6FvaAH>ostgTJpv1F>suZ^NZgj1`bnQzPKk0 z9HyjPoUOz23~+yEbP#Ah(%CvZ_oI?rtOq?nXdEfpbJBSVHvA9(rubZ^af_E;c1Aip zOP1CwcMb>~U5DqfDjA%s!}B3%0oFhVN5pvA-vr~dznY_B-}_^cWI=2&8S6Wq+}{`J zY918PhOSuuVApUUzKgV0Y|Z-0P0U8t@FYTxxJ)8qWfxAS#du#KgQrDsWLWwm(^vi1($FPxe)Gbqt0pi=!=F?S1>Z;{EBaSYloxQe7fX znJbBjMH5oIGodHfMU^3m{I`>txRkoj7R3;I8JCcX%YnXFS3AnTxhvi$;^R{LXCQ8}R7<3;mm{s_ zDDOWhWBXG`*0rs~l`JTEUkPFr>l;K(JDy}sLw)PZUE3m_T+{Nxt~?pjeIJ6n2T(T0 zlR*Q2>Tno!lKGOWL<{ju?h?gWg@=n|Z7yw?kO){$7scK|-YkW_TVNkc<#)Skq{f?A zR4_a*I;Xp(J7Q?Ry>s-Vc+q9f*({Ozb9^pe?YUie-qsz`i{N7);^r}}1F z$F$9w8rLko@rL@vonzW&W7=k8+Gh1D*ZnHA&CHIb_1CIz#c#R)J^EI^8l5F`-iqIK z)DbH9MDQVwdE@xyd;S=|3$*(#F3#0CUGFANX4>8_<8*duGv%y#7jn!zs(F`r#P3+` z_-%eR_1H`oR36T{?9I6RI@{E_%wIEamc5I-G2^sa%IVuv_=(Ub3qJMk+Srv+*16FQ zthUkz*5gW8sLD|{u-M@F747AN7GGfTA&W1x_^`znS$xFei!DBC@#91o@nzmSZk**` zBK?`4jw`YJ$6Ndai=Sxmr4~QQ;wM}D6pNoKUgl(=a?~ySx`z*ndpvxBSm)tGV!nqj z6afz(7Jp;RffR@$vCqRt#H}8_SS6XN$W${#9b5ho2*^@$eT2 z&W~#s5EqFHJp5eoOFe-FPylcBA9?tB;&~50U!G}@kyj>ufcirS-^J90{C&lLSMove z3B~iBMqS7cDxUo&bs-ljp6?jyLKY~V@8rqBu=qRFuZ;X6@u=eYuALl=hz~2C{nX@O zu~?*dC%mZmG3pbaXB(d!94Ee@c(&=u!4lD}cy?QpgX2ZQ!%q+wdiaS_7nkxJe5v>& z)UOObN!;t?%;jUXGnoBB?W$| z;<^NpyWCT-J+dYX-NDJf72Xu2#=$e!k-EcueJe#3N36GtNS? zaLhN}zf|21lA;kwdaI(hDf(eWZ&wtBB5}>mI&-u|=~!N&bSy7Ye68Z=SUQ;qob4ru zOkz6>&Qtti#UoMDAOEC3x-rRPK~3_Q1D8B9Rq|zuzeMq<1kxX#(jOD_l3%X)3dJMw z(jU5{(*H8Wmn$BHBmI$y(*JVB&s97Y`K14J#iQ^fj|B^ff1lzj6^~9u`p;JU2NWMe zCY&psR7Wo;hdtDsnv_&g(H6LT407juP8m{@RvxqLCFgu1%d(W$5LJH9WLu-k`CJYw zQOfl8XmHy|Z*IJ=O(_R%YYjT~Z(FwawzqBVrM+`#qb6JWJGVg}%C$P0L+ca=9%SnZ z$(%n&vNm?~K)Xm=Mzob)a|St?beNf=Xq&$awCo2c$4MXR`(TEM38Y;&3;i8fl9V=j9W z>}|D=n0n(8Dz|NJ8xfsP>6p+8%>EF`ZvO)MNE}xnDu&0}$Nh(8w*XUGo zDe#Wici=b(tqI+G2kMG4KyFCy#C`Mws4*~8FFO&#)4%0s1REH;xf`HNyYR6XI;!Gu zFIqRwrf6xsqpeq(hC}5~!WOerAWgmP-P^WrR<#8-{Ce)tAh$%Fy2tJ$hn=*hCal3U zZSGDsE!x<&Vf$tn-f!8`R^_YNd#SJf?s8xK-Q~XeyUTs`cbEI>@A|41FY{IG9aC;@ zt6K7#uH5YD3rsV-SxU1;&)|3dN7geVb{ARbQHB|#?(1)be+B3sUgLy2tonG7SGr`=BRjD`?7p7k9*WMh4X4%tAzVM8|3c>iY) z8AgPAh6~w9|Di%|tj{pv-I($7uAaTO8s^K?yauLUq~muM=Y+K5_bOe;!aan0-<3Yj zKaKla%$sp4L(8LnB)`?Q)3~o#IO-oWZ0$5|yM^N!oY!d(sKzx|xF|gE+2}frE33p4n)ogHUiFoA77tZsU@_1&V87_)Jy6*vG z;+_VsR{4==+@lum4d6Hjrk#%89Tx5_AKaA|?rk3&=d%}joeTFx z3pdpVx5>hl`{0=OX1Gqu;PK}=ecfT<*sfmFo38CxFW* zepRR}`Q%GGaQUR;V4m{c$`e-urR~*uN~^ORRMA-`}p0+%b?7PJ}N_89%A zfm?%@38rMl3jE+L=Z@J9QH5Ri_EhKo0^DKUBQ8Q;3s-WU(?1i(a5U}(^kb&HD}gJ8 zKXLGKabL1>Pqi~Ai5 z7dqc5PnHL&qKn&X;Yth~s*a1Rv2arj9JUg;I947re&q&^^+D&$_i=6Fstg=;)HUw& z7H*+|GxtGkuyD%^oVgEzV=mld~r`0IIeB^rQ;a`hvgDq+;avF%ObwGmkeBN1l(%| zu3`k-TL!Lj1Y8J(s>_#U<(J;62CixZT$O>tGL)~pWd`n|5pXLF9LGR@@mpu$;v?WT z8n}5Q;Cc<*d;`Zii!Rl5dw{!}kx~xbfOPhLlQ1gX8u?;z{56gg@{-P7AwG!AU8NaN zjaz(4^(BVM*w|<`V=q}+y)0jwu?yKDV;7zC9TkV|;1Z?x4qf`8@z-@ErW#uN*i-S? z6^SLvYHVrc{uxh}Q7e9`p*w%-=mjyowtMnlGIrjBW`FIrqTro}#{ z#r`YNV$apxy!X279Mfo5iwj%lTKj3r{r%cek8`)d^R2^u%(WT--s>L}YYja0601FY zP#kri<;71jQsS48mvu!s~luOP*T10E4k4EU=-gNPL0l~7l6cnqv1 z&kwY7rB|Y=m1{R9v$&55d3SQ&MdeUuIO_%I)?~l2#H)jlYAZbG)jc42)D>AzOm{#T zL$0`;$S$6qQQaSTV} z?C6vcL3jOXR{~Kl)>@4mSKpNmtWK`BXInd z;o5b^1%#ImT6}>>8hC!oT;t(`Vz!4b5C=2DarKkapELLX-r^tg@L{ph!xxEe$fHQ6 ziQhWh<3XPJ#BZHB9=^b%x4>@~jvchi=i7$s8T@vU-!K?FNQxJHHSWWFxby9Tae(Bp z=tB9w(r+7SsIj$Wt8=EN^@-C7>#-b1E45Tvk*zbyGv7k)hY&tBaAuVg)o&Du=rs|`<%A3C-7FOL<%j3M=GR)Gl%T<2a z8dAPxSJf-zn=WojkeQ)8nal}9Av)T{k^BkQ4ga1usxgK zM&|qj+aDeK1rv8Qc=iF>X`KBHbprsoaL?mDFtoh}3W+pPsc{z-cRtS?ECuB3jx9`AzO-)@(lk*%}kHJ3Z4&SIn6I@`#|8f#Bg zqC!LyrH8+Bs8m|{%6zjqwwR9feWUNZ)p$MC@82~yF(8h8;Mla<>QLo8iQd0!_I zaom|dqjbS}sgJFBe3zKrD4w4-uw=r(#iMBaaR%4#tuy$d$FZc6VucKLvatmo=hdRJ}vu|w(J(ztl>pL=8X)y|CFUEDCR zQ^ZSB;JH0ayfAvH`Lt!#0!#XBI(`#=y@)Z-Y<=0G!-?DQ_YQifM;)_z@R|?~? zR3tt(RT7^!JR?0ZUX?11R}Iffzds&LgU8{q;i>60;i-Sq zI1|>$YF{24I25QGH(Zhq#KP%;SSTHf1@VO~(xF(eE|3b~w8hLxitp*S_4eM5&au-G z$Lv*&t@Mq3Q~yf7shtky%)X_|RDVpe20yOLosCT;^IMo>0{tx<$92ATnasFslrnbh z34NmAle9i_CUVTUV90QWamhaGu@^GVHhg~D)=jx<&zYvdTrX{wY4F<5!7Yz_%NUSy zj^QT;&k>cE4_bVI_z&QlU5N#je@ObXemD*xc;pvKf0mi!3N8Pz#TQ9D^VM-h;$M`! zmv94CctpyO&pD4H9v*Wf9=<^Id-#xO_V9(`Y7ZY4vpsx~$Bu}cGtq-k#3z7N6xyZN zE+8g|4IX}?Xz=i*o-@b-_%b-p<3CQkt%ZRG@YV3T;+g(Qup9CM;>Sl=e>ey8ZN*0< z9~56ue6!>W#77m+GNK)m4T@)((2mJ!#j`!oj>#OwvkWE&i^N}nYR5U7uWJUB{Fe-V z68MKKe!IaF-)!-X77tSmt|Q)D52t+ddzAi0_Q~~d=0kLz^BoqQFK~(;_(jg1m*_=K z_%NS>)BkWE%C%RME_C`h-d_hkc(JmhF~`x_rkv}Dt8l)3gL54_AH;VOk4^wl5z$H^ z*ZcW=HSa^Qa~Y|gvqIyQyk3t-Vk8g6Sc!*Dp5&nbD|vK$lAo%0d`L+ig)jY~U@G}i z1aj8v_iF8TPEnJY|EY}vMPI|%l$W5cq?r(vvF+@9uEl>Aj`C8@-qMZuI`&bWl@X&BWED@H7$k zuH8Ib58tMd8=;EY@yu=#&i!1?fwlka6*%-b@;#lDMA!C9{MgT%^OEQSUB|wc?p6Fu zTpf76546*`W4K}Bs5g-rqd4}&Ox!{6>*=9fNYRghnz#s0@d;s;y!WOy$weD@t(e(i~G!n0u4k!FX?LoH`9{Gm)c8O2yi+q zy#Cy4ig^hI)4&Vm{BY%%_gkq!pnkY!;PR1oAWwO30C!~`;l`0k`NXdiIMx~MbUMz* zg)T$-@k|?LdL;lWq z_Pfi|C`uZ|P^7PRW+d66&d%o8UnBaIH%{P6=_m(JLVlP+qK zSg%l8Y40568R<{jVa~`EW@X~Z84WVb3K?eUl03rf_6zd>!pxkV(vhfgViXUgig&$*i~$dzzKml&ygwj6p~kWr45sA=tF1QXCi^|MJ-YXNhl1C`TwnEsqURo4 zR^b0hW-#f|H;(%r%1~P3AI|u&o{G7if@1%cdDs5~?i2%u#taQiEt@)!vr4qZ)D@{8 zc>A$;AA`fGOW!=LN^-A&6ex|mOWs}_KA2bdzob~Te9m!yj!ezc^#w?|3!@*;l#uKT%S_2A3KBVw$W~X zIX1pJ32O)U^4SGgj)H?^zhsyK*T5xL8{DaBCF@fLh3Jcp5 zMem7sj=y`xAN)@&H9jY!_M!L**uTL^%RV&Dnk@Pd+a%1$B*6zbz4L7Ap`ah` z8&fcKaQ4kFAH4rylgJ|!Bo0~@pj^Fr!~SId4R(e753 zO}>C>%RU1RB~|A}uBpCgmoFH+Bw=pGE+`l?m{^c9cwk1-;GHuP1~X^)1}7Hc_vHEG z2d&<0p;e=EI;!O}ZaF>ysINhL6-*F$P60USpJUZ#@*pgJ)q0XfN_%sL{BvFs_Xq^1 zt(&$!eQ1A$?=<8l3=Phkdd=F(?@q;;*n`_6<9q1~`h>{-ir=1|P}3YKD|{+U`o47r z?psiu&Xx{F9^G{$@&@i==EsQug?QJ7v7hjTWy>t6e(Vgjxu9iU_$-z^1KWciEl=8l zqQzw#zfO#S@SFRgU}Ri%WoWq1nnVeJ)#vlB#`P%wV5o!h_vWDrL#L1pBUAfB;l)TZ(2GDhjU zl0-kHrbF$X!qb?B+cPhRwM?(^?HCiee;59XPv4jDcylDT$G4*vQ8OOL^xu#F-b^w& z_UHEcc6^s)cpS6$e)<=m!!P0S=DoRnup_s+40nxd>XT1Sc~6#NzCMq6qL7BqWBQXb z>obncT@QKBOgmh0{@|<^^VeHv6JE@#OPGG7V!>d_i@EDhWaka~3i1ZOTTpy*$&hd1 zqCx+{#V6+v%?7HCF$?BR&YrhmLH5iAU|q@1oj!AB`ix04vvOl0Ys&bn+{C*K((^8yGG#keALF$a(iH0 zQ;+ZPksic7hVHnbnvMbGy5an~>DX_aw)S;jG(fpgGbORb1TTifwt&|hdrIguKb zOx-2W8b7SY9?0tXeGeD$?+Yx8RyNulPA|(}j+5=IHgC19@UiXd@mZMv)U>t@hbzK^ z!52g8pTfJ~(!s13Tf|u@wvuhN<&^4b+%eSsf`}B_R?u85Y&i&wBhd&()7u|I8?Vp}dZ9S@}Oycs?FkLcN}(X(Gh&whSpYBa^u(W^hevxnOYs}HUH*E3~N z`Lj{^x1wj?h@SmZ^z8BI**`?j9*&-UHhOj>diJU4*~g=2cSO%_JA+RTwCF)>A2imZ z@Bkjy;UC@qzJt$+mKI){u&(Uj&Dp69C@3q zg!=EtF|BdOd=a>#tR3&LhdZjReHS4(PT5n^+85ILjfuT0-fzj=DnBdq#>TGH_tNjw zgc^TsdDH$TIo_bMS=SP3^{XU#U*}`tg3s1&`uK9r2gA9Y1kbH@s;devKDXLw&0l3^ zmf6*`Se+gJTY$&W%#pgC`pfrV54^jD9({h1bDmQDsR^lxsY$8HsVVVurSO%t%Umh< zxbz-;wCU3KHRrg0o&5+WVwy70H^kA*c~f<~JxU!o-6R^Sg$}QE8E+T*o+Lv%o_L)P z=+-9a+sa7lMlH|foQKiwL#LLfROmYUeHGg{PotTesFv-Tvn*Ra#+TtOJkflr`1b^| z;F)iK=by{Rj@I^%n>rDXM3gp1@-kW_EJO74ssrTIqk+0F+cWVDg=V#l;;#9m*=}_D9>q3X#mbVYvmgC!$ zYNItm=k>Sy@Fs4|`k>1_5wAzJ5$PO_js8~ivQCs|@2KX1t7WqEoP8UlIUb|2uUbbm zRykW8Ry|*LR(l_B75Nx_-=p3WmzcWBv-WHp#XX_giN+0H?Bq7~p!?nV`4WFGscnYV z?bG;rG|zdp9EBdskrEwOr=+D~;nloY^E?NffHd8>MNBA z;0zgEUy_iMU9FI0$diSfo`+UQHsmRWJjIZw3i;zQI?i^|(;s8tfZ$UfV}*brA8W|R z8uBzDkJWdYAx}5t>4toqkkc5;3gZm(BuSwen|6hoFFpD5&aN97X@`6MBy``-$a4Ebasr*W7SCL8i8LQc(O~~oDh!v(8^65f;yA;E8L!M*c83vwd;8{XnMO5D`A>XKAs-G>5=NNdd;K%OIxk4VZpCyl#&yq)?`Yn0PkBcRbieaA6 zAG;ss8R-`YdCa~AhJ3z(7YP1}XaWli`9dM5afB5X8uCR#o+ibx2*zW5QJ`xHuoT{z zD4_T!0sHG8YS;%4YuFDT)G)@-a3Wl&;Ut)-;bizVIeX_o`*@$wa4OuX;W5yu;Q&-> zcq~lQa2ouUCXYt-r^C}49tR)S@ObFfa0aZ^@C2Bt;Y@gQg49m-%YuK_@I<&z!;_#( z!;@jHhNr+(4QIof8LIxN@Vthn!2=qe4t*NVfpr?50W&l_6W*kWs~i$w7CfinAl$Fv zT)0ldc~Gz6*^sZ{eE37`W<~qVfgfskE*#bHJh(x_1#ppu=ff-wF95%W7s9{O#NKFm z7D2CqY5m?-1^aMi>jfIV2=X-C0I3=-hX07&JUEAFGn~@!7Wk@$FNS+Hd8Ny8=Z&l+A1U)1mlxJ$z;pez|S;%Av~kuLU>riAAmy|E`vQ9E{7{MTmcmtt_0f8M+P6x z?jNV&DtJqonC`>fuYaoHwQxeiHSl>27r{q0TnoJ#UI&+Hcs+bT!{}N=!y90%hBw0R zQf2OG&e|pzVoc-w3I3(sGJQeO{O!>{k z^{riu*9jbeDh-c?9L6*z&h)3j8`vL{eha6=GmL4>n~9ynVa8nokB421>Gyi3KLctR zza{Vl2r{N;cBVfQ-opNv^j{-z7JQfS-2zX9BaEpV%JffyFk>2nX8I>XE#ub(o&wVu zqnS{i4R2w8O!{ezndzSj|H_!gl$ri%@F3&c1)dIj7+dzrfjSM(fLV;G+B5w#;VtZs zNk5JGGX1mQdB$%G9E8s>ZWlNgZeVu75&c{_9RZfENxsrY1Ux50Z06tub>A27*ek%w5 zjJgQ_+Ip^%{CvVL*Qx)H>Oo#9V*iymCy%bb!Fqnfe*JO2)B?KxD{CE|Kj^dk7hpQn zPX_SeQbEW6wEP$ZCi%pAR!U!{BY6Me%)@S0NMj@dr3H*5eMpgvC+)BATiV!p75;D5(jyBzqPH8xYz z5$WSiA?%Imt>O6e{+8l9eq5O9q({`-0xlQE zyM*IWdkmm)Yv_pix{{7)pEf$8eR}Bl2Y>-Seua*213W`V)bk1*G5>Gik;*UZfbCY~ z0~aKV_J-|w8u4CrE`K}4$Hb|={omyF{2D~-m)=!TdJS~M^eCUiH{0olS$;RkF&}=y zVTus;UxRH;do#8@jQQj<{Sce_Rz=ZlPm}4-U~W(+3}? zV}cK-LgF#tg9qrC%Q%J`gpVdy#P7?`Zy%w`vlozk368;(A zPbi&!XQ)!v75LIvug_*n}YPFPJWN$blbVKS9T*v7eyhQvkFUKJXm&7j!&{ z<3Kuo7w5{-@mu&#l#b8i{ws9E#MX~rL7d>`W* z82>%v9>zx)U(5J@#?6eeF_cib_Aveo<1pjTGVWshImRKzpJ%*-@lnROfL-MOA;x&<3|{`F#aOrR>ogq{1L{FGTzPj%Z$4jKgPI^@jo(dWc)be4#vkA zH!=PS<7*h-%DA2JZH%`w{wU*}j6cTs0OLc9@#Ylezk~69#&Z3?HXyW_H?gZBGZf@abto*E-v!CZ0R4 z{-(2mf}4c6RslTlsI~?-5KiI-ly6*TI0Hvo$I}(1-&lO@_-uLp0P8uHq^HU{V3H5y_MF20VOxc zzC>Yf?&}V3A;(T0n9V(X9;w}JmV2ko+-Qea9_rf?sqenlOFlw(BLgzC^sRaZ;@ zhVIso7xh(WqrMI35z7lXWduKJ#iZoKRIy{ND3#9VZ>b!_)U4tcH0 zP+vuBIo)e5!_|6iZ)azHPj^c_wghzXKWsLzO*LTS>fX6=_s(q|>PYZgJGw9F?(A#c zK79R1{+7_ru$RnuHy~=Zj54g+@=$M8%eJbnmY)7F)~Hx$<6P^=u58&kGWME~jc%o{ zk9P6Gi(TV3*((qw+ACN$FWraTyZc0==1khK8k(sNwl(9;*xZUm3U}gu3&YT<3cS&& z)mQcQZR1R^Tf2@W*6s`~XuO=kV;Z@766cc42CVN4dSU z9Upjg`1q0)=g362bKRYLu+iJH)vhtV6KHJRy>llHxnqcI^)J_T}fJ=f2L4 zZ4hp2l}}SEck(vu6(aYi1wLu4odVk%cZYE}fx9kHAJ^Dvb#k~vMmu`5wC3&j%& zpU~0Et)V>~EwpP#D>fbLvS>qsupQ&s5JHiTzQz{pvN~GOU0^Rho^TgD5do`-9R07-F`Y*LMOb=!IxL$RkB-A;~NKh+|b5>w9q#K@8EdQ`s5TUI>Dnj;7-(l2G=zGZ`><=a zoV`XR70rF9w!aQb*U2JmU47Vtc7}Q|Ydq?Alw&HD*v0OsY};Pn+|#@>P6s~E(c`c1 zFxwc@jCmS1CRMsM+KY>>jqV(zT(_1q>fBcT;xR6-4RzrYpry90xg`V@ThMWCcUU~r zdMt!}4MT^$t!xKXZDD+zD7~P|4?ue=RzR#%kmD7I^Y-hIr&W#~c~?2QZTsiT8m$4swW>6FaM5=TjqlVpWsIx8HFv%=9h%N>og+|fA89gVZx(KwD- zD{(YViKB5!9F4Qg(KyQ-bFj?OIK_^}DRwl@`{o*YnWK4%mO0v|sMyg!Ma7O5Dk^p~ zQBjejjf#pKjZ{?R*o2CT9NQ3Xs^`#Q6cswQqM|})I~5lF*KJYGzai)Wth~#$eqAau z^*wIv7cCQ_kND^hd}AmZi=n-awSRx>K#u;d!3R3OyLDi?{j{cX>c5^atKx@SoHBgu zy1d|xqpQCN*e;H$)n5i9;W{d$-(_|$bYr<}aebL<@kqV)Uh+C~<6rQ)a@Ci+PQAS<=oj@K=3yB7)ug&1m z9v61yEiricWAt>T{l*x)Qsmjy$1gB~THZ&H*BZ@TtQ=o9co_kEyF72S`=iK{WhAvS ze-9YEM;v$qM!Jt84^0ydQr|@e?+N7LG@)pad6;AHTF0V3G5`n3dk3$ncIiyB<~EwV z?;E_+$h%UK@F?~Dy}>I<*XvF4x(!|p^6d1{{B8U{dcQr0JS=iFNW0MdJC*k+@*bxP z9Avt?jrwREZ+{>C8sn+@29Q@LmElq9`zM1(>shiDp3L8k2JaQ*ov-kuzHJ6Cm|<_f z3WHaIJT+aZFT~}QNzwWoDWhxh{7QpYkGxloO zJHL)RFZL_IM&%{lKIC~x_eqbu#HrrWtw-J#5B2e&M}2R2)VF4uH~S5Ep(cKW)*Z#N+iZ}n)95tOHM>kAH9u9G%;dF^LKA`+jeu$Tfe`oObfy#SB;ZZu0_k_VqT^`d%V*$y#)8GXa z9&seE+u)TVuK?wgKl}+4<&_(}CWVKhC@;(49aMN|iYV__s9Y`YqY97gA@lcjgLhit z(fCvHZZ~+eKrD!IDhCd^qr7H=7epS_6Y;3sNPR^HuTbIPkT%Nm8N4#&6|%l@3hyK; zR?8b!csK-&>ie9*JEEjZ`IPzFYw#XLUK7fx9CSZO-Ufr0vC?X9#KYzq<;^g7*~pXS z$WnN}#YU!o`KscQWu>LTV4=8f{aaL6xMIbMV6eDkd8u_} z_&t%=P)CM8$LKjpqt7Sc7=(|dS0`5csx$JeoojQe3#v1U((|kxZ3)dNO3YhTNc%+P z2J^0@E7x3`S2R;x2_JWlzwLt-f2P7u!#zwXy(8JAb3X2~l~I(D7Zmz}c}KIKij48+ zHr*JRT1m&Uh_5o$A8dN)%GApI++b6C_S2C}|2C9QtE6LD#9x`=Z))m5c|mRy%O7C* z11vux56~zs&L>As=cAAI~^O`U5NvG*yap0!;~c3^e)s1G^LUPWP{GdZvGN zB^?j+XH`z~uWPF8pH{i9DPiAq|E*2W>?PT)O$YXp?3Sj=z0)dhX-c?my8nAk&+H@F z_nHpuBiVCJmHVbuKG&3R{dE7>=4Y-W+1Ta-*O4sHTy~wmGSHlHyn=Ex09ew%KzMEV zm}SA_JZoRJqqq}em^mVs15|=_0|UrkhkSn|5H5?opCI+IyG;q*uhNNNG-pYk|bcw1ol6T zrCPWDMm%4)zhWPjd_U~-SKfjp4C8K@Ws$UM@TU&Uk0j@%Rt5)Njex&t;GsxrWz#@G ze{ffOf77mqW*iZF4;SnU?m4;-{73e8>`SdYvcKRu@DJ^O4bO-6AI0cE| z<&l7Y+JG-IkQ1oHBi@IH*`ikKkX$z;^Ch`zJCN6`_-b3TW7*ej#xZ|nY;_roKugbE_mk$xU-#TM@dnO zSvc7d$L=OP+jT(PnU&Nx4EXUrSvT-4zJJ#38t6ZWt=YaTdMQ#xyLu=mD02Ji-i$oa z!uC=Nqy90iD2;ntd1pD@y#svDtJZ%yt~U@lZK9lFj=85>Cwjtl(f#tu8#V+hmsT!Z z7{s}I;SOBju_(BFN#U~K6&1TXI$MJ)S6l_SShA%hxOg#5SH(kbxD!_)^5VnZ;9^U( zt*056-FMJ}6k0HGL05NID7Y9G-L*8*1XXL{JkQt+^(^T|MJ?go7gTol^o1geHxw?! z3#}c^+i{sie`n}|?OnU07j}okv_$fPRm+Qli))wAR%+J&v?Qi-)5a|go9gPS8X7lm zS>IS&zmztcqg6IbJGxprcejR?dX0qn98DZt9yH=;ot>kI(mskfZH;}ne%`YQMq;w6 zt@WE4w!|BE^Oo|;^^F_KHTT{^ic@y6VHi;y^)!^PsofMy zNzYRK=1rB2^>yW2sy8)kSX#fiyK+T2XGtfD1y-9jZ^3p%1yD1-h8kKGHnj3O+{6w+ zeN{tkeN9yqZ>rc_)o@8wgC(tK*i^ozvV8LvaiPBEvc`++*OYImYTQ_LX=6q0mg?Gb zo8etT+X24!o8g)LOpAE?I{fZ;@jK1Y+irUEXCK#n=O}#1>Jm48SCEOwmw|rGRAk+7 zlOOk9aZW#82fcNb0e{52Cp(MK8+9)`q?kL4sO9md!`+_Am=ABZh_A=F!^Cyl-6b$g z+_Nutd_9ibcJ4a7wkJ0`(3dH1_K)9LW+ukt`ZV-1{U;B*6zGw^r=XBc>bfin%9W#EYho@C(3 z2A*QzYy(d<@H7KYH*k)DXBc>tm@Jo73a7e)W=?M+{;iDQ(fF=zm!ZHmfL7Ik> z;T4*67}cKwU(;|Zd{o0@V4H>mP^#gvkfPx<_ytXVjOtH^M>RYS4r+KjG;25mR%v(w zq-!`6enyipqx!Sp%Nm{tAJXt7XwmRwxKP7WAV1~2(;c-h6LO_ z;|>iM!)6UHgGCxHfg}wt2U>p`3%`5!S_S)X=I50fz6{DWd^yb1@M=iY@D=bony|vb zhb!KGq~WXJ>l(fqj%c_MKBVC$xJJXxut~$)phUwhFjd2?@UAi$!3XETD;f^LcQxDw zU()b)xJ$$B5Ycc4T&3Y_phCktV4j9MAzj1g!|!Qm61CR_@DmMR2;bE32jH_BE`wV& zTn@W5TmhGAxDqbV@EVw{;VKxT;c9q8PQ<`G`fzpJk2Jg%p44y+JfPuPIH=)u(52z^ zVxNFm`Rib{Cf@)-4Q~Y8dLbHUf40}7i1JqtKhW?h_$Lit1b?sL2KbPMH^UAMZvmRS zB!dqw2AbO_1MS{1LjpYd;8OS%K3^z{W%x(?yM2u@{rbxE`{84Zj|iLq+ZfZY1KQth zIb%E^#_=Cx`o)>)PZs+vl71S&XZlm%NqpWArfxOUp9&viOrvz#->sD~{c6UU2C$kj zbqksPu`ovCr@>43d?9^Sdg<^OV~alyZeg4!;*Wn?Ty%EyS3bCGGE4#@H&~6qw1F-k8z;Zhydx#Pm;vZ!)&* zISoF_*y2xzdQF}K3p6|f5;Qy${uQ4$q~FTVEVz%cr9TJ}#+JQuVT&fugCJuo|Fhv8 ze7=xAi=PkAF}C#0flo2E>^B$sG&~R1Yw-(UHe;*4=Y#ZLV5PSJzJ<@5n0*!k?XMQY zi=bV@i{V1XXa=yk(9l6X{JIxaH!^fpPA zODyBbW1+#5`s7jaWc*_0Q#}92c;AL5-pAn{#&wLtj9VD*V~msaMf{r>U&R`YjjPao(@^=m6BaCq(tKi?y_)^9@8Sh}+#dsUzZpLMdcQMAf$U-Qn;|j+8jH?*$Wn9hpI>xIRU(a|I;~N-X z!1#lVKfri^aXI7tjMp+gz!)d;it^pacoR1IQSN(U`8=W-IXo8!=i87YQ{0w;eCU(6 zZRwFMwi|{bPYv}5i& zn|phEJKE4gy2sKqx9*8fPcnB9FiTEca-B3xDSB`d5_BDo9^4zRB`^0hb846g5WV5yP z^B#YH+Io6-qBZaCYbOu(*!a;=f4I57vm2e`lOulIc_LaV@v-~x7VX{HL4KdH5h{%} zo=O!hIsiG<#`HBQ%NHfG6HeKT>{Z&d9eX0(g2QU08&G(1?CGU0t)r{0+okk9p_UN3 z`X9FF!pEgFRb!a8zCmZs=q1}#H|5}n(mo8hdBSj7t*s8~ zi*t)(Z`-}Su?_bV3FZGcbV}c@{N(=cI`VgVQ(!$4)e=U>{&8;!T)6M;4+`6t4)&=# zzi_bU5BsvgKH7+W;&?HJr=LPp6>+aE;xp*_%EF$0?gtkBwELg*18cY+SEKt$=J1Xx zzD=3$r{Wp!)vr7JDUFS{CH@sxe3A;u_LrdA>$$%Qi`VV^8qDIFzaG#1%B(`i^V*KU z_J-Q5?veF3{VNl5s=w8=FVK7OW7J-=?YmM(YW#arH>&ZDG#_`8^|E*uZ>gnD>xSR& zjRrzEuf>O-Tk!L(2=u+H%sLhS`uTi?!NX5c;+u`6N?wY=dk_gnBngj_*U#V6Wx8uH z6L;J2>I~j#be@fMPlTkq5fMt-p ze=&GL6l6*g9wqMqgIA0K{HzxZk{2;}VH8Lk5n1xq8oWIyuuFHA!8?dNJG;EW^8;jB z_c^5dtigK_d3n)N#PWB)!TS#K?CjTX@CF^yeFU$o_4XsgcIAi|yw?$D*yL}6k?x<7 zcZm(J#?aS*?HfOPMgxjPSZL@QM4prpL7pcYyi>@ttG7HOU7G(k(@IMGEA{;WjiTBG zry|*wcMvO9`S8ebvci>Ghc+l+d9 z40(3j-p56WX9fP;V zfrnE@G<{nfcy}22Yek-2e?{$0&0iPt=2Ao9Alu@0#47J@~6|KvI0B{*LYr^!Tvl$pG1Jn}w=yfsm6v9wHmzeZk-2VOBwMDwC= zk4N6ukmsemZ+qkw<9tys`nr(kr5ulWm;CKPo|pRghDUvW^2l3(>%+X* zWiRr)~N8UXic|Ss)m;B8{UzT2Y zZOHS|4j%Bx`?*KnG#ngwN%s=ud8yxfkmsemFMCXP<`i%FyWAu1;~sgZJo3h6+uP+3 zjyL2Og&yNukaq~5NngS92k>OJX(LG>g!Z^cp6RjDudUj z@MtV2>!ZlvU8nHoE4;VyTut{Tg||@QJ#FxAQ+SIM-dzUoZiTm4;k6jNdlg=x!YeU& z41+QsBOqwsK=wbiNY&$;jK}4WL;pHp5O)k6=g;(#wTchwUa^Y=JcnvPRR)x3Oh1aL>wz%+aQg|1;@a|T4m$>jA zRCt%V@E%uqTU~h1D7?#DcrPft%UyV{C_G$tN;sSurjgct!-VA?cYrKb- z;aD5rUC4mLFA?a7`oaw1FZl4I=a3ANx3r|BSZou({|vW(K+*D&Rk)1+hT-=Qcmm6S zA-aD+4|GGuvBYXPNS^%B^~K-dEuJNhY1iKcUYTObrKFXWn4*!6OIvSLB?YuNEI+c5K z`uae1VDI7Mkv9w^;? z_}-6F%Q)uC3xs|B2{#0)r&cD+FFXwk{3px%6Xq{G?K@a;@Ro{srzfo+GwYKTvrlDW z8o^TsZhq?KTPPpv??jw^>K6QW(y5AD((AIS1Lx(>`V8hH;g)yv-zxbG=HrT-^_8dK zGPniv@zgB?x9qR*iF{BV{vQsQWIn9CNDKM~NltmqIOg>ll_Q=jEE<`o+E=qSmcKs% z%b7TT`f1<%af5eNOgZh#e=y;JimcPYg%f_Te_z7driIZf6{JYBZ0 zJjFM7A{DH(6DpsM1S);~6DlkE1C{&xPvBWK6C zPEo%6rw95Il$?-_tva^1jW05f;zUxEICeItc4~KBZTE@T?tKLbnAcc4v+6Z=ZzK*j z9R$1wWc`Z!0Gs0b>t}sWb7u!GQ^e&f=Nzq%!fErJK%Ou2mHLL-OUf%R zYbj7TaxT%pcR8?{DT0~a%%GX@dSbr(*iBSGm zb+oQ@H13|(-MmlcWB-W5`%!sXr}3_HTzAivHPkN;>uKHHdn0}xb4mYf;>PElhBPu1 z;)!#)-P5J_p`(rK-QMwDa_PO=@b-=`H-5s1hU+}(a4-Mal!4yqj;svvc4&GJbi5b& zAiJJzS^idZ1U;4IY}&>DytwXtmwF$@x8af3d%U+^sM-$A~DS1Fj@faut7-~K_NkG&~;e)^G;w(C`FUt>H|d zIlVF@Ko*=yl8Edx5x%D3NpM)hlY!=7%8&q4pi;xx5Y+Hg_ycti91?KWqw3o<0e7dr zS(E1g&H0ppeBrLt@JyJd;aTtt<%MYi1ff&Gfc*!}A(z1ibD&hib77{2=Ru-|3*gs& z8Jl{a`9O2#W$>Y=ysv0@A>6CsMQ}jFi=kb^OJJjhmqLk#3t^gui@>Mh*>Fa_#Klbc zpcwu|!^_|wHCzIp)bMinpoUjKNW&{(y@pGHzU|9^y)jJD@M`#fQiw<4OIE|^yHUgE z!=oC$06wna3nA9`lD-eXHceh;%)2RvC7Qefvamm(EYj}<@-_M&c>fZnW<4+c~F}NZs!{liw}VhTl3H9Na@-gv6{toc{F)a zk35n+{P+>KgpMoO=N^6>6nGKiYR1bMuVuV~F;<%3<3B=QEo13pa2;cu6e8sK(OvLy zGKs)-jOQ@MkLW^7(|kNQ;2^ zRamIe^6ucx?Um(aPK!RglQE}AnwK#r(x~&*85+)2q*e^1s}9RFUu8CVlk}E$&GVQ& zlh&aR>nhRAO;m1~}Ypyhh_YSCK7rkbn*M^wOF+=FV?SK{ojVry@ z**N%%qmuu>5PIx%NS_*l<^!ge7X=OWae%-%P&c4E)8b+}=d zKKaLpIyKcDeA;WK2*N|haAl9V=&&ielixuzi{eI#ITG#d*c|<>Vy+y^{!sp&eZqrO|Syy0g_R zmxHGXdoOGqz3979^#Re2jj%HW=iIV6nc$pTw)_%D*IoaM+_E{^pr{DMuJPr4eLWr9 zcB3QN{QNC78yagjm+x7&A%AmzeN}$>>bm0M{H?3&ii+|#<5_K0RaH@b?WOtnwR7_& zEAnr^UEC|zud(1tgf(^fn>N>%S61a$Rg{}2jJ_3Xh5+DkMVmh$?L?c^o~dd$@`GO z3nPKv-N_(%R~Wn-kYJ}T$;jVL$ivqX(IDd#82VmChLjOmru%2SsFwG2l-)!G4l>S9 z4PF={Nf}Y4zGDWj&w=+mURTqNAeblZIU1bw4I*z%lodhmDFXg?-Bkx&{ z=_Zc#mTrwl-fbRvgC2Pk)4b(xt4H3w9(hB^^U|(z(!KGvdgR^hkvHg(M|%K!X;<~g z^HSd1Jo29P$VoMKL4Ey|Dj{PM59}Q*58^At`#({14mxzCO z35t+}T}3pUz=s>spc4P6?;{>znh&7zo>h1_+(4L*e0Rl=m-quIhV7;Z0X~M-3j};yP)+849o0 z;H4_OnF^1_AZof93NNVeW*fY0cuQP(rxo5(7v8H1 zuh50}j>5yw@Q(G7IxW_&@bkDMFI(Z^XKzPdfx@G>B1}rKP2UIs6*tH>d+u)-Z2_MtJAg zxN68vs)jp!!NPDyb!yOB&+Hpa3BGf@pdIc_YKOc)ZLpfIe|A?vU}#rCTCk^JTvJbK zuqo`vSh>~jTCp(3-2aCuSnEdl8m&E6Ryjvf!{N10M{v$q(~YqOfAb!0ItJ%^880^7+BeDhylp4J7IKWcW|Hoqo9>o>BbA3UaN*E6IkFN$?!Jb{<$CbWG zkG^rdqk4?eQvPrTK3!a0P@VWmN;iF7usXFcuOHh5qTK$0$8bgZV1YotIP=i1q+r*s zc5FGN;rY>)^THY2uh~PoFr!20q1>bd^>oM8CLTUm;X8?W9)e(AKj3=&hh_xZDHp;1 zu3a$0O!bFnP+t98Oq=RRwA1#~CfQ!cuZLr&va^8Vk4*`rj~O#LBWp}bV2ro|$LYG= zzkqEV(2hg?ci+u8mR9Yn&RGw^?`Dq`@iNAY%SxY@o|j&fJ)@|oD1A}U1g`mvpY_-saAwp-31%a2SiItG1q7S>0G&yRp2kv8KF^7Bka==}ir2z39^A|E(*ljqb&5 zJ+=E9tz_&A>G$5d7!sO$cDA%E1pjs8GSeXiQhe&VzW6nHtIr}X{q`Phx-?uHNnG`P zJB?*WwyrL|+SoJecV7b@V?jOv!Fu7F==7e1N2b|fWMEr%~EtXA!keQkw_hJ2ENCmVQ*fwP4^dTv=ETga)ENlfj7p3f5N?PscpADh!KRm6|= zL6)5E4=YTCKBYY-V0+xCVIM5kuph>2I04?E!5N1HeDn7m4JX0hYd9IYHJk#pZ-@*D z_;n;t!(-sj%6q#6+@a-%8XgN@(r_AlRKw}8L&M{sR>R|g<|N6GfNv9%H9P@+MFS8H z2{>Ei8ye06+Q&x*TDwg93CWNElb~6{lc83_Q(%sUvmsT(Q{nH_7nIn4>{GB0cWNR( z<}&zT7Od595Eg4V7qT>*2mcqp-O1p?uS37ka6Wun!*k#Z8lDSxXm}o6tKkB;O2hM^ zQo{?-d7(_5-lOI~hK3iy+w$cq(tNN8Uexencv{0t;HZX|f*5>q57J*xzi(pur}&mU5uVj>65OxhWZ1)1L)L7*n5$^Cw|1V>}?91TBndoJwnd*K6`AFpn|yk(vH%2r#BTFVjC2zKcg0 zXf5s+B)}u#zccU+25vWSgMsOLo(!aKh6H#dJlVix3mNiIPJMUadVHTs#{p}eUEqUO zdkF03V;>*!!!fm+zyV8d05KL90*X9?FzO4^abHX?<(u^8v%Hj!0|3=@ybgW2(h&=P z4IOQGLcSM(>_Kv>k3f^v?gJg1-VST8tN@Z0ksOs3)3MW<7fAd9!ePF?%bKqc=;nOv zw8lb#E~~u+nyq=IfffL~1c4r2^SYVWyrS|#yzal6F%J3!#zK|Qb^KT;@LI7;gfBFJ+7$BL&{d_ydeDV~mYJ$noYB`mqxb_zK47Grp4X zd5o`OyoPZj4Q#gkjF z^1JS?J-CF>TFZ;Cy;+wnC)Cs2E0;ezQn%xB&(4l*n1h~PTq0|)FBA&*;CfJNDUYKn zW?9P;oU+CwD{qdf&@OEq+lNb#Sw@0vbTOab`aICviK)^@0xn%VL#POMHutr4_mFY7 z!xCO1+_A)3fJlpPySo~DukGk-X)lE(gmLdJN8@a98Y(E?QS9D_AxdPN9wRsx0@lr?Jgr>xWI6m9OEH3D&T> ztePE`rq{46Y%GiMb!2N)CmO4lR-{E~VmWD}(k!lR-VxeuwF^6OZ~N}P*6wS&M8mOP zv$`|16PHUvXQ#Z=#fmkM=56ah2^WcuR)umyp^V^Stmqn9u{av&YFkez)M%}h-nP4~ z4I33*ZSKUSY5L{L{zh^>if`^4H&U-~X-`LA2>9ySP~Yah=9V3G9ou@Ed-^Zo`@6Eg zqBA4}8@BgY(HgMjI;}CaZTt>Pa!Z|*tX%0Raa_B2ZgK0m#jQI-`9+Qm3`+tgZ&^O_WaP~<^Um%W)2SG2;9x{lS_C2kewf=#0>H5peL}Cir9c4j-fv) z>~t{0CJ~f~0oJ+aB@Jrq9&=oG`l!R6In47iI?A$3Mthpt5k%z~Lnhm&&j=Sn#(l

Nj5 zyhjiRZS+kyc+VrYOZN{L7e&!Jp!bhKTkO){0bKKd^+JkWu##8f@8e#uJp(| z?2-2Z^43^c68}2oFFW8Ze_N2}Mc-lM;p?wxa7uT`W4bwGy`|fPJTLWeuSec#k33qF z=Ox{GkG$KER~NOO)z%4`?dr5geG}95=bKY~v?I?;{XXJRA1&1OqHhiIytEfuYv)DZ zphw=s@%H)>us@if*ncbX(A2^|LK7Yn`H$A9ku8()NTC&Z)2vhRFJF$;8(+8qd3NRf zzo<;cAqBK1uMGQ`COpU2pCVm)PJADEcxy*PYPPjTT=t8UKa2)nGeJXd-33XkeZ z@}4(%Tag#UYm{y#{z=~bc&_S;Ag_RVSqcw7acI0FioS^o4_}pQJX+IOh}S4xJdLJH z<4iSOS_@diJX&8O^Ecbzm7-AEFUN&fqwr?9@U|*E8jm@p+ph3tx$q(iFX+NMsPJ-K zc!w2Uo(u1&!XukGmE#G8m+!)RR^iQY;hk1^G(L7p_f>^QeYX?u9fe2j(219dor`P- z^Idq^3U7f6uR!4~bm5gMyhSd&8ilvmg|}7VEpg$sE4-yHyokc1`_9RJ2NfQE26N;c zR(SaN&yjaj;o)aLN8S?(kNN&J! ziK_>wWW62mSNMo=h8}oXnqkFx;AxFtlLm zojJbQNkgwZRuX>aI3bw5N~~IH-}T^(-=F!>FRZmW$+czKNrS$Eq(Q&f9TE43#FcW% z_y<57++-<%K4qwDAzk<=XdUu=cn2m z+O6|}z1rTT+TNPNTDUfgj$%hkU5bN`#M-i%xJv5>a=%M}C+^4mM0~g><%xb(v&b)} zN#}Pe`8~Bm<_pWDoHwZDP~$3PYEa6Q$(+QRgj!!yVr@D8?QaUNZ4%8j_D^z663UZN zo{VyT?TMnNkQI~5Gm%dv-ApAv4N4yFRPuaEZ%&}Ld~Yl zv`^)li#Kez?A#hJ%QU#SZM|F-h#%FL%8yk_7tx=f6#|R4zwow*9xXL>N@rtIKjY) z22L_?vVl_!oNC}P1`Zf_tbx-kR?avE=2A>ELVGw^r=XBc>bfin%9 zW#EYho@C(32A*QzY>|JuU#yUA$fp|esfK)-A)jW*ryKI=hCIiR=NR%ChJ1!0pK0J( z1`ZlH*T8uO#{G7&zG*CPh1rHY-@tQ>{LL}sa}D`iLq5-t&okr&h8*`R*6yeIhJ3yu zUtq`=81jXNe4!yp^5uqng&|*I$X6Qjm4>|3ke9-XT>sCb!4lxSD5mE@0?xkr z5zEQu32*^?Mrkj!UwTBtepsX71el=VM0h!NGoZdCcv!>9ut&owP_E%rn5N+|@H%~* z0MzOUi2@OcfV!66N&!_^ud2PGOF4?YcN!1rT~5A#0(?$>Z8T%+MESgGNOkf7m7 z@H3jY6V3l*_`HUvz%?4qh6^=36~<|J8vKM_^hEVdhtFs@2li=r22^W!CImE$`=!%F zrKr9jJgVVbxK6`)uvWvfA*kVecug5-B;fw)U(@hhIH2KquwKIjkgehQ@FLD7lpz6E zVn3+ig|I`zi=a%yi(#&Ymq5CPm%@*6E~N|!IQ!@!4HrR=hKu2R4KIU$hD+f4%0#6E zSPnGjR0i_t(WK#(utLM7@U7Ux6{G#`-7he1LPYzgA7V^q^5Om4kCpTKiV zejZdXA1|T&YM7_tMo80e6TF#1Oe^@H41TQPW_VJ=+u(i;x4?%r+zLB191=blV*1-) zxhCHZ(=^-;@6tCwx>%{)+F?|<8y(ZrPD>S@O?8hGCZvww2uZLH0 zLX8YQxCs7L!wvAbhBw1K8r}i}8on6XG<*qc(C`OfnT9WgsT$r2@6tyI4nDXHex>2d z;d>gs0=}%_E8!Cwz6w5z&qtaUREU3mJlo5dXny>!nlX)O{P@Jl(r_ZYg3m*WZ}F4h z5yloj86u3SS^CijVe68r+6 zhcSJVp#}>|*edT#pnXbWcow{b&nLoGdO>)Mv6cT^xPh@1KM!gdquH=LvmuW$y^r#v zhmPyHeo5a1{{_&9n9e1xMoeXuxBxMwCGkT_{xkhkpi{%yK>L%(@{x~}3=L0%f8+8| z8kzp-@L3J#!1WrQ0l&e-WBTU6lNz22H)(htY|wB4Ow;gu_&Gj5WBL}r=QO+!c4~ML zRA_iH6fnkW#r!XU@rl?Ete8#*=$~ce@8P(?zVVXNG!vw@PD467z8aU6uBD0GAA4+9- zr1(2tXqhdW` z|2Us$_W|6T4OK$`7pRHj1mif7@gzP@<|9sY7yMsw|8d#-f28vI(PxXe|1o{~Zt6b` z!an|=Fh)7q%a8IP9e-;1^6~%MdzW8S3;yq0{fJ-M<3+1)@xNfzoB!WApD%H~20346 zIA1^GeEqtQJA);{%Kj zGv3emlZ*!#e~R%qGo{utvgGCsukON{Se{11!| zGX65-kHDyXVJ&HG?rRpVm(XicS8rbw#ymZ+a~^c2Bd7W{?(A+2N#{9+S1N_w+}esh zcY4tcQg3(X?mqNj)!5guGt|AiZ&YzZUCrBYE}(Qnq&wi^WP3t8yZ3||TSI#~T0-co z2OVRH)c16BZAVvHy~Cs|{2Uk&dOP+Gn`m=uV>lG*;j~0HW#Na(F2=NWwYO6B9@W|c z+sLbHVwfXon7(drW?_@_3~!^RTRVD1cI~CoxrfJQqtd16MB%)&n_(imHXIpuv@ItV zAFI-+4wt5*MH^Y$(V~v9@yNI%XgxB@2$~PM#Nu7eLyf~UfHLEw(7Nr9&dRq zjtA>$d@|ig+gF?d&wU!jRC-~)J?;8zgE=D0D=FB-bF}*?`)MVomMX2P&Q-8LeKAGi*nr(_LGhP9^Jkuk84^9(opZ3Ki>B zJe0(0-Z)@vCWokcu5jpMQ8GGDHB=;*bwCETxgt#rKMV~#ByN@6zQVIvqtkMX@XE;Y_D;~`tBI{sCR z5bN`Y?ObANU9BIZdFp#;EmCi&vrTsI;%Aavpv1jD_A0x(c65?A2&~Z?NsD!C+A`nI@_tx*-nK;!YQ@v!)3I%LU#K@fe@o4V#@fy0dzNj;-<)4xm0!NPuDCdV>*~6qqWsNx zR$En7Rg_{unjRjXCtf|Z2w7DMFPUlxul$Yi=R9#e>U*Ax* zxir73yrOnbvErhZpSq6YBO2$nh$p7P^fXHJ7S9+h#U-LOf5#^%5)2x>_U;=GFMa*jM9@)WC6(JzH3L@W_X;_T@}_t1=?%Dw=I- z#MZVPWh70DN*;|iY#(H@hwpyO7#?~aC5neS=gd=$5Bpx$stkwsQp3Nh{j0v*a%nxX zPaRS7877i#`;l=*+JIv5JhdQ=?yU)FQ9QOG8OK8-l2lKvh`*;}9R8L*LXY@z?1>K# zuJk1>@V5y)cq3>=7effqyoVF45$&RPdGX0-`UfxGhHjW4!WI2ACqVsTCkgY%9 zrwn~Ktty%psg(L2GbcayBMUwC+<9yW6SK_ng(@Co2MGSpgke4P& zc$Dd`Gk8tNL(@ltA?FPDn?PX zKAv^p(b@}@_ksiOR)aU>z*}I{@9W63yWf60Mo;%o4!my}JemtFZAJ!=?d5KRmxcn> z&XPxKpD?MYU1O%+?{CYCPJXD+4!nyDUb_SDEq?AJU4%a5$-1Ho^87ajFM_<&Qiwb% zBZUh5qjRi25$ZAC^L$PR8O7w~;Qjpn+4~m2sE+g8*x0Evf?cv-fw ztrv@g1;`*f_!UV=f|U`lNWzw|od}yGi<73+`27JebdFb zEl!+P&UI~W;;EjOS=z{kw zcy8j0WnQj$E5LK(?}$s@vo8ImLf|GIE5LJ;ezeBPjlL5ud2hSq)l78f@1RQ_t<825 zk2hTM%JK4blfQi~c}HCG-UQE0JgRcsg>TR$?9=E#W9dOBe(Iqbzja@h4 zYjMeox#T_TlE)^y3*QQtydjsoCtdQ+x#TTC=Zl+kj=1Cz%LCyJo@Yj@X*At%}BZReRKzGsI5UfP}rcsI{+Tp6OYwV-%#U`tMH~Oy!#DaP~lO&$aJ~c;Dr=kk;0o}@X8h5G==x?P@DxUO_jo% z4om6pw+vp5!YfvIA2WEh3U7wOYcY6D3U9W;D>8Vk3U7|W`yn2xEMRFiD!jR{gc|<* zJ!bGa6dsC%&D(15A_@<;HgCSciz>W%3hzHrxnu!LGo<;eYGigL4{YBf>*Ba>QnG)6kbCLUX#LWOu^fz@K&ba zMHF5*1#d{yaNiaIR)>q!dsn!_mslBE(PzT!fQ#vJEQREnQ$ssXBFPs z6uk2aZ(RzWAC;plf2}EaL4|jH3SPOwTc3hgqwqGQ;58|{wiLXL3h#y#yokcPF$Hf( z;e8+lFQ)J|rr;e=csHfs9aeZZr{F!M@NP-LJE`z)O~E^(@NP@NJFDN8rD!iT)yokcvoPsx`@V2Dj#S~s7 z1@C~u>rKHstnhA6!Fx*KZB4;Dsqp$z@Xjc_Z7FzX72fs~yz>fgM+%-FjX7EVqA7Sm zg|{;WuUz5vr{L8nynz(FCWSYcg11rO?NWI34TL7SZ6e?uonS+IJb=C-Ro*l-s^%At z<)O(%JW48VR<3h6cXC;^b+Dw%b0@1WuU>-VCt*4QA70rK_ISuA%XnD19Zs^TMI2!4 zb0Iy$$z|Bx8*XdBKXV%CygJ zoQU%q>9j*Herfpm@nh^?=!{3)(fvC(J92LGlyKotZIG3+a&J7lyz$iJ(XHWWJ3Ws_ z_{or4!$q<3qCL@~*rDRAz%$X&qc_JYg7-&nj^ziw8=XJe8xHh)1-Cc6k8|lN*}dU; z!RKNRM0>-}#YUjvRP@AAvdiLjS&ChAY+jIf%`sw)6hDhoD&IN&Lxi{HSX!8c*#6#d zPKZvKWH`q$GgNb&J$y~bAI%KKqM@Oa(NK&9{5ua0HSO%cU2JD)_~g!mWY>RixT$}X z?D|8yPxgoQ!ERtes0l7fTaDuxmhzlRes-dA7NUAqr969*IP%;|3ZH$>q;j82@rYS5 zm=f=d`NPv|UMbIc;b1JVdVl?dGw+r*FWz6Dc{+1-{?<>$902L-Jq9h`kL|B# zFXfl`!wL5kUZ*oD<=K-w-s0Rx^BhVm6p6p4yec8$cRYQRG+eKoCn?X3B#u0nk{rE{ zXGnJU^;|kX^3wT{m(Gv8bbe%GTlE!-FJD^S{(<$^)vaIK7+Sb+pm)pmp6>RpNN4{* zsB%%I{I4Iand1CNs$Qst{{9*2_q>?%8)w4Z#k!^M{fl*rF354YrT%GY4&kP*U}$gp zN76p(`FXsF@HSBahp0KO_Q~&7i z(|`X(`me^}zq<}KFDWkL$;(S_FRq@wl+N>+_wGsgzl-z4Xskq<4&2aLtiF$2=)G{^ zv$mX{iwnDz;gQ$x1mqp{lmGPHrxi@I4s`4_u+PA022N*x4t?}4w@kVr&oFSNf&JV) zy;m*cH{@9c4j6cXfwK)f(ZG|qfAmaPW|AS#G2}UhJlBxt8uC0to@dDO4P0R0Lhim% z1`o61_57L4<@7GI%w$78#qfWMA)jihuVMcf-u#+0jW}nsYM7CAK zlh_p+&SCi)&Sn3aY2_sSrE`^@)Nnq#Ps0W5HVqfD`5KG8G#q3! z_eL5YD`MAccp6)w;puFWhKt$vF_%ReADh9xso|OIZVg|?vJ_0``23PSHejfq$%FFo zBVf9h_@s~%$HV5ZZ)kWfdq~6OY`2ChScit^v9N~cvjrMn!16V`keydLqCJ?E@h=)) z#Gch~75l1&tJ!`HFJ^aYxQyMV;U%m=!%JC(hL^D%4KHWEppO+{JnVAz0}a=(XEb~T z`-+CIWPhOHtJr{sSFoEkJe$>O_-Zys!`Coc<0OrTUCVx!=sHLK)v_}hu48|x;d=IA zJnv*hYUo^;wHo%aa)IY?xsUx4&nxliyUUCE;9mu%ccvHTto@b1l&xN@u%dIP68bY4 zt#KfHh|B%#GJ)wa_2OK$|HKW+Ej)pJSHs!tVGU1Ye~Rak_*B1naRTB;G+e;i1#aZ> zLbgy~dgpjCG4wDwhN1B0d1o>D2&Q|9hk+?95;u$RcEB#*o5i*%;mP+-VpnN6hZSl# zm%SqVC!P7;JoXNrZwi8ir?BTVJe7Sx!$H=o;Ucy{V0uU8d#AB$G(4T2#(G(3}iNW+)0O+*%k)|KTJ$|kydYig7UyK#WsOUYk>4ZaNTdtthdSnc)GD{$M+EydM$gbnFr5bYMc&M&jQq&gu9N0AWn#py!U#g~u1^!u{F zd<?$ps#G=;+o7i#<>VjxVvqgLoR|PcK<-1 zxe;Eu1J_uI+#+NAX&_zF_9Yii1j!zEDrgQblnjael*SXEgsaqXp&e}Ot(V+;pg9|d z53Z9+^T0)MA-*WVVy|c)R}6%5m*Ka!^`U)t)#nvzw)C|3+|jdrP}zjtrsD~a z&var>-OBOpPwpaGw8dSbtfY*SzWtEcK09eJRVER%U4w-%xwU+V++??{K_&eSt*zMh0EXUemn;cq38r zZSU#g=kZwT_}-s(odkxt2Q?)+tnKn|Js4!$*@q36tOuoi)2_{%d-@p_DiUc0OIkt& ze{vF!jg+|ChT3s6*GrpCmo0ZpoaK%i-7a(7=XROnHn+Ht(>es~1uj<=Ab)z`B8>iYf!B!f> z2}`vhoUoN|rSZj8y1H;=CDX-AWo)2QzAA~HXlJ+$f5JtouqRk9!)-Wl&LS%6_DjoM zpfxAXq1I@wf<4wn>TrvK>ps-NLFzD%=W(DAtNhgAwcq?GD2@$ft2Jj+c{Q|yAA*s1 z+lvOKI0NQVI~9Ebl%7oKUAXuiBa!0o_imAYC;EA*|B?*vZ?SIqU$40TjKM<}8Sf*N zRLP4PJanC5^eAB@?;3-LuCt_jEY3A}L*SJq)bV~nf&qi~DD0@uP#Wp)C@ej&l<_@? zdnqHXyua4q9fIsI5rmPta}6H#i+4y8u2SERe7e6+fJc3q(n#Jn4BnFtypI?>+WRk= zKH9SjB0Ij%I`BdU?|JaDW#Dj?@%=FZs_LV0rDVMC7`#^RG?@Kk?g`cXcqyeAxZH2$RWo^s%| z8N6p5cvl*{IC!BX@hCBP=Nx$d3Adoy@y$i~NfzHfGkC=gy!#DaxdRVf%bLGS9e9JH z9DvSEEqF2y$U@$4HF&faUR(;nqd1bO$B*uj9Nf@&UWd4+i*!Qu9r2)s8`|?ES-Q-H zRO%+;2zVHlu#J?Nyr*6A&b#C-#W*(C1OB6g;;d9A5?~+G*(z)?>1UxtKc-kfJyi4BFiSGQ3y5v3Kl6Tf6 zuWXXL@O8N4J?fHo#wD*X$6feZ!E18yd>nA8??ne*7b-$oN0N8Bxp-gVS-KndAH@%1 zKIVKCZcqi-rgfTS-vAp_U7SbPY=hUK@W?&sBOc8UQuRf_BYV;Z?`Ix5xL4y_4xuc6#R~6R z2Cqut%}{vstf=~G6y8jQx5nVrD!j`S9;OUv`kKHy0XvFsDSk3P==)Fg*N?zc`Vw!J z!lQeY7XnX~m$DSRDup*Y1+P}&%}K#)Re1ESm+>&e*P-yrQ}Ch+uObC+MB&X#!P~F! z=BMBtRCo(g@Qx_Fg(-L^6kcTtUR>cVO2HddcvUHQ=M-Lb3Ld7c+T~?&3SO?l!!#+! z{0%8QD#K3Ypi1Fk8jmBdR^d@!hm*cmg@j&3f>WgcXbNh357>>k5hc(3J=qs9C@P(uQmnmoWiS1!K1|;vc9TUc=V3& z;U`Tlct1nmk~DZ7a6|7-mFF#E>{ry#5JvLo3SLy&{{|1^N(pe4yhY0v*I?rd+f*;B zT6V?arAunA2!*UoG_1eXRaMKEW0Q>P<%?bKmGJ~sD9T;xq5GpJuor~fA%kI8jKD}jZn5jJuSQ_R+GB%U{MFERqu$}b&U>-P#&<_*vB$=D z;RbQTegqGydlqcXg{@_;?)#wb2O;->@C?nZ$UIXwWS zGm11*kz#KLu}cK)BVq0R;2H8&nVwT@UV40ArsqX<#|d?p zi3#z8;O3usg}W{tCf9$R>5cnF`F;`=>G2VAJg-_WH=iULOZ(ua6=BPTKFIY3JyWwbMri_VdUV`+1mqO*|;# zz*C;$r|dmp?>9j?1M@!aIT4Kvx9^Ig_x;k=6MdJqp18F2#HFn#eivI$D78$NTG9R< z@9F#HV)mw>HrVgOE%k3)tiSKYEqyosKK#uer@z#{A`RWY*ZmymdvrYUR{f{8`g`>s zP3Cd=PyK1qjMpvoO-R#-oBs-H)yI?eYTW$@|0TD-n>`KwXQy-O{S)3xz5m~}Ov*Yz zUdxnkbJ{PWM8WhGu4Au(eFjc5aJqpr*i7iBw6jcxA}nru3cSH;J9pa1Q&dhI3h$hVxjhhV$7J4HvLCGgSSB?4LC}nH|#b z6c*F)RCbGogKWNri`aRkkI{z_sDIM%boO-(7qd@jcn0g$@JuH6cd$bJ(|2E{mjDd) z7ooOe&j8cC#9t9|;&|9>_6HiC!v-`wm))e{az^vzr17u{He18<*aQvFXFpXsPd#h_ z`)3U=WXCmJ$-boFMQopjs~DYGDvgI#vl}%$i>=V`Vpgi*C5+DUl*WTukpF>kPH8-B z8GBK~%h_LO_;Pko!!_)q8oq+jnXJ-y*p+O(hOc5*Xt<1Brr{MVUBg$ipU945DD~hJ zic=cCmi?KAYuS(Rypk1tPtpDkM+K&D6)*mMN|XE8HVvn-bpp@f{B(93oY&J(%C*sfJcoO@r!1TT0WjXB2cpgYj#l(wK!*3I~k>eoSit?S1 z&t#7ffFXXKx0KQT40JE?ZNOATNL(VqPj>m<40cY0&%&83u3=y`oN?+2mRM^)Dd#eAvSchLr*CDY#!=TuoVOZ?X@Hw$R!!EHu!)~!Z!=sFKkh`6X zb<_0@#v*h*z*rw$`>la5@0~dNjqttZus|4OE@H&Av2#iQ@ zew)A;$mRG3ftL$>qri&={(!(3Nap;F0;3Y*_$Gnn{tGt?Tr1?a2#iGI{96USTHxCR zZWj210yhcVE^t`jPJtT)-Xw6Nz+D2b6c~w&s55V!z&!%j3%pt2D+JymFb0Tuc#%2W z{Z#_@3VgZ1w+oEI!THEU&TkPI4>8A>bi(D^1zs!g4uMw-92NLF1p0Tre*-P8q0ZVa zYsreS_kp_pre|~Ku09v!p6zheg{>e4`#ZM}Z0j8y?CEbG#O@HO{ji<&_jL92-jUjk zz1k+x&ulNY(bliawRK`aTY_#xRIY7vB*m|!@BSX&R4T+0}Wb24dEH$K`Cy+8tKifu;@spDdMgT8jYcjQthd^l-RVuDY+AjF)>Mq>`;vZkTY4Gi2!0*;(yuw5GdiSc?Ruc z(n66@cA>QMcY|GpGlSr6lLW`r{xy!P{c9Xo``0+G_OEeV?O(&%+cA@)eM^6|UENZt z>~hDI?w32RbicgXN!xNqe=co>P`1P|ah5o4#<0Y(%^%1oa*55ylq82>R2Q5YKgWm8>7^AqE*mI_%2`NU3~MH zvCY(k$Kz@lSn86rY7_e8JJ&g(RYvl6x6BgB98=Se_0CQ>^X-=;?W9`UjdNlr+NR0k zqf4FQl3*o`M?!3eCuJOx@SVc1wMfTCV2n6<3^ZDjC}?swaY*hURU~ANC69wDb&i5$ zImAGU-9}&xKY93niyIOo>fQHyUxI4Ue~E5SZm8dZ`mUuxmmoJDgNLpV?EafDl1KYn zQy-$#*M|FK`kpp;n;dwbH+bmkNV?BK8^#q>f6+CTbUpB82Jesq?>C5$s_%#ckJfjq zyr&&_UpIIs9e6v9_`V1p_5Di&HQdx0yr01~8Sj3>U+Qlz6guc4^-VYQm4QcN2+~Mi z#L%}EJap^XM)H;zyib6aZL_R?NrJzDJ^tI}<$we4MT2+9f%j#Dcf^4=V(@6cfMnro zH+Uz3LlkgfkZjzXHOkdl@T80gGF`4U^u6JrZ<4{Iea9OuulQf7@B2WY+UeH{L9%#! z$>81U!24Sx9+cn7;(;z`&0iXKOXe@Spf%o*1CPcX)p*c)%4Gh2O7NhTo0!3qZtgdD zp8)S)q!2F2FEaJ`(LKc6^kMvHNZiv!Izd-0=RqwuuY#8>zHy>95IK zfDU>$yogKQA(y;Sm%L((>$wTvMwh&Yz-zQqC6OOyx}0&TuQ1?F-$wA<#N#2Cyf}DG zF5(fK;LhJRm%RNhdC$A#`B9kNq)Veq-iS-yrF{;p!ef^E4m6tFPst1 z=p#K+-}449Tj7y=$$Q-36)HSDqBf7_i>UqRt#6URTcGeL-DLRQ zLdCE8yHw%jDZIGBTcPl%y)E@UX7CynUV*~9+u*e*JZc9@eYY6AHt<4_*Wou=;az3$ z1{K~^g%>b*4}nMNLHbZ6Y=8d=_iDNvQo@H@oA(8S_k_Zmrtta=-jfQiSm9x4RrB|0 zg*QXtQQKAx-?QMIg&oDCMByzpcuycu6i?!nD!f?+?^*Cg;$Y+w^ZTHOTlYYc=J>6+7#Y`6ufSQw=e~7 zP~lak;O$j-i&F3&Qg~G5D!eOG@ER4~RVjFF3U5UUUbn)-bQj0? z4k|pVqnz?%ufj{U?*Ac$SF7klb%%Mr33CX%527zf8jrZ4cbLkj4LI;Rr07Kaj?5`$0D&(|3d5ZYc5}g)%s*Q0v}%4683ncCem4M>m{$Apo&>p zr++o(iRK=g(B#?eshAXhW;d(Ij(bWx{k6L@t~q}|ihS^l(%;eDwKGTiJ9gI=pE%mlUsUcn%|aarouwnX>Y8I|VHTPgX8S$+ zz56{2(&OF*GK|+8&kyy6{d?G_SMOo-d&85S%Zf9xmi=73A{^o|x#qZK_vY&qCi2tQ zL@7Xb(jUv-vN?ZjayT=5>-11K-_OnzIxr$#O|?Hv6IdTVNba? z?k%5i$~S7Inr}2O9ON$0w47wE`S)PWf9^3)Ibu*QV~{ISnItkiZyzf>h{| z{rBHn|Kl_JkEWHAzi%J+(9f66JXur=S>|`W_Fk5Koao*a-F0=tj{d=(p@nOz=EI`9 zw{uJTz~FFS&(&MD@3Jj+MWg*a0|QrIv8+0@uvwn_jsxJGkACm&-?U}i%h?gMi*bWT zdECzWE-kiixwP2+(qjAH)?#~l21U)%<+%LS?@7JHkv{dQd7o@q{Ds_76UE7GrYF;z z>GP-g)BPF#%*<>*x%^2IEQxtF>Y| zZ^5OmV7H57!c(UwePUcpda7Z$k?Xj7Z`wzEAEiUfFE(!}Z7wD(Xo=cpCfBihZ~8~l zKI;3}g^o~9oi@~*zL@Z+WsSOO#;3z7Cu*G9xQ<~hPO#F=6ZBLGL+foHS1`4FzYI*7 zZ5a>K#RM*EgZ<3SHtK*L4sT;j6~sf+cO8pe6<8ZKs!X?O;UX?P~vq2WAsqlWYO z`bx5*XCU9};pb-)rZS)J^|C(X2VpAX`CcDeBQOO!-)X-= zrb;Z|o5}ti=}r2mLdy60*=d161I}XK6qw2|c6VbB2)uyf39MgWdRgUrvw6Qe>7y4< zzIP&9CgfCR`T55r6o%GsRV$dz=bf%#lD{p_gO%O^bR=v9_QIYjQnD|lE9`59J-xsJ==`NV zvA}g=-54?-PFMh$j3}}II<6=`1LzQ=N}cp^`=!=c2ibG^TC0yYfQ}@}A8$RrXUW|v zYj4{?li;nk^aPrPo<^~*3wo(s()v26X5PyLM&LL`A>#7c0*3^iBXEhp=$PgFQi1U% z<`|tf+&wy4IYy!47#*q{Bk?#!$0^6?z~>l+kz*tx$LI*<7@5T}Iy^Z>Vsea*O^(s0 z$1(nJJPVP!$n{9Qm6&w31B-gFENFB8j&1FIJFp&TV0e3%Scenc%;!Jy`E*fyA-DH# z@9yowCUxyS{rx-oomiXudwS#neDI>Lw{nak>!?0)NT0^pf;AI#{?Fi0duJEsr_xE7 zbb6og%xYbeG}_suYhwWx04@R zws-cm5AJ9m>>Sui*1ZG$P9mPENOrDBWE@;@Yq3mC<~gi+{!&31>%tZpu0+n_0OVa= zgZvao=n)a;o<)GGLo%wcGa1y<1qraD89ThCvje zHCy`Io4R^iQM^AurzShi?{}QR?l^&cspBewrH-oz{=b?i|9d$M(6P$1A4A9LE(wE| zG4V7c5o^_)Etk(Z3bbCujbV(f3E)Pp`0N_Ownuf6s3Ya`lCU&u5>X}Cj!d~#)7WB) zZ$eq34zvkl>%Z|GA*S`9)Y0fxXHVy*Ugn{J$A-m~Rm)j=qO+D|WM_HuJo(;2?^I9F zQ{v%z~7 zVl+!^BY7_wJU=kCg`|=9w9h~O+u@_}e>A6TBYCvXzslPPKy5N3wk~a&9=SJTa@Z7}XOW-xR2;Wa!`nw2| zO5EtX6FfKZ_%?Xz^X8O(nE`kDu5-!zL-3OM`*{RFmRU-+m%(G{jL{f5KA(8`%f z;34R?c^Ne%+2d1)mjNn@NKy>t>AW|@F<>A-wA^^2p-8Pe3X=u_o%_U zThTW`;SC$SPbfU9-=w|`2JcbD--!y3-aTqO4kf6=bv&ik#j=sLgMNGHY%)44#d(u0OK&{-^x^8{j*x+wyt82KfeNElk zx>YOJw>P&gvWQ8-FowBdeZ!)41D$<~dWNX`&v4?XXMJ5`^SXpjdXQQ-tZQg*ZK-Pu zuUo%nQR{{s4a@69kaQx=s%cucp{?BtmKyLzh#FR|ZChX05?V;0b>;fz)~1y(|vaHq>os;})$=H?`l;+E~}NvVHB!546`ew}qQqR)X1dX&%IHe;x#{ zU7Y7aTxd?hJk*HT1|1{c;~USX=7%)&W~eXt(B9PJ=c(sp(CfV%zhrYVE))j}%lO8r zt+^T0M3JTxH@}TJ3DgWgSa^C$-S+j6@-ac<++S2MeJSYJYhWMyJot(4Zl57fGjO_r zGr0Ri#$~XFh5xT2gfwn@rxG3-H&(|Jrrv-JdrKc@FX@(!#PZu9*fWh_?m`@D!gm|^g9dIg zFovvbL+&p$uE@s`(I}_z2Qc17ZCnh`@^7v{NQ@_zS^GYc94c7=4Q7g803T%(4=)==U;?A`*ueX}kAdmR5D7Zj8{W zDBDD<7~3#;5gsERTYRasUhL?DXt%ttBM{$16+`tk^?8w@dWYTx(olU!=4<$=y!F7S z25lpG2VkS}27yC1%jypxxD`K@_Yg4Exzb2|t6`z?9s{O#jWm*10}GY+JTR(t+oXv* zIsPC8=WrusWGCX{!^1=r1Rq!Zm^g|Zf zyrl;3P4KD&4@qhB&=k?aN9U?YeYkbxEme5bERf+d^))Iywg1=TwJAKc|JUSoD?EBW zo%|hCcr+L)d1k-gUht;K!UUeYHT(S@K_q{u6d=i?t550oyAy$02|H;dPrNE|?X7ifP3`Mi(FrPSIgz?Q*R2)y8*XT&ZqoKOYu0QKeSXw|D6EA|>-y#!>l$uq zuWnzgNN(7$vb`nTzM*9ud0_Qi;znQn2aC1q+9^OQ>u*>EWCgFT@y7Pn53FzBPzTxq*de7hR(f%D>SOqF3 zPhNO-XY$Wu`AU?tx#YK|(h(r1IErs7YYL?Jes}m5UB-T&pMplpl%bnp5mv`q|MjN? zkMDIfKtT1ol@#K_hezJ;{Ta>g6>2|Hxs*mWeL7(w+cYHWz>nHi(#ZRbuuys3!2e4M z6&aOrl}GzTHo{ICDQks=3u+^c)$--ok)V3{@@i{if(y474_9#y(j|+E=A%|-C`>E%6UJ(u zB5jeti8cIIdo+41Bb**in-N@2IIpQ9;_2v&WX1N3d~vt0V&dt}$i87ue`ln5U$egs z*M0k*8Tsb$p8jv%^$gz|fR$(Puu$l{t34%o(WvdW<(H@2XYFKA&al#+LU#Vx^flSx z43-w3)`U&?uq(i};_~qM9-MbG%DDn6>68Mdz12CeI)=9*w_Ff?MJl2}bC zp>N)GeS>OS8}v1YMq(o`yiR#))!a)_;Pm*DPx42*3#74}rs;8OM+8$3*0&*w2BZME>L+W2KqRev5-$5Hhe+flrLclj{VN zv2(}RoGH;I;mM8#^Rd6f?DP#~!Jd&@ zihpqQSnh86S1rzZ`c=R6`puy)A{3UVRpPC!YZ=j z75hFJ{$hRl>0TgjoRxij_cf!loBTEBkAH^!S@A#I!WJ!#fASX8uJI2wEG;^8l+DYG zd*H25R6qnx6 zFt6w{EC2j7d-&n{KRtsG!(<`N|KeRd*Q@g*Y#u_3l9s#5+Ib?1oiSt%)3tDoXF)D@ z$C!AEmE`kOSEY2%LggsKbl1qsBl*wm%hOJIAhXJZ5A!neYREpy!;p_>+DmgaI_f(1 zbXb1l8!+q<`F-O5qTV}}R&skdFUn}oiJ^Ejy}1dc-xIH$*%ZwS`#96jwV@pGXVurt zLjI^VU&Ja2h!30Bbbb8bu%~=_yd?6+vDHJKSr2A>CMT_whZ1EdlcclKN=qVSL%)*9 z!ppK|eEn!i2c>q&=wmU@EK7>Yd(yo4V=;135-AxyIP8T>RTJTarci{@|WEFAvuo?;L6_ z?u^!mFmeyLA6YFP77F8;8sez{Hr1zTtFMRFU&otgULRG%E?doaAiltr2rrIQlk{!aHzQtXgQH47Gcd$)zsA+B@qlaqTcR!6I);{ubVQg7~2`diRZc9A-0 zPKh+nBn-H>nY2X59I$ zrZe^RU0gbko#@sk;`LrPyrJhvc4uDfvtZ@`H8WBbVHtD;7rb^=gu;jhTPBP^lq?>-;ifGn9BtxEK$a4&NE|*iCZJAs{p2y{h z@Z}lud@iRlYngmQUclvv^eZsrgpG%odHrQ@6C48NpdAA3f_Y3z`O(^*Wz8Em_TGZ~%D zAq~x0Zq#rVo2}shOV{uO_EW!fP4UTQr!_p0eN)4e*k?4H!|u{>F59f(Ja)Z?^VyXe zE?~5#R~jGkcY=l|GwQRK#)rNkI-^AzADhaa*Km;Cq+l8cY!sOCi}t2k4ov<2)~}cq z1E&Fdxm_{Cc2BnPV1?h=3>(5th<#7PCG1HJm$FARJd2HJxQuPq@NCwi;W=!vhUc=N zhRfMIG-x7>hgGmwH9U`fSHtt!H#IzieOAK@*gYCv$htIK$(l912p!PUcS^%5Hd({f z>^GE{!g#PFlfHg$3Hv)uzLb4K!!wy5&kyAdy(7H13!}UeraHol-rsMbd=RGm^kUZF z0S)J{djy`t<+<#Sgnn|9he_M_0b6-(;k$sT$Pta?ZwUXWPNTiVejqTtgJ=%?Ukgli z63v1CvcUAtp*isP3ry`WngbsdxSr!ocC)}`9Q)Z^O&(yG0zc2?6WGs1e5~+fvwsx0 zo69FMIy;EsX36u|27#&0&G+Urny)0&FW+0hW(#bEzmQGT@MQKY@qAF7nUBfsuL(@) zneUy-z9+EdKFGFG!U;p;=r|6>F1Gw==rZ!qxH z2A*T!d;`;fqBInqpW!DB;eRtQoh2s?$&VZO8wUQIfkzBHXy6V5uQl*h23Gg-qwx3* z`D;{IgdzFg8u%##KW1Qcr4PBk%aCt1@COWhje%)Rzci$8s)2n5{;4G6O8l1${G5Tm zu3*|5?~fEr?mubZT?W3*z|97(Ffctg(vW^7_HtF0dRs5QSN z@GY^&-5u6E-2kqnFgB}E#1->cxm>AC2);z*ki0nUS&Cd>eMeN1*2aM0N34C0H^D{VS zfOwBFHi)ZN>U&Ux2Z_zYvrokTF!GT22gRO%2Za1#vG?8=MfyB0(&v8R?;nbId`j@| zv+Bpdm#p~-f&IeWL)JWTFXC4&!h`CN1@09*T&W%pd_wSg1n;wqQT_4m?G@?v4QoD(Oy9uA#JsAT#k?vwf=cE^ zVl1U=t-xypt`>N$z*h*oPGBT9ci$>7HZbA%dV#MLc)h?)0&fr)nZx;b*tq|z1jeK@ zj+Y61qrgi9#)d##j>PBgHwt{Yz&8oJT;N*-h9l0uRp3T}QTcFvD+NX&;rMES+XZeA zxI^GNfjb4R7kHDv*9hDt@U`qc%wua9Zl|HW4TC%StsU?hvBjcT5tfie+j_TQZ$fJ= znr+?LKbYLUYwLy`n+MnT;Dq5ZZXk>78tmS2=XPDRzGqACz+g{*Q&(@pCS3%pHX0b) zX0MkML4aV4GVJ8n&O^0wDB9aU+=P?C`;?%QnD6w*LzmQbLcFSP$EMD{8$0`ZJ2&-V zi$xiKu0+Iw>uJ!plH`lX+BaZV#g%uo?Wl`JHJ42oD88|?uNQOpdYZRKcMZ07_IGa6 zwG)SjV_hPd$XDB*FG*9wV@sNPI-{wjjqp}UN?UKwV7LdPb^SdJ*0zYI`sM*1q;O*Q zODm$}byAIuy#thRLaQFb`o3K~gFAK%M%Ha_*cKgZs839uq{)q}l17yI2ARp08TM8t zyq0N+bgtjEd2>%cD(IwpVGf{>V`#A*8$b3U0otQ|%o;`R7iEw3r{sgt?VI~{+}Yl> zNyvK#q%}pI25PP0Qwk!=SNjbOO?B(7Nt<#2S1@=~$N~J0wh!{B$bxuy6x@Zq0j(8? zw5w`6!A;nXl8Gd5!(s`Z?4o4RR+X!I2CaN*9qhMuux#J3Eo$e!U|KdJ$89^f6`4YO z>=~L+fQQebwa@^2+tBqiI3GrG=mPu6QOLXuC|K9c^%=pl?X&=LTNDUO6_qYgkXrkD z@969r7C}!Uj||@srN_#V(P)=O=^9l?&mgSZhSqfrqP`NIa%=G%*j7g9QT>pO7IxU# z358T%g_#t@S<|y^NB?jlp~>DzLb6g)P`XTFrFlp^JFQlUN8buDkP%{GV}!hM}s z#f+)@nB#z%EY?e+eb+!wKb{o4FE)2}^^mxa&j+yys4J~S&UlC+rDx8TSpuweQ$&;LV%K0y$tSX9PM?<72@9y;#@OZERn^a?Lu7 zvp251vAJR829c6Hj`(vCd(2+$xRvbXj$6qtcU+mg+;Pj=<%^xRzg>2Pqhz_GWQn7s z%2DDZSbDjm#4&L$?X%lcR$a{ocMNv+HFWlM?ZW)9o^E=K@zihV-OW&JdCRF`$FA*z zY)eG8L3sNF8)f6g`g>VXU^h6mHYzm%WZPA=PZcY>ZK~R-?NY;Dwn=U4^;&z>wnqJK zw?$P;yZRzaYEdO=gGv#9^!4`VSdrQGv>8d;owihIb4ojUfyy?L+TKhiSK3gjn1>im z(J^+sk{@GhzjcyIMD?%9?DmLw<*Gup*{Ru6{j6G;%}psw($ut?n2uWlxSiwkzHSJB z&%CdBtv)I0S0F>*llY9cO`5p-xWRiA_PI6--{j){4uglTf#iD^8$8;RcuEp|R~Wny zcy}v28NMQe_b7P93J+p#egk{_=lv*TLH(Qf+_#O?_lm)z2rjT$R{syd=M3Hg2i{MO z@X_8v$^89eL*GI0&Lr{o4-DRr&*~$SR2dKIf5m@0zMlZEPm*wzyp;y;Ja}sUO5PlU z=Z7E}FVo=BnJd(%A&u1cAFxov*91YKB;hJ~|7h@Th2Y5~yuUDbx#?CPnWRd6=sMN> ztpP72Nw`YheFkr%18=Lrqcv2GN%XZDyr;oSmM-YB(!%!!cxri;;d@1tE9sRV53-bz zoxFb;JU=k9m78qvvc)}JB=5ALk9bj8Ief6W zG4R~@8wbx#JPJ{1xZ!Pd$)i1v-RK*2$t%lqr!NAYn{+wiQs0{{c{Ta&{2c+$&GYs& zc*)Z5Z}6Psf5H@C>ng~x6I(tX3n*OhpN@)O*VM7;8h78RfAIB zTX^u)_(m08ro#K7!8@q%C_SXUzcF}m@ML_+AIbZo!8;Eg>7n={TWsDwgU3P%9;#NG zx5eQ3!HYsp`cTE$ygGw71fKL4RgKLnHFzTm4^@NBqj6j{{bJzBe50$3?~ie>@(w6G zJSsNtl)*a;UMuV<9w^#2?@w{B>N_7|4F5R~Mcd|KXj9__OA_Iu_K6JNhYeo2!ket{ zwivt`@MO8CcCXY&VOGP}s_4U3gEnue!Rr7|<_GDO`eqrth@x*s3f_>y!z1OWFQ)KN z6did76kaF=@36wdt)srD6kcfx-bsZ=Y2lPEXB1vp3f@_TH#-IIyuzE4g6BuzWx1y| zkW=`A3XkdqCtkV2t4P7CQF!xG@R}6f{1m*63U5IQUPR$7Ou-vcc$F!5F@?7%1@C~u zt4hH;tnjK+@Sak5i&OAUDm)AeJLcONg-6e}%-4l-}sa4F1Saell z^?vU0REWF%o$slo$N$pu+r%y_V|%g^t9&mlzg3nz(+H7$*4qV_lj_T*FD<_vyL?qI zcu7~G)%H2i-ULqjpZS^JlX{1LFWy_!aC5t8mp(G2p$|5>04uqU z|9||KX`);+C~bwIHE8NS{M4e+vDd&p1MByz`waGD*+_z)wC3lOhP~|1HH>o# zG@Qmhrr~t9O~V=N*D^Bv`qOtu73{%R{@-din?0f7iR?iQPh!Iw&SD)J4zM@iKLvr3 zk@m_vEie^3S`+bYP3~h~(&TAupC(V|=efg*_XpFOh&J3yLvx@TCBT(1reoTMFty{Q zAxz(u(hye1i3pQl($JX&_|F39ET{e&+Si|Be8h4*UEq+w_z0%&0W6iU=29Zk9OL<; zb~uh}w=g;{I7XYA%X0-rrwhkufO9!M!Z}8#1IP3+f6@E;>r+SCcSWO^q=HFi);v0O z8c7P-=FN(5%$EDcZu`BJhM$BmpyEeEE$QX0vldRpbx14|ik<^7EYkLt%{ z`kpX&t%?rZ+WKk?-g@9<`W_WLT)64LU+Q;|M&5r47HS>a4LmFpNs*ajcs~Tk&DcW` zI?O4~(n!BdeYb(1X$)Fg}np35GD z@D3q+>JKOPl+JL&S~MJaz2B z^mkO@Q8{$-_ng90#~w_5G|(Z_PaS(O`^s{`dkg+aBg>W9SC)xDH7FS=d35zDePyfR zS+c&eMaz~g2`T1+ePz{)Yb^SO_Y*y0J-GIMqElD_`pV=#D`vmzedyF)9o`*ysXOda zci5%f==cV91DAHATf~=pnWunW+KukN?wJDP+>K7_4l`c{zl$ER_tu+r@jY?Bdw*q9 z#J)Zt8ym2pzAJS-J+-=Z>@~2@z-b0fXT6Gk>Z@9>VK2K%!#-A~;WU<|;dJ&HJLGip z(|7MyFr7iUNy8J2xl!3#-;M{ZUbQdBgI2AauS(4^>WgZF{}coZd)d_*_Axmh)sm;N z37R~eyOlwrzM(48g~lWQwnKZ9W7&6u_9DkFt%T=oUw`{APcb}rlr zV?1SvUXtEQQ^fm84C~Fiu=o%CM5Z+s8z!;t?j7jbv3+|_*C5s-wM)0jyKfv$h8TaR zOSR*An`+1PHdt%&ds!}GCb`{bWu$Mk&+4@@tYwOt*5k>IardMcVSc~Qyf}tOgPvR2 zO~9WYU}@-iCG&awR37!ENEylH{l^R*^>Ij<%8MF2EbULqyTRa5zd|y7^u0&nlcp9o z^!+N0yeIc6uMzmeGV+RSu5yoC_SY`^NZxhHyUJys#+@#C-*VuY`FRe!5hOq%;)Jem zo<_O2n&0lUKN8u~_dWG_IQ0dLD7;jC75fz)s&hwu2NhnbzKSCXPwlHP`xZ`s_kH*$ zjm&$qZ{ZOHN*y1PJi4lV3tQn?vc3iC6}M*KSUm<8>RYJ3eEAj2In_nq!eSnJyKmtR zHo&6C^4H{F=LzSmW@Xcd4o5OayXS0fSRVZ4U92)a-d+6a(MRilaXL2~J>EU*)`t6s zL&19o{8btJRDs7Mo=|7-1IaPiv~3`Ob0g+T}Cedi~n!bFZT;EAe>i7#ku@ z)0*!+k`<{%XnVOYtbE2PRyJkrly#FwyF;_XD;thPDuO5P@{~_F6$y_F-+$Ns`ixWl z>Woq=RIEIcr)160-ul;02b$84oIBnfYJ{t_hrKtI2Lm0RVc!8yl!bnZ5G2gI@8a1x z=4;L<&58_HCr($WI+ocoduU>m!j_I$)&@s*=SD||g3wTPJmKEcbYjRly@K=vR7N0oUT>RY8FV_F;G@W>0nRk!vITHAMCd-U_53usI zxDS7E+C^D#G$i6cai7^VB4Qsn^^_9#8j)63+$ZC7n7#G?cDk_XmDefmxlP_jMj|Ca z|J}J!4^HFAL(cdPP#n|X%fvXVoDg3;w0ItSX>nM&(e|6;NrJX_RZp7ai9AQoUmbQwphoAOX&SO>;iIs+e{wh|&&z1JqMrjqy6HzU1xmPEPdC51t! z%!{{<-FsweSS^3k*SalzeqQ==MGoZfyraAf#3wd=tUl+ARTe!Znb(&GJv-A8(iVi1 z;o0`@WTDqzPiy)&yIfLQUt6EUDE+PHJbP{Sy4=xF_)uwU!{W%}!}kU|7GHlybtI#- zHn_X0f~OV5ss_*UPqb&*)9goywMwX``J{bM<<4^;@P&zCI#0;6&=*gCsnibjuTTP~ z;JKR<4)d~CEuK8jf&1?o8J16;$0{k}$+Jq|t0;Xx5T$P<5(=gddKRMORiWfPtdzV( z6XI8jl9$nRB}!h}!&Sj*UQ@Bqw~-QN*`qj&+|`YzF}mvK$L>3l!?NPNVc%h1E>N~v zS>c*Olz>9(sVVttq!abkzF@MNB7^5u74rYbI5X!p9@@i^+|rU@Nwp{|p&!_}VTFbA zB&s!%{v46va!YaMse;|# zs!w}qW_bNwTf?)%)1u@D#pfgS{y3c@W4!}BC04EBIgqZ!jh=67CT#BUpC7xd<-Q}6 zSfNsSa!%1(Wc|z+j_$dYRiww+Jp9V0teLWI$|#%nGn`h%-zF}~6s59Wrb5Azs%opm z@G@nV>vP8rl}-#VZn>eMG_qd2!K+Tq!IQo`vbtg6x`o$0SmY^Bk9*5!pUU0M%4fwF zj!xdq7S4?0ET8_Gp}f&p{lxg8(m9d(hCjRYJDK0f@hnO|^_il@yT4lRd1?L3#r^c& znHJlRa7}Oa4_oIa`FEZ>9&8Dr74Wx5=j;r|j?}XkLOVmlx&1k7t0LvW^xd9?{~q_0 zdKDj*!iTTeKI9h_?tY@)^8(J$QhYe4lwMh@Vw%!lY1`e3>`I0H}fzJUG&*Ns;vCH@ z-b;DEc()fC07X~wMduIo*Vh%?spa|VapjM7CX<@yk0#N%<|1^e`81|%))x$=DwBSn zKh2-+&+unj<;R+Kg@D0OA9X6XnYP=pXL0%AHucgC^rv~oJ`-wOXiVh2oPVX()AX`= zui^P1*YVq_k7&;0#l_9aCpB&hE;4RvSsXFrhB~e1BFdtwbI{bevfz#_LMKF;2~vR( zhUNoIRxph)!6?sY;VV~FVT((!k z{Ndc$nv47BTh#k}LBBq`%L+3Z`(d5-^ zi-s4oH5y*RmS}h>E7I^X_O2YzMkqaOIr}#aU(Wts!!_)vhD+E14PU`Nq~R-Bw}!7` z>jb7tp7%0Vg&Vq;xDYoKM2RtlOys@Ar}M=~)`TC;FMCm7dS}vF$HxTzAjdwoS73T4 z()mxl0@FK?&VOnWnCe7Y>lhN492 z1h(Agvu6a}%;g2_>l!X(_X|w#h`cdC& z{Auhw0!HEc5a&;4FAGd{cs`xig{w5Q_VWb^aHaEn{!+mtKdfMqe@4M1SJ%c8?lVozqH`$#W^9ZbbZJwKY;_{d>#}Y^4E*VOd~!r zw~?-JN8uy;2wlM|Bzw5y@`uGaJg^@kIrQI6SLnwy74DwOHMtAX74kBHDL)BQIVO1( zUExnHt^w$!bR++vieC@nO8i4~g=Ie3Bb*&{{j3$fz=PJ>sK6JjaL{=|pCCT;k{ zl=#qJOBnhn9;A=LL-ATpSI9@m9`e0(g?tX#BRn;Pp=SkMp;yL3Ucwi5Ra!f^ilZ8|67Hg4xwif*?&5b4>G({$R6pm zlz8x$#}EFtkv;U09y;%dhYOLB;ffL;>3|~00$9+;^@G2jF#NxRu82QRKj@7SA9~|- zg}WC8K0{aNeVMM{@p8~D!n01`9RfEC`~iX22)t3?wF2KHaE-t>3tTVoEdpOHFe15> z{BIHXHi54b7@5Q6s|9Ws7?I`S?GSi_z?}lu3A{<*l>&DOjKad*_XvEAz^Kf)f2#!E zB52Q9dz{o_7R|vdKU=%VQp6vo(A#haSYX#mZaD%}8 z0$+thyy&&*)Qi1~pN-Kj=9*%0wz4{%oyVWK+mU4x6`RWNn~T4Y(Yq) zJy_{Z!R@@Gv$wBvQ!mDKhjrIPBZe6jX+JiiSkbJe1Z@+ZP^k#Fbq=-nZ13tHj?yr4 z`_`V}_JQ8re7d%kVhXo+2M(B^d4VD^RZ;iYG*rZ!dxv_u+oPQW1LT3JpdV+7AU{M( zo6>Ea{ad9B+xhqJ!r@BLWduT|MAC?oaQm)pn<$+(w{P09y&D=V@ARk;(QS$l*GhLJ z%9vaektb5GbJ~zNb=nZ4YXB)g3D>)Q^A5zky%*aZ^lsnUzH7V4x}NT_@zA2#zG=7} zC;DvFX(;wGWhp)7`T%QBdHdL+Fe?Y1s@g1cwgm!lf%Z z%rD!bOwg?pktpO;;s$$ok=2Ep>0G1@Yg+knC)PP9?JL)|HMiX)PCHp;pD=@Ca8jI& zBJy9>HC70CoG2Sm_n;_KnjwV{E2|tKGqnfMlG!PURNmE#kR#T-rXq*dBdL@=r-c%Z zrZR<`Q7<^Q#j${-Tz*4E9rd1gj_F;@A0=Mh+wY~b_=yqz8 zBOw{@E1|biX(fH5;!$P zG}mroOv;iqKr}^q<3kfU$DK60YIJD&k~cVPiqY8Mjf}ExHtrQ>R$cIZFD%0+%RT55 zr9Pqz{K(L^Q5(Or{-lZf8x0?FJ%gI5epX(NpcUz5RW1%5)3aFsk-FRRA)ZD4d6 z*hccw4BkUXPkh?iM)H0HWvafH!F$MNCH(zsgBOK@+9bTg2JZ-X$H@jy4A#%ly`&}JpllKP}n zeNTaxEd9`(r14IGw?BzKbT4VVRwx@y!uy)YHz}&ZT0a?fvXl3Z8N8+7QUAO&6m~L? z3LY-p9K!nXWa&2-Qt5_>SU93RM^a|;&V#3>vlDM=Zt{JsOnpP(xzYC|cjEjZkN0`cy7X1j6Ema@FL*3$&W)Wd800Q z#dvA8xyZMuOWw2KxruKsHcxXC-xly1U4(Bxcy9cC*`>bF6nFaiT=Jd*&rLku2G31? zv`$UVqxZ6W=TNd80xuT>5reoNz>n%RJgRIMJXB@2d9uVhtAz4|o(GWf1bFn0A|8zoNgidInl8_R z7Zkh+3h!T#IV$gE@Ir!@t?<5M@ZMJR(Yk!;?;(R%I4hAZG=3y`Lk6!{;o;R}^KLPC zW#E-VPVuGullo|n7d0L&3J+D6&6{oT1{EHv8k_eH?p1w{f)|1v`HM&1=Dm)4mG?Aw zvRvWOvw44S@SX=xmKQuyHt)|3-izSLe50$3FNWPTf8PL4rc05+!?2CUD=bU+J5AwH z9ihgf7(A(Oy24v(@EXAj!H&|U7(W?41V_`?4W3MwPzv6l!YfI^+pF+U6dnD2Na0bK z((t2nH^X;G;o;Vi_oTv`or3qQ!kd$V_oBk1HdPva$-?)l!lQg~;=QTxDpK&$5O|p% z^HT5%72f<5yfTHiAO&x!!dsYv*QoF+Q}Egp-l7z|ZiQEsf;Xt}s#EaxD!j!hcn>MO zB`J7^6dpZePWk(!!dsSt_pHKOo`UzH!n-^L?^T6I?;EG^y{YgpwCu=B!$Tp~OkRk)LrYZFTQZek9AYFZf)n zWJK=Mk$Y^yYG3%Kq5L6#(*yO{FZfqydGaHl2$t=Bwc$`^+KbbNuD|u;_3RW@R39&( zheVj%V_D5v*JTZPho(oGXFhi{+f#hoWA)xsb=XA#J9t#QdCJ$6*vW&|nV~J%%shOz zkh`pP^8RL4o)yQ`k@AdqMspy-=3$SIrW3`{RsJx39kj1Op78UnV;?<|abR*7tNpQW z#ANIZGqW=5r57qQ9t%@pA};?Cm)G7! z`;V-z%!$8H890?aIs<>n^$%>RH~!D-zEd0@^;FK_?q1}Q6EQY}@9cmz_5aZ931!X5 zsoWXQd-;2-moT!=shIz(@cFj4qQAW77yIAb`|}Ex6?*OUXV*=<_G_cT%KmuP%ZtOg zR~B%t|2N-ydtpJrtFIQ!tehRsc)6&uG(Nr3gBYcqdSi5b<=Y6`J@I4fK0bPOC=I)i zq#byC$m=wKMnBd*k0g81EWAJk+tXJa%v=3ykhOJM`<(-f+{Nw$bv~)SCVE zp3^zu+edvNvMY~ufOBwXc(i=jQ$8i0JJ%c98s504e7Ixhk7FD6eW!TVjNJ_p z%hvGO*iHL}8vMbHdlrta8}-h8{dLlEI93t4mv!)T0N(d_Y#;mOsHN#}Y^3G3((73B8t{(&0@s(9(f zUI_yk53|vRS0)S<^fwP(-|uDI0`+hk}>wm^&=-G_J zBON=x8ao@iWnX_Kg(pIeOEc!~0@wH|=AAlQ*=D9vjuu;L%fOV<(Dd zzi#E$S6|R`D(yf;%(ZW94TgHi~==^{0nCuTy9~ z7T>y$&EFe;r2gN}P`KvpE16N>mK(Tb-=-M{+O~$<_eJ)7X~ucn-GWfPKI04zE1U7L zqwNUm5D#mtZR5U@@JR8!M{nMf$g!`SqICT~vD)DCugya!o{DdcvH8c~(^F?!M-RuO z+caz*lv`TC%Sa?#x3Byj4|e*=4Kb7xfAAZxVLqRz2Y!Xhlw$R%xD^*)=nGu)$K$t$ zTkR6t%2V?CJ=h{=My&1juqUv7U&o9*+>xYp&ktYYX|)jwgSMr=%K#GF!t!u|i)dmF&0t~!1A%tw;R5FmsA69{w?0wjC}3N+PPCz)iJ zK!6meqHQ+`N$8{vFeHHvP;1iCHq^RHYgcLQy3|%}{X{Ho*Dbr$vRZfD-3jQvy4$~- z)hb=B{_8jDu6>{9+;e8mz08DxYJJ}|2PWq}=l9&-`MBqPoR8l*505-}uI7-a5hGvv z9_v`mp#`&_yWa2bi8Lb({w*w#!Sd)3pC4uFDKWWj@c7GvPYn+@h;RPaAZx<+hfkGR zHM3gXU0YF(MU_}<>G;;6Q)N#Dtb1-iRmlF1Wv6zX@O$^?P26BK7_oUyNdWF^ciUD8?6~7+;Jcym7;pO&eQUnl@nt z3a)GZzj85(zFh;mI(PNOg-#J%T3SN_Wta@Wna6$Yy(N+Eltf@6S(s|Pj;yZ!bX9H_;i^;NfH*?EgNEy@Ju60wz z>AwebIKR=Zr+ssQf!Q+m0<-Kb=Mr|gTgurdWjVJ)?vZll*K!_*+$-fQOUq&P6G<($ zj~Lj6QSU(;o+!54@FdYdET)wH8LeXm&Y&DKKrlyh7|J7S|a1?T_d zL+D56a}d58otf-!b)!Fx{hGvlQV=s9VwPJf9G#@s0Q3AW(8tMV=%ek(F&X+FLWF*F z8h%mvzom~($pGT^qf_)6`sjR&&_^fkjr751J*H3lSU);DkI~0@-=mLkFYYO(<8AQ$ z=rpArF~k3xKJ?J;keJtzJe^NoM`D@Jc`Bb6G?5sU1R?=5MhgcO#z|6Mp)dx4B(78# zg)Z@2g=Z>Ur7-#mr5u9>Qa>x}W!vRo9w%Svoafp zov`5O+G7vx>%JKid%OGWp`44DK_S9A1{`WhrTSRM&aU3>w(WhpcIYX?J%)hz|J0gRn4VMIFHh@;W6{XY4o;aK z+jfC=5N$}P;AQQ_EK`EE?!-X0?JqMHOg3YLY)Z0km6_E@;eW>_ni)$^&Yb0S&2~>2 z1a&{9LQ?lqDrD^Y$VOwFneU+#E%W`85*znUu2X!oG!EX_tvKa36kY|XIgETR;&GXB zc#KQ;ANXtXwgTfdkaC*$G(t??VPNXiPV){Sz~r3!Nco4M>siU{gpoUD)h zek#OIyO+_ZV>r{t^pNMn@89t=dFKrt2va4HFy)o;4xuZ zAM1lopHpA4!9$hJ$_pAiREey-T7!owk(C!RcuZ%u^tBp1WIe^>ur;r@cJ1J8V1-gn zAM)NXd7s8as<08DdGrw+*XREj-_A`Mz}LKGtFBsMjl$<#q`#66((nH6670R0<`#!#3#0oJgUyy7_ zcoQY=((sJMg=c1LEE~OZU*kUFS{KHnhTWs|L)c$IeA64LjCd=mvOEq23J-{y{AB(9O*Nk6 znHpDeR?Uw_tkw0I2f9q>*YE#_0@ui#nu3vnlqQrbbXe!Ua?YKaufVwqT8BI7X<->! ztY4kewwcGggtF-a<`Q83R=$Xkb9(@xv-qaA@@o-OU!a!hdj@5 zex5^~?~vy^V+_dU7z1*PLL+}3eEt7Gf8;{}M(D)9*>IltiVf$BPug&S zxZ1!RQ@X;y98=1(;fdl0I;rqoSm|uUh9}#`U|eX;eaI&F3$}5!b775OJ;uXp$T1{6 z#=~pIF{BB|FO$G)#4)5F0ub|>a17~1g)MoWToW_R&ljIoa+Wd2koLgWj$=aY8o=im zO|t`Y?zncjjOno5>c_3g_9n+>R?=T!^@A|H1=u|wVWu46Ar;=p@P$Hbr;qTR^r46O z&2%37Va)Jab)F7q^Ne~J?#5UN)8j^AON_A)iP7Mc7=MAAoTUeGX!FRCe?&UGrJR= z2*VO*7~;r$nw^nRM_=ErzAPt8Q7TrwxYVVMmGrLQieqYF6>Gr?CVFRguN;_RPxSy6 zRO*lK>Kkag4GT?KBPTm|4fJf^hxsMx;SN&y>Qs5Q27DN3j**NHSX@Q}R)A4^WPrVH8I?AJ^n!CQ zsCCv!wiTKKau~b^0lX;A)h-*aq%b#qZ_APQ2zb24 z+GUIPdpYV`h?lH+J+!``BLWmz%EiGug@6i#T!A0U8LvF?E&LEw%GIK?8AT()^cr9?OgQKvAajIeFhOcw>zNyln9JJ*Cs<)OX(C;V>)D zhmSFxK7N;F(-$y!V~qn;8$9aO`kejy94F(LlXm)0UvC}00g*jyR7lOE?=kxK&*8*O z{rmc@KhUwQw;L9B7qhjya(UfKYb4;}{rjW5pho|`Us~;>#r6i+Pw*Y3@-*HdJl-KZ z-XT2RAw1q8{72j&Y`qIQ#gKd@S%2ZE@inS{d@tkuDS!OV;WyEb@#D7)e?P&G z-#h%q!7!-RCj(!{%(Be zu{`LP(nn#l?St)Eto<)=Ar=$kJ45yz0bir|jr4JH3w?xdq0bM!9Q&5g>CrzRm*CWM zTQ6}E>lhsXj!q~-qX7??wdsF>%yHfY&3>L>YxMJbPj>BClVGiHBsuj}PKwo?U@H9g zzEZHQ*90Y;Ds=U*#+Qq>_G+{CVQy|+ws}){8759UY^Bm)e4V2HN?hrVZY=vPTs1fh zuUJ~UTI7Y%3D%uhvc7ha$S*2%O>tpvhI@vq%r(*M- z2u(KYBI~bq`k4L9Ca(_o_A%Pt`Wf*wIPF>)e64Q*j;T-cN>R^wKWnFXD-fVLl=Xu5 zDttb>bX$*Yk-7LW^V;1A0`+MQ_3<2MTjgm4Zq_Hk*Lh@#dW`S_D1V<88axJp7uVEB za6e~jt8j^Cy)ekd+A6CqVJ^~2HrkA~%52OQJbz+NR8)D}XGhDM-HF00T=R<~9@pep z@taHL{d?I>agS>vj&CUYPRNsH9?9`xLmF%=LT7;hghL+ zOxw!32II}D@n+R{vueCqHQucHBW+g6*FYys@X|e@m(%4=7~s*%u0+71c@)9P2bhMZO_fH zdhOVu?PA#)mOHZWS*9j_q{6zo9iiK>Rhi`JsTx-QK(+}RJxi%do?#u*!cfMB=02tf zPzsg(u{{Ia4i9}5J=?0PHenO1?*4(QD(ouO+p|qr6FjuJqS_2iPx0v7CY$aShpA~p zNO)fZjC^ss>ig zk~QkGCuUH`A7I~?ZMd)T=&{Yo7zWmk&o8!+F?rg(gafUEVfy$E9GkqCf%`J_ z_aqcg_m$j;{uw??wbS|*Ai&hu1s?l5wbL>u?`V#^7r|@P%HU_y7ewN6iI@FHyhhq( z)AwW+eQ}(q%bYr10um*>BZ|cTiBt7$bh16e|lo*nCr;GjiG)1NS>=M zHYrjaI2bEjF+b^Dn3pW7n7FVwIc4EnN0y9+5+$%xWbfS7v65g7bJI6GBVyq@ zlVZ`Kz5wdx=e@2mf&} z7IE#rC1S0DThZJ+XSl(GHFoo5k8B=RP5$EXp2*tWZ%$0ueRV>(YPPs5iluGlkka9K zs?M_2d{P`PK-dd|e{*j1xT}J-;Lfa^=ehQ8A2~gdP36A68|H`ypE+k;H@%KD?Mxf@ z5AL57aaC80RPP_Eo|C+@x;!bCP8ylBxF|VV;7-n7oS!Tl-LyC_d1kREIcu>i>8tRK zQZj3?dnA8!&SJ|d*0Lkbj~2wlviu}g@jbjEf;C=eFN!_0#cAT@SE^^HezuPH>5up6kN4@1_vw%K>HpF8>8n@4Sa!2x_lVEI+qxRR3r7O1 z6>FU~w*kK1mE&xK`l**^FI%ORz+a7~Mg7zR2lMXs-s8C!>#NpJ-Rs_FEj@cFX)8B$ zhHz}t34FP_*m{0FcC==?8h(emZuuSRYX2STIwp1PGp}djQp(<}V-cwmb~>dLf^ zywJS^4O;Cu=EA*>)6OL}1EZ<&KDj%G78pFj!Df`n01n4Qj-;C9psqQZ;*fT`PAo_)H#J&=Qt+y&kD1Sab4cOQaB`W zfp|pW28n&*kix7pB^Wc?uW-A>e$k~c@8S{+Ha!PlJC0#}Oau5F^J1T_cEtB;0G~Kr z_o+{a8w@$|ItNbIWs5)CA-~wX)>81@Z??v;{BO0^3HD#BY_);k4>>W*o4lv#W1x;t zeDYcD3_ni%7Oc-pzs|BZEt@ToW@8zpMEXYV1)0!T8I#R=-EL2Qfpsz zHzp{CfEm7m;j64ZQ)2ds`s>yFTHuAmIFIGw2U+St`r3iX_cJ_%>9+Lo2T=?6A~j}* zJ~xRMD;!X`QsJ2j&s7+imwde9nGQE9o5b@J#zl~LzQVH%La3>i{Unt@boEa5mReAan5$^>0vRdwwB_}JoKs70k%?X zw{4eWot8O!th2{j|5z5SuwVzQ-7U;Wj8%lYy7%^UcDG@Sbx*fk54f*;$F70ywvMi@ zJ~@_Zj(s}EM#JxD<80*h^;_FEHLc&crKzp4>21y7rp;Uhn8mQCUzXuE3?~21Eak7v zy6EqfE3(D1;_9rD)mbI~%a;)5#dO}6j(gIA#{FmnTzD^DD3tf16`bK7v;_A1&kD1z zOKpYO@5gkQ?OwEkGv0@Co2>%TP)_UnJg~_-4Fz#cg0FcW zbnsT<+bWuY$N52~zT3fLp0(5Zx)EUVUI4FAli+LKCI_zwf>;I~J}Yec2EgNYmv*{b z)*@2ItKGBU>9`oCkLw-0QxNRW*Jq`5;I(bj_ofNCjW_QF&n!QkCa1o?1#e3_+EiRl zUP+O?oU`fslN@;;&yn|w9C-~G>}|;*AAg!7@87`7rTi)xWCMad-~JvW&^|;rAMTChrJ%)I}cS(Y$jG-V5L{9`bMtqS}ccem#8`DvyvVd%pxkmAjC@P-W@E@4*Q5ra2*4BnFlkL9S-=ZyCmgU2}p z*?2D)JY2%8yl)sh9A@RcZ176Q;GH*kn2wlLpASlOePL4~TRs8?4^5J+ylR8T_o3FO z>osaQN0Ims@WycP$VYHohrb08G-&`|>%+&cwZVrn#Jbpgj8#{! z&Uwv z>nDQ2xMed{g7f1irmpu!suM1pJtZ1H=?+%Md)hOdZ;b(ag-5PS?ZrO1E^s}gnj6Fz zu1vd_BGZ*0btT-`r`J>AiifZpu1F59k$XN%Qt^o*q+3*%jI?KrO>3p^N~PG+|N9;j zHm>jZfbjT$@c4l6_<->EfbbvLfUxy~UzUCqbXxBo{;kF@*U?>klBC=U99`Vrs=z(g z2r<8XFL#94Obgq#my;G#2fC?q&@uLCx%IgNMTYxx~go1 zGk=zIJLDcIXE|EVX2htEafQ2uu#eovrVQQv5|ebwQ4izuU#ZT=n3_DlN}a!0oeyO=6n>0Vt)yQgL<9X= ztIy3p*UBgLVK_{t4~N1JGMXE5uT7@gkIb@-$gx23xPEky{vvD59FEoT`OS5m84vX# zitP4zXxK|RluQ03h0%tT7?DdkGAS|okS>4h46mE+fmnCn4zAp6SwzW^v(#&-Z5#G} z9N4vMAl9~PCtIQM-fnZ3OH-_d*l?~9x_x`5U~BI`ZZ644^=6m3nfYZNyOLv5SVgDb zQYj2<+WgsrWscQ2l6kBR53R8SDX|VsRjCju=P+1$v?D{1d8#DKfytCHVmc^wZtB2! zs!pE$(qU2RIEFgoy}}XRyX!V9+%^^`wcA3>Xq*DcHZJSVbZoZJR9r^r_U#$T2u`t4 zXIKC!t4nKbBveYZH)vZY_Waz2`jTxhtuC7&>tNnx8bKQQO5YD0U;cwwM_zdU${jDQ zk4f`3Os5rwu=YE2=LI3SXC0)>_v_^uPiFYieS^on9>*h-?;t%C!sjTT-P-Xxhwgs- zOkOK+2tVyKZ!ZE&-eKUangn0-c)rPd890cacACfU9Fyk*V3>BA_bmjFr(Fm@%NVAQ zzm8**$1$|qbmk2i`|HWW=aY2LqEp?cj_GNAc*WWDod&Pb;OV%WJRg)rbKtdtmy5oK za^!sjylXPV`(=c=jqp-*-XBKh`Q5?3UgozLzrV!K?ALz+?{KJ;YYj55azzh>}onBqD6;a`IAN04i$>z}h9{tPmDmIbVw z=FvxRT!()IAEKH1;mwy~E_RX2SJu|n1?eunc5|>s#-7@n@$DEfbw@?TPB?gT^IPrf{w6Qh{?$JBGFQ^GZ1zZg<#Ls> zznc?_+`GF+?Wu@%S#p77Pe{6-(rGV*?V#9S9S^p2mA`rPis&h5s~xFMOsbsS(i;A7 z?6dm@14FxkE281YV)>P!z;c=EV5F#aXdiiG4F>A_O-@DR)a;_=?8^@(ikd^^r;Z2X zg~Ot12sVxk%^&s3l(VX>fV&ZOYHNK^P2Vy_NZ`z>0> z_wGIx6BX5gQ*u|yW3U2U(=Qf(@5QU)j6+-ZvCN5!Pu86f^Lio^s+l&@wATt{81pr&ml@xtg#( z8t#!fD5||$mbA`+6{8f6&j#x_{l zqIT@9R{MCuR#4<8%bJ6U!r|ct@7Wm`gPI-{SHw?Fs+fk-#9GN{LGzV&F_hgU{}@0b_=QZxxiOu=T~Zt#V5`B`P&mkkph%A>}lh!!|ub?QL)&E zT}<<^vz}}~n zs^VG;U%*lXqb6sQss5w$!j0P{<4Sm>5>=i%w_xUzNafGnRS`N=@EMwL>$gxDnJS&)jnVKv)PwqfE}f!O z=~&_F35=Y1QBKOnH^N++X%HvwJ?4?+8;hK}?^OQOulsPlqH$Ny7azW(@Liz*pK1sh z6hZgl{ODlJb=Z0?#v+4vuO=S>hTqE+a;s*BbO??oZ(tC zEg_kf+Yfr~W{$=h#vXgfmR$~)Ql@5CUZYGyE=zu9HkLNagk3L}Qzlh7PrLhYP(RgX zSi3i2*-2k^9=|PhCep^bz?V{9<~6%T>dMVnH$82@sy}AAZ;^TogYegpCQH|)rpej> z*-TSHrs;Q6P8=%yT}+GM(B$RRDYIT$b^Oww8)n%Yf1PDx>bgUyemzR0{JxaD#37$5<-DOSH`O68m2y5fELSQ%rmi>V%6r5Namcv-oX4}nhTUSL z4SU3!Y#6<DXHk>a;IT)av2No00+OSW2$c78W4jcB1H8wm!Txr8aVww$46yNdc z*qFab;~kOg3`C(fJM$9 z@lC+|DAJgAY3%PQQ1bVn{_$KsGdYiIm%<^5-QqfhF?9!WkGMwRZ%gbI^Av8BI8XQ$ zW}IBx;M=Hg)X!%g_ly5qh4~C9!922~3iFx9wGDPD%x72$HnD0}n9nS(ZLmsVKBG!7 zQD=t2R{Rsicac%X$7fK9dy@E)!d85f#rqWIGp58{EZ(hfMB*vpCWZM7DRGyGH!I9% zMu~f>C|9^a;!?4IktxS{Qxgr$wG@7(h43kV(Sg5YVDcX~F!_J#!22Ay%YoN9aH9ji z#esQUwPSpkvXpYfMs{RfX5De)%a!%TkBf?7IN|TL#@rdsu}c5V*8C^`9wDw(coThG zwEO8J{AuO?1O44X{2TpULc9#0dS0QwQ_T;<;Qdm{;Y)pe*4Q)UQN>46g}>h#C-vW? zc;L%;;j{ixul8A=+_x$|o z(>p*Pq-z+C^P(zT>zDaN{PKK|x044Y_bdKKmH&)7?^*iLw^D`6{2?Bl9<7h@_@S>| z@jwxNRG!=6GhKu9p(mf=JFIo^{kN%d{F8J!hbY(Sf`6Fj;rxf_Na^aA^c!#x$Mut4wnO1D^J=@yieLZ_~I4N6Erqyn@ zCX9AB>D$-^>y6b-L|7+Cp;8H_su>1Sni>1$F8nD zz1;#UuHaJA>x}P{-j2AiRl|61dcz8*Kwc(W;PySey_^AR4@7mkAh4^aU#+~tiM{%~ z&Ffp`YAe<9 zR%c!8WmVS2URGsY>}6Hf#a>or-KHb!)YX+&Wt;7~a%EP@@@$eTv(B9zUkPVLRdZ8Q z)AFk3w^v=ixoPv;R#)AzdCR)+x<(6L1sH9q+PJy3KHOB*)KFhnm1z$X+ubN1-Nu`& zXXyoE#~bki#szOf2SYv=9AS>vS;n{E*r#Aluq~z3n7&7IRhT}*sZYN39C4&?Yug)d zOqLac{cV@^giJ-1j?{R|W!2z#!#Q~7+wDS8rr52w+So6fEYfDa@3P4ByYBMlY?~L} zIRy5`PTn4ITkS@+CFuCgTP%;PKVEhGSqBfF4<=`E|No<#Br+I(k;QcpvK23tJ<6Yt4d4bvf(oXC1J9zED?V1E% z^Ik?gwtRpW$iVxYgZB;a&_qZ%t?!V7SB>&)PqEVR?so8o!AoS|ZFKOM@J#WRIe4w$ zoywr^7YGA2b$yG`r_-K+_je9n9K3@Wcpr1{egpSG&g;2qcWYBkmgZB;asx$D= z47BBgoot!PB_HL={A$+Wk)W0q-t-6ChCQ_@&}Ot#seOTx<4MYp3-s zK!84nvLArgs7Z#*$yyDF@$>H}De zAL|}@#Gi8T7K6voxR|uk|^3w;Md#1!d#iZ}4c}m5ukP!9x|x%KN0jLy>3YJ!|lAn3eZcgEwak z-irqBiZOVv7`)&Zy#F?M6=U#dp6$f2Crre-u(s-LkwB2v0^+_vtweB1(*)F#B-154WS6Q0@UfkyG1wI^% zwdZaZ`-Ja=t7ZyzkXxGc)D(?~1nnhS6TC(JkX8o1ldi<{sH<-zQRsFJ zzAsT0b`4&)uh3mTICWoHxPEX1$3uhf!|~AIb^8n5&kdIBpAvp<&=v6nL!SS0j+%$# zNvZh(rP&n?%}Jia`?Fo9OSmJ;*A<^w79E-SNW)u`b6#B9yk+Kn4R1+Kd2z`)hOJE& zytt_Ox*^OsYouV5hF9PlHU57BFLI+rX|w?v8uufw@I+;=h`;jR;A2r3l9V3!gVSOw4}_l@%#$3EjY-#Dg~quqI$ zMbOvoX|{ga3e)0fTg;;e9@`fUm%@%`=(x6@35-l^7Ds%r$BYK+!#Z^0h);z!8lmnH z?^^Nj6xe9m;~qQ^t*8$-!U`r7V9e)FbZnSYv3s{`|DUYKR1WNvxI5mkACovnT$L;0 zL;D5xx0?_-yKzgg)-xOE8Iw(eeHdr2P z4YQ7}gH4gI{awl01oOd=s02r6;;*+kH-<;z+VS0-D{IKhgI})(U zYz*#w$3%5y(lsn{;+G@QI^Qq-rc;Dn*q ze++h#Ex$%8#&+p6`jhp;V)){DflXQlmOzfFi#EHkx~?uv262t^lcU2usXP~s7OeM= zK0f@P!?8$Z%#0}yHi30mW=faWMdLvEPf9*FEFQRPxMA2e?7QF^KwIh>)FMsy9%HKf z$%^5l_9p?d41Vva9C7NAMre8$@8AFED>>?M+&39b%?97H!|t86(8&k z@1vILNWrmMnQm?SYt@Yj$vYGE36U`KXw?i|PP{6=Z+krTEi!J1H*SbGZiqK-h&OJC z_eW-k*KIAihI`+76Lh9N1=vEr9Fx1#I4}G=9{`d2Q#+|O;p&krQPe%!=5zl z*oz30qKlZ^U6>YA2ahjDhnb(C)Ny&`^1DcjsbjiK%k8hrw32zd-0N(nWu??}>E>Fd zj<;Q=4)gl37m6lquh+DyUFvz4rKe%)-rlM2l0D>?b3fi`|brVe!Zr`}ON;c}lb!L+W+E*JJ_s`UIpb+G66^`@ihGIf}B_Zq3=^6IX69|dzv zi_hcp`tp4Fz5>hCl_Nje@p*eGb;HaDNB(lV2gf#%MkD@`(qPv0gXrpgJ$oaY<;il< z^~35zz7`>vS}$s!9*A_!nV0A)|3rg0Gdt3G(+%P~f!b#SYc99!IEo|Vy4$sGsyO}k zfDU)g7i!d$PaMm+gkA2I@8n%Vko%;Zwbyb!hrCeAS86dv@$BW}mvYuT z%lRGh2~y4)Zn+5#d65H8lzi4k%T091CrLTqe3qN!kWZHKbbcp0R9dAXGHX>Yl5hx}UcBJK}5J~gl^ zz4%v!eG&)7mlP(4_OPF{VXU)n!yb{aVXtVn;XJX%hV#Wj8!iwNZP+J%#)K&6LH&Qx zhW+A8HatOm)`pA3U)u0QanOb*i5?rCEH>M4v8c1*DPpz_mx$L2bm~|>sE;;WD!ypL z)5OCzJY6Jgc!t<&!vXPT8!i(QZFr{mmNBmA!S(-w4VR0@ZTMPIYhc>v1{LP@cj5Zy z8*=P~Endk>=a2TWXKZ+$c*ch3+w7NJVu3hllUIvdY`8|W+VDcL+J+a2avNSO+%~*K zyzDj8w^aPI4KEW|YB1%nle+kz4cCex8(uDMw&4|Gy$xR}uC(EmqRfU@iPt=-=un=k z#dmG^D)EmtTqizj!&i$VHe4z0u;Dj}E*pNcSZl-Ah)?7G;p6)>es27GNMXJM-Ke4a zZP+WeDIApYJkhK$-)U~l*j%hIpXqK)c$};--&t-@i(w zkDMv)pr``ovBuo@!foIm0Pqwo=UglnvBsYVW);x*BfzY(@T7juq0(-O`>o;ymEJoM zNc-nssPwIrxKMmcVZK9YkNkqdd}q=g`Ev?0zqChwOkutwOWYI1Jqq)kNPFb#73Td! z`{OGV<~xk`#x8~DOFUJ42lq4cV&PK3b)1R$PAYLv6CYH#QsU`izrsO@XNY$y%y&$Q zJ0RX-lb4Cf3iBOO;+`o+QCQU9F7Yh!tin|imy3@m%rCnV_q8HslqcPvqsSn0vkpp@hJ>2D=oAM09bLM1S-qyGtO9c=DNA0mD< z9j@iPU&&*=r_cIIAD3VHe)=C$`*^^wRCuZKdH=XSXU&^)f7(j7`)Mma_a`j9?$4;_ z!ZB;U8N-==|Krx&IQk6=v%XWll|J}4(#QG4{=X377Ukcr{QKzt8Ojsa)Bjn_W2X;% zJADX;;k!|o_tQr@57S3FAEJ+Rmh$}1TP-&Fpi11Te3=fMC({98JHmN>7k!)`qmT6J zazoL}_+|Ma{z=3rPrveIIis=!h!d*ZKbFQa{!d!-YAKiHv0s(PK9!C;R65?J(s4kg zse9)Rqq(VQ=#%OA6zYtMU*`X~+P~!~Ay%kx$@{p2_n6vOMW_42>2%lf zypLG*!2g#*yp8y%N*C&%EQb^7y5oHE-95_A84Xj32NVt|j6z>Y9vZDuev`tD3jc}1 zVTIciu2;BS;dKgkD7;?bZ3?6EN&TG)Hz|yZEaP9RaJRz9oaAp;7!xohzFFb7D2&P> z&)=Z%Eec{Wjw`%H;oS;jVzW$NpTbdv`xRcJ z@E(OD3h!08Sz)XbAoJ6r@UX(~z(u-jJ9TBz+Oi^C-`chrCau_s1oo^0eY<*FdUo^- z^ry^O&hE|uSYWqy^mXjGJ`QWD?oHkO@m)LnwZ*ngb=Fg0q1r!?DU!yN zT`sMPEvsjn%5ba$iRf+Y80dI=Ur%Z;9y@2-_Ri~fYGdQp{v8<=fwZ}MXP1%pa9?*9 zOvp0D3i2jpygY_JRY05iwMqR2${3hS*A9^Ukht z2Jzn&2u!iFMwGtvS#p>rgm-SwR0OF?kxjU%yCY-SsjHGDUM0;EX*ky1d23T&UwBtn z`W{G?Q@BAaRrd8gOWWEoMMUjo+}3|v&p>CaPArusiA%XH49vd8(rvH-U)s^Pqiyf@ z?zR{b+})QlYD^Vyc9VN$Qs2u8CD%z9NVHk@;M;MNxAj`Lw>qqo<_H-!%ZCCY~DyS2W6Iha_&G1Ihn%dYx(JmY!+SQWr36O^oq zkgHtCOMtzjkoImYouD4Gxsk00EV$fP%C6Q@D3pvTHsZ9dFNN}&qBikZ8s)YDwDFQ! z)%fPVcpEIDx9zzZ)Q%n9RT*pd%`L2m>pK$b2lj04+21X!cgd!v&8-_ZY;J1X(!9QD z4ZJi8O6$Yiem)kM$Qew?*H+UP;&2Z#AWDt)O8Fz=q6Xo@_|M4UuqL z>t<6|I9k79LsQG*5wT9vMy(kb(w*yvMy(ERo3MUuFATc!RoB>tj@Zi z!uVPbRsRdudf;7ceWJ;)wLi=bZ5ba5w9z*{EHi$9IyhOsB-K+fSGx6FbgvhBr%rT@Y6RD37`-de@G(_gNp-q(fptObB zKPGJ=`-h}WWLug+z7qJEs7pJQn$%aN?PTMN(iU!hP1*$M>uG(_Wf58*batU`R^SWr z0)hH^w1uk+k|7=?$q`yoK-42Xymz2}xa>&6u1)M2;Tu;^1_abn6N?W>|zwgNJHNfmU(hjFd z_YQ}?7VwTR0_Al2-sIrD1Od8PQcm+`Id~k8%2a+X2QLO*QA!*7s?_nfkrp$*1K?#U zm**Y4!&%~e%)xsSyv0VmIv?+L@V=IXccX*Hij&BoZ<&La054NLG>)!$d=yNE$ z1-wR0GGtEPr@@Qn!23mxylW@t7Vn)o^1cLKF6o<8oLjt`a^$@qyj$g9N5GMDRd z3wXI)-%o>gO%B)X`#HwDVp?wcc7m77b^8K%nexH;3aCnHH{E)!g%I*6eqQzajCx*i zZ4tU6@HnQd-38Ap6)+#XOy$gV<@Gt#5eIK@f)E%Y6GQkhUfhD>ec)lpKjmJnu);$K z;d7BZAAWlrJPvR&JcJ+P(Y&`ics_#%QHpo9gI8?ubeT~9YzHr3@bJn`>EnyT%tz4R z@%5n7_aAOMuiD_@Rg&WUt%Fx<@R%;G?=c6j4!jWL{4qV6cejI=0FU2IFbMENs9MBs1#xj% zBzUcmhw#I#oZ>BV@Xj0ha7(3l`3|11DqSu!4BoeKY?faDJY5gy>vDO{!K*d&aa|3~ z`!feGWbpX>(7YQRyjJjZy)xH~S?S;n8v6KMuJxf9Z235B@G8dO9W{8BWAKg{JjRtR z-ctq-hgo?^gEwys-l)NwKL+nrgU4?}FMhmVoaG`AnZ7@&$KVwkyqYn1L4&t&3|_6l zTQmkQWbhV`!D}^mOUB@}8@#1s@Ztt<*%-V*gU9-st(*@Vyyau?jvBlbWAKg{yer4x zoicd5ce14~Y4BE!!5cMrtH?!rZF z(g42ZEn9W9wPX+%7=lZ!F|<4wtd$|w-{rNnt5>fM23Oav!e6?JuQ6227nQNb&wx<+02dvt&PVG;c9u={X9q~NgY@JB|i{iQ!M zdUu2CoB0tjx-|0SthSE2!Lrdlv7~RL9cKx5L3s4QV=~|FpzDFRMDh=Jj~>N35%nXUC&l3_ zBNdUtNAlEO(a(;!j)ba<&-jnr+u;5N#@9L+o8diaaS z^-kB~KsoZd8+i={1`mnq2_uC^3Lg$73bEFbD|~DYb|xR8wilBtBAzF$bOzf+^}*z0 z!@<~!NGM>19UUGlJ37cTOg?Lm!F8YLU3Xcqy6(05< z8JsnE+<(}8#8o{x=|6(bl;k_k5&4q&M~?P=chFVgmpjXg;DU3mBYD-qq_=t?nP1(P zG-J9Z>Pld@^8-T-g~`&nTf=Wz_u=7Lv5MHKfTzdvXmU4gSSQso_9yE=XQ$eAE}*v*YWAi&xlYU zRQKgu7e;u-Gi&@uK2^44_TVgW1xrL!e|qHcbFZoTSkV0VaAB+x`@Jt+?vhvi&(HB@ z;o2XI=kmzz&YzeTaYv#DCZGm+!s2}|9C(j)RMkEw|3ki^U?j9?+L^Bo=3y-nytPFxoVEx&)bX0)vN{`=;So;hBIUDH`pr>|R{D6gCoTN{2~ z*#{4aMMWdGCa!QVN=%HrIb6EnUE#?a-x~X2*$;>RqG8fmQT?@%(z)*l``68ieI-!X zQ@HNo1~KyVJH^9~HGKJ-u4r@J`IGSs>1S@@xc5)-9+)TG-|cgSKQhQCfHxVcah+j0 z=C!+mNBg|N(Ltf=Nc<$vdqdVXv1V!Xb$9Mvx@&xulkrtf##cERU*%+cm6Jd2RZfg| zLZ=)R%5_}@_JC-|*3|D}yJGfQX!~xqz;jIt&(rRcICwqw=2cn|eKaqy(|LO9>xQZE zHnp9$Nwbb$cBjK=5B^;Pvo&JJZt-o(5rgI24!K9lnH$S_9CEMtvZ0^$tH*8FEsokS z?Bi_MD+&xud&wW_1`{H5p~vW~4f`GYc@{YK^Yn?YKp#)x)u27v(+V?>C2qI)u)@p} z_v7UFJNc|VC2p^@W5J&ABDiaDW=sLr==lp)TdOm9c;o+8fso+m0@qfOCZ79s7EB zb#%2^v#wK<+SBva9aGjbZwQAe#N6r4ice0z=Dc^#4Dai{B^4|;c(V2}QnSSEB6W@m z%sOoy)1Lc#Zf>)tH1{cXPrnLi>%l&PJvU=xMPpL>_MQZGN5t-Qm~fr2O2dA-MX;yJ znlwJvStdiyrRI$8{;oZoQoXBBmj_r3x91MCIL&$VNDZuC`pt>WdKNS0Y4;CcYr1|p z?SC5#SuST5ch>2{S!WL~&pJza`SL%^q|;n(hn}U*TS14|ZUY^d;TCwk)ARJrhSqMU zcta=Z;ZgGdet4Xw<__^0#OIlIcyvmaz+aQs3S5rorFLF*unoS+>jmeuCc)RdItQ;7 z0>-VKj+dPd)Tdn+cv=U;^zqX;HhD1!?#b6@rDe`JH$TGjH=3rUbU1md@f>f=fwv#L zmK=Cr0&hzO9=|zs-YG6G5@HYm96!XXQRWw~67gRA%rU=5@&3T8ML@001IvYY06&xW z1b9y(j6BApc`)a+@mlcy;(LiaUS`eXH8S;Y*?7+yJY4D&&)LWSRq*}^a_w|oVwoG&Ts(}-E;9l&k3NFq`urF0J(H=A-+I{K zVNPoz>?d%sKK?6LT$OVleO>J z9eG#yD)c3O>i+jOpx3xcye}R0nfw2&AwL;hRgn19fzLp?8oie{l&@O9B=L!c|2Qia z-;fj^jAC8&m9dVYP1_Dc;z?y#lunbOI{g^R(&O~wo{||>%S5RF8_zyH2zA! zf3JAhHMawL3d@4a-$O|ik#}xk*}8jO32`Kf{^l#u(;TcF>IXuP`f~KAfAJuWu>$&v z*o=z7K&WYbd`G+|LCj;V(oJ54{#n26}_(W zlDYbdS^gW-znQxJR{g*zw@v*|s(Z?%dE{uGvmI0pUaAoTo-PY#JLrD!LRx6>800Zjd=>X< zrgqS>)ypxfDeW%S4qCl(yLz1 zJk(HprnGWfIB#xAV3zyL%m))K2;FpJa8~N3FBc4%Lm3tJkgh#zqt|vK*W5$Njf=S6} za7}nxw5meHR>bPiCh7?v3W&KIV`UNdBhRd9FPQlC$<6K~!)WJ;3Nh-6R0UVWV&TES z7h~ec;Wfd6{I6F9o5HoR>c9{}hS&U-oic{2Lwa93ao4d)5g%r|hze^aO9AG8weBn3 zhsSd`x$n>6=Y{7*=WP^;(BjEwT@lQGX_#=PwBk*%4x}fqvc!F8=AneBabb2R#7|5_PU=Ql_f1Et^O1U& z`|v(rxU4x;?N5|7Plzo#I|b<YaQE2t2%_P9|0tfQ+pu>HGgt61VqdgtB}aaYtuo|LWLpPm&}E7o7R@yZPoMoWV= zvG%aU zE1lLk|8*R&#SgR+V_>|_C4C}y2@Rp?hlQ%|Hic4)2qvjPfpS{=@&Cd zH`m5l7F^P-&$}dB_DehO=8pI!#&mPXz`!M*VlAq387B?&b?n576@8Z)VgHUx&6Qm1 zsBNI5|JIz6xkt9eJG%SZI(Kw*UcxEXkkcidu&b}*=I%>4qr0;!c2RoM*4B-iwm4`R z16wz5#7aOd^;;qvH?3dRx_MW4b^S7nd0|zvR$5qJzoC8&RvW^K3po?HG{eUJj^1V6 z3109ERi|6NSkFPO=8#SIruxR_jb`MH%^Sik*Ecq`ZEkI=Z*2`OY1DTj4(qpUX}j+F zrt6y;+upvZ87+;?*SE54AX-CNxTP6uBWbj`Y17-9Hc8al7KUI`eTza^U#Yn@+GGVp z!_95Y8@4oUiqwapG6D|cOlLv`aD56KHeSDe{X5zs%^T`l+M-e;1|v6b*|-Vi2yyrw zJQ+!?Z)>gJ5^dYq%9E^6N#yz#8#kzMm4UYP>(_4vjY(<5>FIniq;*sC+b}D-ZF$=Y zLvlUVm}-f%ZEo4f2&{{Z&Q}cl?!-VZ#&P@lgO~MGvYLFxOX2cc@Q>g{RzG!LdKM3+ z^i(4(*V#o?`b7x;S*hzbQ`bOL%?P>_ooriZH;9AFojqmtRQS+HaQ0MON}7T?LGYiD zX-XXQ-tD=^{im)Q{8MkQw}wFs5)M6{G-kgC8!2h$690q77j;<<3AD-GQqJpRIgo8~ zkCd~_EeD}Z?v?UEEoSS>CeM>{mW$=`#5toe$bOfk4ZFo(+ptH@S<+{Fpr3PLwDX|V zH_gE8xA{#fF1GQohlLGK5MQ?8BJpV(_K82Y;X?6W(9a;2A^UyKD9keBoT|T3m}SH{ zRZl29D6v=Er!dQ)#GNN-bE%!2qhw&tF}lvclylCIc9ffQs3@Ol$cbrNsU7*}HGog~ zcMMGVKRfUj3{3vV3{3uE2Ocso`8OGu{00YJ8Tm%?Wj|RL_?!#HxnBNC>pF1G z(v!gMpqk56fqknfUtrmZGyEv9yGHTnsEq$R z>&bXd(GRLM?-9>VV9vqXOCP*J_~ad=AGGFxajq4+O#Ha{*<|M&El{NYPWm|SPw7L? z)AVNxk))4KMAj4ce9YydAH@0eadLouh3YrNLnla#eAVJSEah(X7h>*}#3)qur(nr= z3zsO2v0y337_O8TD~v=+j4}DwJ4cI?OHxbRT3wEEkyPjFL@qdKt-5-l2?98#@QO2gD_J5MRbbt*i@8 z{(p4}*M)bBo{weRL|mFRQ!pxghG5n0Vv*|mEe(4rXGGtEPE8uO(ffvF@XEX=iFnGDd`!(=dGw5R{ z7>X?As)~eQ8L}TAQ;%i2;B_S)#}8ffDOZYj8eX#kuRd80EI%K9!}yuJYrqR4j6BAp zc{^}y@@@o=`6bU|@Hif5@}4l_r7o?H?@^P-`ByQ7QD2_H!>ilITZzmuf8;U!TA!2G zXz&ISAgjAlFXUQ|CC#HUz9=0V}6@^bs7_ z;h!qaJkDahNPBknaIzT&P%bvkQn$ReF4u9EUS`S|XQ_rU>8mG1#cK;DL{_d{wSL8@ zFA|*}4^QtARWF6_DSP^0X^*!oxbkED(|cxA-BT7?{q*4U9uJNN+84G=@2N_F(_Ygu zKT+B^~6zk`1}<=^kz#^bqnmG+3TQ0-m2o6D;cLk(ZS?5-LIuSg6x{QT_Zj?M9D%~Rtdcv^(YCtT;L{`FZ=Q8IrD($`qk9)1Y= z9`FA^&*H?F%WiKcnmhDR&-^W-EIeRo|Nhyt9j~VPpLLmQKYl_~`PLV1@S}(QztF=T z3W(cZgJrwfSN`L(mi;WxIe(%W7WMO!_q=EKoY!jHXRD&UwdYT|Vxp!zS&zSE$szom zo_r2}rzTxJqNX@mkG~U>L-^}Yx^59Q1sG?Uu`aN_DB_RY5L=d*Hd-7(4>|hktL9xF z{$b!#?~%6P6{Qi4Pr%;XADx7lHkE&&0e$y1g~_Ulmasqaoq#K%?DWyg?ut$ZXF6{v z<<6g|M><_+7h@Kn9*6kV$in7@>u!k@CQ66@BGx?T(DBmBwc$-=Z#(qShP)Auq#^&& z4p<R9}e_Ju4}IxzA<)7xTLH%@_=zXg5#>H zZQ&bZluYR`(RDWTfPo&kt2aXC4Y6(EGl7x2IAU<8k&ogN{-}Q)mRhU~%{g^ET2bCp zA1*4Zyt}-osB9bl7M9(2x2S$~q}aUDu=aO1M>|9?zQz@euVIm}Y;MEYT&b88$xD8; z!EwT1RrCjQ)rk4x zV;-WEUzh;DEv_+XL(J5@%4KZW;Ui^uh;_$v;929T_m;x^H}4z z1CwjoCX7?ogO@ zmg8o$cclCYi9I5!FzY1OB6zdHtb-gkD^r+hDsktF^C(ZA&pKA(E)Zu3lw(?-ao~p? zn6~%Yk>BsY*E{gF2Ie@`0tcSvz`xSU;gkP=9QXwX{+t6p?7;7K;B5}P&ViRX@N5Uh z5K+oy8h7J$!TZVUZRi1316mPC&VlCuRvS8eIDYgB@dX_n|=_!KO)2i`e?24x-%U&(ubT5TMEni=Z;!+ zn?CC_eW?dN>#)1ts=Mw6tIkp$RJ>sf9Y%vD%xDZ3ejrY=nb8#$ra5J{U>+W+fJN4#{={`JTOb>%l z8FtDu)k=9vH}}yqrP~JD`t3VKTG1e!pMdExLMu-k@yfa_VGe6N?AdwiPHakvS!H^! zKzp&E__*<2dU1wKBYhYEl$qkVpw3vg)+hI=Q^Rf;>XWIpvXpISKid$j-q_C`h_NF} zhq7GYQW|qR}H{-opze{JOWG}*RVgPN$@rAaR<+bZ?zXP@E&yVIB$(<)K2T` zMSvME_u9hiJ>@hHpD;Ea*Boh2vC`?A2W8Z!-Rc8y+K@()~9E8@H-sdOF@IN}rB*3kDm5Iq(L+(>hFj3jlN)7@h#Hkq63Y znUnV{crBU)KO4`7K~8>~X_t-H3Ld}hw9Cf3AG}sgf}f4|B6zu^uevBRuMmp$wP17u z;2lE&&d2dw{8*O7_|eYQ9DlCDI4kcDd_u~!k;i(%_K3;b0v_uNd5lN%{?5VcHF&({ zn)jCu-a&&$j^_QTgZC(SOgG~-$H!w1-Y3Chy2)d8)%wB?-qYX(5k_7CewxR7)y(hL zz&oaRxHKsq%hKc>RBaIILpNAf-a`ftL;hKLPZ&JrTc^(%@6!ekNzKYTZSZiImG?D+ zhv|P=c`q5fQiF#kN9x&vL-8~4R_V$PtPh!1)(h=wpyapAq;i@^AH28@Uw{bE985XQ zvp&nD^@beizvwvss^vMaEAt97WsLJLL#y@tiGz{yC~m97FTz7uoxK*L&t=h>Ydu)0 z`lfJcutZuAiYkoA!@{y8P;&cgu&wMWf3)EjXI&N6I`c1`tBjN`5Oep3?`ka$+%@$4 z(6&gV-93O=1F-$_tu2X7-Fm~EsjU{fx-4x0mdd{P<%vm=0*r?HmgXgCb-Bn|Z+&=S z^WDdzuv+xNYVmYzTX}O*^c-xcO3rI8{eRhe8^EZlGjIIdJ2S~-5<V@;?OZ|wFK?)h?!2iCMVht@`J@vdmrVeQ@#=cm{bPQwcu>s8)hq}uo6 z!6H0Yc%3Z;D+|_mBSodNyz$6&5!y*E-}6Gvq(N5x`mU*wFL;agU4xTvQzP|w9&DzN z!uEZz&z;{wvNbN-dXh3aP_Qyw=7a6;qT+vxXSz4Txd2aj&@_fCq z3MI`R&5F!gx%#&24Ij?O7DsvxwtGDfmSO#-kqR9qD}DdUr8ddcokK6D4(EtgsXtRi#J zJRRxawGa&K@Aex$@n&EE8VhI>Su3Z-vJzqFcFcvvrUTIBV17??0J2T~+s zf_w~;=LaU>z3Gt&D|1%+V!4U%jCG+~i$C+=S86ij{zaLwPu}wxA>%w`JXQ0{v(E5& zAw$|mA~|^jIblbH%`S*%qXs>(99Xcg#;Mjb?<)10n&d+S8HLU9QvZHF1$QB^d%%6eMw%L zHioG|Q6UAu{|hc-kEy-z5v?6o!e4&nAO5jAJ7hi(_Tri%rd(_iCEZRu*)akj&iR6=#lPu=c-zJv3J*MuB4zLWE*7EI@~@m-uxt=e=h8$W~d zspL(UVdH0VKJ_lsW!m^|&ZnMiI=79V#rf15OqXTjdpMt3y6HUZBTD&^4oB2N>+BW_ z?O@kiXeXO$pdICQKI*iX{2T>jbp*Bc5 z79D~<#c7@0DrjnBbT;_|f~Gb_Iu^9%Oz%@0A{~oAApb;Dn;{*Gw**aXgmf&vA!uq7 z1-hF(FKB851<+CXxS*-d3t-HS&ag^HItIU&1bm_s3Qal~r)~6?Z1fX0`lB{_w~gLn zqu1H!S{prAp(%Zn6`IngWQU(k4ubDNVQeEGg%E>JIuRJ)xNbrZ`Ot0HPyY4hsPCD_ z*jGW5e~QAd6S@!JpCKA}1Tjxg=nf#fQG|oVJWEV@jI|?6)R> zEY(;eA&f9lB;?(`y`yQ1^$>NGCr;dZ(Ihnt)TpHL!8Y^E? zzTx7Jwtc^7Axj}^;j)yRr71ao7Rms&h9~;E90{!bTnV*m`zVZ2`?ut$>f0(mMZcDi z(X@snPj*PrpKZaiFU#Om{rEi}Czl_Y)%Yo6Ep08E+L<;RkD-P00!x`I1fx=IvAL@P zvsp$?mX@y-=tcSz&8rn_Q?(KYZL(o;lxdlGD8MgVdhTW*37jF|^jp!VyehYqg4Pel`Lpq832tb6B?i3i3 zM`7}r=FTeaWiUQ0D-k%!!_R&4nclBSbKm`Az^VC7CGTI-#FgZvr?;>PxDAw0;Znu> zRp1&V2!1MD1`d#?gIfz+I{AG(P23Mt#Jdv-MH5cCKrZHCsJpocq0UbAn}>gEfm8S0 zo3X!4^EsNPQC#=om=xWm9zAe?X%kHnFEZB^cjz+no=acJ5}+#m3);^M$jxsW`P zCFQ+g!+EiZF6F6u3x93H1%RXckvwXyQr<^xxS)cg5l!NvHe92Eqw(s)YzLFZz|np75=Y;kGQXs%KJ* zFG?Kw2&U%6-RBWOYW<5XTcf6#g^Su*Sh{S{!gTE{JV6Da=wHlWe&}DY!*j7Ci@oMg zhy6xqHnb7~&~#|_8SzT!IAlS`;mS32-YSHizK=cN_M(V#9D{y?9pzdL{d-T8;GG5D zq6Ma%0#;EuIDd~eKW}jA%4eVzFbz5ltnAy~4|PrE`|w$Nv`Xwcm(tsL;ZlR*`+DRM ztVZ7%`Fit~$nz0X3!&NPio55(H270~s{O?w7f;#g2zH7G>r1qjk-PFmWr2alPz7S? z@xFWzyUk_Ois>Gp@&?=_Uwl`~zJsqEymcBq&)(8DPd+chKdZSV94{ELFc z>a(%v83J&Z4&*XWFuiO{?3TkeRQCP zon2ydOgnYoCr+@6>DW`(5998l{=BHxug%ardOy>&kfXl`e{YOF8m;ieqt3E+L-$jC zfLq~;=Or{hS>4wBi6MPPsqw?zISWj?4vF0rQx718NJk&5@W!91Vdq@NGd0@T;53$C z{$o9C#w^GxjqtVsd*Zr3gSV46hWwFWvA@~9A`fXk{b0TC^nQ9GYtK5YJ=d4?9$@nx zMIKKNQMr)rKwzL~MNvaRj8){vS>?p|+LG5!glEi*tP9;%TzOz-C+EBS);wiVBtJ#+G(;k4UG{Br<~*o16GfL4wE(T8f- zn|lwiIXdo?qH>XOz>dVqV%YkgIGD8}413=p~1!Gab#ll@aN?-c8=-~F;eYdCSOp0(Ft zyWu_yKbN&x=!tBlh0bFOEwqOfTj*?-Kzb;M>X7!mzb$C0GqNo(AZV&1+V}pXps7x1 z-+PassSar0`&L0ynbW>^ji9NFY2O=D|D>aR;9n&v;xqOyHu`0SCj5Yne#%BaVx#X< zXp-M-qYWEPBZPG6>|0+4u*WaX(w8!}n`kV^eS-Y?rcDOgpQiHF7ch2;d=v)di)?D2 zAs>r(&j|X9f`43uzd%0rdGCi$Hn6E)$bVh<3G%T}OZ7u?sb0wDHLZgZok9G7IGeA~ z#3!5C%>sv4xJ_+9cslV4f1mr)#Xc|AXE=@h8)7GhJ3|fu<_KudVbpE(0+PcFc(A;XJ z`(C!TchM>TO_AZl^~q!P&`odJd3#$^q^+eD$C^h!QEw`tCyOC@*csbuqwbTL_|dkw zOir7*vt=Ht=jo(<@1)q#EoQ%mJz%;nCwcRYS%$ng88MeAZe3d_$f1Kj^4fraKh!;n}{hbX*c6vtJ2mO={N9V0Kjv|kKyVQ8+VD9H11$UDT z*8p7WD7Y#c?l^FiXX#{qry){`SGpeqCwUYmp9^fbp8~gA7A9~~27V5c&-DH#Y{rD? zLAX@7FQke44RGtFF!-tD8ENis(tc?}8uGpiTx}XS+Akd~zaAtMRiAVb-~uSaQiMPy zjF&ThqS?RWpSrKrk4+_#NBbd^SE>&;{te=vic0|JM;PHK9*O%3o>d%e%2Ws(qEF(E z+He)XQF=%o$&&JR+Hh40PTfDe(S{2Hhp7seN6kjcqc*9guUWxmD!3UoTug}-%tA~n6s&&2qzz@ z9;v>iE5v-US_zOi@(~=Bxb>J9j;%4habQPf@?O}F z>|EwKy)$Fi0#EfW^G?$L|*GMF=-2MgU3!&AxX zHs9ZvP@gd)D^ge%#2%Jwk4xM(>aM4IQ6sQZzJEt4Vy@u#fYJ$Wd@oZ2myX-Mb~mfG zuVotEr@ai+|M*tM_*TaFR>t^N#`spopZiuuTiQDrBXzU5M zzNpBj_3?Wxw9am`&<_4BA>XF;?f5W(x801s4W!fXW&CMLz}K)o|0T#Hk(38opQiP1 zqAAU^KHVf}N+YdLKLB4kS})!u3HY?0+pf^WSHI(kf4#yddbUCnezHOnpVA^-8EE>J z@BkDcAM@5vkdJlKXW-L%=@-ezyqBhzgrjd{y2Efa`M}Y4IpLbg2afWkL*X$%J|_Dl zU&qH6ry+#X_;}$oJ{mYpA0wB&j*5d5=E`5vgq~{1(Ok|%*&>>ep58T(qiuU3p_&dG$373m2AexTayjg7S5Es;{f7TTovA!E)SY zyzb_u;KCV4f;a6|c;b&a@~xxB8Xx~hC_-Hlb{jce=HRh8FO*VOM^2y2PS zx*D|!DExG)KV7(4_3wRYkA4B(-<7?Oqr1^KAeW-34<5%q>1dsS9QAD#_hZnl#1Ky6 z?CWM>yhQ63(n;JuBS0O0nn6e&Vde8HHXNOmjmg9+Jo~!YTUh*9PlAM#aoKSJj7JR; z1V0sS4{+Cwg2N}JWnJn;;Eq8Etry7kh&(*g*siYAY`{2IA;Kt5$}e8!dtWN9N5Nr; zPU5JZRNOPb(fbre%Mwx^eeSBbnaK0z7M{1 zvYhSfDqqWHPz{x+;rbvv@)ebw@8kDmv~`vFOBXFL*GbI37qb($c;Ujd*H!k@f|YGu z<-&lEO)_$gj5wR?jKf@he8CkC+$A4{M|*-*`X*Y@7{*o&6d9yB?1ZJNtZ-HGjx#-;fpk@gwG^kc⪚G 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 ly4GF?Sd5n}qraW(s|sQK9`^5eYU@qqoo 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 literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy8c6x7_cm0plus.ld b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_GCC_ARM/cy8c6xx7_cm0plus.ld similarity index 76% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy8c6x7_cm0plus.ld rename to targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_GCC_ARM/cy8c6xx7_cm0plus.ld index c181e96892..146e0e8492 100644 --- a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/TOOLCHAIN_GCC_ARM/cy8c6x7_cm0plus.ld +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_GCC_ARM/cy8c6xx7_cm0plus.ld @@ -1,8 +1,8 @@ /***************************************************************************//** -* \file cy8c6x7_cm0plus.ld -* \version 1.0 +* \file cy8c6xx7_cm0plus.ld +* \version 2.0 * -* \brief Linker file for the GNU C compiler. +* Linker file for the GNU C compiler. * * \note The entry point location is fixed and starts at 0x10000000. The valid * application image should be placed there. @@ -34,34 +34,20 @@ ENTRY(Reset_Handler) * option. */ EXTERN(Reset_Handler) -EXTERN(vectors) -EXTERN(ram_vectors) -EXTERN(cychipprotect) -EXTERN(cymeta) - -/* Flash */ -__cy_memory_0_start = 0x10000000; -__cy_memory_0_length = 0x00100000; -__cy_memory_0_row_size = 0x200; - -/* Working Flash */ -__cy_memory_1_start = 0x14000000; -__cy_memory_1_length = 0x8000; -__cy_memory_1_row_size = 0x200; - -/* XIP */ -__cy_memory_2_start = 0x18000000; -__cy_memory_2_length = 0x08000000; -__cy_memory_2_row_size = 0x200; /* Linker script to configure memory regions. */ MEMORY { - rom (rx) : ORIGIN = 0x10000000, LENGTH = 0x00080000 - wrom (rx) : ORIGIN = 0x14000000, LENGTH = 0x8000 - xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x08000000 - ram_cm0p (rwx) : ORIGIN = 0x08000000, LENGTH = 0x00024000 + flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x80000 + wflash (rx) : ORIGIN = 0x14000000, LENGTH = 0x8000 /* 32 KB */ + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x400 + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000 /* 128 MB */ + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 /* 1 MB */ + ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x24000 } @@ -100,13 +86,17 @@ GROUP(libgcc.a libc.a libm.a libnosys.a) * __Vectors_End * __Vectors_Size */ -ENTRY(Reset_Handler) + SECTIONS { + .cy_app_header : + { + KEEP(*(.cy_app_header)) + } > flash + .text : { - /* Cortex-M0+ ROM vector table */ . = ALIGN(4); __Vectors = . ; KEEP(*(.vectors)) @@ -139,26 +129,26 @@ SECTIONS *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) KEEP(*(.eh_frame*)) - } > rom + } > flash .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) - } > rom + } > flash __exidx_start = .; .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > rom + } > flash __exidx_end = .; /* To copy multiple ROM to RAM sections, * uncomment .copy.table section and, - * define __STARTUP_COPY_MULTIPLE in startup_psoc6ble_cm0plus.S */ + * define __STARTUP_COPY_MULTIPLE in startup_psoc63_cm0plus.S */ .copy.table : { . = ALIGN(4); @@ -175,13 +165,12 @@ SECTIONS LONG (__data_end__ - __data_start__) /* Size */ __copy_table_end__ = .; - } > rom - + } > flash /* To clear multiple BSS sections, * uncomment .zero.table section and, - * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc6ble_cm0plus.S */ + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc63_cm0plus.S */ .zero.table : { . = ALIGN(4); @@ -189,7 +178,7 @@ SECTIONS LONG (__bss_start__) LONG (__bss_end__ - __bss_start__) __zero_table_end__ = .; - } > rom + } > flash __etext = . ; @@ -199,7 +188,7 @@ SECTIONS __ram_vectors_start__ = .; KEEP(*(.ram_vectors)) __ram_vectors_end__ = .; - } > ram_cm0p + } > ram .data __ram_vectors_end__ : AT (__etext) @@ -233,9 +222,12 @@ SECTIONS KEEP(*(.jcr*)) . = ALIGN(4); + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + __data_end__ = .; - } > ram_cm0p + } > ram /* Place variables in the section that should not be initialized during the @@ -244,7 +236,7 @@ SECTIONS .noinit (NOLOAD) : ALIGN(8) { KEEP(*(.noinit)) - } > ram_cm0p + } > ram /* The uninitialized global or static variables are placed in this section. @@ -267,7 +259,7 @@ SECTIONS *(COMMON) . = ALIGN(4); __bss_end__ = .; - } > ram_cm0p + } > ram .heap (NOLOAD): @@ -277,7 +269,8 @@ SECTIONS end = __end__; KEEP(*(.heap*)) __HeapLimit = .; - } > ram_cm0p + } > ram + /* .stack_dummy section doesn't contains any symbols. It is only * used for linker to calculate size of stack sections, and assign @@ -285,11 +278,12 @@ SECTIONS .stack_dummy (NOLOAD): { KEEP(*(.stack*)) - } > ram_cm0p + } > ram + /* Set stack top to end of RAM, and stack limit move down by * size of stack_dummy section */ - __StackTop = ORIGIN(ram_cm0p) + LENGTH(ram_cm0p); + __StackTop = ORIGIN(ram) + LENGTH(ram); __StackLimit = __StackTop - SIZEOF(.stack_dummy); PROVIDE(__stack = __StackTop); @@ -297,32 +291,88 @@ SECTIONS ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") - /* The section is used for BLE bonding data storage. */ - ble_bond_data 0x14000000 : + /* Work Flash */ + .cy_wflash : { - __ble_bond_data_start = . ; - KEEP(*(.ble_bond_data)) - __ble_bond_data_end = . ; - } > wrom + KEEP(*(.cy_wflash)) + } > wflash + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 /* Places the code in the Execute in Place (XIP) section. See the smif driver * documentation for details. */ - .xip 0x18000000 : + .cy_xip : { - . = ALIGN(4); - __xip_data_start = . ; - KEEP(*(.xip)) - __xip_data_end = . ; + KEEP(*(.cy_xip)) } > xip + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + /* These sections are used for additional metadata (silicon revision, * Silicon/JTAG ID, etc.) storage. */ .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE - .cychipprotect 0x90600000 : { KEEP(*(.cychipprotect)) } :NONE } +/* The following symbols used by the cypdlelftool. */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Working Flash */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + /* EOF */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_GCC_ARM/libble_stack_gcc_controller_ipc_cm0p.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M0/device/TOOLCHAIN_GCC_ARM/libble_stack_gcc_controller_ipc_cm0p.a new file mode 100644 index 0000000000000000000000000000000000000000..96f368b18caf96638e9602683b8cf0392e8e16cc GIT binary patch literal 815250 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

8`q5dc6KJpPNYEIahIokd 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

CEVCQtwAo~`-3EePbG+l?GLZ6N;IX{i> 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

xrBInx5syKzJned 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

$?`Yp+uVdJ%fC-V=7ae4PBJmSaGcfZ1;@xOSy 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 WSgR*F2p-zt92fq7xjgk=wf_X #include -#include "system_psoc6ble_cm0plus.h" +#include "system_psoc63.h" #include "cy_device_headers.h" -#include "ipc/cy_ipc_drv.h" -#include "ipc/cy_ipc_pipe.h" -#include "ipc/cy_ipc_lock.h" -#include "sysint/cy_sysint.h" - -/******************************************************************************* -* Inter Process Communication (IPC) -*******************************************************************************/ -cy_stc_ipc_pipe_ep_t cy_ipc_pipe_sysEpArray[CPUSS_IPC_IPC_NR]; -uint32_t ipcLockArray[CY_IPC_LOCK_COUNT/CY_IPC_LOCKS_PER_WORD]; -cy_ipc_pipe_callback_ptr_t ipc_pipe_cyPipeCbArray[CY_IPC_CYPIPE_CLIENT_CNT]; +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + #include "ipc/cy_ipc_pipe.h" + #include "ipc/cy_ipc_sema.h" +#endif /* CY_IPC_DEFAULT_CFG_DISABLE */ /******************************************************************************* @@ -35,34 +28,33 @@ cy_ipc_pipe_callback_ptr_t ipc_pipe_cyPipeCbArray[CY_IPC_CYPIPE_CLIENT_CNT]; *******************************************************************************/ /** Default HFClk frequency in Hz */ -#define CY_HFCLK0_FREQ_HZ_DEFAULT ( 8000000UL) +#define CY_CLK_HFCLK0_FREQ_HZ_DEFAULT ( 8000000UL) /** Default PeriClk frequency in Hz */ -#define CY_PERICLK_FREQ_HZ_DEFAULT (4000000UL) +#define CY_CLK_PERICLK_FREQ_HZ_DEFAULT (4000000UL) /** Default SlowClk system core frequency in Hz */ -#define CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT (4000000UL) +#define CY_CLK_SYSTEM_FREQ_HZ_DEFAULT (4000000UL) +/** IMO frequency in Hz */ +#define CY_CLK_IMO_FREQ_HZ (8000000UL) -#define CY_IMO_FREQ_HZ ( 8000000UL) -#ifndef CY_EXT_FREQ_HZ - #define CY_EXT_FREQ_HZ (24000000UL) -#endif -#ifndef CY_ECO_FREQ_HZ - #define CY_ECO_FREQ_HZ (24000000UL) -#endif +/** HVILO frequency in Hz */ +#define CY_CLK_HVILO_FREQ_HZ (32000UL) -#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) - #ifndef CY_ALTHF_FREQ_HZ - #define CY_ALTHF_FREQ_HZ (32000000UL) - #endif - uint32_t cy_BleEcoClockFreqHz = CY_ALTHF_FREQ_HZ; -#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) */ +#if (SRSS_PILO_PRESENT == 1U) || defined(CY_DOXYGEN) + /** PILO frequency in Hz */ + #define CY_CLK_PILO_FREQ_HZ (32768UL) +#endif /* (SRSS_PILO_PRESENT == 1U) || defined(CY_DOXYGEN) */ + +/** WCO frequency in Hz */ +#define CY_CLK_WCO_FREQ_HZ (32768UL) + +#if (SRSS_ALTLF_PRESENT == 1U) || defined(CY_DOXYGEN) + /** ALTLF frequency in Hz */ + #define CY_CLK_ALTLF_FREQ_HZ (32768UL) +#endif /* (SRSS_ALTLF_PRESENT == 1U) || defined(CY_DOXYGEN) */ -#define CY_ROOT_PATH_SRC_IMO (0UL) -#define CY_ROOT_PATH_SRC_EXT (1UL) -#define CY_ROOT_PATH_SRC_ECO (2UL) -#define CY_ROOT_PATH_SRC_ALTHF (3UL) /** Holds the SlowClk system core clock, which is the system clock frequency supplied to the SysTick timer and the * processor core clock. This variable can be used by debuggers to query the frequency of the debug timer or to configure @@ -71,114 +63,94 @@ cy_ipc_pipe_callback_ptr_t ipc_pipe_cyPipeCbArray[CY_IPC_CYPIPE_CLIENT_CNT]; * \attention Compilers must be configured to avoid removing this variable in case the application program is not using * it. Debugging systems require the variable to be physically present in memory so that it can be examined to configure * the debugger. */ -uint32_t SystemCoreClock = CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT; +uint32_t SystemCoreClock = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; /** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ -uint32_t cy_Hfclk0FreqHz = CY_HFCLK0_FREQ_HZ_DEFAULT; +uint32_t cy_Hfclk0FreqHz = CY_CLK_HFCLK0_FREQ_HZ_DEFAULT; /** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ -uint32_t cy_PeriClkFreqHz = CY_PERICLK_FREQ_HZ_DEFAULT; +uint32_t cy_PeriClkFreqHz = CY_CLK_PERICLK_FREQ_HZ_DEFAULT; - -/* Do not use these definitions directly in your application */ -#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) -#define CY_DELAY_1K_THRESHOLD (1000u) -#define CY_DELAY_1K_MINUS_1_THRESHOLD (CY_DELAY_1K_THRESHOLD - 1u) -#define CY_DELAY_1M_THRESHOLD (1000000u) -#define CY_DELAY_1M_MINUS_1_THRESHOLD (CY_DELAY_1M_THRESHOLD - 1u) -uint32_t cy_delayFreqHz = CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT; -uint32_t cy_delayFreqKhz = (CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD; -uint8_t cy_delayFreqMhz = (uint8_t)((CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT + CY_DELAY_1M_MINUS_1_THRESHOLD) / CY_DELAY_1M_THRESHOLD); -uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * ((CY_SYSTEM_CLOCK_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / - CY_DELAY_1K_THRESHOLD); - - -/******************************************************************************* -* Table Of Content (TOC) -*******************************************************************************/ -typedef struct { - uint32_t securityImageAddr; /** Address of security image */ - uint32_t flashBootAddr; /** Address of Flash Boot stored in SFLASH */ - uint32_t flashBootSize; /** Size of Flash Boot (in bytes) */ - uint32_t objectOneAddr; /** Address of next object (0 if none) */ - uint32_t objectOneSize; /** Size of next object (0 if none) */ - uint32_t objectTwoAddr; /** Address of next object (0 if none) */ - uint32_t objectTwoSize; /** Size of next object (0 if none) */ - uint32_t objectThreeAddr; /** Address of next object (0 if none) */ - uint32_t objectThreeSize; /** Size of next object (0 if none) */ - uint32_t userAppAddr; /** Address of start of User Application */ - uint32_t userAppSize; /** Size of the User Application */ - uint32_t keyStorageAddr; /** Address of Key Storage Flash Blocks. */ - uint32_t keyStorageSize; /** Size of key storage area in bytes. */ - uint32_t smifConfigAddr; /** SMIF Configuration Table */ - uint32_t reserved[113u]; - uint32_t crc; /** 0x1FC CRC16-CCITT */ -} Cy_TOC_Type; - - -#define CY_TOC_BASE (0x100FFE00UL) -#define CY_TOC ((Cy_TOC_Type*) CY_TOC_BASE) - -#ifndef CY_TOC_FLASH_BOOT_ADDR - #define CY_TOC_FLASH_BOOT_ADDR (0x160020D8UL) -#endif - -#ifndef CY_TOC_FLASH_BOOT_SIZE - #define CY_TOC_FLASH_BOOT_SIZE (0x2000UL) -#endif - -#ifndef CY_TOC_SMIF_CONFIG_ADDR - #define CY_TOC_SMIF_CONFIG_ADDR (0xFFFFFFFFUL) -#endif - -#ifndef CY_TOC_USER_APP_ADDR - #define CY_TOC_USER_APP_ADDR (0x10000000UL) -#endif - -#ifndef CY_TOC_USER_APP_SIZE - #define CY_TOC_USER_APP_SIZE (0x80000UL) -#endif - -#ifdef CY_TOC_PRESENT - #if defined(__GNUC__) || defined(__ARMCC_VERSION) - __attribute__ ((__section__(".cy_toc"), used)) - #elif defined(__ICCARM__) - #pragma location=".cy_toc" - #endif - Cy_TOC_Type cyToc = { - .flashBootAddr = CY_TOC_FLASH_BOOT_ADDR, - .flashBootSize = CY_TOC_FLASH_BOOT_SIZE, - .smifConfigAddr = CY_TOC_SMIF_CONFIG_ADDR, - .userAppAddr = CY_TOC_USER_APP_ADDR, - .userAppSize = CY_TOC_USER_APP_SIZE - }; -#endif +/** Holds the Alternate high frequency clock in Hz. Updated by \ref SystemCoreClockUpdate(). */ +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) + uint32_t cy_BleEcoClockFreqHz = CY_CLK_ALTHF_FREQ_HZ; +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) */ /******************************************************************************* * SystemInit() *******************************************************************************/ +/* WDT lock bits */ #define CY_WDT_LOCK_BIT0 ((uint32_t)0x01u << 30u) #define CY_WDT_LOCK_BIT1 ((uint32_t)0x01u << 31u) -/* CLK_FLL_CONFIG default values, from MXS40-IP-SRSS */ +/* CLK_FLL_CONFIG default values */ #define CY_FB_CLK_FLL_CONFIG_VALUE (0x01000000u) #define CY_FB_CLK_FLL_CONFIG2_VALUE (0x00020001u) #define CY_FB_CLK_FLL_CONFIG3_VALUE (0x00002800u) #define CY_FB_CLK_FLL_CONFIG4_VALUE (0x000000FFu) +/******************************************************************************* +* SystemCoreClockUpdate (void) +*******************************************************************************/ +/* Do not use these definitions directly in your application */ +#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) +#define CY_DELAY_1K_THRESHOLD (1000u) +#define CY_DELAY_1K_MINUS_1_THRESHOLD (CY_DELAY_1K_THRESHOLD - 1u) +#define CY_DELAY_1M_THRESHOLD (1000000u) +#define CY_DELAY_1M_MINUS_1_THRESHOLD (CY_DELAY_1M_THRESHOLD - 1u) +uint32_t cy_delayFreqHz = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +uint32_t cy_delayFreqKhz = (CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / + CY_DELAY_1K_THRESHOLD; + +uint8_t cy_delayFreqMhz = (uint8_t)((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1M_MINUS_1_THRESHOLD) / + CY_DELAY_1M_THRESHOLD); + +uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * + ((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD); + +#define CY_ROOT_PATH_SRC_IMO (0UL) +#define CY_ROOT_PATH_SRC_EXT (1UL) +#if (SRSS_ECO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ECO (2UL) +#endif /* (SRSS_ECO_PRESENT == 1U) */ +#if (SRSS_ALTHF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ALTHF (3UL) +#endif /* (SRSS_ALTHF_PRESENT == 1U) */ +#define CY_ROOT_PATH_SRC_DSI_MUX (4UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_HVILO (16UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_WCO (17UL) +#if (SRSS_ALTLF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_ALTLF (18UL) +#endif /* (SRSS_ALTLF_PRESENT == 1U) */ +#if (SRSS_PILO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_PILO (19UL) +#endif /* (SRSS_PILO_PRESENT == 1U) */ + + +/******************************************************************************* +* Cy_SysEnableCM4(), Cy_SysRetainCM4(), and Cy_SysResetCM4() +*******************************************************************************/ +#define CY_SYS_CM4_PWR_CTL_KEY_OPEN (0x05FAUL) +#define CY_SYS_CM4_PWR_CTL_KEY_CLOSE (0xFA05UL) + /******************************************************************************* * Function Name: SystemInit ****************************************************************************//** * -* Initializes the system. +* Initializes the system: +* - Restores FLL registers to the default state. +* - Unlocks and disables WDT. +* - Calls the Cy_SystemInit() function, if compiled from PSoC Creator. +* - Calls \ref SystemCoreClockUpdate(). * *******************************************************************************/ void SystemInit(void) { - /* Restores FLL to default state as it is not restored by ROM code */ + /* Restore FLL registers to the default state as they are not restored by the ROM code */ uint32_t copy = SRSS->CLK_FLL_CONFIG; copy &= ~SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk; SRSS->CLK_FLL_CONFIG = copy; @@ -201,8 +173,17 @@ void SystemInit(void) Cy_SystemInit(); SystemCoreClockUpdate(); - Cy_SystemInitIpc(); - Cy_SMIF_StartupCallBack(); + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + /* Allocate and initialize semaphores for the system operations. */ + Cy_IPC_SystemSemaInit(); + Cy_IPC_SystemPipeInit(); +#endif /* CY_IPC_DEFAULT_CFG_DISABLE */ + + /* Clear data register of IPC structure #7, reserved for the Deep Sleep operations. */ + IPC_STRUCT7->DATA = 0UL; + /* Release IPC structure #7 to avoid deadlocks in case of SW or WDT reset during Deep Sleep entering. */ + IPC_STRUCT7->RELEASE = 0UL; } @@ -228,30 +209,15 @@ __WEAK void Cy_SystemInit(void) } -/******************************************************************************* -* Function Name: Cy_SMIF_StartupCallBack -****************************************************************************//** -* -* The function is called during device startup. Once SMIF functionality is -* required, user should implement the function as described by the SMIF -* documentation. -* -******************************************************************************/ -__WEAK void Cy_SMIF_StartupCallBack(void) -{ - /* Empty weak function. The actual implementation to be in the user's - * strong function. - */ -} - - /******************************************************************************* * Function Name: SystemCoreClockUpdate ****************************************************************************//** * -* Get Core Clock Frequency. +* Gets core clock frequency and updates \ref SystemCoreClock, \ref +* cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. * -* Update \ref SystemCoreClock, \ref cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. +* Updates global variables used by the \ref Cy_SysLib_Delay(), \ref +* Cy_SysLib_DelayUs(), and \ref Cy_SysLib_DelayCycles(). * *******************************************************************************/ void SystemCoreClockUpdate (void) @@ -273,25 +239,60 @@ void SystemCoreClockUpdate (void) switch (srcClk) { case CY_ROOT_PATH_SRC_IMO: - srcFreqHz = CY_IMO_FREQ_HZ; + srcFreqHz = CY_CLK_IMO_FREQ_HZ; break; case CY_ROOT_PATH_SRC_EXT: - srcFreqHz = CY_EXT_FREQ_HZ; + srcFreqHz = CY_CLK_EXT_FREQ_HZ; break; - case CY_ROOT_PATH_SRC_ECO: - srcFreqHz = CY_ECO_FREQ_HZ; - break; + #if (SRSS_ECO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ECO: + srcFreqHz = CY_CLK_ECO_FREQ_HZ; + break; + #endif /* (SRSS_ECO_PRESENT == 1U) */ -#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) case CY_ROOT_PATH_SRC_ALTHF: srcFreqHz = cy_BleEcoClockFreqHz; break; -#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) */ +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) */ + + case CY_ROOT_PATH_SRC_DSI_MUX: + { + uint32_t dsi_src; + dsi_src = _FLD2VAL(SRSS_CLK_DSI_SELECT_DSI_MUX, SRSS->CLK_DSI_SELECT[rootPath]); + switch (dsi_src) + { + case CY_ROOT_PATH_SRC_DSI_MUX_HVILO: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_DSI_MUX_WCO: + srcFreqHz = CY_CLK_WCO_FREQ_HZ; + break; + + #if (SRSS_ALTLF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_ALTLF: + srcFreqHz = CY_CLK_ALTLF_FREQ_HZ; + break; + #endif /* (SRSS_ALTLF_PRESENT == 1U) */ + + #if (SRSS_PILO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_PILO: + srcFreqHz = CY_CLK_PILO_FREQ_HZ; + break; + #endif /* (SRSS_PILO_PRESENT == 1U) */ + + default: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + } + } + break; default: - srcFreqHz = CY_EXT_FREQ_HZ; + srcFreqHz = CY_CLK_EXT_FREQ_HZ; break; } @@ -373,93 +374,24 @@ void SystemCoreClockUpdate (void) } -/******************************************************************************* -* Function Name: Cy_SystemInitIpcCyPipeIsr -****************************************************************************//** -* -* This is the Interrupt Service Routine for the Cypress Pipe. -* -*******************************************************************************/ -void Cy_SystemInitIpcCyPipeIsr(void) -{ - Cy_IPC_PIPE_ExecCallback(&cy_ipc_pipe_sysEpArray[CY_IPC_EP_CYPIPE_ADDR]); -} - - -/******************************************************************************* -* Function Name: Cy_SystemInitIpc -****************************************************************************//** -* -* Performs initial IPC configuration. -* -*******************************************************************************/ -void Cy_SystemInitIpc(void) -{ - cy_stc_sysint_t ipc_intr_cypipeConfig; - - Cy_IPC_PIPE_Config(cy_ipc_pipe_sysEpArray); - - #if (CY_CPU_CORTEX_M0P) - /* Initialize the lock subsystem. Should be called only on one CPU. */ - (void) Cy_IPC_LOCK_Init(CY_IPC_LOCK_COUNT, ipcLockArray); - #endif /* (CY_CPU_CORTEX_M0P) */ - - /* Initialize the pipe endpoints */ - Cy_IPC_PIPE_Init(CY_IPC_EP_CYPIPE_ADDR, ipc_pipe_cyPipeCbArray, CY_IPC_CYPIPE_CLIENT_CNT, CY_IPC_CYPIPE_CONFIG); - - /* Configure interrupts */ - ipc_intr_cypipeConfig.intrSrc = CY_IPC_INTR_CYPIPE_SRC; - ipc_intr_cypipeConfig.intrCm0p = CY_IPC_INTR_CYPIPE_CM0SRC; - ipc_intr_cypipeConfig.intrPriority = CY_IPC_INTR_CYPIPE_PRIO; - - Cy_SysInt_Init(&ipc_intr_cypipeConfig, &Cy_SystemInitIpcCyPipeIsr); - #if (CY_CPU_CORTEX_M0P) - NVIC_EnableIRQ((IRQn_Type)ipc_intr_cypipeConfig.intrCm0p); - #else - NVIC_EnableIRQ((IRQn_Type)ipc_intr_cypipeConfig.intrSrc); - #endif -} - - +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) /******************************************************************************* * Function Name: Cy_SysGetCM4Status ****************************************************************************//** * -* Gets the Cortex-M4 core mode. +* Returns the Cortex-M4 core power mode. * -* \return \ref group_startup_macro +* \return \ref group_system_config_cm4_status_macro * *******************************************************************************/ uint32_t Cy_SysGetCM4Status(void) { - uint32_t returnValue; uint32_t regValue; - regValue = CPUSS->CM4_PWR_CTL & CPUSS_CM4_PWR_CTL_Msk; - switch(regValue) - { - case CPUSS_CM4_PWR_CTL_DISABLED: - returnValue = CY_SYS_CM4_STATUS_DISABLED; - break; + /* Get current power mode */ + regValue = CPUSS->CM4_PWR_CTL & CPUSS_CM4_PWR_CTL_PWR_MODE_Msk; - case CPUSS_CM4_PWR_CTL_RETAINED: - returnValue = CY_SYS_CM4_STATUS_RETAINED; - break; - - case CPUSS_CM4_PWR_CTL_ENABLED: - returnValue = CY_SYS_CM4_STATUS_ENABLED; - break; - - case CPUSS_CM4_PWR_CTL_RESET_MODE: - returnValue = CY_SYS_CM4_STATUS_RESET; - break; - - default: - returnValue = CY_SYS_CM4_STATUS_UNKNOWN; - break; - } - - return (returnValue); + return (regValue); } @@ -467,9 +399,9 @@ uint32_t Cy_SysGetCM4Status(void) * Function Name: Cy_SysEnableCM4 ****************************************************************************//** * -* Enables the Cortex-M4 core. The CPU is enabled once if it was in the disabled -* or retained mode. If the CPU is enabled, the vector table base address is -* updated and software reset of the Cortex-M4 core is performed. +* Sets vector table base address and enables the Cortex-M4 core. +* +* \note If the CPU is already enabled, it is reset and then enabled. * * \param vectorTableOffset The offset of the vector table base address from * memory address 0x00000000. The offset should be multiple to 1024 bytes. @@ -477,54 +409,28 @@ uint32_t Cy_SysGetCM4Status(void) *******************************************************************************/ void Cy_SysEnableCM4(uint32_t vectorTableOffset) { - uint32_t cm4Status; - uint32_t interruptState; + uint32_t regValue; + uint32_t interruptState; + uint32_t cpuState; interruptState = Cy_SaveIRQ(); - cm4Status = Cy_SysGetCM4Status(); - switch(cm4Status) + cpuState = Cy_SysGetCM4Status(); + if (CY_SYS_CM4_STATUS_ENABLED == cpuState) { - case CY_SYS_CM4_STATUS_DISABLED: - CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; + Cy_SysResetCM4(); + } - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_POWER, 1UL); - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_ISOLATE, 1UL); - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); - break; + CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; - case CY_SYS_CM4_STATUS_RETAINED: - CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_ENABLED; + CPUSS->CM4_PWR_CTL = regValue; - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_POWER, 1UL); - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_RETAIN, 1UL); - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_ISOLATE, 1UL); - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); - break; - - case CY_SYS_CM4_STATUS_RESET: - CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; - - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); - break; - - case CY_SYS_CM4_STATUS_ENABLED: - CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; - - /* Move to Reset from Enabled state */ - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); - - /* Move to Enabled from Reset state */ - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); - break; - - default: - /* Do nothing if Cortex-M4 is already enabled. */ - break; + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) + { + /* Wait for the power mode to take effect */ } Cy_RestoreIRQ(interruptState); @@ -535,41 +441,32 @@ void Cy_SysEnableCM4(uint32_t vectorTableOffset) * Function Name: Cy_SysDisableCM4 ****************************************************************************//** * -* Disables the Cortex-M4 core. +* Disables the Cortex-M4 core and waits for the mode to take the effect. * * \warning Do not call the function while the Cortex-M4 is executing because * such a call may corrupt/abort a pending bus-transaction by the CPU and cause * unexpected behavior in the system including a deadlock. Call the function * while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use * the \ref group_syspm Power Management (syspm) API to put the CPU into the -* low-power modes. Use the \ref SysPm_ReadStatus() to get a status of the CPU. +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the +* CPU. * *******************************************************************************/ void Cy_SysDisableCM4(void) { - uint32_t cm4Status; - uint32_t interruptState; + uint32_t interruptState; + uint32_t regValue; interruptState = Cy_SaveIRQ(); - cm4Status = Cy_SysGetCM4Status(); - switch(cm4Status) + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_DISABLED; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) { - case CY_SYS_CM4_STATUS_ENABLED: - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_ISOLATE, 1UL); - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_POWER, 1UL); - break; - - case CY_SYS_CM4_STATUS_RETAINED: - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_RETAIN, 1UL); - break; - - default: - /* Do nothing if Cortex-M4 is already disabled. */ - break; + /* Wait for the power mode to take effect */ } Cy_RestoreIRQ(interruptState); @@ -580,7 +477,10 @@ void Cy_SysDisableCM4(void) * Function Name: Cy_SysRetainCM4 ****************************************************************************//** * -* Retains the Cortex-M4 core. +* Retains the Cortex-M4 core and exists without waiting for the mode to take +* effect. +* +* \note The retained mode can be entered only from the enabled mode. * * \warning Do not call the function while the Cortex-M4 is executing because * such a call may corrupt/abort a pending bus-transaction by the CPU and cause @@ -592,30 +492,15 @@ void Cy_SysDisableCM4(void) *******************************************************************************/ void Cy_SysRetainCM4(void) { - uint32_t cm4Status; - uint32_t interruptState; + uint32_t interruptState; + uint32_t regValue; interruptState = Cy_SaveIRQ(); - cm4Status = Cy_SysGetCM4Status(); - switch(cm4Status) - { - case CY_SYS_CM4_STATUS_ENABLED: - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_ISOLATE, 1UL); - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_RETAIN, 1UL); - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_POWER, 1UL); - break; - - case CY_SYS_CM4_STATUS_DISABLED: - /* Switch from the DISABLED to the RETAINED state is not valid. - * Do nothing in this case. */ - break; - - default: - /* Do nothing if Cortex-M4 is already in the RETAINED state. */ - break; - } + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_RETAINED; + CPUSS->CM4_PWR_CTL = regValue; Cy_RestoreIRQ(interruptState); } @@ -625,7 +510,9 @@ void Cy_SysRetainCM4(void) * Function Name: Cy_SysResetCM4 ****************************************************************************//** * -* Resets the Cortex-M4 core. +* Resets the Cortex-M4 core and waits for the mode to take the effect. +* +* \note The reset mode can not be entered from the retained mode. * * \warning Do not call the function while the Cortex-M4 is executing because * such a call may corrupt/abort a pending bus-transaction by the CPU and cause @@ -637,31 +524,90 @@ void Cy_SysRetainCM4(void) *******************************************************************************/ void Cy_SysResetCM4(void) { - uint32_t cm4Status; - uint32_t interruptState; + uint32_t interruptState; + uint32_t regValue; interruptState = Cy_SaveIRQ(); - cm4Status = Cy_SysGetCM4Status(); - switch(cm4Status) + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_RESET; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) { - case CY_SYS_CM4_STATUS_ENABLED: - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_CLOCK, 1UL); - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_RESET, 1UL); - break; - - case CY_SYS_CM4_STATUS_DISABLED: - CPUSS->CM4_PWR_CTL |= _VAL2FLD(CPUSS_CM4_PWR_CTL_ISOLATE, 1UL); - CPUSS->CM4_PWR_CTL &= ~_VAL2FLD(CPUSS_CM4_PWR_CTL_POWER, 1UL); - break; - - default: - /* Do nothing if Cortex-M4 is already in the RETAINED state. */ - break; - } + /* Wait for the power mode to take effect */ + } Cy_RestoreIRQ(interruptState); } +#endif /* #if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) */ + + +/******************************************************************************* +* Function Name: Cy_MemorySymbols +****************************************************************************//** +* +* The intention of the function is to declare boundaries of the memories for the +* MDK compilers. For the rest of the supported compilers, this is done using +* linker configuration files. The following symbols used by the cypdlelftool. +* +*******************************************************************************/ +#if defined (__ARMCC_VERSION) +__asm void Cy_MemorySymbols(void) +{ + /* Flash */ + EXPORT __cy_memory_0_start + EXPORT __cy_memory_0_length + EXPORT __cy_memory_0_row_size + + /* Working Flash */ + EXPORT __cy_memory_1_start + EXPORT __cy_memory_1_length + EXPORT __cy_memory_1_row_size + + /* Supervisory Flash */ + EXPORT __cy_memory_2_start + EXPORT __cy_memory_2_length + EXPORT __cy_memory_2_row_size + + /* XIP */ + EXPORT __cy_memory_3_start + EXPORT __cy_memory_3_length + EXPORT __cy_memory_3_row_size + + /* eFuse */ + EXPORT __cy_memory_4_start + EXPORT __cy_memory_4_length + EXPORT __cy_memory_4_row_size + + + /* Flash */ +__cy_memory_0_start EQU __cpp(CY_FLASH_BASE) +__cy_memory_0_length EQU __cpp(CY_FLASH_SIZE) +__cy_memory_0_row_size EQU 0x200 + + /* Working Flash */ +__cy_memory_1_start EQU __cpp(CY_WFLASH_BASE) +__cy_memory_1_length EQU __cpp(CY_WFLASH_SIZE) +__cy_memory_1_row_size EQU 0x200 + + /* Supervisory Flash */ +__cy_memory_2_start EQU __cpp(CY_SFLASH_BASE) +__cy_memory_2_length EQU __cpp(CY_SFLASH_SIZE) +__cy_memory_2_row_size EQU 0x200 + + /* XIP */ +__cy_memory_3_start EQU __cpp(CY_XIP_BASE) +__cy_memory_3_length EQU __cpp(CY_XIP_SIZE) +__cy_memory_3_row_size EQU 0x200 + + /* eFuse */ +__cy_memory_4_start EQU __cpp(0x90700000) +__cy_memory_4_length EQU __cpp(0x100000) +__cy_memory_4_row_size EQU __cpp(1) +} +#endif /* defined (__ARMCC_VERSION) */ /* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/PeripheralPins.c b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/PeripheralPins.c new file mode 100644 index 0000000000..451cf138c9 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/PeripheralPins.c @@ -0,0 +1,131 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) XXX + * 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 ARM Limited nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#include "PeripheralNames.h" +#include "PeripheralPins.h" +#include "pinmap.h" + +// //*** ADC *** +// const PinMap PinMap_ADC[] = { +// {PC_15, ADC_0, STM_PIN_DATA_EXT(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN0 +// {PC_14, ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN1 +// {PC_13, ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN2 +// {PC_12, ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN3 +// {PC_11, ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN4 +// {PC_10, ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN5 +// {PC_9 , ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN6 +// {PC_8 , ADC_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF3)}, // ADC0_IN7 +// {NC, NC, 0} +// }; + +// //*** DAC *** +// const PinMap PinMap_DAC[] = { +// {PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // OUT1 +// {PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // OUT2 (Warning: LED1 is also on this pin) +// {NC, NC, 0} +// }; + +// //*** SERIAL *** +// const PinMap PinMap_UART_TX[] = { +// {PA_13, UART_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {PC_2, UART_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {PC_10, UART_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {NC, NC, 0} +// }; +// const PinMap PinMap_UART_RX[] = { +// {PA_14, UART_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {PC_3, UART_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {PC_11, UART_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, +// {NC, NC, 0} +// }; + +// //*** I2C *** +// const PinMap PinMap_I2C_SDA[] = { +// {PA_10, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_9, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_5, I2C_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PA_6, I2C_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC, NC, 0} +// }; +// const PinMap PinMap_I2C_SCL[] = { +// {PA_9, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_8, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_4, I2C_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PA_5, I2C_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC, NC, 0} +// }; + +// //*** SPI *** +// const PinMap PinMap_SPI_SCLK[] = { +// {PA_6 , SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PB_1 , SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_13, SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_12, SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC , NC , 0} +// }; +// const PinMap PinMap_SPI_MOSI[] = { +// {PA_8 , SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PB_3 , SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_15, SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_14, SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC , NC , 0} +// }; +// const PinMap PinMap_SPI_MISO[] = { +// {PA_7 , SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PB_2 , SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_14, SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_13, SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC , NC , 0} +// }; +// const PinMap PinMap_SPI_SSEL[] = { +// {PA_5 , SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PB_0 , SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_12, SPI_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_11, SPI_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC , NC , 0} +// }; + +// //*** PWM *** +// const PinMap PinMap_PWM[] = { +// {PA_0 , PWM_6, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_1 , PWM_7, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PA_5 , PWM_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, +// {PA_7 , PWM_4, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, +// {PA_8 , PWM_5, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, +// {PA_9 , PWM_6, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, +// {PA_10, PWM_7, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, +// {PC_0 , PWM_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_2 , PWM_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_4 , PWM_4, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_5 , PWM_5, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {PC_8 , PWM_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, +// {PC_10, PWM_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, +// {NC , NC , WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)} +// }; diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/PinNames.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/PinNames.h new file mode 100644 index 0000000000..23ab89eee5 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/PinNames.h @@ -0,0 +1,251 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) XXX + * 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 ARM Limited nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef MBED_PINNAMES_H +#define MBED_PINNAMES_H + +#include "cmsis.h" +#include "PinNamesTypes.h" +#include "PortNames.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define CY_UART_RX P5_0 +#define CY_UART_TX P5_1 + +// PinName[15-0] = Port[15-8] + Pin[7-0] +typedef enum { + P0_0 = (Port0 << 8) + 0x00, + P0_1 = (Port0 << 8) + 0x01, + P0_2 = (Port0 << 8) + 0x02, + P0_3 = (Port0 << 8) + 0x03, + P0_4 = (Port0 << 8) + 0x04, + P0_5 = (Port0 << 8) + 0x05, + P0_6 = (Port0 << 8) + 0x06, + P0_7 = (Port0 << 8) + 0x07, + + P1_0 = (Port1 << 8) + 0x00, + P1_1 = (Port1 << 8) + 0x01, + P1_2 = (Port1 << 8) + 0x02, + P1_3 = (Port1 << 8) + 0x03, + P1_4 = (Port1 << 8) + 0x04, + P1_5 = (Port1 << 8) + 0x05, + P1_6 = (Port1 << 8) + 0x06, + P1_7 = (Port1 << 8) + 0x07, + + P2_0 = (Port2 << 8) + 0x00, + P2_1 = (Port2 << 8) + 0x01, + P2_2 = (Port2 << 8) + 0x02, + P2_3 = (Port2 << 8) + 0x03, + P2_4 = (Port2 << 8) + 0x04, + P2_5 = (Port2 << 8) + 0x05, + P2_6 = (Port2 << 8) + 0x06, + P2_7 = (Port2 << 8) + 0x07, + + P3_0 = (Port3 << 8) + 0x00, + P3_1 = (Port3 << 8) + 0x01, + P3_2 = (Port3 << 8) + 0x02, + P3_3 = (Port3 << 8) + 0x03, + P3_4 = (Port3 << 8) + 0x04, + P3_5 = (Port3 << 8) + 0x05, + P3_6 = (Port3 << 8) + 0x06, + P3_7 = (Port3 << 8) + 0x07, + + P4_0 = (Port4 << 8) + 0x00, + P4_1 = (Port4 << 8) + 0x01, + P4_2 = (Port4 << 8) + 0x02, + P4_3 = (Port4 << 8) + 0x03, + P4_4 = (Port4 << 8) + 0x04, + P4_5 = (Port4 << 8) + 0x05, + P4_6 = (Port4 << 8) + 0x06, + P4_7 = (Port4 << 8) + 0x07, + + P5_0 = (Port5 << 8) + 0x00, + P5_1 = (Port5 << 8) + 0x01, + P5_2 = (Port5 << 8) + 0x02, + P5_3 = (Port5 << 8) + 0x03, + P5_4 = (Port5 << 8) + 0x04, + P5_5 = (Port5 << 8) + 0x05, + P5_6 = (Port5 << 8) + 0x06, + P5_7 = (Port5 << 8) + 0x07, + + P6_0 = (Port6 << 8) + 0x00, + P6_1 = (Port6 << 8) + 0x01, + P6_2 = (Port6 << 8) + 0x02, + P6_3 = (Port6 << 8) + 0x03, + P6_4 = (Port6 << 8) + 0x04, + P6_5 = (Port6 << 8) + 0x05, + P6_6 = (Port6 << 8) + 0x06, + P6_7 = (Port6 << 8) + 0x07, + + P7_0 = (Port7 << 8) + 0x00, + P7_1 = (Port7 << 8) + 0x01, + P7_2 = (Port7 << 8) + 0x02, + P7_3 = (Port7 << 8) + 0x03, + P7_4 = (Port7 << 8) + 0x04, + P7_5 = (Port7 << 8) + 0x05, + P7_6 = (Port7 << 8) + 0x06, + P7_7 = (Port7 << 8) + 0x07, + + P8_0 = (Port8 << 8) + 0x00, + P8_1 = (Port8 << 8) + 0x01, + P8_2 = (Port8 << 8) + 0x02, + P8_3 = (Port8 << 8) + 0x03, + P8_4 = (Port8 << 8) + 0x04, + P8_5 = (Port8 << 8) + 0x05, + P8_6 = (Port8 << 8) + 0x06, + P8_7 = (Port8 << 8) + 0x07, + + P9_0 = (Port9 << 8) + 0x00, + P9_1 = (Port9 << 8) + 0x01, + P9_2 = (Port9 << 8) + 0x02, + P9_3 = (Port9 << 8) + 0x03, + P9_4 = (Port9 << 8) + 0x04, + P9_5 = (Port9 << 8) + 0x05, + P9_6 = (Port9 << 8) + 0x06, + P9_7 = (Port9 << 8) + 0x07, + + P10_0 = (Port10 << 8) + 0x00, + P10_1 = (Port10 << 8) + 0x01, + P10_2 = (Port10 << 8) + 0x02, + P10_3 = (Port10 << 8) + 0x03, + P10_4 = (Port10 << 8) + 0x04, + P10_5 = (Port10 << 8) + 0x05, + P10_6 = (Port10 << 8) + 0x06, + P10_7 = (Port10 << 8) + 0x07, + + P11_0 = (Port11 << 8) + 0x00, + P11_1 = (Port11 << 8) + 0x01, + P11_2 = (Port11 << 8) + 0x02, + P11_3 = (Port11 << 8) + 0x03, + P11_4 = (Port11 << 8) + 0x04, + P11_5 = (Port11 << 8) + 0x05, + P11_6 = (Port11 << 8) + 0x06, + P11_7 = (Port11 << 8) + 0x07, + + P12_0 = (Port12 << 8) + 0x00, + P12_1 = (Port12 << 8) + 0x01, + P12_2 = (Port12 << 8) + 0x02, + P12_3 = (Port12 << 8) + 0x03, + P12_4 = (Port12 << 8) + 0x04, + P12_5 = (Port12 << 8) + 0x05, + P12_6 = (Port12 << 8) + 0x06, + P12_7 = (Port12 << 8) + 0x07, + + P13_0 = (Port13 << 8) + 0x00, + P13_1 = (Port13 << 8) + 0x01, + P13_2 = (Port13 << 8) + 0x02, + P13_3 = (Port13 << 8) + 0x03, + P13_4 = (Port13 << 8) + 0x04, + P13_5 = (Port13 << 8) + 0x05, + P13_6 = (Port13 << 8) + 0x06, + P13_7 = (Port13 << 8) + 0x07, + + P14_0 = (Port14 << 8) + 0x00, + P14_1 = (Port14 << 8) + 0x01, + P14_2 = (Port14 << 8) + 0x02, + P14_3 = (Port14 << 8) + 0x03, + P14_4 = (Port14 << 8) + 0x04, + P14_5 = (Port14 << 8) + 0x05, + P14_6 = (Port14 << 8) + 0x06, + P14_7 = (Port14 << 8) + 0x07, + + P15_0 = (Port15 << 8) + 0x00, + P15_1 = (Port15 << 8) + 0x01, + P15_2 = (Port15 << 8) + 0x02, + P15_3 = (Port15 << 8) + 0x03, + P15_4 = (Port15 << 8) + 0x04, + P15_5 = (Port15 << 8) + 0x05, + P15_6 = (Port15 << 8) + 0x06, + P15_7 = (Port15 << 8) + 0x07, + + // Arduino connector namings + A0 = P10_0, + A1 = P10_1, + A2 = P10_2, + A3 = P10_3, + A4 = P10_4, + A5 = P10_5, + + D0 = P5_0, + D1 = P5_1, + D2 = P5_2, + D3 = P5_3, + D4 = P5_4, + D5 = P5_5, + D6 = P5_6, + D7 = P0_2, + D8 = P13_0, + D9 = P13_1, + D10 = P12_3, + D11 = P12_0, + D12 = P12_1, + D13 = P12_2, + + // Generic signals namings + + LED_RED = P0_3, + LED_GREEN = P1_1, + LED_BLUE = P11_1, + + SWITCH2 = P0_4, + + LED1 = LED_RED, + LED2 = LED_GREEN, + LED3 = LED_BLUE, + LED4 = LED_RED, + + USER_BUTTON = SWITCH2, + BUTTON1 = USER_BUTTON, + + // Standardized interfaces names + SERIAL_TX = CY_UART_TX, + SERIAL_RX = CY_UART_RX, + USBTX = CY_UART_TX, + USBRX = CY_UART_RX, + // I2C_SCL = PB_8, + // I2C_SDA = PB_9, + // SPI_MOSI = PA_7, + // SPI_MISO = PA_6, + // SPI_SCK = PA_5, + // SPI_CS = PB_6, + // PWM_OUT = PB_3, + + // Not connected + NC = (int)0xFFFFFFFF +} PinName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_controller_ipc_cm4.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_controller_ipc_cm4.a new file mode 100644 index 0000000000000000000000000000000000000000..e11d3b42b2255bb2c42d422da866a1b5afd02233 GIT binary patch literal 820884 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 J@lXj-zCj<7&dUQ?&+`#g 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÷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

-BigP5uhT&X8Y+b*AJmLu6EDc+pAu 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 r|?;*OSf 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 b&lmp$+y^ocV0lTd`h0OODx+QsQ*i$WC~vUj literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_controller_uart_cm4.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_controller_uart_cm4.a new file mode 100644 index 0000000000000000000000000000000000000000..d9e8856a229f72e3eda6f15a98297a2676913105 GIT binary patch literal 812496 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

CR12pE;Vi6)17TGbrZnw(ri|lW~XR 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%0A+#dzvmtrXRJt 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%0Ahcr|-Yy65O`CH#G64 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 literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_ipc_cm4.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_ipc_cm4.a new file mode 100644 index 0000000000000000000000000000000000000000..b367c9d9ecdd4357127124eacf2d041f678fcba0 GIT binary patch literal 751250 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

y9~gcJl$t;2>m3iYqin(E`fuo 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

hk#qq8owo|c@R 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 (BA^{7+oj~27E>tCW?G%Tky>GdFYCvJ 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 literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_radio_max_cm4.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_radio_max_cm4.a new file mode 100644 index 0000000000000000000000000000000000000000..34aa520aa46c0af89dad9a4dcccab57cfe6e6786 GIT binary patch literal 53890 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/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%0D3bpGCcq-&DGe^lqFfUv3}p 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�lK4kB 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

fY3+={v4NV7imgcii_;KP0C% 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%0A91;QQwffcW|zzTaV{-N{93jNAg~<@aBL= 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

  • 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 literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/cy8c6xx7_cm4_dual.ld b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/cy8c6xx7_cm4_dual.ld new file mode 100644 index 0000000000..8192d3318e --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/cy8c6xx7_cm4_dual.ld @@ -0,0 +1,381 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm4_dual.ld +* \version 2.0 +* +* Linker file for the GNU C compiler. +* +* \note The entry point location is fixed and starts at 0x10000000. The valid +* application image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* Force symbol to be entered in the output file as an undefined symbol. Doing +* this may, for example, trigger linking of additional modules from standard +* libraries. You may list several symbols for each EXTERN, and you may use +* EXTERN multiple times. This command has the same effect as the -u command-line +* option. +*/ +EXTERN(Reset_Handler) + + +/* Linker script to configure memory regions. */ +MEMORY +{ + flash (rx) : ORIGIN = 0x10080000, LENGTH = 0x80000 + wflash (rx) : ORIGIN = 0x14000000, LENGTH = 0x8000 /* 32 KB */ + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x400 + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000 /* 128 MB */ + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 /* 1 MB */ + ram (rwx) : ORIGIN = 0x08024000, LENGTH = 0x23800 +} + + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* 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 + * __Vectors_End + * __Vectors_Size + */ + + +SECTIONS +{ + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_psoc63_cm4.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc63_cm4.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells linker that .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes linker to A) not allocate section in memory, and + * A) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get PROGBITS type. + * This makes linker to A) allocate zeroed section in memory, and B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Used for the digital signature of the secure application and the Bootloader SDK appication. + * The size of the section depends on the required data size. */ + .cy_app_signature ORIGIN(flash) + LENGTH(flash) - 256 : + { + KEEP(*(.cy_app_signature)) + } > flash + + + /* Work Flash */ + .cy_wflash : + { + KEEP(*(.cy_wflash)) + } > wflash + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Places the code in the Execute in Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* The following symbols used by the cypdlelftool. */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Working Flash */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/libcy_ble_stack_gcc_host_ipc_cm4.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/libcy_ble_stack_gcc_host_ipc_cm4.a new file mode 100644 index 0000000000000000000000000000000000000000..5fe461fe476284073b0208b2311667cf27878cd2 GIT binary patch literal 752754 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¨mBvB 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 GqOPQFeLsmo8YiQXX*4p2Hk#+qXc{z; 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 literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/startup_psoc63_cm4.S b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/startup_psoc63_cm4.S new file mode 100644 index 0000000000..5a1c62d640 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_GCC_ARM/startup_psoc63_cm4.S @@ -0,0 +1,646 @@ +/**************************************************************************//** + * @file startup_psoc63_cm4.s + * @brief CMSIS Core Device Startup File for + * ARMCM4 Device Series + * @version V5.00 + * @date 02. March 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* Address of the NMI handler */ + #define CY_NMI_HANLDER_ADDR 0x0000000D + + /* The CPU VTOR register */ + #define CY_CPU_VTOR_ADDR 0xE000ED08 + + /* Copy flash vectors and data section to RAM */ + #define __STARTUP_COPY_MULTIPLE + + /* Clear single BSS section */ + #define __STARTUP_CLEAR_BSS + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00001000 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000400 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long CY_NMI_HANLDER_ADDR /* 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 0 /* Reserved */ + .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 Description */ + .long ioss_interrupts_gpio_0_IRQHandler /* GPIO Port Interrupt #0 */ + .long ioss_interrupts_gpio_1_IRQHandler /* GPIO Port Interrupt #1 */ + .long ioss_interrupts_gpio_2_IRQHandler /* GPIO Port Interrupt #2 */ + .long ioss_interrupts_gpio_3_IRQHandler /* GPIO Port Interrupt #3 */ + .long ioss_interrupts_gpio_4_IRQHandler /* GPIO Port Interrupt #4 */ + .long ioss_interrupts_gpio_5_IRQHandler /* GPIO Port Interrupt #5 */ + .long ioss_interrupts_gpio_6_IRQHandler /* GPIO Port Interrupt #6 */ + .long ioss_interrupts_gpio_7_IRQHandler /* GPIO Port Interrupt #7 */ + .long ioss_interrupts_gpio_8_IRQHandler /* GPIO Port Interrupt #8 */ + .long ioss_interrupts_gpio_9_IRQHandler /* GPIO Port Interrupt #9 */ + .long ioss_interrupts_gpio_10_IRQHandler /* GPIO Port Interrupt #10 */ + .long ioss_interrupts_gpio_11_IRQHandler /* GPIO Port Interrupt #11 */ + .long ioss_interrupts_gpio_12_IRQHandler /* GPIO Port Interrupt #12 */ + .long ioss_interrupts_gpio_13_IRQHandler /* GPIO Port Interrupt #13 */ + .long ioss_interrupts_gpio_14_IRQHandler /* GPIO Port Interrupt #14 */ + .long ioss_interrupt_gpio_IRQHandler /* GPIO All Ports */ + .long ioss_interrupt_vdd_IRQHandler /* GPIO Supply Detect Interrupt */ + .long lpcomp_interrupt_IRQHandler /* Low Power Comparator Interrupt */ + .long scb_8_interrupt_IRQHandler /* Serial Communication Block #8 (DeepSleep capable) */ + .long srss_interrupt_mcwdt_0_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + .long srss_interrupt_mcwdt_1_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + .long srss_interrupt_backup_IRQHandler /* Backup domain interrupt */ + .long srss_interrupt_IRQHandler /* Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + .long pass_interrupt_ctbs_IRQHandler /* CTBm Interrupt (all CTBms) */ + .long bless_interrupt_IRQHandler /* Bluetooth Radio interrupt */ + .long cpuss_interrupts_ipc_0_IRQHandler /* CPUSS Inter Process Communication Interrupt #0 */ + .long cpuss_interrupts_ipc_1_IRQHandler /* CPUSS Inter Process Communication Interrupt #1 */ + .long cpuss_interrupts_ipc_2_IRQHandler /* CPUSS Inter Process Communication Interrupt #2 */ + .long cpuss_interrupts_ipc_3_IRQHandler /* CPUSS Inter Process Communication Interrupt #3 */ + .long cpuss_interrupts_ipc_4_IRQHandler /* CPUSS Inter Process Communication Interrupt #4 */ + .long cpuss_interrupts_ipc_5_IRQHandler /* CPUSS Inter Process Communication Interrupt #5 */ + .long cpuss_interrupts_ipc_6_IRQHandler /* CPUSS Inter Process Communication Interrupt #6 */ + .long cpuss_interrupts_ipc_7_IRQHandler /* CPUSS Inter Process Communication Interrupt #7 */ + .long cpuss_interrupts_ipc_8_IRQHandler /* CPUSS Inter Process Communication Interrupt #8 */ + .long cpuss_interrupts_ipc_9_IRQHandler /* CPUSS Inter Process Communication Interrupt #9 */ + .long cpuss_interrupts_ipc_10_IRQHandler /* CPUSS Inter Process Communication Interrupt #10 */ + .long cpuss_interrupts_ipc_11_IRQHandler /* CPUSS Inter Process Communication Interrupt #11 */ + .long cpuss_interrupts_ipc_12_IRQHandler /* CPUSS Inter Process Communication Interrupt #12 */ + .long cpuss_interrupts_ipc_13_IRQHandler /* CPUSS Inter Process Communication Interrupt #13 */ + .long cpuss_interrupts_ipc_14_IRQHandler /* CPUSS Inter Process Communication Interrupt #14 */ + .long cpuss_interrupts_ipc_15_IRQHandler /* CPUSS Inter Process Communication Interrupt #15 */ + .long scb_0_interrupt_IRQHandler /* Serial Communication Block #0 */ + .long scb_1_interrupt_IRQHandler /* Serial Communication Block #1 */ + .long scb_2_interrupt_IRQHandler /* Serial Communication Block #2 */ + .long scb_3_interrupt_IRQHandler /* Serial Communication Block #3 */ + .long scb_4_interrupt_IRQHandler /* Serial Communication Block #4 */ + .long scb_5_interrupt_IRQHandler /* Serial Communication Block #5 */ + .long scb_6_interrupt_IRQHandler /* Serial Communication Block #6 */ + .long scb_7_interrupt_IRQHandler /* Serial Communication Block #7 */ + .long csd_interrupt_IRQHandler /* CSD (Capsense) interrupt */ + .long cpuss_interrupts_dw0_0_IRQHandler /* CPUSS DataWire #0, Channel #0 */ + .long cpuss_interrupts_dw0_1_IRQHandler /* CPUSS DataWire #0, Channel #1 */ + .long cpuss_interrupts_dw0_2_IRQHandler /* CPUSS DataWire #0, Channel #2 */ + .long cpuss_interrupts_dw0_3_IRQHandler /* CPUSS DataWire #0, Channel #3 */ + .long cpuss_interrupts_dw0_4_IRQHandler /* CPUSS DataWire #0, Channel #4 */ + .long cpuss_interrupts_dw0_5_IRQHandler /* CPUSS DataWire #0, Channel #5 */ + .long cpuss_interrupts_dw0_6_IRQHandler /* CPUSS DataWire #0, Channel #6 */ + .long cpuss_interrupts_dw0_7_IRQHandler /* CPUSS DataWire #0, Channel #7 */ + .long cpuss_interrupts_dw0_8_IRQHandler /* CPUSS DataWire #0, Channel #8 */ + .long cpuss_interrupts_dw0_9_IRQHandler /* CPUSS DataWire #0, Channel #9 */ + .long cpuss_interrupts_dw0_10_IRQHandler /* CPUSS DataWire #0, Channel #10 */ + .long cpuss_interrupts_dw0_11_IRQHandler /* CPUSS DataWire #0, Channel #11 */ + .long cpuss_interrupts_dw0_12_IRQHandler /* CPUSS DataWire #0, Channel #12 */ + .long cpuss_interrupts_dw0_13_IRQHandler /* CPUSS DataWire #0, Channel #13 */ + .long cpuss_interrupts_dw0_14_IRQHandler /* CPUSS DataWire #0, Channel #14 */ + .long cpuss_interrupts_dw0_15_IRQHandler /* CPUSS DataWire #0, Channel #15 */ + .long cpuss_interrupts_dw1_0_IRQHandler /* CPUSS DataWire #1, Channel #0 */ + .long cpuss_interrupts_dw1_1_IRQHandler /* CPUSS DataWire #1, Channel #1 */ + .long cpuss_interrupts_dw1_2_IRQHandler /* CPUSS DataWire #1, Channel #2 */ + .long cpuss_interrupts_dw1_3_IRQHandler /* CPUSS DataWire #1, Channel #3 */ + .long cpuss_interrupts_dw1_4_IRQHandler /* CPUSS DataWire #1, Channel #4 */ + .long cpuss_interrupts_dw1_5_IRQHandler /* CPUSS DataWire #1, Channel #5 */ + .long cpuss_interrupts_dw1_6_IRQHandler /* CPUSS DataWire #1, Channel #6 */ + .long cpuss_interrupts_dw1_7_IRQHandler /* CPUSS DataWire #1, Channel #7 */ + .long cpuss_interrupts_dw1_8_IRQHandler /* CPUSS DataWire #1, Channel #8 */ + .long cpuss_interrupts_dw1_9_IRQHandler /* CPUSS DataWire #1, Channel #9 */ + .long cpuss_interrupts_dw1_10_IRQHandler /* CPUSS DataWire #1, Channel #10 */ + .long cpuss_interrupts_dw1_11_IRQHandler /* CPUSS DataWire #1, Channel #11 */ + .long cpuss_interrupts_dw1_12_IRQHandler /* CPUSS DataWire #1, Channel #12 */ + .long cpuss_interrupts_dw1_13_IRQHandler /* CPUSS DataWire #1, Channel #13 */ + .long cpuss_interrupts_dw1_14_IRQHandler /* CPUSS DataWire #1, Channel #14 */ + .long cpuss_interrupts_dw1_15_IRQHandler /* CPUSS DataWire #1, Channel #15 */ + .long cpuss_interrupts_fault_0_IRQHandler /* CPUSS Fault Structure Interrupt #0 */ + .long cpuss_interrupts_fault_1_IRQHandler /* CPUSS Fault Structure Interrupt #1 */ + .long cpuss_interrupt_crypto_IRQHandler /* CRYPTO Accelerator Interrupt */ + .long cpuss_interrupt_fm_IRQHandler /* FLASH Macro Interrupt */ + .long cpuss_interrupts_cm0_cti_0_IRQHandler /* CM0+ CTI #0 */ + .long cpuss_interrupts_cm0_cti_1_IRQHandler /* CM0+ CTI #1 */ + .long cpuss_interrupts_cm4_cti_0_IRQHandler /* CM4 CTI #0 */ + .long cpuss_interrupts_cm4_cti_1_IRQHandler /* CM4 CTI #1 */ + .long tcpwm_0_interrupts_0_IRQHandler /* TCPWM #0, Counter #0 */ + .long tcpwm_0_interrupts_1_IRQHandler /* TCPWM #0, Counter #1 */ + .long tcpwm_0_interrupts_2_IRQHandler /* TCPWM #0, Counter #2 */ + .long tcpwm_0_interrupts_3_IRQHandler /* TCPWM #0, Counter #3 */ + .long tcpwm_0_interrupts_4_IRQHandler /* TCPWM #0, Counter #4 */ + .long tcpwm_0_interrupts_5_IRQHandler /* TCPWM #0, Counter #5 */ + .long tcpwm_0_interrupts_6_IRQHandler /* TCPWM #0, Counter #6 */ + .long tcpwm_0_interrupts_7_IRQHandler /* TCPWM #0, Counter #7 */ + .long tcpwm_1_interrupts_0_IRQHandler /* TCPWM #1, Counter #0 */ + .long tcpwm_1_interrupts_1_IRQHandler /* TCPWM #1, Counter #1 */ + .long tcpwm_1_interrupts_2_IRQHandler /* TCPWM #1, Counter #2 */ + .long tcpwm_1_interrupts_3_IRQHandler /* TCPWM #1, Counter #3 */ + .long tcpwm_1_interrupts_4_IRQHandler /* TCPWM #1, Counter #4 */ + .long tcpwm_1_interrupts_5_IRQHandler /* TCPWM #1, Counter #5 */ + .long tcpwm_1_interrupts_6_IRQHandler /* TCPWM #1, Counter #6 */ + .long tcpwm_1_interrupts_7_IRQHandler /* TCPWM #1, Counter #7 */ + .long tcpwm_1_interrupts_8_IRQHandler /* TCPWM #1, Counter #8 */ + .long tcpwm_1_interrupts_9_IRQHandler /* TCPWM #1, Counter #9 */ + .long tcpwm_1_interrupts_10_IRQHandler /* TCPWM #1, Counter #10 */ + .long tcpwm_1_interrupts_11_IRQHandler /* TCPWM #1, Counter #11 */ + .long tcpwm_1_interrupts_12_IRQHandler /* TCPWM #1, Counter #12 */ + .long tcpwm_1_interrupts_13_IRQHandler /* TCPWM #1, Counter #13 */ + .long tcpwm_1_interrupts_14_IRQHandler /* TCPWM #1, Counter #14 */ + .long tcpwm_1_interrupts_15_IRQHandler /* TCPWM #1, Counter #15 */ + .long tcpwm_1_interrupts_16_IRQHandler /* TCPWM #1, Counter #16 */ + .long tcpwm_1_interrupts_17_IRQHandler /* TCPWM #1, Counter #17 */ + .long tcpwm_1_interrupts_18_IRQHandler /* TCPWM #1, Counter #18 */ + .long tcpwm_1_interrupts_19_IRQHandler /* TCPWM #1, Counter #19 */ + .long tcpwm_1_interrupts_20_IRQHandler /* TCPWM #1, Counter #20 */ + .long tcpwm_1_interrupts_21_IRQHandler /* TCPWM #1, Counter #21 */ + .long tcpwm_1_interrupts_22_IRQHandler /* TCPWM #1, Counter #22 */ + .long tcpwm_1_interrupts_23_IRQHandler /* TCPWM #1, Counter #23 */ + .long udb_interrupts_0_IRQHandler /* UDB Interrupt #0 */ + .long udb_interrupts_1_IRQHandler /* UDB Interrupt #1 */ + .long udb_interrupts_2_IRQHandler /* UDB Interrupt #2 */ + .long udb_interrupts_3_IRQHandler /* UDB Interrupt #3 */ + .long udb_interrupts_4_IRQHandler /* UDB Interrupt #4 */ + .long udb_interrupts_5_IRQHandler /* UDB Interrupt #5 */ + .long udb_interrupts_6_IRQHandler /* UDB Interrupt #6 */ + .long udb_interrupts_7_IRQHandler /* UDB Interrupt #7 */ + .long udb_interrupts_8_IRQHandler /* UDB Interrupt #8 */ + .long udb_interrupts_9_IRQHandler /* UDB Interrupt #9 */ + .long udb_interrupts_10_IRQHandler /* UDB Interrupt #10 */ + .long udb_interrupts_11_IRQHandler /* UDB Interrupt #11 */ + .long udb_interrupts_12_IRQHandler /* UDB Interrupt #12 */ + .long udb_interrupts_13_IRQHandler /* UDB Interrupt #13 */ + .long udb_interrupts_14_IRQHandler /* UDB Interrupt #14 */ + .long udb_interrupts_15_IRQHandler /* UDB Interrupt #15 */ + .long pass_interrupt_sar_IRQHandler /* SAR ADC interrupt */ + .long audioss_interrupt_i2s_IRQHandler /* I2S Audio interrupt */ + .long audioss_interrupt_pdm_IRQHandler /* PDM/PCM Audio interrupt */ + .long profile_interrupt_IRQHandler /* Energy Profiler interrupt */ + .long smif_interrupt_IRQHandler /* Serial Memory Interface interrupt */ + .long usb_interrupt_hi_IRQHandler /* USB Interrupt */ + .long usb_interrupt_med_IRQHandler /* USB Interrupt */ + .long usb_interrupt_lo_IRQHandler /* USB Interrupt */ + .long pass_interrupt_dacs_IRQHandler /* Consolidated interrrupt for all DACs */ + + + .size __Vectors, . - __Vectors + .equ __VectorsSize, . - __Vectors + + .section .ram_vectors + .align 2 + .globl __ramVectors +__ramVectors: + .space __VectorsSize + .size __ramVectors, . - __ramVectors + + + .text + .thumb + .thumb_func + .align 2 + + /* Device startup customization */ + .weak Cy_OnResetUser + .func Cy_OnResetUser, Cy_OnResetUser + .type Cy_OnResetUser, %function +Cy_OnResetUser: + bx lr + .size Cy_OnResetUser, . - Cy_OnResetUser + .endfunc + + /* Saves and disables the interrupts */ + .global Cy_SaveIRQ + .func Cy_SaveIRQ, Cy_SaveIRQ + .type Cy_SaveIRQ, %function +Cy_SaveIRQ: + mrs r0, PRIMASK + cpsid i + bx lr + .size Cy_SaveIRQ, . - Cy_SaveIRQ + .endfunc + + /* Restores the interrupts */ + .global Cy_RestoreIRQ + .func Cy_RestoreIRQ, Cy_RestoreIRQ + .type Cy_RestoreIRQ, %function +Cy_RestoreIRQ: + msr PRIMASK, r0 + bx lr + .size Cy_RestoreIRQ, . - Cy_RestoreIRQ + .endfunc + + /* Reset handler */ + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + + bl Cy_OnResetUser + cpsid i + +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + + /* Update Vector Table Offset Register. */ + ldr r0, =__ramVectors + ldr r1, =CY_CPU_VTOR_ADDR + str r0, [r1] + dsb 0xF + + /* Enable the FPU if used */ + bl Cy_SystemInitFpuEnable + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + + bl main + + /* Should never get here */ + b . + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + + + .weak Cy_SysLib_FaultHandler + .type Cy_SysLib_FaultHandler, %function +Cy_SysLib_FaultHandler: + b . + .size Cy_SysLib_FaultHandler, . - Cy_SysLib_FaultHandler + + .type Fault_Handler, %function +Fault_Handler: + /* Storing LR content for Creator call stack trace */ + push {LR} + movs r0, #4 + mov r1, LR + tst r0, r1 + beq .L_MSP + mrs r0, PSP + b .L_API_call +.L_MSP: + mrs r0, MSP +.L_API_call: + /* Compensation of stack pointer address due to pushing 4 bytes of LR */ + adds r0, r0, #4 + bl Cy_SysLib_FaultHandler + b . + .size Fault_Handler, . - Fault_Handler + +.macro def_fault_Handler fault_handler_name + .weak \fault_handler_name + .set \fault_handler_name, Fault_Handler + .endm + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + + def_fault_Handler HardFault_Handler + def_fault_Handler MemManage_Handler + def_fault_Handler BusFault_Handler + def_fault_Handler UsageFault_Handler + + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler ioss_interrupts_gpio_0_IRQHandler /* GPIO Port Interrupt #0 */ + def_irq_handler ioss_interrupts_gpio_1_IRQHandler /* GPIO Port Interrupt #1 */ + def_irq_handler ioss_interrupts_gpio_2_IRQHandler /* GPIO Port Interrupt #2 */ + def_irq_handler ioss_interrupts_gpio_3_IRQHandler /* GPIO Port Interrupt #3 */ + def_irq_handler ioss_interrupts_gpio_4_IRQHandler /* GPIO Port Interrupt #4 */ + def_irq_handler ioss_interrupts_gpio_5_IRQHandler /* GPIO Port Interrupt #5 */ + def_irq_handler ioss_interrupts_gpio_6_IRQHandler /* GPIO Port Interrupt #6 */ + def_irq_handler ioss_interrupts_gpio_7_IRQHandler /* GPIO Port Interrupt #7 */ + def_irq_handler ioss_interrupts_gpio_8_IRQHandler /* GPIO Port Interrupt #8 */ + def_irq_handler ioss_interrupts_gpio_9_IRQHandler /* GPIO Port Interrupt #9 */ + def_irq_handler ioss_interrupts_gpio_10_IRQHandler /* GPIO Port Interrupt #10 */ + def_irq_handler ioss_interrupts_gpio_11_IRQHandler /* GPIO Port Interrupt #11 */ + def_irq_handler ioss_interrupts_gpio_12_IRQHandler /* GPIO Port Interrupt #12 */ + def_irq_handler ioss_interrupts_gpio_13_IRQHandler /* GPIO Port Interrupt #13 */ + def_irq_handler ioss_interrupts_gpio_14_IRQHandler /* GPIO Port Interrupt #14 */ + def_irq_handler ioss_interrupt_gpio_IRQHandler /* GPIO All Ports */ + def_irq_handler ioss_interrupt_vdd_IRQHandler /* GPIO Supply Detect Interrupt */ + def_irq_handler lpcomp_interrupt_IRQHandler /* Low Power Comparator Interrupt */ + def_irq_handler scb_8_interrupt_IRQHandler /* Serial Communication Block #8 (DeepSleep capable) */ + def_irq_handler srss_interrupt_mcwdt_0_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + def_irq_handler srss_interrupt_mcwdt_1_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + def_irq_handler srss_interrupt_backup_IRQHandler /* Backup domain interrupt */ + def_irq_handler srss_interrupt_IRQHandler /* Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + def_irq_handler pass_interrupt_ctbs_IRQHandler /* CTBm Interrupt (all CTBms) */ + def_irq_handler bless_interrupt_IRQHandler /* Bluetooth Radio interrupt */ + def_irq_handler cpuss_interrupts_ipc_0_IRQHandler /* CPUSS Inter Process Communication Interrupt #0 */ + def_irq_handler cpuss_interrupts_ipc_1_IRQHandler /* CPUSS Inter Process Communication Interrupt #1 */ + def_irq_handler cpuss_interrupts_ipc_2_IRQHandler /* CPUSS Inter Process Communication Interrupt #2 */ + def_irq_handler cpuss_interrupts_ipc_3_IRQHandler /* CPUSS Inter Process Communication Interrupt #3 */ + def_irq_handler cpuss_interrupts_ipc_4_IRQHandler /* CPUSS Inter Process Communication Interrupt #4 */ + def_irq_handler cpuss_interrupts_ipc_5_IRQHandler /* CPUSS Inter Process Communication Interrupt #5 */ + def_irq_handler cpuss_interrupts_ipc_6_IRQHandler /* CPUSS Inter Process Communication Interrupt #6 */ + def_irq_handler cpuss_interrupts_ipc_7_IRQHandler /* CPUSS Inter Process Communication Interrupt #7 */ + def_irq_handler cpuss_interrupts_ipc_8_IRQHandler /* CPUSS Inter Process Communication Interrupt #8 */ + def_irq_handler cpuss_interrupts_ipc_9_IRQHandler /* CPUSS Inter Process Communication Interrupt #9 */ + def_irq_handler cpuss_interrupts_ipc_10_IRQHandler /* CPUSS Inter Process Communication Interrupt #10 */ + def_irq_handler cpuss_interrupts_ipc_11_IRQHandler /* CPUSS Inter Process Communication Interrupt #11 */ + def_irq_handler cpuss_interrupts_ipc_12_IRQHandler /* CPUSS Inter Process Communication Interrupt #12 */ + def_irq_handler cpuss_interrupts_ipc_13_IRQHandler /* CPUSS Inter Process Communication Interrupt #13 */ + def_irq_handler cpuss_interrupts_ipc_14_IRQHandler /* CPUSS Inter Process Communication Interrupt #14 */ + def_irq_handler cpuss_interrupts_ipc_15_IRQHandler /* CPUSS Inter Process Communication Interrupt #15 */ + def_irq_handler scb_0_interrupt_IRQHandler /* Serial Communication Block #0 */ + def_irq_handler scb_1_interrupt_IRQHandler /* Serial Communication Block #1 */ + def_irq_handler scb_2_interrupt_IRQHandler /* Serial Communication Block #2 */ + def_irq_handler scb_3_interrupt_IRQHandler /* Serial Communication Block #3 */ + def_irq_handler scb_4_interrupt_IRQHandler /* Serial Communication Block #4 */ + def_irq_handler scb_5_interrupt_IRQHandler /* Serial Communication Block #5 */ + def_irq_handler scb_6_interrupt_IRQHandler /* Serial Communication Block #6 */ + def_irq_handler scb_7_interrupt_IRQHandler /* Serial Communication Block #7 */ + def_irq_handler csd_interrupt_IRQHandler /* CSD (Capsense) interrupt */ + def_irq_handler cpuss_interrupts_dw0_0_IRQHandler /* CPUSS DataWire #0, Channel #0 */ + def_irq_handler cpuss_interrupts_dw0_1_IRQHandler /* CPUSS DataWire #0, Channel #1 */ + def_irq_handler cpuss_interrupts_dw0_2_IRQHandler /* CPUSS DataWire #0, Channel #2 */ + def_irq_handler cpuss_interrupts_dw0_3_IRQHandler /* CPUSS DataWire #0, Channel #3 */ + def_irq_handler cpuss_interrupts_dw0_4_IRQHandler /* CPUSS DataWire #0, Channel #4 */ + def_irq_handler cpuss_interrupts_dw0_5_IRQHandler /* CPUSS DataWire #0, Channel #5 */ + def_irq_handler cpuss_interrupts_dw0_6_IRQHandler /* CPUSS DataWire #0, Channel #6 */ + def_irq_handler cpuss_interrupts_dw0_7_IRQHandler /* CPUSS DataWire #0, Channel #7 */ + def_irq_handler cpuss_interrupts_dw0_8_IRQHandler /* CPUSS DataWire #0, Channel #8 */ + def_irq_handler cpuss_interrupts_dw0_9_IRQHandler /* CPUSS DataWire #0, Channel #9 */ + def_irq_handler cpuss_interrupts_dw0_10_IRQHandler /* CPUSS DataWire #0, Channel #10 */ + def_irq_handler cpuss_interrupts_dw0_11_IRQHandler /* CPUSS DataWire #0, Channel #11 */ + def_irq_handler cpuss_interrupts_dw0_12_IRQHandler /* CPUSS DataWire #0, Channel #12 */ + def_irq_handler cpuss_interrupts_dw0_13_IRQHandler /* CPUSS DataWire #0, Channel #13 */ + def_irq_handler cpuss_interrupts_dw0_14_IRQHandler /* CPUSS DataWire #0, Channel #14 */ + def_irq_handler cpuss_interrupts_dw0_15_IRQHandler /* CPUSS DataWire #0, Channel #15 */ + def_irq_handler cpuss_interrupts_dw1_0_IRQHandler /* CPUSS DataWire #1, Channel #0 */ + def_irq_handler cpuss_interrupts_dw1_1_IRQHandler /* CPUSS DataWire #1, Channel #1 */ + def_irq_handler cpuss_interrupts_dw1_2_IRQHandler /* CPUSS DataWire #1, Channel #2 */ + def_irq_handler cpuss_interrupts_dw1_3_IRQHandler /* CPUSS DataWire #1, Channel #3 */ + def_irq_handler cpuss_interrupts_dw1_4_IRQHandler /* CPUSS DataWire #1, Channel #4 */ + def_irq_handler cpuss_interrupts_dw1_5_IRQHandler /* CPUSS DataWire #1, Channel #5 */ + def_irq_handler cpuss_interrupts_dw1_6_IRQHandler /* CPUSS DataWire #1, Channel #6 */ + def_irq_handler cpuss_interrupts_dw1_7_IRQHandler /* CPUSS DataWire #1, Channel #7 */ + def_irq_handler cpuss_interrupts_dw1_8_IRQHandler /* CPUSS DataWire #1, Channel #8 */ + def_irq_handler cpuss_interrupts_dw1_9_IRQHandler /* CPUSS DataWire #1, Channel #9 */ + def_irq_handler cpuss_interrupts_dw1_10_IRQHandler /* CPUSS DataWire #1, Channel #10 */ + def_irq_handler cpuss_interrupts_dw1_11_IRQHandler /* CPUSS DataWire #1, Channel #11 */ + def_irq_handler cpuss_interrupts_dw1_12_IRQHandler /* CPUSS DataWire #1, Channel #12 */ + def_irq_handler cpuss_interrupts_dw1_13_IRQHandler /* CPUSS DataWire #1, Channel #13 */ + def_irq_handler cpuss_interrupts_dw1_14_IRQHandler /* CPUSS DataWire #1, Channel #14 */ + def_irq_handler cpuss_interrupts_dw1_15_IRQHandler /* CPUSS DataWire #1, Channel #15 */ + def_irq_handler cpuss_interrupts_fault_0_IRQHandler /* CPUSS Fault Structure Interrupt #0 */ + def_irq_handler cpuss_interrupts_fault_1_IRQHandler /* CPUSS Fault Structure Interrupt #1 */ + def_irq_handler cpuss_interrupt_crypto_IRQHandler /* CRYPTO Accelerator Interrupt */ + def_irq_handler cpuss_interrupt_fm_IRQHandler /* FLASH Macro Interrupt */ + def_irq_handler cpuss_interrupts_cm0_cti_0_IRQHandler /* CM0+ CTI #0 */ + def_irq_handler cpuss_interrupts_cm0_cti_1_IRQHandler /* CM0+ CTI #1 */ + def_irq_handler cpuss_interrupts_cm4_cti_0_IRQHandler /* CM4 CTI #0 */ + def_irq_handler cpuss_interrupts_cm4_cti_1_IRQHandler /* CM4 CTI #1 */ + def_irq_handler tcpwm_0_interrupts_0_IRQHandler /* TCPWM #0, Counter #0 */ + def_irq_handler tcpwm_0_interrupts_1_IRQHandler /* TCPWM #0, Counter #1 */ + def_irq_handler tcpwm_0_interrupts_2_IRQHandler /* TCPWM #0, Counter #2 */ + def_irq_handler tcpwm_0_interrupts_3_IRQHandler /* TCPWM #0, Counter #3 */ + def_irq_handler tcpwm_0_interrupts_4_IRQHandler /* TCPWM #0, Counter #4 */ + def_irq_handler tcpwm_0_interrupts_5_IRQHandler /* TCPWM #0, Counter #5 */ + def_irq_handler tcpwm_0_interrupts_6_IRQHandler /* TCPWM #0, Counter #6 */ + def_irq_handler tcpwm_0_interrupts_7_IRQHandler /* TCPWM #0, Counter #7 */ + def_irq_handler tcpwm_1_interrupts_0_IRQHandler /* TCPWM #1, Counter #0 */ + def_irq_handler tcpwm_1_interrupts_1_IRQHandler /* TCPWM #1, Counter #1 */ + def_irq_handler tcpwm_1_interrupts_2_IRQHandler /* TCPWM #1, Counter #2 */ + def_irq_handler tcpwm_1_interrupts_3_IRQHandler /* TCPWM #1, Counter #3 */ + def_irq_handler tcpwm_1_interrupts_4_IRQHandler /* TCPWM #1, Counter #4 */ + def_irq_handler tcpwm_1_interrupts_5_IRQHandler /* TCPWM #1, Counter #5 */ + def_irq_handler tcpwm_1_interrupts_6_IRQHandler /* TCPWM #1, Counter #6 */ + def_irq_handler tcpwm_1_interrupts_7_IRQHandler /* TCPWM #1, Counter #7 */ + def_irq_handler tcpwm_1_interrupts_8_IRQHandler /* TCPWM #1, Counter #8 */ + def_irq_handler tcpwm_1_interrupts_9_IRQHandler /* TCPWM #1, Counter #9 */ + def_irq_handler tcpwm_1_interrupts_10_IRQHandler /* TCPWM #1, Counter #10 */ + def_irq_handler tcpwm_1_interrupts_11_IRQHandler /* TCPWM #1, Counter #11 */ + def_irq_handler tcpwm_1_interrupts_12_IRQHandler /* TCPWM #1, Counter #12 */ + def_irq_handler tcpwm_1_interrupts_13_IRQHandler /* TCPWM #1, Counter #13 */ + def_irq_handler tcpwm_1_interrupts_14_IRQHandler /* TCPWM #1, Counter #14 */ + def_irq_handler tcpwm_1_interrupts_15_IRQHandler /* TCPWM #1, Counter #15 */ + def_irq_handler tcpwm_1_interrupts_16_IRQHandler /* TCPWM #1, Counter #16 */ + def_irq_handler tcpwm_1_interrupts_17_IRQHandler /* TCPWM #1, Counter #17 */ + def_irq_handler tcpwm_1_interrupts_18_IRQHandler /* TCPWM #1, Counter #18 */ + def_irq_handler tcpwm_1_interrupts_19_IRQHandler /* TCPWM #1, Counter #19 */ + def_irq_handler tcpwm_1_interrupts_20_IRQHandler /* TCPWM #1, Counter #20 */ + def_irq_handler tcpwm_1_interrupts_21_IRQHandler /* TCPWM #1, Counter #21 */ + def_irq_handler tcpwm_1_interrupts_22_IRQHandler /* TCPWM #1, Counter #22 */ + def_irq_handler tcpwm_1_interrupts_23_IRQHandler /* TCPWM #1, Counter #23 */ + def_irq_handler udb_interrupts_0_IRQHandler /* UDB Interrupt #0 */ + def_irq_handler udb_interrupts_1_IRQHandler /* UDB Interrupt #1 */ + def_irq_handler udb_interrupts_2_IRQHandler /* UDB Interrupt #2 */ + def_irq_handler udb_interrupts_3_IRQHandler /* UDB Interrupt #3 */ + def_irq_handler udb_interrupts_4_IRQHandler /* UDB Interrupt #4 */ + def_irq_handler udb_interrupts_5_IRQHandler /* UDB Interrupt #5 */ + def_irq_handler udb_interrupts_6_IRQHandler /* UDB Interrupt #6 */ + def_irq_handler udb_interrupts_7_IRQHandler /* UDB Interrupt #7 */ + def_irq_handler udb_interrupts_8_IRQHandler /* UDB Interrupt #8 */ + def_irq_handler udb_interrupts_9_IRQHandler /* UDB Interrupt #9 */ + def_irq_handler udb_interrupts_10_IRQHandler /* UDB Interrupt #10 */ + def_irq_handler udb_interrupts_11_IRQHandler /* UDB Interrupt #11 */ + def_irq_handler udb_interrupts_12_IRQHandler /* UDB Interrupt #12 */ + def_irq_handler udb_interrupts_13_IRQHandler /* UDB Interrupt #13 */ + def_irq_handler udb_interrupts_14_IRQHandler /* UDB Interrupt #14 */ + def_irq_handler udb_interrupts_15_IRQHandler /* UDB Interrupt #15 */ + def_irq_handler pass_interrupt_sar_IRQHandler /* SAR ADC interrupt */ + def_irq_handler audioss_interrupt_i2s_IRQHandler /* I2S Audio interrupt */ + def_irq_handler audioss_interrupt_pdm_IRQHandler /* PDM/PCM Audio interrupt */ + def_irq_handler profile_interrupt_IRQHandler /* Energy Profiler interrupt */ + def_irq_handler smif_interrupt_IRQHandler /* Serial Memory Interface interrupt */ + def_irq_handler usb_interrupt_hi_IRQHandler /* USB Interrupt */ + def_irq_handler usb_interrupt_med_IRQHandler /* USB Interrupt */ + def_irq_handler usb_interrupt_lo_IRQHandler /* USB Interrupt */ + def_irq_handler pass_interrupt_dacs_IRQHandler /* Consolidated interrrupt for all DACs */ + + .end + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/system_psoc63_cm4.c b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/system_psoc63_cm4.c new file mode 100644 index 0000000000..c5437c7795 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/system_psoc63_cm4.c @@ -0,0 +1,430 @@ +/***************************************************************************//** +* \file system_psoc63_cm4.c +* \version 2.0 +* +* The device system-source file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include +#include "system_psoc63.h" +#include "cy_device_headers.h" + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + #include "ipc/cy_ipc_pipe.h" + #include "ipc/cy_ipc_sema.h" +#endif /* CY_IPC_DEFAULT_CFG_DISABLE */ + + +/******************************************************************************* +* SystemCoreClockUpdate() +*******************************************************************************/ + +/** Default HFClk frequency in Hz */ +#define CY_CLK_HFCLK0_FREQ_HZ_DEFAULT ( 8000000UL) + +/** Default PeriClk frequency in Hz */ +#define CY_CLK_PERICLK_FREQ_HZ_DEFAULT (4000000UL) + +/** Default SlowClk system core frequency in Hz */ +#define CY_CLK_SYSTEM_FREQ_HZ_DEFAULT (8000000UL) + +/** IMO frequency in Hz */ +#define CY_CLK_IMO_FREQ_HZ (8000000UL) + +/** HVILO frequency in Hz */ +#define CY_CLK_HVILO_FREQ_HZ (32000UL) + +#if (SRSS_PILO_PRESENT == 1U) || defined(CY_DOXYGEN) + /** PILO frequency in Hz */ + #define CY_CLK_PILO_FREQ_HZ (32768UL) +#endif /* (SRSS_PILO_PRESENT == 1U) || defined(CY_DOXYGEN) */ + +/** WCO frequency in Hz */ +#define CY_CLK_WCO_FREQ_HZ (32768UL) + +#if (SRSS_ALTLF_PRESENT == 1U) || defined(CY_DOXYGEN) + /** ALTLF frequency in Hz */ + #define CY_CLK_ALTLF_FREQ_HZ (32768UL) +#endif /* (SRSS_ALTLF_PRESENT == 1U) || defined(CY_DOXYGEN) */ + + +/** Holds the FastClk system core clock, which is the system clock frequency supplied to the SysTick timer and the +* processor core clock. This variable can be used by debuggers to query the frequency of the debug timer or to configure +* the trace clock speed. +* +* \attention Compilers must be configured to avoid removing this variable in case the application program is not using +* it. Debugging systems require the variable to be physically present in memory so that it can be examined to configure +* the debugger. */ +uint32_t SystemCoreClock = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +/** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_Hfclk0FreqHz = CY_CLK_HFCLK0_FREQ_HZ_DEFAULT; + +/** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_PeriClkFreqHz = CY_CLK_PERICLK_FREQ_HZ_DEFAULT; + +#if (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) + /** Holds the Alternate high frequency clock in Hz. Updated by \ref SystemCoreClockUpdate(). */ + uint32_t cy_BleEcoClockFreqHz = CY_CLK_ALTHF_FREQ_HZ; +#endif /* (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) */ + + +/* SCB->CPACR */ +#define SCB_CPACR_CP10_CP11_ENABLE (0xFUL << 20u) + + +/******************************************************************************* +* SystemInit() +*******************************************************************************/ +/* WDT lock bits */ +#define CY_WDT_LOCK_BIT0 ((uint32_t)0x01u << 30u) +#define CY_WDT_LOCK_BIT1 ((uint32_t)0x01u << 31u) + + +/******************************************************************************* +* SystemCoreClockUpdate (void) +*******************************************************************************/ +/* Do not use these definitions directly in your application */ +#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) +#define CY_DELAY_1K_THRESHOLD (1000u) +#define CY_DELAY_1K_MINUS_1_THRESHOLD (CY_DELAY_1K_THRESHOLD - 1u) +#define CY_DELAY_1M_THRESHOLD (1000000u) +#define CY_DELAY_1M_MINUS_1_THRESHOLD (CY_DELAY_1M_THRESHOLD - 1u) +uint32_t cy_delayFreqHz = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +uint32_t cy_delayFreqKhz = (CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / + CY_DELAY_1K_THRESHOLD; + +uint8_t cy_delayFreqMhz = (uint8_t)((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1M_MINUS_1_THRESHOLD) / + CY_DELAY_1M_THRESHOLD); + +uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * + ((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD); + +#define CY_ROOT_PATH_SRC_IMO (0UL) +#define CY_ROOT_PATH_SRC_EXT (1UL) +#if (SRSS_ECO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ECO (2UL) +#endif /* (SRSS_ECO_PRESENT == 1U) */ +#if (SRSS_ALTHF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ALTHF (3UL) +#endif /* (SRSS_ALTHF_PRESENT == 1U) */ +#define CY_ROOT_PATH_SRC_DSI_MUX (4UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_HVILO (16UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_WCO (17UL) +#if (SRSS_ALTLF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_ALTLF (18UL) +#endif /* (SRSS_ALTLF_PRESENT == 1U) */ +#if (SRSS_PILO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_PILO (19UL) +#endif /* (SRSS_PILO_PRESENT == 1U) */ + + +/******************************************************************************* +* Function Name: SystemInit +****************************************************************************//** +* +* Initializes the system: +* - Unlocks and disables WDT. +* - Calls the Cy_SystemInit() function, if compiled from PSoC Creator. +* - Calls \ref SystemCoreClockUpdate(). +* +*******************************************************************************/ +void SystemInit(void) +{ + /* Unlock and disable WDT */ + SRSS->WDT_CTL = ((SRSS->WDT_CTL & (uint32_t)(~SRSS_WDT_CTL_WDT_LOCK_Msk)) | CY_WDT_LOCK_BIT0); + SRSS->WDT_CTL = (SRSS->WDT_CTL | CY_WDT_LOCK_BIT1); + SRSS->WDT_CTL &= (~ (uint32_t) SRSS_WDT_CTL_WDT_EN_Msk); + + Cy_SystemInit(); + SystemCoreClockUpdate(); + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + /* Allocate and initialize semaphores for the system operations. */ + Cy_IPC_SystemSemaInit(); + Cy_IPC_SystemPipeInit(); +#endif /* CY_IPC_DEFAULT_CFG_DISABLE */ +} + + +/******************************************************************************* +* Function Name: Cy_SystemInit +****************************************************************************//** +* +* The function is called during device startup. Once project compiled as part of +* the PSoC Creator project, the Cy_SystemInit() function is generated by the +* PSoC Creator. +* +* The function generated by PSoC Creator performs all of the necessary device +* configuration based on the design settings. This includes settings from the +* Design Wide Resources (DWR) such as Clocks and Pins as well as any component +* configuration that is necessary. +* +*******************************************************************************/ +__WEAK void Cy_SystemInit(void) +{ + /* Empty weak function. The actual implementation to be in the PSoC Creator + * generated strong function. + */ +} + + +/******************************************************************************* +* Function Name: SystemCoreClockUpdate +****************************************************************************//** +* +* Gets core clock frequency and updates \ref SystemCoreClock, \ref +* cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. +* +* Updates global variables used by the \ref Cy_SysLib_Delay(), \ref +* Cy_SysLib_DelayUs(), and \ref Cy_SysLib_DelayCycles(). +* +*******************************************************************************/ +void SystemCoreClockUpdate (void) +{ + uint32_t srcFreqHz; + uint32_t pathFreqHz; + uint32_t fastClkDiv; + uint32_t periClkDiv; + uint32_t rootPath; + uint32_t srcClk; + + /* Get root path clock for the high-frequency clock # 0 */ + rootPath = _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_MUX, SRSS->CLK_ROOT_SELECT[0u]); + + /* Get source of the root path clock */ + srcClk = _FLD2VAL(SRSS_CLK_PATH_SELECT_PATH_MUX, SRSS->CLK_PATH_SELECT[rootPath]); + + /* Get frequency of the source */ + switch (srcClk) + { + case CY_ROOT_PATH_SRC_IMO: + srcFreqHz = CY_CLK_IMO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_EXT: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + + #if (SRSS_ECO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ECO: + srcFreqHz = CY_CLK_ECO_FREQ_HZ; + break; + #endif /* (SRSS_ECO_PRESENT == 1U) */ + +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ALTHF: + srcFreqHz = cy_BleEcoClockFreqHz; + break; +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) */ + + case CY_ROOT_PATH_SRC_DSI_MUX: + { + uint32_t dsi_src; + dsi_src = _FLD2VAL(SRSS_CLK_DSI_SELECT_DSI_MUX, SRSS->CLK_DSI_SELECT[rootPath]); + switch (dsi_src) + { + case CY_ROOT_PATH_SRC_DSI_MUX_HVILO: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_DSI_MUX_WCO: + srcFreqHz = CY_CLK_WCO_FREQ_HZ; + break; + + #if (SRSS_ALTLF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_ALTLF: + srcFreqHz = CY_CLK_ALTLF_FREQ_HZ; + break; + #endif /* (SRSS_ALTLF_PRESENT == 1U) */ + + #if (SRSS_PILO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_PILO: + srcFreqHz = CY_CLK_PILO_FREQ_HZ; + break; + #endif /* (SRSS_PILO_PRESENT == 1U) */ + + default: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + } + } + break; + + default: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + } + + if (rootPath == 0UL) + { + /* FLL */ + bool fllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_FLL_STATUS_LOCKED, SRSS->CLK_FLL_STATUS)); + bool fllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)); + bool fllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)) || + (1UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3))); + if ((fllOutputAuto && fllLocked) || fllOutputOutput) + { + uint32_t fllMult; + uint32_t refDiv; + uint32_t outputDiv; + + fllMult = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_MULT, SRSS->CLK_FLL_CONFIG); + refDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV, SRSS->CLK_FLL_CONFIG2); + outputDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV, SRSS->CLK_FLL_CONFIG) + 1UL; + + pathFreqHz = ((srcFreqHz / refDiv) * fllMult) / outputDiv; + } + else + { + pathFreqHz = srcFreqHz; + } + } + else if (rootPath == 1UL) + { + /* PLL */ + bool pllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_PLL_STATUS_LOCKED, SRSS->CLK_PLL_STATUS[0UL])); + bool pllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])); + bool pllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])) || + (1UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL]))); + if ((pllOutputAuto && pllLocked) || pllOutputOutput) + { + uint32_t feedbackDiv; + uint32_t referenceDiv; + uint32_t outputDiv; + + feedbackDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + referenceDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_REFERENCE_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + outputDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_OUTPUT_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + + pathFreqHz = ((srcFreqHz * feedbackDiv) / referenceDiv) / outputDiv; + + } + else + { + pathFreqHz = srcFreqHz; + } + } + else + { + /* Direct */ + pathFreqHz = srcFreqHz; + } + + /* Get frequency after hf_clk pre-divider */ + pathFreqHz = pathFreqHz >> _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_DIV, SRSS->CLK_ROOT_SELECT[0u]); + cy_Hfclk0FreqHz = pathFreqHz; + + /* Fast Clock Divider */ + fastClkDiv = 1u + _FLD2VAL(CPUSS_CM4_CLOCK_CTL_FAST_INT_DIV, CPUSS->CM4_CLOCK_CTL); + + /* Peripheral Clock Divider */ + periClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV, CPUSS->CM0_CLOCK_CTL); + cy_PeriClkFreqHz = pathFreqHz / periClkDiv; + + pathFreqHz = pathFreqHz / fastClkDiv; + SystemCoreClock = pathFreqHz; + + /* Sets clock frequency for Delay API */ + cy_delayFreqHz = SystemCoreClock; + cy_delayFreqMhz = (uint8_t)((cy_delayFreqHz + CY_DELAY_1M_MINUS_1_THRESHOLD) / CY_DELAY_1M_THRESHOLD); + cy_delayFreqKhz = (cy_delayFreqHz + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD; + cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * cy_delayFreqKhz; +} + + +/******************************************************************************* +* Function Name: Cy_SystemInitFpuEnable +****************************************************************************//** +* +* Enables the FPU if it is used. The function is called from the startup file. +* +*******************************************************************************/ +void Cy_SystemInitFpuEnable(void) +{ + #if defined (__FPU_USED) && (__FPU_USED == 1U) + uint32_t interruptState; + interruptState = Cy_SaveIRQ(); + SCB->CPACR |= SCB_CPACR_CP10_CP11_ENABLE; + __DSB(); + __ISB(); + Cy_RestoreIRQ(interruptState); + #endif /* (__FPU_USED) && (__FPU_USED == 1U) */ +} + + +/******************************************************************************* +* Function Name: Cy_MemorySymbols +****************************************************************************//** +* +* The intention of the function is to declare boundaries of the memories for the +* MDK compilers. For the rest of the supported compilers, this is done using +* linker configuration files. The following symbols used by the cypdlelftool. +* +*******************************************************************************/ +#if defined (__ARMCC_VERSION) +__asm void Cy_MemorySymbols(void) +{ + /* Flash */ + EXPORT __cy_memory_0_start + EXPORT __cy_memory_0_length + EXPORT __cy_memory_0_row_size + + /* Working Flash */ + EXPORT __cy_memory_1_start + EXPORT __cy_memory_1_length + EXPORT __cy_memory_1_row_size + + /* Supervisory Flash */ + EXPORT __cy_memory_2_start + EXPORT __cy_memory_2_length + EXPORT __cy_memory_2_row_size + + /* XIP */ + EXPORT __cy_memory_3_start + EXPORT __cy_memory_3_length + EXPORT __cy_memory_3_row_size + + /* eFuse */ + EXPORT __cy_memory_4_start + EXPORT __cy_memory_4_length + EXPORT __cy_memory_4_row_size + + /* Flash */ +__cy_memory_0_start EQU __cpp(CY_FLASH_BASE) +__cy_memory_0_length EQU __cpp(CY_FLASH_SIZE) +__cy_memory_0_row_size EQU 0x200 + + /* Working Flash */ +__cy_memory_1_start EQU __cpp(CY_WFLASH_BASE) +__cy_memory_1_length EQU __cpp(CY_WFLASH_SIZE) +__cy_memory_1_row_size EQU 0x200 + + /* Supervisory Flash */ +__cy_memory_2_start EQU __cpp(CY_SFLASH_BASE) +__cy_memory_2_length EQU __cpp(CY_SFLASH_SIZE) +__cy_memory_2_row_size EQU 0x200 + + /* XIP */ +__cy_memory_3_start EQU __cpp(CY_XIP_BASE) +__cy_memory_3_length EQU __cpp(CY_XIP_SIZE) +__cy_memory_3_row_size EQU 0x200 + + /* eFuse */ +__cy_memory_4_start EQU __cpp(0x90700000) +__cy_memory_4_length EQU __cpp(0x100000) +__cy_memory_4_row_size EQU __cpp(1) +} +#endif /* defined (__ARMCC_VERSION) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device.h similarity index 98% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device.h rename to targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device.h index fa47e5377a..b134699e38 100644 --- a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device.h +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device.h @@ -34,6 +34,6 @@ #define MBED_DEVICE_H #include "objects.h" -#include "project.h" +//#include "project.h" #endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_client_gcc.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_client_gcc.a new file mode 100644 index 0000000000000000000000000000000000000000..32d9aa905aaebd17e7c139e3de76d7e3f4482da2 GIT binary patch literal 10040 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 literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_server_gcc_base.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_server_gcc_base.a new file mode 100644 index 0000000000000000000000000000000000000000..685790d83a62b1361f87cc8bf9d603a20de6de52 GIT binary patch literal 20240 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 z z`}iwdC*=2_Ug$i%upaft<>hex zaGbCAD|0!&BA!X_H|BG`FP>k)<7kovC3_lI#6?oqJ;f-eXqfza0(@o{yn%0I~YS!|Pz|92|i&-wZM90cjx&G8&Y`3R>o9K|?w{Tk8& zY)Jg4KoAp7^9=!n)4W0e;d6AjPlw;6!#C;hFX-^SI{fQ8{B<4vt`7e|hg&s+E7fr{l--j6L7Phax(0-NL+b!Y}Q9u*Of*=@A~9 zj?BM4(a~@;E!_^Z!KuN-?yO#o!ZG-%ndXc7{UCi^_y>==vQpej@LT=Oo!3V1>|BYT z9a^pY)CH*$k}&F+w;B+etAdp!ZWe2Onind?n*&5v)-99N}~E z-5rk5J61sHYK3&^EE{-`QiGlXBfxqt%k+cy^w(RJ=icEo91rpKuD zhk?dHm^~*bB!?!$f&6AI5RU*&f%~UgISc0~7m-F&NGaFIFYVCDQG2DfD?sRL1%XCc zpUT(|Bpc~s1h_RbcY`KC z=%aq3)%OMv>T6U#q6>Zhg0xoOAs{p+3lRFg4uV$SZ-G#`q%Rji=z9}st-jNEp?=T= z2z_)0K&$U=D`O7ONFU8kgue4glRkPD1U|fIBY!v>LSRJ{DXdoj@d^Yn=^%io7;jUA r??<_I!2~Xn6pOYSPm0f}~%o?ws4KdvV$Z;V5n!b$_AoTqo3ZiJ% literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_server_gcc_extra.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_server_gcc_extra.a new file mode 100644 index 0000000000000000000000000000000000000000..937eeefec7234a3067dca982e17b64f2add6a898 GIT binary patch literal 29300 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 ZaTv^8#2HvVyf(6|R=?{aWdw2+{r@i4LaqP+ literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_server_gcc_full.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/TOOLCHAIN_GCC_ARM/libcy_crypto_server_gcc_full.a new file mode 100644 index 0000000000000000000000000000000000000000..29b5ed4003adedbb479cccacd48bf193bc0de0b4 GIT binary patch literal 37358 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 O?{F>{hQ9)(@Bab#@@j$r literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cmsis.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cmsis.h similarity index 93% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cmsis.h rename to targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cmsis.h index 5de272b134..18c5387bd3 100644 --- a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/cmsis.h +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cmsis.h @@ -32,7 +32,6 @@ #ifndef MBED_CMSIS_H #define MBED_CMSIS_H -#include "cy8c637bzi_bld74.h" // IRQn - could include "include/cy_device_headers.h" -#include "core_cm0plus.h" // NVIC +#include "cy_device_headers.h" #endif diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cy8c6347bzi_bld53.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cy8c6347bzi_bld53.h new file mode 100644 index 0000000000..24e44b7bb0 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cy8c6347bzi_bld53.h @@ -0,0 +1,1285 @@ +/***************************************************************************//** +* \file cy8c6347bzi_bld53.h +* +* \brief +* CY8C6347BZI-BLD53 device header +* +* \note +* Generated 9/21/2017 by CyDeviceHeaderGenerator v1.2.0.101 +* from the register map configuration rev#1007711 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CY8C6347BZI_BLD53_H_ +#define _CY8C6347BZI_BLD53_H_ + +/** +* \addtogroup group_device CY8C6347BZI-BLD53 +* \{ +*/ + +/** +* \addtogroup Configuration_of_CMSIS +* \{ +*/ + +/******************************************************************************* +* Interrupt Number Definition +*******************************************************************************/ + +typedef enum { +#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined(__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3)) || \ + (defined(__ghs__) && defined(__CORE_CORTEXM0PLUS__))) + /* ARM Cortex-M0+ Core Interrupt Numbers */ + Reset_IRQn = -15, /*!< -15 Reset Vector, invoked on Power up and warm reset */ + NonMaskableInt_IRQn = -14, /*!< -14 Non maskable Interrupt, cannot be stopped or preempted */ + HardFault_IRQn = -13, /*!< -13 Hard Fault, all classes of Fault */ + SVCall_IRQn = -5, /*!< -5 System Service Call via SVC instruction */ + PendSV_IRQn = -2, /*!< -2 Pendable request for system service */ + SysTick_IRQn = -1, /*!< -1 System Tick Timer */ + /* ARM Cortex-M0+ NVIC Mux inputs. Allow routing of device interrupts to the CM0+ NVIC */ + NvicMux0_IRQn = 0, /*!< 0 [DeepSleep] CM0+ NVIC Mux input 0 */ + NvicMux1_IRQn = 1, /*!< 1 [DeepSleep] CM0+ NVIC Mux input 1 */ + NvicMux2_IRQn = 2, /*!< 2 [DeepSleep] CM0+ NVIC Mux input 2 */ + NvicMux3_IRQn = 3, /*!< 3 [DeepSleep] CM0+ NVIC Mux input 3 */ + NvicMux4_IRQn = 4, /*!< 4 [DeepSleep] CM0+ NVIC Mux input 4 */ + NvicMux5_IRQn = 5, /*!< 5 [DeepSleep] CM0+ NVIC Mux input 5 */ + NvicMux6_IRQn = 6, /*!< 6 [DeepSleep] CM0+ NVIC Mux input 6 */ + NvicMux7_IRQn = 7, /*!< 7 [DeepSleep] CM0+ NVIC Mux input 7 */ + NvicMux8_IRQn = 8, /*!< 8 [Active] CM0+ NVIC Mux input 8 */ + NvicMux9_IRQn = 9, /*!< 9 [Active] CM0+ NVIC Mux input 9 */ + NvicMux10_IRQn = 10, /*!< 10 [Active] CM0+ NVIC Mux input 10 */ + NvicMux11_IRQn = 11, /*!< 11 [Active] CM0+ NVIC Mux input 11 */ + NvicMux12_IRQn = 12, /*!< 12 [Active] CM0+ NVIC Mux input 12 */ + NvicMux13_IRQn = 13, /*!< 13 [Active] CM0+ NVIC Mux input 13 */ + NvicMux14_IRQn = 14, /*!< 14 [Active] CM0+ NVIC Mux input 14 */ + NvicMux15_IRQn = 15, /*!< 15 [Active] CM0+ NVIC Mux input 15 */ + NvicMux16_IRQn = 16, /*!< 16 [Active] CM0+ NVIC Mux input 16 */ + NvicMux17_IRQn = 17, /*!< 17 [Active] CM0+ NVIC Mux input 17 */ + NvicMux18_IRQn = 18, /*!< 18 [Active] CM0+ NVIC Mux input 18 */ + NvicMux19_IRQn = 19, /*!< 19 [Active] CM0+ NVIC Mux input 19 */ + NvicMux20_IRQn = 20, /*!< 20 [Active] CM0+ NVIC Mux input 20 */ + NvicMux21_IRQn = 21, /*!< 21 [Active] CM0+ NVIC Mux input 21 */ + NvicMux22_IRQn = 22, /*!< 22 [Active] CM0+ NVIC Mux input 22 */ + NvicMux23_IRQn = 23, /*!< 23 [Active] CM0+ NVIC Mux input 23 */ + NvicMux24_IRQn = 24, /*!< 24 [Active] CM0+ NVIC Mux input 24 */ + NvicMux25_IRQn = 25, /*!< 25 [Active] CM0+ NVIC Mux input 25 */ + NvicMux26_IRQn = 26, /*!< 26 [Active] CM0+ NVIC Mux input 26 */ + NvicMux27_IRQn = 27, /*!< 27 [Active] CM0+ NVIC Mux input 27 */ + NvicMux28_IRQn = 28, /*!< 28 [Active] CM0+ NVIC Mux input 28 */ + NvicMux29_IRQn = 29, /*!< 29 [Active] CM0+ NVIC Mux input 29 */ + NvicMux30_IRQn = 30, /*!< 30 [Active] CM0+ NVIC Mux input 30 */ + NvicMux31_IRQn = 31, /*!< 31 [Active] CM0+ NVIC Mux input 31 */ + unconnected_IRQn = 240 /*!< 240 Unconnected */ +#else + /* ARM Cortex-M4 Core Interrupt Numbers */ + Reset_IRQn = -15, /*!< -15 Reset Vector, invoked on Power up and warm reset */ + NonMaskableInt_IRQn = -14, /*!< -14 Non maskable Interrupt, cannot be stopped or preempted */ + HardFault_IRQn = -13, /*!< -13 Hard Fault, all classes of Fault */ + MemoryManagement_IRQn = -12, /*!< -12 Memory Management, MPU mismatch, including Access Violation and No Match */ + BusFault_IRQn = -11, /*!< -11 Bus Fault, Pre-Fetch-, Memory Access Fault, other address/memory related Fault */ + UsageFault_IRQn = -10, /*!< -10 Usage Fault, i.e. Undef Instruction, Illegal State Transition */ + SVCall_IRQn = -5, /*!< -5 System Service Call via SVC instruction */ + DebugMonitor_IRQn = -4, /*!< -4 Debug Monitor */ + PendSV_IRQn = -2, /*!< -2 Pendable request for system service */ + SysTick_IRQn = -1, /*!< -1 System Tick Timer */ + /* CY8C6347BZI-BLD53 Peripheral Interrupt Numbers */ + ioss_interrupts_gpio_0_IRQn = 0, /*!< 0 [DeepSleep] GPIO Port Interrupt #0 */ + ioss_interrupts_gpio_1_IRQn = 1, /*!< 1 [DeepSleep] GPIO Port Interrupt #1 */ + ioss_interrupts_gpio_2_IRQn = 2, /*!< 2 [DeepSleep] GPIO Port Interrupt #2 */ + ioss_interrupts_gpio_3_IRQn = 3, /*!< 3 [DeepSleep] GPIO Port Interrupt #3 */ + ioss_interrupts_gpio_4_IRQn = 4, /*!< 4 [DeepSleep] GPIO Port Interrupt #4 */ + ioss_interrupts_gpio_5_IRQn = 5, /*!< 5 [DeepSleep] GPIO Port Interrupt #5 */ + ioss_interrupts_gpio_6_IRQn = 6, /*!< 6 [DeepSleep] GPIO Port Interrupt #6 */ + ioss_interrupts_gpio_7_IRQn = 7, /*!< 7 [DeepSleep] GPIO Port Interrupt #7 */ + ioss_interrupts_gpio_8_IRQn = 8, /*!< 8 [DeepSleep] GPIO Port Interrupt #8 */ + ioss_interrupts_gpio_9_IRQn = 9, /*!< 9 [DeepSleep] GPIO Port Interrupt #9 */ + ioss_interrupts_gpio_10_IRQn = 10, /*!< 10 [DeepSleep] GPIO Port Interrupt #10 */ + ioss_interrupts_gpio_11_IRQn = 11, /*!< 11 [DeepSleep] GPIO Port Interrupt #11 */ + ioss_interrupts_gpio_12_IRQn = 12, /*!< 12 [DeepSleep] GPIO Port Interrupt #12 */ + ioss_interrupts_gpio_13_IRQn = 13, /*!< 13 [DeepSleep] GPIO Port Interrupt #13 */ + ioss_interrupts_gpio_14_IRQn = 14, /*!< 14 [DeepSleep] GPIO Port Interrupt #14 */ + ioss_interrupt_gpio_IRQn = 15, /*!< 15 [DeepSleep] GPIO All Ports */ + ioss_interrupt_vdd_IRQn = 16, /*!< 16 [DeepSleep] GPIO Supply Detect Interrupt */ + lpcomp_interrupt_IRQn = 17, /*!< 17 [DeepSleep] Low Power Comparator Interrupt */ + scb_8_interrupt_IRQn = 18, /*!< 18 [DeepSleep] Serial Communication Block #8 (DeepSleep capable) */ + srss_interrupt_mcwdt_0_IRQn = 19, /*!< 19 [DeepSleep] Multi Counter Watchdog Timer interrupt */ + srss_interrupt_mcwdt_1_IRQn = 20, /*!< 20 [DeepSleep] Multi Counter Watchdog Timer interrupt */ + srss_interrupt_backup_IRQn = 21, /*!< 21 [DeepSleep] Backup domain interrupt */ + srss_interrupt_IRQn = 22, /*!< 22 [DeepSleep] Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + pass_interrupt_ctbs_IRQn = 23, /*!< 23 [DeepSleep] CTBm Interrupt (all CTBms) */ + bless_interrupt_IRQn = 24, /*!< 24 [DeepSleep] Bluetooth Radio interrupt */ + cpuss_interrupts_ipc_0_IRQn = 25, /*!< 25 [DeepSleep] CPUSS Inter Process Communication Interrupt #0 */ + cpuss_interrupts_ipc_1_IRQn = 26, /*!< 26 [DeepSleep] CPUSS Inter Process Communication Interrupt #1 */ + cpuss_interrupts_ipc_2_IRQn = 27, /*!< 27 [DeepSleep] CPUSS Inter Process Communication Interrupt #2 */ + cpuss_interrupts_ipc_3_IRQn = 28, /*!< 28 [DeepSleep] CPUSS Inter Process Communication Interrupt #3 */ + cpuss_interrupts_ipc_4_IRQn = 29, /*!< 29 [DeepSleep] CPUSS Inter Process Communication Interrupt #4 */ + cpuss_interrupts_ipc_5_IRQn = 30, /*!< 30 [DeepSleep] CPUSS Inter Process Communication Interrupt #5 */ + cpuss_interrupts_ipc_6_IRQn = 31, /*!< 31 [DeepSleep] CPUSS Inter Process Communication Interrupt #6 */ + cpuss_interrupts_ipc_7_IRQn = 32, /*!< 32 [DeepSleep] CPUSS Inter Process Communication Interrupt #7 */ + cpuss_interrupts_ipc_8_IRQn = 33, /*!< 33 [DeepSleep] CPUSS Inter Process Communication Interrupt #8 */ + cpuss_interrupts_ipc_9_IRQn = 34, /*!< 34 [DeepSleep] CPUSS Inter Process Communication Interrupt #9 */ + cpuss_interrupts_ipc_10_IRQn = 35, /*!< 35 [DeepSleep] CPUSS Inter Process Communication Interrupt #10 */ + cpuss_interrupts_ipc_11_IRQn = 36, /*!< 36 [DeepSleep] CPUSS Inter Process Communication Interrupt #11 */ + cpuss_interrupts_ipc_12_IRQn = 37, /*!< 37 [DeepSleep] CPUSS Inter Process Communication Interrupt #12 */ + cpuss_interrupts_ipc_13_IRQn = 38, /*!< 38 [DeepSleep] CPUSS Inter Process Communication Interrupt #13 */ + cpuss_interrupts_ipc_14_IRQn = 39, /*!< 39 [DeepSleep] CPUSS Inter Process Communication Interrupt #14 */ + cpuss_interrupts_ipc_15_IRQn = 40, /*!< 40 [DeepSleep] CPUSS Inter Process Communication Interrupt #15 */ + scb_0_interrupt_IRQn = 41, /*!< 41 [Active] Serial Communication Block #0 */ + scb_1_interrupt_IRQn = 42, /*!< 42 [Active] Serial Communication Block #1 */ + scb_2_interrupt_IRQn = 43, /*!< 43 [Active] Serial Communication Block #2 */ + scb_3_interrupt_IRQn = 44, /*!< 44 [Active] Serial Communication Block #3 */ + scb_4_interrupt_IRQn = 45, /*!< 45 [Active] Serial Communication Block #4 */ + scb_5_interrupt_IRQn = 46, /*!< 46 [Active] Serial Communication Block #5 */ + scb_6_interrupt_IRQn = 47, /*!< 47 [Active] Serial Communication Block #6 */ + scb_7_interrupt_IRQn = 48, /*!< 48 [Active] Serial Communication Block #7 */ + csd_interrupt_IRQn = 49, /*!< 49 [Active] CSD (Capsense) interrupt */ + cpuss_interrupts_dw0_0_IRQn = 50, /*!< 50 [Active] CPUSS DataWire #0, Channel #0 */ + cpuss_interrupts_dw0_1_IRQn = 51, /*!< 51 [Active] CPUSS DataWire #0, Channel #1 */ + cpuss_interrupts_dw0_2_IRQn = 52, /*!< 52 [Active] CPUSS DataWire #0, Channel #2 */ + cpuss_interrupts_dw0_3_IRQn = 53, /*!< 53 [Active] CPUSS DataWire #0, Channel #3 */ + cpuss_interrupts_dw0_4_IRQn = 54, /*!< 54 [Active] CPUSS DataWire #0, Channel #4 */ + cpuss_interrupts_dw0_5_IRQn = 55, /*!< 55 [Active] CPUSS DataWire #0, Channel #5 */ + cpuss_interrupts_dw0_6_IRQn = 56, /*!< 56 [Active] CPUSS DataWire #0, Channel #6 */ + cpuss_interrupts_dw0_7_IRQn = 57, /*!< 57 [Active] CPUSS DataWire #0, Channel #7 */ + cpuss_interrupts_dw0_8_IRQn = 58, /*!< 58 [Active] CPUSS DataWire #0, Channel #8 */ + cpuss_interrupts_dw0_9_IRQn = 59, /*!< 59 [Active] CPUSS DataWire #0, Channel #9 */ + cpuss_interrupts_dw0_10_IRQn = 60, /*!< 60 [Active] CPUSS DataWire #0, Channel #10 */ + cpuss_interrupts_dw0_11_IRQn = 61, /*!< 61 [Active] CPUSS DataWire #0, Channel #11 */ + cpuss_interrupts_dw0_12_IRQn = 62, /*!< 62 [Active] CPUSS DataWire #0, Channel #12 */ + cpuss_interrupts_dw0_13_IRQn = 63, /*!< 63 [Active] CPUSS DataWire #0, Channel #13 */ + cpuss_interrupts_dw0_14_IRQn = 64, /*!< 64 [Active] CPUSS DataWire #0, Channel #14 */ + cpuss_interrupts_dw0_15_IRQn = 65, /*!< 65 [Active] CPUSS DataWire #0, Channel #15 */ + cpuss_interrupts_dw1_0_IRQn = 66, /*!< 66 [Active] CPUSS DataWire #1, Channel #0 */ + cpuss_interrupts_dw1_1_IRQn = 67, /*!< 67 [Active] CPUSS DataWire #1, Channel #1 */ + cpuss_interrupts_dw1_2_IRQn = 68, /*!< 68 [Active] CPUSS DataWire #1, Channel #2 */ + cpuss_interrupts_dw1_3_IRQn = 69, /*!< 69 [Active] CPUSS DataWire #1, Channel #3 */ + cpuss_interrupts_dw1_4_IRQn = 70, /*!< 70 [Active] CPUSS DataWire #1, Channel #4 */ + cpuss_interrupts_dw1_5_IRQn = 71, /*!< 71 [Active] CPUSS DataWire #1, Channel #5 */ + cpuss_interrupts_dw1_6_IRQn = 72, /*!< 72 [Active] CPUSS DataWire #1, Channel #6 */ + cpuss_interrupts_dw1_7_IRQn = 73, /*!< 73 [Active] CPUSS DataWire #1, Channel #7 */ + cpuss_interrupts_dw1_8_IRQn = 74, /*!< 74 [Active] CPUSS DataWire #1, Channel #8 */ + cpuss_interrupts_dw1_9_IRQn = 75, /*!< 75 [Active] CPUSS DataWire #1, Channel #9 */ + cpuss_interrupts_dw1_10_IRQn = 76, /*!< 76 [Active] CPUSS DataWire #1, Channel #10 */ + cpuss_interrupts_dw1_11_IRQn = 77, /*!< 77 [Active] CPUSS DataWire #1, Channel #11 */ + cpuss_interrupts_dw1_12_IRQn = 78, /*!< 78 [Active] CPUSS DataWire #1, Channel #12 */ + cpuss_interrupts_dw1_13_IRQn = 79, /*!< 79 [Active] CPUSS DataWire #1, Channel #13 */ + cpuss_interrupts_dw1_14_IRQn = 80, /*!< 80 [Active] CPUSS DataWire #1, Channel #14 */ + cpuss_interrupts_dw1_15_IRQn = 81, /*!< 81 [Active] CPUSS DataWire #1, Channel #15 */ + cpuss_interrupts_fault_0_IRQn = 82, /*!< 82 [Active] CPUSS Fault Structure Interrupt #0 */ + cpuss_interrupts_fault_1_IRQn = 83, /*!< 83 [Active] CPUSS Fault Structure Interrupt #1 */ + cpuss_interrupt_crypto_IRQn = 84, /*!< 84 [Active] CRYPTO Accelerator Interrupt */ + cpuss_interrupt_fm_IRQn = 85, /*!< 85 [Active] FLASH Macro Interrupt */ + cpuss_interrupts_cm0_cti_0_IRQn = 86, /*!< 86 [Active] CM0+ CTI #0 */ + cpuss_interrupts_cm0_cti_1_IRQn = 87, /*!< 87 [Active] CM0+ CTI #1 */ + cpuss_interrupts_cm4_cti_0_IRQn = 88, /*!< 88 [Active] CM4 CTI #0 */ + cpuss_interrupts_cm4_cti_1_IRQn = 89, /*!< 89 [Active] CM4 CTI #1 */ + tcpwm_0_interrupts_0_IRQn = 90, /*!< 90 [Active] TCPWM #0, Counter #0 */ + tcpwm_0_interrupts_1_IRQn = 91, /*!< 91 [Active] TCPWM #0, Counter #1 */ + tcpwm_0_interrupts_2_IRQn = 92, /*!< 92 [Active] TCPWM #0, Counter #2 */ + tcpwm_0_interrupts_3_IRQn = 93, /*!< 93 [Active] TCPWM #0, Counter #3 */ + tcpwm_0_interrupts_4_IRQn = 94, /*!< 94 [Active] TCPWM #0, Counter #4 */ + tcpwm_0_interrupts_5_IRQn = 95, /*!< 95 [Active] TCPWM #0, Counter #5 */ + tcpwm_0_interrupts_6_IRQn = 96, /*!< 96 [Active] TCPWM #0, Counter #6 */ + tcpwm_0_interrupts_7_IRQn = 97, /*!< 97 [Active] TCPWM #0, Counter #7 */ + tcpwm_1_interrupts_0_IRQn = 98, /*!< 98 [Active] TCPWM #1, Counter #0 */ + tcpwm_1_interrupts_1_IRQn = 99, /*!< 99 [Active] TCPWM #1, Counter #1 */ + tcpwm_1_interrupts_2_IRQn = 100, /*!< 100 [Active] TCPWM #1, Counter #2 */ + tcpwm_1_interrupts_3_IRQn = 101, /*!< 101 [Active] TCPWM #1, Counter #3 */ + tcpwm_1_interrupts_4_IRQn = 102, /*!< 102 [Active] TCPWM #1, Counter #4 */ + tcpwm_1_interrupts_5_IRQn = 103, /*!< 103 [Active] TCPWM #1, Counter #5 */ + tcpwm_1_interrupts_6_IRQn = 104, /*!< 104 [Active] TCPWM #1, Counter #6 */ + tcpwm_1_interrupts_7_IRQn = 105, /*!< 105 [Active] TCPWM #1, Counter #7 */ + tcpwm_1_interrupts_8_IRQn = 106, /*!< 106 [Active] TCPWM #1, Counter #8 */ + tcpwm_1_interrupts_9_IRQn = 107, /*!< 107 [Active] TCPWM #1, Counter #9 */ + tcpwm_1_interrupts_10_IRQn = 108, /*!< 108 [Active] TCPWM #1, Counter #10 */ + tcpwm_1_interrupts_11_IRQn = 109, /*!< 109 [Active] TCPWM #1, Counter #11 */ + tcpwm_1_interrupts_12_IRQn = 110, /*!< 110 [Active] TCPWM #1, Counter #12 */ + tcpwm_1_interrupts_13_IRQn = 111, /*!< 111 [Active] TCPWM #1, Counter #13 */ + tcpwm_1_interrupts_14_IRQn = 112, /*!< 112 [Active] TCPWM #1, Counter #14 */ + tcpwm_1_interrupts_15_IRQn = 113, /*!< 113 [Active] TCPWM #1, Counter #15 */ + tcpwm_1_interrupts_16_IRQn = 114, /*!< 114 [Active] TCPWM #1, Counter #16 */ + tcpwm_1_interrupts_17_IRQn = 115, /*!< 115 [Active] TCPWM #1, Counter #17 */ + tcpwm_1_interrupts_18_IRQn = 116, /*!< 116 [Active] TCPWM #1, Counter #18 */ + tcpwm_1_interrupts_19_IRQn = 117, /*!< 117 [Active] TCPWM #1, Counter #19 */ + tcpwm_1_interrupts_20_IRQn = 118, /*!< 118 [Active] TCPWM #1, Counter #20 */ + tcpwm_1_interrupts_21_IRQn = 119, /*!< 119 [Active] TCPWM #1, Counter #21 */ + tcpwm_1_interrupts_22_IRQn = 120, /*!< 120 [Active] TCPWM #1, Counter #22 */ + tcpwm_1_interrupts_23_IRQn = 121, /*!< 121 [Active] TCPWM #1, Counter #23 */ + udb_interrupts_0_IRQn = 122, /*!< 122 [Active] UDB Interrupt #0 */ + udb_interrupts_1_IRQn = 123, /*!< 123 [Active] UDB Interrupt #1 */ + udb_interrupts_2_IRQn = 124, /*!< 124 [Active] UDB Interrupt #2 */ + udb_interrupts_3_IRQn = 125, /*!< 125 [Active] UDB Interrupt #3 */ + udb_interrupts_4_IRQn = 126, /*!< 126 [Active] UDB Interrupt #4 */ + udb_interrupts_5_IRQn = 127, /*!< 127 [Active] UDB Interrupt #5 */ + udb_interrupts_6_IRQn = 128, /*!< 128 [Active] UDB Interrupt #6 */ + udb_interrupts_7_IRQn = 129, /*!< 129 [Active] UDB Interrupt #7 */ + udb_interrupts_8_IRQn = 130, /*!< 130 [Active] UDB Interrupt #8 */ + udb_interrupts_9_IRQn = 131, /*!< 131 [Active] UDB Interrupt #9 */ + udb_interrupts_10_IRQn = 132, /*!< 132 [Active] UDB Interrupt #10 */ + udb_interrupts_11_IRQn = 133, /*!< 133 [Active] UDB Interrupt #11 */ + udb_interrupts_12_IRQn = 134, /*!< 134 [Active] UDB Interrupt #12 */ + udb_interrupts_13_IRQn = 135, /*!< 135 [Active] UDB Interrupt #13 */ + udb_interrupts_14_IRQn = 136, /*!< 136 [Active] UDB Interrupt #14 */ + udb_interrupts_15_IRQn = 137, /*!< 137 [Active] UDB Interrupt #15 */ + pass_interrupt_sar_IRQn = 138, /*!< 138 [Active] SAR ADC interrupt */ + audioss_interrupt_i2s_IRQn = 139, /*!< 139 [Active] I2S Audio interrupt */ + audioss_interrupt_pdm_IRQn = 140, /*!< 140 [Active] PDM/PCM Audio interrupt */ + profile_interrupt_IRQn = 141, /*!< 141 [Active] Energy Profiler interrupt */ + smif_interrupt_IRQn = 142, /*!< 142 [Active] Serial Memory Interface interrupt */ + usb_interrupt_hi_IRQn = 143, /*!< 143 [Active] USB Interrupt */ + usb_interrupt_med_IRQn = 144, /*!< 144 [Active] USB Interrupt */ + usb_interrupt_lo_IRQn = 145, /*!< 145 [Active] USB Interrupt */ + pass_interrupt_dacs_IRQn = 146, /*!< 146 [Active] Consolidated interrrupt for all DACs */ + unconnected_IRQn = 240 /*!< 240 Unconnected */ +#endif +} IRQn_Type; + + +#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined(__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3)) || \ + (defined(__ghs__) && defined(__CORE_CORTEXM0PLUS__))) + +/* CY8C6347BZI-BLD53 interrupts that can be routed to the CM0+ NVIC */ +typedef enum { + ioss_interrupts_gpio_0_IRQn = 0, /*!< 0 [DeepSleep] GPIO Port Interrupt #0 */ + ioss_interrupts_gpio_1_IRQn = 1, /*!< 1 [DeepSleep] GPIO Port Interrupt #1 */ + ioss_interrupts_gpio_2_IRQn = 2, /*!< 2 [DeepSleep] GPIO Port Interrupt #2 */ + ioss_interrupts_gpio_3_IRQn = 3, /*!< 3 [DeepSleep] GPIO Port Interrupt #3 */ + ioss_interrupts_gpio_4_IRQn = 4, /*!< 4 [DeepSleep] GPIO Port Interrupt #4 */ + ioss_interrupts_gpio_5_IRQn = 5, /*!< 5 [DeepSleep] GPIO Port Interrupt #5 */ + ioss_interrupts_gpio_6_IRQn = 6, /*!< 6 [DeepSleep] GPIO Port Interrupt #6 */ + ioss_interrupts_gpio_7_IRQn = 7, /*!< 7 [DeepSleep] GPIO Port Interrupt #7 */ + ioss_interrupts_gpio_8_IRQn = 8, /*!< 8 [DeepSleep] GPIO Port Interrupt #8 */ + ioss_interrupts_gpio_9_IRQn = 9, /*!< 9 [DeepSleep] GPIO Port Interrupt #9 */ + ioss_interrupts_gpio_10_IRQn = 10, /*!< 10 [DeepSleep] GPIO Port Interrupt #10 */ + ioss_interrupts_gpio_11_IRQn = 11, /*!< 11 [DeepSleep] GPIO Port Interrupt #11 */ + ioss_interrupts_gpio_12_IRQn = 12, /*!< 12 [DeepSleep] GPIO Port Interrupt #12 */ + ioss_interrupts_gpio_13_IRQn = 13, /*!< 13 [DeepSleep] GPIO Port Interrupt #13 */ + ioss_interrupts_gpio_14_IRQn = 14, /*!< 14 [DeepSleep] GPIO Port Interrupt #14 */ + ioss_interrupt_gpio_IRQn = 15, /*!< 15 [DeepSleep] GPIO All Ports */ + ioss_interrupt_vdd_IRQn = 16, /*!< 16 [DeepSleep] GPIO Supply Detect Interrupt */ + lpcomp_interrupt_IRQn = 17, /*!< 17 [DeepSleep] Low Power Comparator Interrupt */ + scb_8_interrupt_IRQn = 18, /*!< 18 [DeepSleep] Serial Communication Block #8 (DeepSleep capable) */ + srss_interrupt_mcwdt_0_IRQn = 19, /*!< 19 [DeepSleep] Multi Counter Watchdog Timer interrupt */ + srss_interrupt_mcwdt_1_IRQn = 20, /*!< 20 [DeepSleep] Multi Counter Watchdog Timer interrupt */ + srss_interrupt_backup_IRQn = 21, /*!< 21 [DeepSleep] Backup domain interrupt */ + srss_interrupt_IRQn = 22, /*!< 22 [DeepSleep] Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + pass_interrupt_ctbs_IRQn = 23, /*!< 23 [DeepSleep] CTBm Interrupt (all CTBms) */ + bless_interrupt_IRQn = 24, /*!< 24 [DeepSleep] Bluetooth Radio interrupt */ + cpuss_interrupts_ipc_0_IRQn = 25, /*!< 25 [DeepSleep] CPUSS Inter Process Communication Interrupt #0 */ + cpuss_interrupts_ipc_1_IRQn = 26, /*!< 26 [DeepSleep] CPUSS Inter Process Communication Interrupt #1 */ + cpuss_interrupts_ipc_2_IRQn = 27, /*!< 27 [DeepSleep] CPUSS Inter Process Communication Interrupt #2 */ + cpuss_interrupts_ipc_3_IRQn = 28, /*!< 28 [DeepSleep] CPUSS Inter Process Communication Interrupt #3 */ + cpuss_interrupts_ipc_4_IRQn = 29, /*!< 29 [DeepSleep] CPUSS Inter Process Communication Interrupt #4 */ + cpuss_interrupts_ipc_5_IRQn = 30, /*!< 30 [DeepSleep] CPUSS Inter Process Communication Interrupt #5 */ + cpuss_interrupts_ipc_6_IRQn = 31, /*!< 31 [DeepSleep] CPUSS Inter Process Communication Interrupt #6 */ + cpuss_interrupts_ipc_7_IRQn = 32, /*!< 32 [DeepSleep] CPUSS Inter Process Communication Interrupt #7 */ + cpuss_interrupts_ipc_8_IRQn = 33, /*!< 33 [DeepSleep] CPUSS Inter Process Communication Interrupt #8 */ + cpuss_interrupts_ipc_9_IRQn = 34, /*!< 34 [DeepSleep] CPUSS Inter Process Communication Interrupt #9 */ + cpuss_interrupts_ipc_10_IRQn = 35, /*!< 35 [DeepSleep] CPUSS Inter Process Communication Interrupt #10 */ + cpuss_interrupts_ipc_11_IRQn = 36, /*!< 36 [DeepSleep] CPUSS Inter Process Communication Interrupt #11 */ + cpuss_interrupts_ipc_12_IRQn = 37, /*!< 37 [DeepSleep] CPUSS Inter Process Communication Interrupt #12 */ + cpuss_interrupts_ipc_13_IRQn = 38, /*!< 38 [DeepSleep] CPUSS Inter Process Communication Interrupt #13 */ + cpuss_interrupts_ipc_14_IRQn = 39, /*!< 39 [DeepSleep] CPUSS Inter Process Communication Interrupt #14 */ + cpuss_interrupts_ipc_15_IRQn = 40, /*!< 40 [DeepSleep] CPUSS Inter Process Communication Interrupt #15 */ + scb_0_interrupt_IRQn = 41, /*!< 41 [Active] Serial Communication Block #0 */ + scb_1_interrupt_IRQn = 42, /*!< 42 [Active] Serial Communication Block #1 */ + scb_2_interrupt_IRQn = 43, /*!< 43 [Active] Serial Communication Block #2 */ + scb_3_interrupt_IRQn = 44, /*!< 44 [Active] Serial Communication Block #3 */ + scb_4_interrupt_IRQn = 45, /*!< 45 [Active] Serial Communication Block #4 */ + scb_5_interrupt_IRQn = 46, /*!< 46 [Active] Serial Communication Block #5 */ + scb_6_interrupt_IRQn = 47, /*!< 47 [Active] Serial Communication Block #6 */ + scb_7_interrupt_IRQn = 48, /*!< 48 [Active] Serial Communication Block #7 */ + csd_interrupt_IRQn = 49, /*!< 49 [Active] CSD (Capsense) interrupt */ + cpuss_interrupts_dw0_0_IRQn = 50, /*!< 50 [Active] CPUSS DataWire #0, Channel #0 */ + cpuss_interrupts_dw0_1_IRQn = 51, /*!< 51 [Active] CPUSS DataWire #0, Channel #1 */ + cpuss_interrupts_dw0_2_IRQn = 52, /*!< 52 [Active] CPUSS DataWire #0, Channel #2 */ + cpuss_interrupts_dw0_3_IRQn = 53, /*!< 53 [Active] CPUSS DataWire #0, Channel #3 */ + cpuss_interrupts_dw0_4_IRQn = 54, /*!< 54 [Active] CPUSS DataWire #0, Channel #4 */ + cpuss_interrupts_dw0_5_IRQn = 55, /*!< 55 [Active] CPUSS DataWire #0, Channel #5 */ + cpuss_interrupts_dw0_6_IRQn = 56, /*!< 56 [Active] CPUSS DataWire #0, Channel #6 */ + cpuss_interrupts_dw0_7_IRQn = 57, /*!< 57 [Active] CPUSS DataWire #0, Channel #7 */ + cpuss_interrupts_dw0_8_IRQn = 58, /*!< 58 [Active] CPUSS DataWire #0, Channel #8 */ + cpuss_interrupts_dw0_9_IRQn = 59, /*!< 59 [Active] CPUSS DataWire #0, Channel #9 */ + cpuss_interrupts_dw0_10_IRQn = 60, /*!< 60 [Active] CPUSS DataWire #0, Channel #10 */ + cpuss_interrupts_dw0_11_IRQn = 61, /*!< 61 [Active] CPUSS DataWire #0, Channel #11 */ + cpuss_interrupts_dw0_12_IRQn = 62, /*!< 62 [Active] CPUSS DataWire #0, Channel #12 */ + cpuss_interrupts_dw0_13_IRQn = 63, /*!< 63 [Active] CPUSS DataWire #0, Channel #13 */ + cpuss_interrupts_dw0_14_IRQn = 64, /*!< 64 [Active] CPUSS DataWire #0, Channel #14 */ + cpuss_interrupts_dw0_15_IRQn = 65, /*!< 65 [Active] CPUSS DataWire #0, Channel #15 */ + cpuss_interrupts_dw1_0_IRQn = 66, /*!< 66 [Active] CPUSS DataWire #1, Channel #0 */ + cpuss_interrupts_dw1_1_IRQn = 67, /*!< 67 [Active] CPUSS DataWire #1, Channel #1 */ + cpuss_interrupts_dw1_2_IRQn = 68, /*!< 68 [Active] CPUSS DataWire #1, Channel #2 */ + cpuss_interrupts_dw1_3_IRQn = 69, /*!< 69 [Active] CPUSS DataWire #1, Channel #3 */ + cpuss_interrupts_dw1_4_IRQn = 70, /*!< 70 [Active] CPUSS DataWire #1, Channel #4 */ + cpuss_interrupts_dw1_5_IRQn = 71, /*!< 71 [Active] CPUSS DataWire #1, Channel #5 */ + cpuss_interrupts_dw1_6_IRQn = 72, /*!< 72 [Active] CPUSS DataWire #1, Channel #6 */ + cpuss_interrupts_dw1_7_IRQn = 73, /*!< 73 [Active] CPUSS DataWire #1, Channel #7 */ + cpuss_interrupts_dw1_8_IRQn = 74, /*!< 74 [Active] CPUSS DataWire #1, Channel #8 */ + cpuss_interrupts_dw1_9_IRQn = 75, /*!< 75 [Active] CPUSS DataWire #1, Channel #9 */ + cpuss_interrupts_dw1_10_IRQn = 76, /*!< 76 [Active] CPUSS DataWire #1, Channel #10 */ + cpuss_interrupts_dw1_11_IRQn = 77, /*!< 77 [Active] CPUSS DataWire #1, Channel #11 */ + cpuss_interrupts_dw1_12_IRQn = 78, /*!< 78 [Active] CPUSS DataWire #1, Channel #12 */ + cpuss_interrupts_dw1_13_IRQn = 79, /*!< 79 [Active] CPUSS DataWire #1, Channel #13 */ + cpuss_interrupts_dw1_14_IRQn = 80, /*!< 80 [Active] CPUSS DataWire #1, Channel #14 */ + cpuss_interrupts_dw1_15_IRQn = 81, /*!< 81 [Active] CPUSS DataWire #1, Channel #15 */ + cpuss_interrupts_fault_0_IRQn = 82, /*!< 82 [Active] CPUSS Fault Structure Interrupt #0 */ + cpuss_interrupts_fault_1_IRQn = 83, /*!< 83 [Active] CPUSS Fault Structure Interrupt #1 */ + cpuss_interrupt_crypto_IRQn = 84, /*!< 84 [Active] CRYPTO Accelerator Interrupt */ + cpuss_interrupt_fm_IRQn = 85, /*!< 85 [Active] FLASH Macro Interrupt */ + cpuss_interrupts_cm0_cti_0_IRQn = 86, /*!< 86 [Active] CM0+ CTI #0 */ + cpuss_interrupts_cm0_cti_1_IRQn = 87, /*!< 87 [Active] CM0+ CTI #1 */ + cpuss_interrupts_cm4_cti_0_IRQn = 88, /*!< 88 [Active] CM4 CTI #0 */ + cpuss_interrupts_cm4_cti_1_IRQn = 89, /*!< 89 [Active] CM4 CTI #1 */ + tcpwm_0_interrupts_0_IRQn = 90, /*!< 90 [Active] TCPWM #0, Counter #0 */ + tcpwm_0_interrupts_1_IRQn = 91, /*!< 91 [Active] TCPWM #0, Counter #1 */ + tcpwm_0_interrupts_2_IRQn = 92, /*!< 92 [Active] TCPWM #0, Counter #2 */ + tcpwm_0_interrupts_3_IRQn = 93, /*!< 93 [Active] TCPWM #0, Counter #3 */ + tcpwm_0_interrupts_4_IRQn = 94, /*!< 94 [Active] TCPWM #0, Counter #4 */ + tcpwm_0_interrupts_5_IRQn = 95, /*!< 95 [Active] TCPWM #0, Counter #5 */ + tcpwm_0_interrupts_6_IRQn = 96, /*!< 96 [Active] TCPWM #0, Counter #6 */ + tcpwm_0_interrupts_7_IRQn = 97, /*!< 97 [Active] TCPWM #0, Counter #7 */ + tcpwm_1_interrupts_0_IRQn = 98, /*!< 98 [Active] TCPWM #1, Counter #0 */ + tcpwm_1_interrupts_1_IRQn = 99, /*!< 99 [Active] TCPWM #1, Counter #1 */ + tcpwm_1_interrupts_2_IRQn = 100, /*!< 100 [Active] TCPWM #1, Counter #2 */ + tcpwm_1_interrupts_3_IRQn = 101, /*!< 101 [Active] TCPWM #1, Counter #3 */ + tcpwm_1_interrupts_4_IRQn = 102, /*!< 102 [Active] TCPWM #1, Counter #4 */ + tcpwm_1_interrupts_5_IRQn = 103, /*!< 103 [Active] TCPWM #1, Counter #5 */ + tcpwm_1_interrupts_6_IRQn = 104, /*!< 104 [Active] TCPWM #1, Counter #6 */ + tcpwm_1_interrupts_7_IRQn = 105, /*!< 105 [Active] TCPWM #1, Counter #7 */ + tcpwm_1_interrupts_8_IRQn = 106, /*!< 106 [Active] TCPWM #1, Counter #8 */ + tcpwm_1_interrupts_9_IRQn = 107, /*!< 107 [Active] TCPWM #1, Counter #9 */ + tcpwm_1_interrupts_10_IRQn = 108, /*!< 108 [Active] TCPWM #1, Counter #10 */ + tcpwm_1_interrupts_11_IRQn = 109, /*!< 109 [Active] TCPWM #1, Counter #11 */ + tcpwm_1_interrupts_12_IRQn = 110, /*!< 110 [Active] TCPWM #1, Counter #12 */ + tcpwm_1_interrupts_13_IRQn = 111, /*!< 111 [Active] TCPWM #1, Counter #13 */ + tcpwm_1_interrupts_14_IRQn = 112, /*!< 112 [Active] TCPWM #1, Counter #14 */ + tcpwm_1_interrupts_15_IRQn = 113, /*!< 113 [Active] TCPWM #1, Counter #15 */ + tcpwm_1_interrupts_16_IRQn = 114, /*!< 114 [Active] TCPWM #1, Counter #16 */ + tcpwm_1_interrupts_17_IRQn = 115, /*!< 115 [Active] TCPWM #1, Counter #17 */ + tcpwm_1_interrupts_18_IRQn = 116, /*!< 116 [Active] TCPWM #1, Counter #18 */ + tcpwm_1_interrupts_19_IRQn = 117, /*!< 117 [Active] TCPWM #1, Counter #19 */ + tcpwm_1_interrupts_20_IRQn = 118, /*!< 118 [Active] TCPWM #1, Counter #20 */ + tcpwm_1_interrupts_21_IRQn = 119, /*!< 119 [Active] TCPWM #1, Counter #21 */ + tcpwm_1_interrupts_22_IRQn = 120, /*!< 120 [Active] TCPWM #1, Counter #22 */ + tcpwm_1_interrupts_23_IRQn = 121, /*!< 121 [Active] TCPWM #1, Counter #23 */ + udb_interrupts_0_IRQn = 122, /*!< 122 [Active] UDB Interrupt #0 */ + udb_interrupts_1_IRQn = 123, /*!< 123 [Active] UDB Interrupt #1 */ + udb_interrupts_2_IRQn = 124, /*!< 124 [Active] UDB Interrupt #2 */ + udb_interrupts_3_IRQn = 125, /*!< 125 [Active] UDB Interrupt #3 */ + udb_interrupts_4_IRQn = 126, /*!< 126 [Active] UDB Interrupt #4 */ + udb_interrupts_5_IRQn = 127, /*!< 127 [Active] UDB Interrupt #5 */ + udb_interrupts_6_IRQn = 128, /*!< 128 [Active] UDB Interrupt #6 */ + udb_interrupts_7_IRQn = 129, /*!< 129 [Active] UDB Interrupt #7 */ + udb_interrupts_8_IRQn = 130, /*!< 130 [Active] UDB Interrupt #8 */ + udb_interrupts_9_IRQn = 131, /*!< 131 [Active] UDB Interrupt #9 */ + udb_interrupts_10_IRQn = 132, /*!< 132 [Active] UDB Interrupt #10 */ + udb_interrupts_11_IRQn = 133, /*!< 133 [Active] UDB Interrupt #11 */ + udb_interrupts_12_IRQn = 134, /*!< 134 [Active] UDB Interrupt #12 */ + udb_interrupts_13_IRQn = 135, /*!< 135 [Active] UDB Interrupt #13 */ + udb_interrupts_14_IRQn = 136, /*!< 136 [Active] UDB Interrupt #14 */ + udb_interrupts_15_IRQn = 137, /*!< 137 [Active] UDB Interrupt #15 */ + pass_interrupt_sar_IRQn = 138, /*!< 138 [Active] SAR ADC interrupt */ + audioss_interrupt_i2s_IRQn = 139, /*!< 139 [Active] I2S Audio interrupt */ + audioss_interrupt_pdm_IRQn = 140, /*!< 140 [Active] PDM/PCM Audio interrupt */ + profile_interrupt_IRQn = 141, /*!< 141 [Active] Energy Profiler interrupt */ + smif_interrupt_IRQn = 142, /*!< 142 [Active] Serial Memory Interface interrupt */ + usb_interrupt_hi_IRQn = 143, /*!< 143 [Active] USB Interrupt */ + usb_interrupt_med_IRQn = 144, /*!< 144 [Active] USB Interrupt */ + usb_interrupt_lo_IRQn = 145, /*!< 145 [Active] USB Interrupt */ + pass_interrupt_dacs_IRQn = 146, /*!< 146 [Active] Consolidated interrrupt for all DACs */ + disconnected_IRQn = 240 /*!< 240 Disconnected */ +} cy_en_intr_t; + +#endif + +/******************************************************************************* +* Processor and Core Peripheral Section +*******************************************************************************/ + +#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined(__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3)) || \ + (defined(__ghs__) && defined(__CORE_CORTEXM0PLUS__))) + +/* Configuration of the ARM Cortex-M0+ Processor and Core Peripherals */ +#define __CM0PLUS_REV 0x0001U /*!< CM0PLUS Core Revision */ +#define __NVIC_PRIO_BITS 2 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#define __VTOR_PRESENT 1 /*!< Set to 1 if CPU supports Vector Table Offset Register */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ + +/** \} Configuration_of_CMSIS */ + +#include "core_cm0plus.h" /*!< ARM Cortex-M0+ processor and core peripherals */ +#include "system_psoc63.h" /*!< PSoC 63 System */ + +#else + +/* Configuration of the ARM Cortex-M4 Processor and Core Peripherals */ +#define __CM4_REV 0x0001U /*!< CM4 Core Revision */ +#define __NVIC_PRIO_BITS 3 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#define __VTOR_PRESENT 1 /*!< Set to 1 if CPU supports Vector Table Offset Register */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ +#define __FPU_PRESENT 1 /*!< FPU present or not */ + +/** \} Configuration_of_CMSIS */ + +#include "core_cm4.h" /*!< ARM Cortex-M4 processor and core peripherals */ +#include "system_psoc63.h" /*!< PSoC 63 System */ + +#endif + +#include "psoc63_config.h" +#include "gpio_psoc63_116_bga_ble.h" + +/* Memory Blocks */ +#define CY_ROM_BASE 0x00000000UL +#define CY_ROM_SIZE 0x00020000UL +#define CY_SRAM0_BASE 0x08000000UL +#define CY_SRAM0_SIZE 0x00048000UL +#define CY_FLASH_BASE 0x10000000UL +#define CY_FLASH_SIZE 0x00100000UL +#define CY_WFLASH_BASE 0x14000000UL +#define CY_WFLASH_SIZE 0x00008000UL +#define CY_XIP_BASE 0x18000000UL +#define CY_XIP_SIZE 0x08000000UL +#define CY_SFLASH_BASE 0x16000000UL +#define CY_SFLASH_SIZE 0x00008000UL +#define CY_EFUSE_BASE 0x402C0800UL +#define CY_EFUSE_SIZE 0x000000C8UL + +#define CY_SILICON_ID 0xE2072100UL + +#define CY_HF_CLK_MAX_FREQ 150000000UL + +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB_GET_EZ_DATA_NR(base) 256u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB_IS_I2C_SLAVE_CAPABLE(base) true +/* I2C master support? ('0': no, '1': yes) */ +#define SCB_IS_I2C_MASTER_CAPABLE(base) ((base) != SCB8) +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB_IS_I2C_DS_CAPABLE(base) ((base) == SCB8) +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB_IS_SPI_SLAVE_CAPABLE(base) true +/* SPI master support? ('0': no, '1': yes) */ +#define SCB_IS_SPI_MASTER_CAPABLE(base) ((base) != SCB8) +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB_IS_SPI_DS_CAPABLE(base) ((base) == SCB8) +/* UART support? ('0': no, '1': yes) */ +#define SCB_IS_UART_CAPABLE(base) ((base) != SCB8) + +/* IP List */ +#define CY_IP_MXTCPWM 1u +#define CY_IP_MXTCPWM_INSTANCES 2u +#define CY_IP_MXTCPWM_VERSION 1u +#define CY_IP_MXCSDV2 1u +#define CY_IP_MXCSDV2_INSTANCES 1u +#define CY_IP_MXCSDV2_VERSION 1u +#define CY_IP_MXLCD 1u +#define CY_IP_MXLCD_INSTANCES 1u +#define CY_IP_MXLCD_VERSION 1u +#define CY_IP_MXS40SRSS 1u +#define CY_IP_MXS40SRSS_INSTANCES 1u +#define CY_IP_MXS40SRSS_VERSION 1u +#define CY_IP_MXS40SRSS_RTC 1u +#define CY_IP_MXS40SRSS_RTC_INSTANCES 1u +#define CY_IP_MXS40SRSS_RTC_VERSION 1u +#define CY_IP_MXS40SRSS_MCWDT 1u +#define CY_IP_MXS40SRSS_MCWDT_INSTANCES 2u +#define CY_IP_MXS40SRSS_MCWDT_VERSION 1u +#define CY_IP_MXSCB 1u +#define CY_IP_MXSCB_INSTANCES 9u +#define CY_IP_MXSCB_VERSION 1u +#define CY_IP_MXPERI 1u +#define CY_IP_MXPERI_INSTANCES 1u +#define CY_IP_MXPERI_VERSION 1u +#define CY_IP_MXPERI_TR 1u +#define CY_IP_MXPERI_TR_INSTANCES 1u +#define CY_IP_MXPERI_TR_VERSION 1u +#define CY_IP_M4CPUSS 1u +#define CY_IP_M4CPUSS_INSTANCES 1u +#define CY_IP_M4CPUSS_VERSION 1u +#define CY_IP_M4CPUSS_DMA 1u +#define CY_IP_M4CPUSS_DMA_INSTANCES 2u +#define CY_IP_M4CPUSS_DMA_VERSION 1u +#define CY_IP_MXCRYPTO 1u +#define CY_IP_MXCRYPTO_INSTANCES 1u +#define CY_IP_MXCRYPTO_VERSION 1u +#define CY_IP_MXBLESS 1u +#define CY_IP_MXBLESS_INSTANCES 1u +#define CY_IP_MXBLESS_VERSION 1u +#define CY_IP_MXAUDIOSS 1u +#define CY_IP_MXAUDIOSS_INSTANCES 1u +#define CY_IP_MXAUDIOSS_VERSION 1u +#define CY_IP_MXLPCOMP 1u +#define CY_IP_MXLPCOMP_INSTANCES 1u +#define CY_IP_MXLPCOMP_VERSION 1u +#define CY_IP_MXS40PASS 1u +#define CY_IP_MXS40PASS_INSTANCES 1u +#define CY_IP_MXS40PASS_VERSION 1u +#define CY_IP_MXS40PASS_SAR 1u +#define CY_IP_MXS40PASS_SAR_INSTANCES 16u +#define CY_IP_MXS40PASS_SAR_VERSION 1u +#define CY_IP_MXS40PASS_CTDAC 1u +#define CY_IP_MXS40PASS_CTDAC_INSTANCES 1u +#define CY_IP_MXS40PASS_CTDAC_VERSION 1u +#define CY_IP_MXS40PASS_CTB 1u +#define CY_IP_MXS40PASS_CTB_INSTANCES 1u +#define CY_IP_MXS40PASS_CTB_VERSION 1u +#define CY_IP_MXSMIF 1u +#define CY_IP_MXSMIF_INSTANCES 1u +#define CY_IP_MXSMIF_VERSION 1u +#define CY_IP_MXS40IOSS 1u +#define CY_IP_MXS40IOSS_INSTANCES 1u +#define CY_IP_MXS40IOSS_VERSION 1u +#define CY_IP_MXEFUSE 1u +#define CY_IP_MXEFUSE_INSTANCES 1u +#define CY_IP_MXEFUSE_VERSION 1u +#define CY_IP_MXUDB 1u +#define CY_IP_MXUDB_INSTANCES 1u +#define CY_IP_MXUDB_VERSION 1u +#define CY_IP_MXPROFILE 1u +#define CY_IP_MXPROFILE_INSTANCES 1u +#define CY_IP_MXPROFILE_VERSION 1u + +/* Include IP definitions */ +#include "cyip_sflash.h" +#include "cyip_peri.h" +#include "cyip_crypto.h" +#include "cyip_cpuss.h" +#include "cyip_fault.h" +#include "cyip_ipc.h" +#include "cyip_prot.h" +#include "cyip_flashc.h" +#include "cyip_srss.h" +#include "cyip_backup.h" +#include "cyip_dw.h" +#include "cyip_efuse.h" +#include "cyip_profile.h" +#include "cyip_hsiom.h" +#include "cyip_gpio.h" +#include "cyip_smartio.h" +#include "cyip_udb.h" +#include "cyip_lpcomp.h" +#include "cyip_csd.h" +#include "cyip_tcpwm.h" +#include "cyip_lcd.h" +#include "cyip_ble.h" +#include "cyip_smif.h" +#include "cyip_scb.h" +#include "cyip_ctbm.h" +#include "cyip_ctdac.h" +#include "cyip_sar.h" +#include "cyip_pass.h" +#include "cyip_i2s.h" +#include "cyip_pdm.h" + +/******************************************************************************* +* SFLASH +*******************************************************************************/ + +#define SFLASH_BASE 0x16000000UL +#define SFLASH ((SFLASH_Type*) SFLASH_BASE) /* 0x16000000 */ + +/******************************************************************************* +* PERI +*******************************************************************************/ + +#define PERI_BASE 0x40010000UL +#define PERI_PPU_GR_MMIO0_BASE 0x40015000UL +#define PERI_PPU_GR_MMIO1_BASE 0x40015040UL +#define PERI_PPU_GR_MMIO2_BASE 0x40015080UL +#define PERI_PPU_GR_MMIO3_BASE 0x400150C0UL +#define PERI_PPU_GR_MMIO4_BASE 0x40015100UL +#define PERI_PPU_GR_MMIO6_BASE 0x40015180UL +#define PERI_PPU_GR_MMIO9_BASE 0x40015240UL +#define PERI_PPU_GR_MMIO10_BASE 0x40015280UL +#define PERI_GR_PPU_SL_PERI_GR1_BASE 0x40100000UL +#define PERI_GR_PPU_SL_CRYPTO_BASE 0x40100040UL +#define PERI_GR_PPU_SL_PERI_GR2_BASE 0x40200000UL +#define PERI_GR_PPU_SL_CPUSS_BASE 0x40200040UL +#define PERI_GR_PPU_SL_FAULT_BASE 0x40200080UL +#define PERI_GR_PPU_SL_IPC_BASE 0x402000C0UL +#define PERI_GR_PPU_SL_PROT_BASE 0x40200100UL +#define PERI_GR_PPU_SL_FLASHC_BASE 0x40200140UL +#define PERI_GR_PPU_SL_SRSS_BASE 0x40200180UL +#define PERI_GR_PPU_SL_BACKUP_BASE 0x402001C0UL +#define PERI_GR_PPU_SL_DW0_BASE 0x40200200UL +#define PERI_GR_PPU_SL_DW1_BASE 0x40200240UL +#define PERI_GR_PPU_SL_EFUSE_BASE 0x40200300UL +#define PERI_GR_PPU_SL_PROFILE_BASE 0x40200340UL +#define PERI_GR_PPU_RG_IPC_STRUCT0_BASE 0x40201000UL +#define PERI_GR_PPU_RG_IPC_STRUCT1_BASE 0x40201040UL +#define PERI_GR_PPU_RG_IPC_STRUCT2_BASE 0x40201080UL +#define PERI_GR_PPU_RG_IPC_STRUCT3_BASE 0x402010C0UL +#define PERI_GR_PPU_RG_IPC_STRUCT4_BASE 0x40201100UL +#define PERI_GR_PPU_RG_IPC_STRUCT5_BASE 0x40201140UL +#define PERI_GR_PPU_RG_IPC_STRUCT6_BASE 0x40201180UL +#define PERI_GR_PPU_RG_IPC_STRUCT7_BASE 0x402011C0UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT0_BASE 0x40201200UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT1_BASE 0x40201240UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT2_BASE 0x40201280UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT3_BASE 0x402012C0UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT4_BASE 0x40201300UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT5_BASE 0x40201340UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT6_BASE 0x40201380UL +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT7_BASE 0x402013C0UL +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT0_BASE 0x40201400UL +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT1_BASE 0x40201440UL +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT2_BASE 0x40201480UL +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT3_BASE 0x402014C0UL +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT0_BASE 0x40201500UL +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT1_BASE 0x40201540UL +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT2_BASE 0x40201580UL +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT3_BASE 0x402015C0UL +#define PERI_GR_PPU_RG_SMPU_BASE 0x40201600UL +#define PERI_GR_PPU_RG_MPU_CM0P_BASE 0x40201640UL +#define PERI_GR_PPU_RG_MPU_CRYPTO_BASE 0x40201680UL +#define PERI_GR_PPU_RG_MPU_CM4_BASE 0x402016C0UL +#define PERI_GR_PPU_RG_MPU_TC_BASE 0x40201700UL +#define PERI_GR_PPU_SL_PERI_GR3_BASE 0x40300000UL +#define PERI_GR_PPU_SL_HSIOM_BASE 0x40300040UL +#define PERI_GR_PPU_SL_GPIO_BASE 0x40300080UL +#define PERI_GR_PPU_SL_SMARTIO_BASE 0x403000C0UL +#define PERI_GR_PPU_SL_UDB_BASE 0x40300100UL +#define PERI_GR_PPU_SL_LPCOMP_BASE 0x40300140UL +#define PERI_GR_PPU_SL_CSD_BASE 0x40300180UL +#define PERI_GR_PPU_SL_TCPWM0_BASE 0x40300200UL +#define PERI_GR_PPU_SL_TCPWM1_BASE 0x40300240UL +#define PERI_GR_PPU_SL_LCD_BASE 0x40300280UL +#define PERI_GR_PPU_SL_BLE_BASE 0x403002C0UL +#define PERI_GR_PPU_SL_USBFS_BASE 0x40300300UL +#define PERI_GR_PPU_SL_PERI_GR4_BASE 0x40400000UL +#define PERI_GR_PPU_SL_SMIF_BASE 0x40400080UL +#define PERI_GR_PPU_SL_PERI_GR6_BASE 0x40600000UL +#define PERI_GR_PPU_SL_SCB0_BASE 0x40600040UL +#define PERI_GR_PPU_SL_SCB1_BASE 0x40600080UL +#define PERI_GR_PPU_SL_SCB2_BASE 0x406000C0UL +#define PERI_GR_PPU_SL_SCB3_BASE 0x40600100UL +#define PERI_GR_PPU_SL_SCB4_BASE 0x40600140UL +#define PERI_GR_PPU_SL_SCB5_BASE 0x40600180UL +#define PERI_GR_PPU_SL_SCB6_BASE 0x406001C0UL +#define PERI_GR_PPU_SL_SCB7_BASE 0x40600200UL +#define PERI_GR_PPU_SL_SCB8_BASE 0x40600240UL +#define PERI_GR_PPU_SL_PERI_GR9_BASE 0x41000000UL +#define PERI_GR_PPU_SL_PASS_BASE 0x41000040UL +#define PERI_GR_PPU_SL_PERI_GR10_BASE 0x42A00000UL +#define PERI_GR_PPU_SL_I2S_BASE 0x42A00040UL +#define PERI_GR_PPU_SL_PDM_BASE 0x42A00080UL +#define PERI ((PERI_Type*) PERI_BASE) /* 0x40010000 */ +#define PERI_GR0 ((PERI_GR_Type*) &PERI->GR[0]) /* 0x40010000 */ +#define PERI_GR1 ((PERI_GR_Type*) &PERI->GR[1]) /* 0x40010040 */ +#define PERI_GR2 ((PERI_GR_Type*) &PERI->GR[2]) /* 0x40010080 */ +#define PERI_GR3 ((PERI_GR_Type*) &PERI->GR[3]) /* 0x400100C0 */ +#define PERI_GR4 ((PERI_GR_Type*) &PERI->GR[4]) /* 0x40010100 */ +#define PERI_GR6 ((PERI_GR_Type*) &PERI->GR[6]) /* 0x40010180 */ +#define PERI_GR9 ((PERI_GR_Type*) &PERI->GR[9]) /* 0x40010240 */ +#define PERI_GR10 ((PERI_GR_Type*) &PERI->GR[10]) /* 0x40010280 */ +#define PERI_TR_GR0 ((PERI_TR_GR_Type*) &PERI->TR_GR[0]) /* 0x40012000 */ +#define PERI_TR_GR1 ((PERI_TR_GR_Type*) &PERI->TR_GR[1]) /* 0x40012200 */ +#define PERI_TR_GR2 ((PERI_TR_GR_Type*) &PERI->TR_GR[2]) /* 0x40012400 */ +#define PERI_TR_GR3 ((PERI_TR_GR_Type*) &PERI->TR_GR[3]) /* 0x40012600 */ +#define PERI_TR_GR4 ((PERI_TR_GR_Type*) &PERI->TR_GR[4]) /* 0x40012800 */ +#define PERI_TR_GR5 ((PERI_TR_GR_Type*) &PERI->TR_GR[5]) /* 0x40012A00 */ +#define PERI_TR_GR6 ((PERI_TR_GR_Type*) &PERI->TR_GR[6]) /* 0x40012C00 */ +#define PERI_TR_GR7 ((PERI_TR_GR_Type*) &PERI->TR_GR[7]) /* 0x40012E00 */ +#define PERI_TR_GR8 ((PERI_TR_GR_Type*) &PERI->TR_GR[8]) /* 0x40013000 */ +#define PERI_TR_GR9 ((PERI_TR_GR_Type*) &PERI->TR_GR[9]) /* 0x40013200 */ +#define PERI_TR_GR10 ((PERI_TR_GR_Type*) &PERI->TR_GR[10]) /* 0x40013400 */ +#define PERI_TR_GR11 ((PERI_TR_GR_Type*) &PERI->TR_GR[11]) /* 0x40013600 */ +#define PERI_TR_GR12 ((PERI_TR_GR_Type*) &PERI->TR_GR[12]) /* 0x40013800 */ +#define PERI_TR_GR13 ((PERI_TR_GR_Type*) &PERI->TR_GR[13]) /* 0x40013A00 */ +#define PERI_TR_GR14 ((PERI_TR_GR_Type*) &PERI->TR_GR[14]) /* 0x40013C00 */ +#define PERI_PPU_PR0 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[0]) /* 0x40014000 */ +#define PERI_PPU_PR1 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[1]) /* 0x40014040 */ +#define PERI_PPU_PR2 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[2]) /* 0x40014080 */ +#define PERI_PPU_PR3 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[3]) /* 0x400140C0 */ +#define PERI_PPU_PR4 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[4]) /* 0x40014100 */ +#define PERI_PPU_PR5 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[5]) /* 0x40014140 */ +#define PERI_PPU_PR6 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[6]) /* 0x40014180 */ +#define PERI_PPU_PR7 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[7]) /* 0x400141C0 */ +#define PERI_PPU_PR8 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[8]) /* 0x40014200 */ +#define PERI_PPU_PR9 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[9]) /* 0x40014240 */ +#define PERI_PPU_PR10 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[10]) /* 0x40014280 */ +#define PERI_PPU_PR11 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[11]) /* 0x400142C0 */ +#define PERI_PPU_PR12 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[12]) /* 0x40014300 */ +#define PERI_PPU_PR13 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[13]) /* 0x40014340 */ +#define PERI_PPU_PR14 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[14]) /* 0x40014380 */ +#define PERI_PPU_PR15 ((PERI_PPU_PR_Type*) &PERI->PPU_PR[15]) /* 0x400143C0 */ +#define PERI_PPU_GR0 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[0]) /* 0x40015000 */ +#define PERI_PPU_GR1 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[1]) /* 0x40015040 */ +#define PERI_PPU_GR2 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[2]) /* 0x40015080 */ +#define PERI_PPU_GR3 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[3]) /* 0x400150C0 */ +#define PERI_PPU_GR4 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[4]) /* 0x40015100 */ +#define PERI_PPU_GR6 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[6]) /* 0x40015180 */ +#define PERI_PPU_GR9 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[9]) /* 0x40015240 */ +#define PERI_PPU_GR10 ((PERI_PPU_GR_Type*) &PERI->PPU_GR[10]) /* 0x40015280 */ +#define PERI_PPU_GR_MMIO0 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO0_BASE) /* 0x40015000 */ +#define PERI_PPU_GR_MMIO1 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO1_BASE) /* 0x40015040 */ +#define PERI_PPU_GR_MMIO2 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO2_BASE) /* 0x40015080 */ +#define PERI_PPU_GR_MMIO3 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO3_BASE) /* 0x400150C0 */ +#define PERI_PPU_GR_MMIO4 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO4_BASE) /* 0x40015100 */ +#define PERI_PPU_GR_MMIO6 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO6_BASE) /* 0x40015180 */ +#define PERI_PPU_GR_MMIO9 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO9_BASE) /* 0x40015240 */ +#define PERI_PPU_GR_MMIO10 ((PERI_PPU_GR_Type*) PERI_PPU_GR_MMIO10_BASE) /* 0x40015280 */ +#define PERI_GR_PPU_SL_PERI_GR1 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR1_BASE) /* 0x40100000 */ +#define PERI_GR_PPU_SL_CRYPTO ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_CRYPTO_BASE) /* 0x40100040 */ +#define PERI_GR_PPU_SL_PERI_GR2 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR2_BASE) /* 0x40200000 */ +#define PERI_GR_PPU_SL_CPUSS ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_CPUSS_BASE) /* 0x40200040 */ +#define PERI_GR_PPU_SL_FAULT ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_FAULT_BASE) /* 0x40200080 */ +#define PERI_GR_PPU_SL_IPC ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_IPC_BASE) /* 0x402000C0 */ +#define PERI_GR_PPU_SL_PROT ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PROT_BASE) /* 0x40200100 */ +#define PERI_GR_PPU_SL_FLASHC ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_FLASHC_BASE) /* 0x40200140 */ +#define PERI_GR_PPU_SL_SRSS ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SRSS_BASE) /* 0x40200180 */ +#define PERI_GR_PPU_SL_BACKUP ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_BACKUP_BASE) /* 0x402001C0 */ +#define PERI_GR_PPU_SL_DW0 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_DW0_BASE) /* 0x40200200 */ +#define PERI_GR_PPU_SL_DW1 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_DW1_BASE) /* 0x40200240 */ +#define PERI_GR_PPU_SL_EFUSE ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_EFUSE_BASE) /* 0x40200300 */ +#define PERI_GR_PPU_SL_PROFILE ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PROFILE_BASE) /* 0x40200340 */ +#define PERI_GR_PPU_RG_IPC_STRUCT0 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT0_BASE) /* 0x40201000 */ +#define PERI_GR_PPU_RG_IPC_STRUCT1 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT1_BASE) /* 0x40201040 */ +#define PERI_GR_PPU_RG_IPC_STRUCT2 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT2_BASE) /* 0x40201080 */ +#define PERI_GR_PPU_RG_IPC_STRUCT3 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT3_BASE) /* 0x402010C0 */ +#define PERI_GR_PPU_RG_IPC_STRUCT4 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT4_BASE) /* 0x40201100 */ +#define PERI_GR_PPU_RG_IPC_STRUCT5 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT5_BASE) /* 0x40201140 */ +#define PERI_GR_PPU_RG_IPC_STRUCT6 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT6_BASE) /* 0x40201180 */ +#define PERI_GR_PPU_RG_IPC_STRUCT7 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_STRUCT7_BASE) /* 0x402011C0 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT0 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT0_BASE) /* 0x40201200 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT1 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT1_BASE) /* 0x40201240 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT2 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT2_BASE) /* 0x40201280 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT3 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT3_BASE) /* 0x402012C0 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT4 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT4_BASE) /* 0x40201300 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT5 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT5_BASE) /* 0x40201340 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT6 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT6_BASE) /* 0x40201380 */ +#define PERI_GR_PPU_RG_IPC_INTR_STRUCT7 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_IPC_INTR_STRUCT7_BASE) /* 0x402013C0 */ +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT0 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW0_DW_CH_STRUCT0_BASE) /* 0x40201400 */ +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT1 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW0_DW_CH_STRUCT1_BASE) /* 0x40201440 */ +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT2 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW0_DW_CH_STRUCT2_BASE) /* 0x40201480 */ +#define PERI_GR_PPU_RG_DW0_DW_CH_STRUCT3 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW0_DW_CH_STRUCT3_BASE) /* 0x402014C0 */ +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT0 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW1_DW_CH_STRUCT0_BASE) /* 0x40201500 */ +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT1 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW1_DW_CH_STRUCT1_BASE) /* 0x40201540 */ +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT2 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW1_DW_CH_STRUCT2_BASE) /* 0x40201580 */ +#define PERI_GR_PPU_RG_DW1_DW_CH_STRUCT3 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_DW1_DW_CH_STRUCT3_BASE) /* 0x402015C0 */ +#define PERI_GR_PPU_RG_SMPU ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_SMPU_BASE) /* 0x40201600 */ +#define PERI_GR_PPU_RG_MPU_CM0P ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_MPU_CM0P_BASE) /* 0x40201640 */ +#define PERI_GR_PPU_RG_MPU_CRYPTO ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_MPU_CRYPTO_BASE) /* 0x40201680 */ +#define PERI_GR_PPU_RG_MPU_CM4 ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_MPU_CM4_BASE) /* 0x402016C0 */ +#define PERI_GR_PPU_RG_MPU_TC ((PERI_GR_PPU_RG_Type*) PERI_GR_PPU_RG_MPU_TC_BASE) /* 0x40201700 */ +#define PERI_GR_PPU_SL_PERI_GR3 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR3_BASE) /* 0x40300000 */ +#define PERI_GR_PPU_SL_HSIOM ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_HSIOM_BASE) /* 0x40300040 */ +#define PERI_GR_PPU_SL_GPIO ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_GPIO_BASE) /* 0x40300080 */ +#define PERI_GR_PPU_SL_SMARTIO ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SMARTIO_BASE) /* 0x403000C0 */ +#define PERI_GR_PPU_SL_UDB ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_UDB_BASE) /* 0x40300100 */ +#define PERI_GR_PPU_SL_LPCOMP ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_LPCOMP_BASE) /* 0x40300140 */ +#define PERI_GR_PPU_SL_CSD ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_CSD_BASE) /* 0x40300180 */ +#define PERI_GR_PPU_SL_TCPWM0 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_TCPWM0_BASE) /* 0x40300200 */ +#define PERI_GR_PPU_SL_TCPWM1 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_TCPWM1_BASE) /* 0x40300240 */ +#define PERI_GR_PPU_SL_LCD ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_LCD_BASE) /* 0x40300280 */ +#define PERI_GR_PPU_SL_BLE ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_BLE_BASE) /* 0x403002C0 */ +#define PERI_GR_PPU_SL_USBFS ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_USBFS_BASE) /* 0x40300300 */ +#define PERI_GR_PPU_SL_PERI_GR4 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR4_BASE) /* 0x40400000 */ +#define PERI_GR_PPU_SL_SMIF ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SMIF_BASE) /* 0x40400080 */ +#define PERI_GR_PPU_SL_PERI_GR6 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR6_BASE) /* 0x40600000 */ +#define PERI_GR_PPU_SL_SCB0 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB0_BASE) /* 0x40600040 */ +#define PERI_GR_PPU_SL_SCB1 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB1_BASE) /* 0x40600080 */ +#define PERI_GR_PPU_SL_SCB2 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB2_BASE) /* 0x406000C0 */ +#define PERI_GR_PPU_SL_SCB3 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB3_BASE) /* 0x40600100 */ +#define PERI_GR_PPU_SL_SCB4 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB4_BASE) /* 0x40600140 */ +#define PERI_GR_PPU_SL_SCB5 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB5_BASE) /* 0x40600180 */ +#define PERI_GR_PPU_SL_SCB6 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB6_BASE) /* 0x406001C0 */ +#define PERI_GR_PPU_SL_SCB7 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB7_BASE) /* 0x40600200 */ +#define PERI_GR_PPU_SL_SCB8 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_SCB8_BASE) /* 0x40600240 */ +#define PERI_GR_PPU_SL_PERI_GR9 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR9_BASE) /* 0x41000000 */ +#define PERI_GR_PPU_SL_PASS ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PASS_BASE) /* 0x41000040 */ +#define PERI_GR_PPU_SL_PERI_GR10 ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PERI_GR10_BASE) /* 0x42A00000 */ +#define PERI_GR_PPU_SL_I2S ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_I2S_BASE) /* 0x42A00040 */ +#define PERI_GR_PPU_SL_PDM ((PERI_GR_PPU_SL_Type*) PERI_GR_PPU_SL_PDM_BASE) /* 0x42A00080 */ + +/******************************************************************************* +* CRYPTO +*******************************************************************************/ + +#define CRYPTO_BASE 0x40110000UL +#define CRYPTO ((CRYPTO_Type*) CRYPTO_BASE) /* 0x40110000 */ + +/******************************************************************************* +* CPUSS +*******************************************************************************/ + +#define CPUSS_BASE 0x40210000UL +#define CPUSS ((CPUSS_Type*) CPUSS_BASE) /* 0x40210000 */ + +/******************************************************************************* +* FAULT +*******************************************************************************/ + +#define FAULT_BASE 0x40220000UL +#define FAULT ((FAULT_Type*) FAULT_BASE) /* 0x40220000 */ +#define FAULT_STRUCT0 ((FAULT_STRUCT_Type*) &FAULT->STRUCT[0]) /* 0x40220000 */ +#define FAULT_STRUCT1 ((FAULT_STRUCT_Type*) &FAULT->STRUCT[1]) /* 0x40220100 */ + +/******************************************************************************* +* IPC +*******************************************************************************/ + +#define IPC_BASE 0x40230000UL +#define IPC ((IPC_Type*) IPC_BASE) /* 0x40230000 */ +#define IPC_STRUCT0 ((IPC_STRUCT_Type*) &IPC->STRUCT[0]) /* 0x40230000 */ +#define IPC_STRUCT1 ((IPC_STRUCT_Type*) &IPC->STRUCT[1]) /* 0x40230020 */ +#define IPC_STRUCT2 ((IPC_STRUCT_Type*) &IPC->STRUCT[2]) /* 0x40230040 */ +#define IPC_STRUCT3 ((IPC_STRUCT_Type*) &IPC->STRUCT[3]) /* 0x40230060 */ +#define IPC_STRUCT4 ((IPC_STRUCT_Type*) &IPC->STRUCT[4]) /* 0x40230080 */ +#define IPC_STRUCT5 ((IPC_STRUCT_Type*) &IPC->STRUCT[5]) /* 0x402300A0 */ +#define IPC_STRUCT6 ((IPC_STRUCT_Type*) &IPC->STRUCT[6]) /* 0x402300C0 */ +#define IPC_STRUCT7 ((IPC_STRUCT_Type*) &IPC->STRUCT[7]) /* 0x402300E0 */ +#define IPC_STRUCT8 ((IPC_STRUCT_Type*) &IPC->STRUCT[8]) /* 0x40230100 */ +#define IPC_STRUCT9 ((IPC_STRUCT_Type*) &IPC->STRUCT[9]) /* 0x40230120 */ +#define IPC_STRUCT10 ((IPC_STRUCT_Type*) &IPC->STRUCT[10]) /* 0x40230140 */ +#define IPC_STRUCT11 ((IPC_STRUCT_Type*) &IPC->STRUCT[11]) /* 0x40230160 */ +#define IPC_STRUCT12 ((IPC_STRUCT_Type*) &IPC->STRUCT[12]) /* 0x40230180 */ +#define IPC_STRUCT13 ((IPC_STRUCT_Type*) &IPC->STRUCT[13]) /* 0x402301A0 */ +#define IPC_STRUCT14 ((IPC_STRUCT_Type*) &IPC->STRUCT[14]) /* 0x402301C0 */ +#define IPC_STRUCT15 ((IPC_STRUCT_Type*) &IPC->STRUCT[15]) /* 0x402301E0 */ +#define IPC_INTR_STRUCT0 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[0]) /* 0x40231000 */ +#define IPC_INTR_STRUCT1 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[1]) /* 0x40231020 */ +#define IPC_INTR_STRUCT2 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[2]) /* 0x40231040 */ +#define IPC_INTR_STRUCT3 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[3]) /* 0x40231060 */ +#define IPC_INTR_STRUCT4 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[4]) /* 0x40231080 */ +#define IPC_INTR_STRUCT5 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[5]) /* 0x402310A0 */ +#define IPC_INTR_STRUCT6 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[6]) /* 0x402310C0 */ +#define IPC_INTR_STRUCT7 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[7]) /* 0x402310E0 */ +#define IPC_INTR_STRUCT8 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[8]) /* 0x40231100 */ +#define IPC_INTR_STRUCT9 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[9]) /* 0x40231120 */ +#define IPC_INTR_STRUCT10 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[10]) /* 0x40231140 */ +#define IPC_INTR_STRUCT11 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[11]) /* 0x40231160 */ +#define IPC_INTR_STRUCT12 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[12]) /* 0x40231180 */ +#define IPC_INTR_STRUCT13 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[13]) /* 0x402311A0 */ +#define IPC_INTR_STRUCT14 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[14]) /* 0x402311C0 */ +#define IPC_INTR_STRUCT15 ((IPC_INTR_STRUCT_Type*) &IPC->INTR_STRUCT[15]) /* 0x402311E0 */ + +/******************************************************************************* +* PROT +*******************************************************************************/ + +#define PROT_BASE 0x40240000UL +#define PROT ((PROT_Type*) PROT_BASE) /* 0x40240000 */ +#define PROT_SMPU_SMPU_STRUCT0 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[0]) /* 0x40242000 */ +#define PROT_SMPU_SMPU_STRUCT1 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[1]) /* 0x40242040 */ +#define PROT_SMPU_SMPU_STRUCT2 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[2]) /* 0x40242080 */ +#define PROT_SMPU_SMPU_STRUCT3 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[3]) /* 0x402420C0 */ +#define PROT_SMPU_SMPU_STRUCT4 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[4]) /* 0x40242100 */ +#define PROT_SMPU_SMPU_STRUCT5 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[5]) /* 0x40242140 */ +#define PROT_SMPU_SMPU_STRUCT6 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[6]) /* 0x40242180 */ +#define PROT_SMPU_SMPU_STRUCT7 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[7]) /* 0x402421C0 */ +#define PROT_SMPU_SMPU_STRUCT8 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[8]) /* 0x40242200 */ +#define PROT_SMPU_SMPU_STRUCT9 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[9]) /* 0x40242240 */ +#define PROT_SMPU_SMPU_STRUCT10 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[10]) /* 0x40242280 */ +#define PROT_SMPU_SMPU_STRUCT11 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[11]) /* 0x402422C0 */ +#define PROT_SMPU_SMPU_STRUCT12 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[12]) /* 0x40242300 */ +#define PROT_SMPU_SMPU_STRUCT13 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[13]) /* 0x40242340 */ +#define PROT_SMPU_SMPU_STRUCT14 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[14]) /* 0x40242380 */ +#define PROT_SMPU_SMPU_STRUCT15 ((PROT_SMPU_SMPU_STRUCT_Type*) &PROT->SMPU.SMPU_STRUCT[15]) /* 0x402423C0 */ +#define PROT_SMPU ((PROT_SMPU_Type*) &PROT->SMPU) /* 0x40240000 */ +#define PROT_MPU1_MPU_STRUCT0 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[0]) /* 0x40244600 */ +#define PROT_MPU1_MPU_STRUCT1 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[1]) /* 0x40244620 */ +#define PROT_MPU1_MPU_STRUCT2 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[2]) /* 0x40244640 */ +#define PROT_MPU1_MPU_STRUCT3 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[3]) /* 0x40244660 */ +#define PROT_MPU1_MPU_STRUCT4 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[4]) /* 0x40244680 */ +#define PROT_MPU1_MPU_STRUCT5 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[5]) /* 0x402446A0 */ +#define PROT_MPU1_MPU_STRUCT6 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[6]) /* 0x402446C0 */ +#define PROT_MPU1_MPU_STRUCT7 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[1].MPU_STRUCT[7]) /* 0x402446E0 */ +#define PROT_MPU15_MPU_STRUCT0 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[0]) /* 0x40247E00 */ +#define PROT_MPU15_MPU_STRUCT1 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[1]) /* 0x40247E20 */ +#define PROT_MPU15_MPU_STRUCT2 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[2]) /* 0x40247E40 */ +#define PROT_MPU15_MPU_STRUCT3 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[3]) /* 0x40247E60 */ +#define PROT_MPU15_MPU_STRUCT4 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[4]) /* 0x40247E80 */ +#define PROT_MPU15_MPU_STRUCT5 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[5]) /* 0x40247EA0 */ +#define PROT_MPU15_MPU_STRUCT6 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[6]) /* 0x40247EC0 */ +#define PROT_MPU15_MPU_STRUCT7 ((PROT_MPU_MPU_STRUCT_Type*) &PROT->CYMPU[15].MPU_STRUCT[7]) /* 0x40247EE0 */ +#define PROT_MPU0 ((PROT_MPU_Type*) &PROT->CYMPU[0]) /* 0x40244000 */ +#define PROT_MPU1 ((PROT_MPU_Type*) &PROT->CYMPU[1]) /* 0x40244400 */ +#define PROT_MPU2 ((PROT_MPU_Type*) &PROT->CYMPU[2]) /* 0x40244800 */ +#define PROT_MPU3 ((PROT_MPU_Type*) &PROT->CYMPU[3]) /* 0x40244C00 */ +#define PROT_MPU4 ((PROT_MPU_Type*) &PROT->CYMPU[4]) /* 0x40245000 */ +#define PROT_MPU5 ((PROT_MPU_Type*) &PROT->CYMPU[5]) /* 0x40245400 */ +#define PROT_MPU6 ((PROT_MPU_Type*) &PROT->CYMPU[6]) /* 0x40245800 */ +#define PROT_MPU7 ((PROT_MPU_Type*) &PROT->CYMPU[7]) /* 0x40245C00 */ +#define PROT_MPU8 ((PROT_MPU_Type*) &PROT->CYMPU[8]) /* 0x40246000 */ +#define PROT_MPU9 ((PROT_MPU_Type*) &PROT->CYMPU[9]) /* 0x40246400 */ +#define PROT_MPU10 ((PROT_MPU_Type*) &PROT->CYMPU[10]) /* 0x40246800 */ +#define PROT_MPU11 ((PROT_MPU_Type*) &PROT->CYMPU[11]) /* 0x40246C00 */ +#define PROT_MPU12 ((PROT_MPU_Type*) &PROT->CYMPU[12]) /* 0x40247000 */ +#define PROT_MPU13 ((PROT_MPU_Type*) &PROT->CYMPU[13]) /* 0x40247400 */ +#define PROT_MPU14 ((PROT_MPU_Type*) &PROT->CYMPU[14]) /* 0x40247800 */ +#define PROT_MPU15 ((PROT_MPU_Type*) &PROT->CYMPU[15]) /* 0x40247C00 */ + +/******************************************************************************* +* FLASHC +*******************************************************************************/ + +#define FLASHC_BASE 0x40250000UL +#define FLASHC ((FLASHC_Type*) FLASHC_BASE) /* 0x40250000 */ +#define FLASHC_FM_CTL ((FLASHC_FM_CTL_Type*) &FLASHC->FM_CTL) /* 0x4025F000 */ + +/******************************************************************************* +* SRSS +*******************************************************************************/ + +#define SRSS_BASE 0x40260000UL +#define SRSS ((SRSS_Type*) SRSS_BASE) /* 0x40260000 */ +#define MCWDT_STRUCT0 ((MCWDT_STRUCT_Type*) &SRSS->MCWDT_STRUCT[0]) /* 0x40260200 */ +#define MCWDT_STRUCT1 ((MCWDT_STRUCT_Type*) &SRSS->MCWDT_STRUCT[1]) /* 0x40260240 */ + +/******************************************************************************* +* BACKUP +*******************************************************************************/ + +#define BACKUP_BASE 0x40270000UL +#define BACKUP ((BACKUP_Type*) BACKUP_BASE) /* 0x40270000 */ + +/******************************************************************************* +* DW +*******************************************************************************/ + +#define DW0_BASE 0x40280000UL +#define DW1_BASE 0x40281000UL +#define DW0 ((DW_Type*) DW0_BASE) /* 0x40280000 */ +#define DW1 ((DW_Type*) DW1_BASE) /* 0x40281000 */ +#define DW0_CH_STRUCT0 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[0]) /* 0x40280800 */ +#define DW0_CH_STRUCT1 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[1]) /* 0x40280820 */ +#define DW0_CH_STRUCT2 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[2]) /* 0x40280840 */ +#define DW0_CH_STRUCT3 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[3]) /* 0x40280860 */ +#define DW0_CH_STRUCT4 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[4]) /* 0x40280880 */ +#define DW0_CH_STRUCT5 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[5]) /* 0x402808A0 */ +#define DW0_CH_STRUCT6 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[6]) /* 0x402808C0 */ +#define DW0_CH_STRUCT7 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[7]) /* 0x402808E0 */ +#define DW0_CH_STRUCT8 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[8]) /* 0x40280900 */ +#define DW0_CH_STRUCT9 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[9]) /* 0x40280920 */ +#define DW0_CH_STRUCT10 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[10]) /* 0x40280940 */ +#define DW0_CH_STRUCT11 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[11]) /* 0x40280960 */ +#define DW0_CH_STRUCT12 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[12]) /* 0x40280980 */ +#define DW0_CH_STRUCT13 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[13]) /* 0x402809A0 */ +#define DW0_CH_STRUCT14 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[14]) /* 0x402809C0 */ +#define DW0_CH_STRUCT15 ((DW_CH_STRUCT_Type*) &DW0->CH_STRUCT[15]) /* 0x402809E0 */ +#define DW1_CH_STRUCT0 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[0]) /* 0x40281800 */ +#define DW1_CH_STRUCT1 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[1]) /* 0x40281820 */ +#define DW1_CH_STRUCT2 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[2]) /* 0x40281840 */ +#define DW1_CH_STRUCT3 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[3]) /* 0x40281860 */ +#define DW1_CH_STRUCT4 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[4]) /* 0x40281880 */ +#define DW1_CH_STRUCT5 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[5]) /* 0x402818A0 */ +#define DW1_CH_STRUCT6 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[6]) /* 0x402818C0 */ +#define DW1_CH_STRUCT7 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[7]) /* 0x402818E0 */ +#define DW1_CH_STRUCT8 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[8]) /* 0x40281900 */ +#define DW1_CH_STRUCT9 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[9]) /* 0x40281920 */ +#define DW1_CH_STRUCT10 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[10]) /* 0x40281940 */ +#define DW1_CH_STRUCT11 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[11]) /* 0x40281960 */ +#define DW1_CH_STRUCT12 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[12]) /* 0x40281980 */ +#define DW1_CH_STRUCT13 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[13]) /* 0x402819A0 */ +#define DW1_CH_STRUCT14 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[14]) /* 0x402819C0 */ +#define DW1_CH_STRUCT15 ((DW_CH_STRUCT_Type*) &DW1->CH_STRUCT[15]) /* 0x402819E0 */ + +/******************************************************************************* +* EFUSE +*******************************************************************************/ + +#define EFUSE_BASE 0x402C0000UL +#define EFUSE ((EFUSE_Type*) EFUSE_BASE) /* 0x402C0000 */ + +/******************************************************************************* +* PROFILE +*******************************************************************************/ + +#define PROFILE_BASE 0x402D0000UL +#define PROFILE ((PROFILE_Type*) PROFILE_BASE) /* 0x402D0000 */ +#define PROFILE_CNT_STRUCT0 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[0]) /* 0x402D0800 */ +#define PROFILE_CNT_STRUCT1 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[1]) /* 0x402D0810 */ +#define PROFILE_CNT_STRUCT2 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[2]) /* 0x402D0820 */ +#define PROFILE_CNT_STRUCT3 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[3]) /* 0x402D0830 */ +#define PROFILE_CNT_STRUCT4 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[4]) /* 0x402D0840 */ +#define PROFILE_CNT_STRUCT5 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[5]) /* 0x402D0850 */ +#define PROFILE_CNT_STRUCT6 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[6]) /* 0x402D0860 */ +#define PROFILE_CNT_STRUCT7 ((PROFILE_CNT_STRUCT_Type*) &PROFILE->CNT_STRUCT[7]) /* 0x402D0870 */ + +/******************************************************************************* +* HSIOM +*******************************************************************************/ + +#define HSIOM_BASE 0x40310000UL +#define HSIOM ((HSIOM_Type*) HSIOM_BASE) /* 0x40310000 */ +#define HSIOM_PRT0 ((HSIOM_PRT_Type*) &HSIOM->PRT[0]) /* 0x40310000 */ +#define HSIOM_PRT1 ((HSIOM_PRT_Type*) &HSIOM->PRT[1]) /* 0x40310010 */ +#define HSIOM_PRT2 ((HSIOM_PRT_Type*) &HSIOM->PRT[2]) /* 0x40310020 */ +#define HSIOM_PRT3 ((HSIOM_PRT_Type*) &HSIOM->PRT[3]) /* 0x40310030 */ +#define HSIOM_PRT4 ((HSIOM_PRT_Type*) &HSIOM->PRT[4]) /* 0x40310040 */ +#define HSIOM_PRT5 ((HSIOM_PRT_Type*) &HSIOM->PRT[5]) /* 0x40310050 */ +#define HSIOM_PRT6 ((HSIOM_PRT_Type*) &HSIOM->PRT[6]) /* 0x40310060 */ +#define HSIOM_PRT7 ((HSIOM_PRT_Type*) &HSIOM->PRT[7]) /* 0x40310070 */ +#define HSIOM_PRT8 ((HSIOM_PRT_Type*) &HSIOM->PRT[8]) /* 0x40310080 */ +#define HSIOM_PRT9 ((HSIOM_PRT_Type*) &HSIOM->PRT[9]) /* 0x40310090 */ +#define HSIOM_PRT10 ((HSIOM_PRT_Type*) &HSIOM->PRT[10]) /* 0x403100A0 */ +#define HSIOM_PRT11 ((HSIOM_PRT_Type*) &HSIOM->PRT[11]) /* 0x403100B0 */ +#define HSIOM_PRT12 ((HSIOM_PRT_Type*) &HSIOM->PRT[12]) /* 0x403100C0 */ +#define HSIOM_PRT13 ((HSIOM_PRT_Type*) &HSIOM->PRT[13]) /* 0x403100D0 */ +#define HSIOM_PRT14 ((HSIOM_PRT_Type*) &HSIOM->PRT[14]) /* 0x403100E0 */ + +/******************************************************************************* +* GPIO +*******************************************************************************/ + +#define GPIO_BASE 0x40320000UL +#define GPIO ((GPIO_Type*) GPIO_BASE) /* 0x40320000 */ +#define GPIO_PRT0 ((GPIO_PRT_Type*) &GPIO->PRT[0]) /* 0x40320000 */ +#define GPIO_PRT1 ((GPIO_PRT_Type*) &GPIO->PRT[1]) /* 0x40320080 */ +#define GPIO_PRT2 ((GPIO_PRT_Type*) &GPIO->PRT[2]) /* 0x40320100 */ +#define GPIO_PRT3 ((GPIO_PRT_Type*) &GPIO->PRT[3]) /* 0x40320180 */ +#define GPIO_PRT4 ((GPIO_PRT_Type*) &GPIO->PRT[4]) /* 0x40320200 */ +#define GPIO_PRT5 ((GPIO_PRT_Type*) &GPIO->PRT[5]) /* 0x40320280 */ +#define GPIO_PRT6 ((GPIO_PRT_Type*) &GPIO->PRT[6]) /* 0x40320300 */ +#define GPIO_PRT7 ((GPIO_PRT_Type*) &GPIO->PRT[7]) /* 0x40320380 */ +#define GPIO_PRT8 ((GPIO_PRT_Type*) &GPIO->PRT[8]) /* 0x40320400 */ +#define GPIO_PRT9 ((GPIO_PRT_Type*) &GPIO->PRT[9]) /* 0x40320480 */ +#define GPIO_PRT10 ((GPIO_PRT_Type*) &GPIO->PRT[10]) /* 0x40320500 */ +#define GPIO_PRT11 ((GPIO_PRT_Type*) &GPIO->PRT[11]) /* 0x40320580 */ +#define GPIO_PRT12 ((GPIO_PRT_Type*) &GPIO->PRT[12]) /* 0x40320600 */ +#define GPIO_PRT13 ((GPIO_PRT_Type*) &GPIO->PRT[13]) /* 0x40320680 */ +#define GPIO_PRT14 ((GPIO_PRT_Type*) &GPIO->PRT[14]) /* 0x40320700 */ + +/******************************************************************************* +* SMARTIO +*******************************************************************************/ + +#define SMARTIO_BASE 0x40330000UL +#define SMARTIO ((SMARTIO_Type*) SMARTIO_BASE) /* 0x40330000 */ +#define SMARTIO_PRT8 ((SMARTIO_PRT_Type*) &SMARTIO->PRT[8]) /* 0x40330800 */ +#define SMARTIO_PRT9 ((SMARTIO_PRT_Type*) &SMARTIO->PRT[9]) /* 0x40330900 */ + +/******************************************************************************* +* UDB +*******************************************************************************/ + +#define UDB_BASE 0x40340000UL +#define UDB ((UDB_Type*) UDB_BASE) /* 0x40340000 */ +#define UDB_WRKONE ((UDB_WRKONE_Type*) &UDB->WRKONE) /* 0x40340000 */ +#define UDB_WRKMULT ((UDB_WRKMULT_Type*) &UDB->WRKMULT) /* 0x40341000 */ +#define UDB_UDBPAIR0_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[0].UDBSNG[0]) /* 0x40342000 */ +#define UDB_UDBPAIR0_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[0].UDBSNG[1]) /* 0x40342080 */ +#define UDB_UDBPAIR1_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[1].UDBSNG[0]) /* 0x40342200 */ +#define UDB_UDBPAIR1_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[1].UDBSNG[1]) /* 0x40342280 */ +#define UDB_UDBPAIR2_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[2].UDBSNG[0]) /* 0x40342400 */ +#define UDB_UDBPAIR2_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[2].UDBSNG[1]) /* 0x40342480 */ +#define UDB_UDBPAIR3_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[3].UDBSNG[0]) /* 0x40342600 */ +#define UDB_UDBPAIR3_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[3].UDBSNG[1]) /* 0x40342680 */ +#define UDB_UDBPAIR4_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[4].UDBSNG[0]) /* 0x40342800 */ +#define UDB_UDBPAIR4_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[4].UDBSNG[1]) /* 0x40342880 */ +#define UDB_UDBPAIR5_UDBSNG0 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[5].UDBSNG[0]) /* 0x40342A00 */ +#define UDB_UDBPAIR5_UDBSNG1 ((UDB_UDBPAIR_UDBSNG_Type*) &UDB->UDBPAIR[5].UDBSNG[1]) /* 0x40342A80 */ +#define UDB_UDBPAIR0_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[0].ROUTE) /* 0x40342100 */ +#define UDB_UDBPAIR1_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[1].ROUTE) /* 0x40342300 */ +#define UDB_UDBPAIR2_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[2].ROUTE) /* 0x40342500 */ +#define UDB_UDBPAIR3_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[3].ROUTE) /* 0x40342700 */ +#define UDB_UDBPAIR4_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[4].ROUTE) /* 0x40342900 */ +#define UDB_UDBPAIR5_ROUTE ((UDB_UDBPAIR_ROUTE_Type*) &UDB->UDBPAIR[5].ROUTE) /* 0x40342B00 */ +#define UDB_UDBPAIR0 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[0]) /* 0x40342000 */ +#define UDB_UDBPAIR1 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[1]) /* 0x40342200 */ +#define UDB_UDBPAIR2 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[2]) /* 0x40342400 */ +#define UDB_UDBPAIR3 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[3]) /* 0x40342600 */ +#define UDB_UDBPAIR4 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[4]) /* 0x40342800 */ +#define UDB_UDBPAIR5 ((UDB_UDBPAIR_Type*) &UDB->UDBPAIR[5]) /* 0x40342A00 */ +#define UDB_DSI0 ((UDB_DSI_Type*) &UDB->DSI[0]) /* 0x40346000 */ +#define UDB_DSI1 ((UDB_DSI_Type*) &UDB->DSI[1]) /* 0x40346080 */ +#define UDB_DSI2 ((UDB_DSI_Type*) &UDB->DSI[2]) /* 0x40346100 */ +#define UDB_DSI3 ((UDB_DSI_Type*) &UDB->DSI[3]) /* 0x40346180 */ +#define UDB_DSI4 ((UDB_DSI_Type*) &UDB->DSI[4]) /* 0x40346200 */ +#define UDB_DSI5 ((UDB_DSI_Type*) &UDB->DSI[5]) /* 0x40346280 */ +#define UDB_DSI6 ((UDB_DSI_Type*) &UDB->DSI[6]) /* 0x40346300 */ +#define UDB_DSI7 ((UDB_DSI_Type*) &UDB->DSI[7]) /* 0x40346380 */ +#define UDB_DSI8 ((UDB_DSI_Type*) &UDB->DSI[8]) /* 0x40346400 */ +#define UDB_DSI9 ((UDB_DSI_Type*) &UDB->DSI[9]) /* 0x40346480 */ +#define UDB_DSI10 ((UDB_DSI_Type*) &UDB->DSI[10]) /* 0x40346500 */ +#define UDB_DSI11 ((UDB_DSI_Type*) &UDB->DSI[11]) /* 0x40346580 */ +#define UDB_PA0 ((UDB_PA_Type*) &UDB->PA[0]) /* 0x40347000 */ +#define UDB_PA1 ((UDB_PA_Type*) &UDB->PA[1]) /* 0x40347040 */ +#define UDB_PA2 ((UDB_PA_Type*) &UDB->PA[2]) /* 0x40347080 */ +#define UDB_PA3 ((UDB_PA_Type*) &UDB->PA[3]) /* 0x403470C0 */ +#define UDB_PA4 ((UDB_PA_Type*) &UDB->PA[4]) /* 0x40347100 */ +#define UDB_PA5 ((UDB_PA_Type*) &UDB->PA[5]) /* 0x40347140 */ +#define UDB_PA6 ((UDB_PA_Type*) &UDB->PA[6]) /* 0x40347180 */ +#define UDB_PA7 ((UDB_PA_Type*) &UDB->PA[7]) /* 0x403471C0 */ +#define UDB_PA8 ((UDB_PA_Type*) &UDB->PA[8]) /* 0x40347200 */ +#define UDB_PA9 ((UDB_PA_Type*) &UDB->PA[9]) /* 0x40347240 */ +#define UDB_PA10 ((UDB_PA_Type*) &UDB->PA[10]) /* 0x40347280 */ +#define UDB_PA11 ((UDB_PA_Type*) &UDB->PA[11]) /* 0x403472C0 */ +#define UDB_BCTL ((UDB_BCTL_Type*) &UDB->BCTL) /* 0x40347800 */ +#define UDB_UDBIF ((UDB_UDBIF_Type*) &UDB->UDBIF) /* 0x40347900 */ + +/******************************************************************************* +* LPCOMP +*******************************************************************************/ + +#define LPCOMP_BASE 0x40350000UL +#define LPCOMP ((LPCOMP_Type*) LPCOMP_BASE) /* 0x40350000 */ + +/******************************************************************************* +* CSD +*******************************************************************************/ + +#define CSD0_BASE 0x40360000UL +#define CSD0 ((CSD_Type*) CSD0_BASE) /* 0x40360000 */ + +/******************************************************************************* +* TCPWM +*******************************************************************************/ + +#define TCPWM0_BASE 0x40380000UL +#define TCPWM1_BASE 0x40390000UL +#define TCPWM0 ((TCPWM_Type*) TCPWM0_BASE) /* 0x40380000 */ +#define TCPWM1 ((TCPWM_Type*) TCPWM1_BASE) /* 0x40390000 */ +#define TCPWM0_CNT0 ((TCPWM_CNT_Type*) &TCPWM0->CNT[0]) /* 0x40380100 */ +#define TCPWM0_CNT1 ((TCPWM_CNT_Type*) &TCPWM0->CNT[1]) /* 0x40380140 */ +#define TCPWM0_CNT2 ((TCPWM_CNT_Type*) &TCPWM0->CNT[2]) /* 0x40380180 */ +#define TCPWM0_CNT3 ((TCPWM_CNT_Type*) &TCPWM0->CNT[3]) /* 0x403801C0 */ +#define TCPWM0_CNT4 ((TCPWM_CNT_Type*) &TCPWM0->CNT[4]) /* 0x40380200 */ +#define TCPWM0_CNT5 ((TCPWM_CNT_Type*) &TCPWM0->CNT[5]) /* 0x40380240 */ +#define TCPWM0_CNT6 ((TCPWM_CNT_Type*) &TCPWM0->CNT[6]) /* 0x40380280 */ +#define TCPWM0_CNT7 ((TCPWM_CNT_Type*) &TCPWM0->CNT[7]) /* 0x403802C0 */ +#define TCPWM1_CNT0 ((TCPWM_CNT_Type*) &TCPWM1->CNT[0]) /* 0x40390100 */ +#define TCPWM1_CNT1 ((TCPWM_CNT_Type*) &TCPWM1->CNT[1]) /* 0x40390140 */ +#define TCPWM1_CNT2 ((TCPWM_CNT_Type*) &TCPWM1->CNT[2]) /* 0x40390180 */ +#define TCPWM1_CNT3 ((TCPWM_CNT_Type*) &TCPWM1->CNT[3]) /* 0x403901C0 */ +#define TCPWM1_CNT4 ((TCPWM_CNT_Type*) &TCPWM1->CNT[4]) /* 0x40390200 */ +#define TCPWM1_CNT5 ((TCPWM_CNT_Type*) &TCPWM1->CNT[5]) /* 0x40390240 */ +#define TCPWM1_CNT6 ((TCPWM_CNT_Type*) &TCPWM1->CNT[6]) /* 0x40390280 */ +#define TCPWM1_CNT7 ((TCPWM_CNT_Type*) &TCPWM1->CNT[7]) /* 0x403902C0 */ +#define TCPWM1_CNT8 ((TCPWM_CNT_Type*) &TCPWM1->CNT[8]) /* 0x40390300 */ +#define TCPWM1_CNT9 ((TCPWM_CNT_Type*) &TCPWM1->CNT[9]) /* 0x40390340 */ +#define TCPWM1_CNT10 ((TCPWM_CNT_Type*) &TCPWM1->CNT[10]) /* 0x40390380 */ +#define TCPWM1_CNT11 ((TCPWM_CNT_Type*) &TCPWM1->CNT[11]) /* 0x403903C0 */ +#define TCPWM1_CNT12 ((TCPWM_CNT_Type*) &TCPWM1->CNT[12]) /* 0x40390400 */ +#define TCPWM1_CNT13 ((TCPWM_CNT_Type*) &TCPWM1->CNT[13]) /* 0x40390440 */ +#define TCPWM1_CNT14 ((TCPWM_CNT_Type*) &TCPWM1->CNT[14]) /* 0x40390480 */ +#define TCPWM1_CNT15 ((TCPWM_CNT_Type*) &TCPWM1->CNT[15]) /* 0x403904C0 */ +#define TCPWM1_CNT16 ((TCPWM_CNT_Type*) &TCPWM1->CNT[16]) /* 0x40390500 */ +#define TCPWM1_CNT17 ((TCPWM_CNT_Type*) &TCPWM1->CNT[17]) /* 0x40390540 */ +#define TCPWM1_CNT18 ((TCPWM_CNT_Type*) &TCPWM1->CNT[18]) /* 0x40390580 */ +#define TCPWM1_CNT19 ((TCPWM_CNT_Type*) &TCPWM1->CNT[19]) /* 0x403905C0 */ +#define TCPWM1_CNT20 ((TCPWM_CNT_Type*) &TCPWM1->CNT[20]) /* 0x40390600 */ +#define TCPWM1_CNT21 ((TCPWM_CNT_Type*) &TCPWM1->CNT[21]) /* 0x40390640 */ +#define TCPWM1_CNT22 ((TCPWM_CNT_Type*) &TCPWM1->CNT[22]) /* 0x40390680 */ +#define TCPWM1_CNT23 ((TCPWM_CNT_Type*) &TCPWM1->CNT[23]) /* 0x403906C0 */ + +/******************************************************************************* +* LCD +*******************************************************************************/ + +#define LCD0_BASE 0x403B0000UL +#define LCD0 ((LCD_Type*) LCD0_BASE) /* 0x403B0000 */ + +/******************************************************************************* +* BLE +*******************************************************************************/ + +#define BLE_BASE 0x403C0000UL +#define BLE ((BLE_Type*) BLE_BASE) /* 0x403C0000 */ +#define BLE_RCB_RCBLL ((BLE_RCB_RCBLL_Type*) &BLE->RCB.RCBLL) /* 0x403C0100 */ +#define BLE_RCB ((BLE_RCB_Type*) &BLE->RCB) /* 0x403C0000 */ +#define BLE_BLELL ((BLE_BLELL_Type*) &BLE->BLELL) /* 0x403C1000 */ +#define BLE_BLESS ((BLE_BLESS_Type*) &BLE->BLESS) /* 0x403DF000 */ + +/******************************************************************************* +* SMIF +*******************************************************************************/ + +#define SMIF0_BASE 0x40420000UL +#define SMIF0 ((SMIF_Type*) SMIF0_BASE) /* 0x40420000 */ +#define SMIF0_DEVICE0 ((SMIF_DEVICE_Type*) &SMIF0->DEVICE[0]) /* 0x40420800 */ +#define SMIF0_DEVICE1 ((SMIF_DEVICE_Type*) &SMIF0->DEVICE[1]) /* 0x40420880 */ +#define SMIF0_DEVICE2 ((SMIF_DEVICE_Type*) &SMIF0->DEVICE[2]) /* 0x40420900 */ +#define SMIF0_DEVICE3 ((SMIF_DEVICE_Type*) &SMIF0->DEVICE[3]) /* 0x40420980 */ + +/******************************************************************************* +* SCB +*******************************************************************************/ + +#define SCB0_BASE 0x40610000UL +#define SCB1_BASE 0x40620000UL +#define SCB2_BASE 0x40630000UL +#define SCB3_BASE 0x40640000UL +#define SCB4_BASE 0x40650000UL +#define SCB5_BASE 0x40660000UL +#define SCB6_BASE 0x40670000UL +#define SCB7_BASE 0x40680000UL +#define SCB8_BASE 0x40690000UL +#define SCB0 ((CySCB_Type*) SCB0_BASE) /* 0x40610000 */ +#define SCB1 ((CySCB_Type*) SCB1_BASE) /* 0x40620000 */ +#define SCB2 ((CySCB_Type*) SCB2_BASE) /* 0x40630000 */ +#define SCB3 ((CySCB_Type*) SCB3_BASE) /* 0x40640000 */ +#define SCB4 ((CySCB_Type*) SCB4_BASE) /* 0x40650000 */ +#define SCB5 ((CySCB_Type*) SCB5_BASE) /* 0x40660000 */ +#define SCB6 ((CySCB_Type*) SCB6_BASE) /* 0x40670000 */ +#define SCB7 ((CySCB_Type*) SCB7_BASE) /* 0x40680000 */ +#define SCB8 ((CySCB_Type*) SCB8_BASE) /* 0x40690000 */ + +/******************************************************************************* +* CTBM +*******************************************************************************/ + +#define CTBM0_BASE 0x41100000UL +#define CTBM0 ((CTBM_Type*) CTBM0_BASE) /* 0x41100000 */ + +/******************************************************************************* +* CTDAC +*******************************************************************************/ + +#define CTDAC0_BASE 0x41140000UL +#define CTDAC0 ((CTDAC_Type*) CTDAC0_BASE) /* 0x41140000 */ + +/******************************************************************************* +* SAR +*******************************************************************************/ + +#define SAR_BASE 0x411D0000UL +#define SAR ((SAR_Type*) SAR_BASE) /* 0x411D0000 */ + +/******************************************************************************* +* PASS +*******************************************************************************/ + +#define PASS_BASE 0x411F0000UL +#define PASS ((PASS_Type*) PASS_BASE) /* 0x411F0000 */ +#define PASS_AREF ((PASS_AREF_Type*) &PASS->AREF) /* 0x411F0E00 */ + +/******************************************************************************* +* I2S +*******************************************************************************/ + +#define I2S_BASE 0x42A10000UL +#define I2S ((I2S_Type*) I2S_BASE) /* 0x42A10000 */ + +/******************************************************************************* +* PDM +*******************************************************************************/ + +#define PDM_BASE 0x42A20000UL +#define PDM ((PDM_Type*) PDM_BASE) /* 0x42A20000 */ + +/** \} CY8C6347BZI-BLD53 */ + +#endif /* _CY8C6347BZI_BLD53_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cy_device_headers.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cy_device_headers.h new file mode 100644 index 0000000000..b9775ccc88 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/cy_device_headers.h @@ -0,0 +1,61 @@ +/***************************************************************************//** +* \file cy_device_headers.h +* +* \brief +* Common header file to be included by the drivers. +* +* \note +* Generated 9/21/2017 by CyDeviceHeaderGenerator v1.2.0.101 +* from the register map configuration rev#1007711 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CY_DEVICE_HEADERS_H_ +#define _CY_DEVICE_HEADERS_H_ + +#if defined (CY8C6336BZI_BLF03) + #include "cy8c6336bzi_blf03.h" +#elif defined (CY8C6316BZI_BLF03) + #include "cy8c6316bzi_blf03.h" +#elif defined (CY8C6316BZI_BLF53) + #include "cy8c6316bzi_blf53.h" +#elif defined (CY8C6336BZI_BLD13) + #include "cy8c6336bzi_bld13.h" +#elif defined (CY8C6347BZI_BLD43) + #include "cy8c6347bzi_bld43.h" +#elif defined (CY8C6347BZI_BLD33) + #include "cy8c6347bzi_bld33.h" +#elif defined (CY8C6347BZI_BLD53) + #include "cy8c6347bzi_bld53.h" +#elif defined (CY8C6347FMI_BLD13) + #include "cy8c6347fmi_bld13.h" +#elif defined (CY8C6347FMI_BLD43) + #include "cy8c6347fmi_bld43.h" +#elif defined (CY8C6347FMI_BLD33) + #include "cy8c6347fmi_bld33.h" +#elif defined (CY8C6347FMI_BLD53) + #include "cy8c6347fmi_bld53.h" +#elif defined (CY8C637BZI_MD76) + #include "cy8c637bzi_md76.h" +#elif defined (CY8C637BZI_BLD74) + #include "cy8c637bzi_bld74.h" +#elif defined (CY8C637FMI_BLD73) + #include "cy8c637fmi_bld73.h" +#elif defined (CY8C68237BZ_BLE) + #include "cy8c68237bz_ble.h" +#elif defined (CY8C68237FM_BLE) + #include "cy8c68237fm_ble.h" +#else + #error Undefined part number +#endif + +#endif /* _CY_DEVICE_HEADERS_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/gpio_psoc63_116_bga_ble.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/gpio_psoc63_116_bga_ble.h new file mode 100644 index 0000000000..b3a17d5830 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/gpio_psoc63_116_bga_ble.h @@ -0,0 +1,1808 @@ +/***************************************************************************//** +* \file gpio_psoc63_116_bga_ble.h +* +* \brief +* PSoC 63 device GPIO header for 116-BGA-BLE package +* +* \note +* Generated 9/21/2017 by CyDeviceHeaderGenerator v1.2.0.101 +* from the register map configuration rev#1007711 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _GPIO_PSOC63_116_BGA_BLE_H_ +#define _GPIO_PSOC63_116_BGA_BLE_H_ + +/* Package type */ +enum +{ + CY_GPIO_PACKAGE_QFN, + CY_GPIO_PACKAGE_BGA, + CY_GPIO_PACKAGE_CSP, + CY_GPIO_PACKAGE_WLCSP, + CY_GPIO_PACKAGE_LQFP, +}; + +#define CY_GPIO_PACKAGE_TYPE CY_GPIO_PACKAGE_BGA + +/* Port List */ +/* PORT 0 (GPIO) */ +#define P0_0_PORT GPIO_PRT0 +#define P0_0_NUM 0u +#define P0_1_PORT GPIO_PRT0 +#define P0_1_NUM 1u +#define P0_2_PORT GPIO_PRT0 +#define P0_2_NUM 2u +#define P0_3_PORT GPIO_PRT0 +#define P0_3_NUM 3u +#define P0_4_PORT GPIO_PRT0 +#define P0_4_NUM 4u +#define P0_5_PORT GPIO_PRT0 +#define P0_5_NUM 5u + +/* PORT 1 (GPIO_OVT) */ +#define P1_0_PORT GPIO_PRT1 +#define P1_0_NUM 0u +#define P1_1_PORT GPIO_PRT1 +#define P1_1_NUM 1u +#define P1_2_PORT GPIO_PRT1 +#define P1_2_NUM 2u +#define P1_3_PORT GPIO_PRT1 +#define P1_3_NUM 3u +#define P1_4_PORT GPIO_PRT1 +#define P1_4_NUM 4u +#define P1_5_PORT GPIO_PRT1 +#define P1_5_NUM 5u + +/* PORT 5 (GPIO) */ +#define P5_0_PORT GPIO_PRT5 +#define P5_0_NUM 0u +#define P5_1_PORT GPIO_PRT5 +#define P5_1_NUM 1u +#define P5_2_PORT GPIO_PRT5 +#define P5_2_NUM 2u +#define P5_3_PORT GPIO_PRT5 +#define P5_3_NUM 3u +#define P5_4_PORT GPIO_PRT5 +#define P5_4_NUM 4u +#define P5_5_PORT GPIO_PRT5 +#define P5_5_NUM 5u +#define P5_6_PORT GPIO_PRT5 +#define P5_6_NUM 6u + +/* PORT 6 (GPIO) */ +#define P6_0_PORT GPIO_PRT6 +#define P6_0_NUM 0u +#define P6_1_PORT GPIO_PRT6 +#define P6_1_NUM 1u +#define P6_2_PORT GPIO_PRT6 +#define P6_2_NUM 2u +#define P6_3_PORT GPIO_PRT6 +#define P6_3_NUM 3u +#define P6_4_PORT GPIO_PRT6 +#define P6_4_NUM 4u +#define P6_5_PORT GPIO_PRT6 +#define P6_5_NUM 5u +#define P6_6_PORT GPIO_PRT6 +#define P6_6_NUM 6u +#define P6_7_PORT GPIO_PRT6 +#define P6_7_NUM 7u + +/* PORT 7 (GPIO) */ +#define P7_0_PORT GPIO_PRT7 +#define P7_0_NUM 0u +#define P7_1_PORT GPIO_PRT7 +#define P7_1_NUM 1u +#define P7_2_PORT GPIO_PRT7 +#define P7_2_NUM 2u +#define P7_3_PORT GPIO_PRT7 +#define P7_3_NUM 3u +#define P7_4_PORT GPIO_PRT7 +#define P7_4_NUM 4u +#define P7_5_PORT GPIO_PRT7 +#define P7_5_NUM 5u +#define P7_6_PORT GPIO_PRT7 +#define P7_6_NUM 6u +#define P7_7_PORT GPIO_PRT7 +#define P7_7_NUM 7u + +/* PORT 8 (GPIO) */ +#define P8_0_PORT GPIO_PRT8 +#define P8_0_NUM 0u +#define P8_1_PORT GPIO_PRT8 +#define P8_1_NUM 1u +#define P8_2_PORT GPIO_PRT8 +#define P8_2_NUM 2u +#define P8_3_PORT GPIO_PRT8 +#define P8_3_NUM 3u +#define P8_4_PORT GPIO_PRT8 +#define P8_4_NUM 4u +#define P8_5_PORT GPIO_PRT8 +#define P8_5_NUM 5u +#define P8_6_PORT GPIO_PRT8 +#define P8_6_NUM 6u +#define P8_7_PORT GPIO_PRT8 +#define P8_7_NUM 7u + +/* PORT 9 (GPIO) */ +#define P9_0_PORT GPIO_PRT9 +#define P9_0_NUM 0u +#define P9_1_PORT GPIO_PRT9 +#define P9_1_NUM 1u +#define P9_2_PORT GPIO_PRT9 +#define P9_2_NUM 2u +#define P9_3_PORT GPIO_PRT9 +#define P9_3_NUM 3u +#define P9_4_PORT GPIO_PRT9 +#define P9_4_NUM 4u +#define P9_5_PORT GPIO_PRT9 +#define P9_5_NUM 5u +#define P9_6_PORT GPIO_PRT9 +#define P9_6_NUM 6u +#define P9_7_PORT GPIO_PRT9 +#define P9_7_NUM 7u + +/* PORT 10 (GPIO) */ +#define P10_0_PORT GPIO_PRT10 +#define P10_0_NUM 0u +#define P10_1_PORT GPIO_PRT10 +#define P10_1_NUM 1u +#define P10_2_PORT GPIO_PRT10 +#define P10_2_NUM 2u +#define P10_3_PORT GPIO_PRT10 +#define P10_3_NUM 3u +#define P10_4_PORT GPIO_PRT10 +#define P10_4_NUM 4u +#define P10_5_PORT GPIO_PRT10 +#define P10_5_NUM 5u +#define P10_6_PORT GPIO_PRT10 +#define P10_6_NUM 6u + +/* PORT 11 (GPIO) */ +#define P11_0_PORT GPIO_PRT11 +#define P11_0_NUM 0u +#define P11_1_PORT GPIO_PRT11 +#define P11_1_NUM 1u +#define P11_2_PORT GPIO_PRT11 +#define P11_2_NUM 2u +#define P11_3_PORT GPIO_PRT11 +#define P11_3_NUM 3u +#define P11_4_PORT GPIO_PRT11 +#define P11_4_NUM 4u +#define P11_5_PORT GPIO_PRT11 +#define P11_5_NUM 5u +#define P11_6_PORT GPIO_PRT11 +#define P11_6_NUM 6u +#define P11_7_PORT GPIO_PRT11 +#define P11_7_NUM 7u + +/* PORT 12 (GPIO) */ +#define P12_0_PORT GPIO_PRT12 +#define P12_0_NUM 0u +#define P12_1_PORT GPIO_PRT12 +#define P12_1_NUM 1u +#define P12_2_PORT GPIO_PRT12 +#define P12_2_NUM 2u +#define P12_3_PORT GPIO_PRT12 +#define P12_3_NUM 3u +#define P12_4_PORT GPIO_PRT12 +#define P12_4_NUM 4u +#define P12_5_PORT GPIO_PRT12 +#define P12_5_NUM 5u +#define P12_6_PORT GPIO_PRT12 +#define P12_6_NUM 6u +#define P12_7_PORT GPIO_PRT12 +#define P12_7_NUM 7u + +/* PORT 13 (GPIO) */ +#define P13_0_PORT GPIO_PRT13 +#define P13_0_NUM 0u +#define P13_1_PORT GPIO_PRT13 +#define P13_1_NUM 1u +#define P13_6_PORT GPIO_PRT13 +#define P13_6_NUM 6u +#define P13_7_PORT GPIO_PRT13 +#define P13_7_NUM 7u + +/* Analog Connections */ +#define CSD_CMODPADD_PORT 7u +#define CSD_CMODPADD_PIN 1u +#define CSD_CMODPADS_PORT 7u +#define CSD_CMODPADS_PIN 1u +#define CSD_CSH_TANKPADD_PORT 7u +#define CSD_CSH_TANKPADD_PIN 2u +#define CSD_CSH_TANKPADS_PORT 7u +#define CSD_CSH_TANKPADS_PIN 2u +#define CSD_CSHIELDPADS_PORT 7u +#define CSD_CSHIELDPADS_PIN 7u +#define CSD_VREF_EXT_PORT 7u +#define CSD_VREF_EXT_PIN 3u +#define IOSS_ADFT0_NET_PORT 10u +#define IOSS_ADFT0_NET_PIN 0u +#define IOSS_ADFT1_NET_PORT 10u +#define IOSS_ADFT1_NET_PIN 1u +#define LPCOMP_INN_COMP1_PORT 6u +#define LPCOMP_INN_COMP1_PIN 3u +#define LPCOMP_INP_COMP0_PORT 5u +#define LPCOMP_INP_COMP0_PIN 6u +#define LPCOMP_INP_COMP1_PORT 6u +#define LPCOMP_INP_COMP1_PIN 2u +#define PASS_AREF_EXT_VREF_PORT 9u +#define PASS_AREF_EXT_VREF_PIN 7u +#define PASS_CTB_OA0_OUT_10X_PORT 9u +#define PASS_CTB_OA0_OUT_10X_PIN 2u +#define PASS_CTB_OA1_OUT_10X_PORT 9u +#define PASS_CTB_OA1_OUT_10X_PIN 3u +#define PASS_CTB_PADS0_PORT 9u +#define PASS_CTB_PADS0_PIN 0u +#define PASS_CTB_PADS1_PORT 9u +#define PASS_CTB_PADS1_PIN 1u +#define PASS_CTB_PADS2_PORT 9u +#define PASS_CTB_PADS2_PIN 2u +#define PASS_CTB_PADS3_PORT 9u +#define PASS_CTB_PADS3_PIN 3u +#define PASS_CTB_PADS4_PORT 9u +#define PASS_CTB_PADS4_PIN 4u +#define PASS_CTB_PADS5_PORT 9u +#define PASS_CTB_PADS5_PIN 5u +#define PASS_CTB_PADS6_PORT 9u +#define PASS_CTB_PADS6_PIN 6u +#define PASS_CTB_PADS7_PORT 9u +#define PASS_CTB_PADS7_PIN 7u +#define PASS_SARMUX_PADS0_PORT 10u +#define PASS_SARMUX_PADS0_PIN 0u +#define PASS_SARMUX_PADS1_PORT 10u +#define PASS_SARMUX_PADS1_PIN 1u +#define PASS_SARMUX_PADS2_PORT 10u +#define PASS_SARMUX_PADS2_PIN 2u +#define PASS_SARMUX_PADS3_PORT 10u +#define PASS_SARMUX_PADS3_PIN 3u +#define PASS_SARMUX_PADS4_PORT 10u +#define PASS_SARMUX_PADS4_PIN 4u +#define PASS_SARMUX_PADS5_PORT 10u +#define PASS_SARMUX_PADS5_PIN 5u +#define PASS_SARMUX_PADS6_PORT 10u +#define PASS_SARMUX_PADS6_PIN 6u +#define SRSS_ADFT_PIN0_PORT 10u +#define SRSS_ADFT_PIN0_PIN 0u +#define SRSS_ADFT_PIN1_PORT 10u +#define SRSS_ADFT_PIN1_PIN 1u +#define SRSS_ECO_IN_PORT 12u +#define SRSS_ECO_IN_PIN 6u +#define SRSS_ECO_OUT_PORT 12u +#define SRSS_ECO_OUT_PIN 7u +#define SRSS_WCO_IN_PORT 0u +#define SRSS_WCO_IN_PIN 0u +#define SRSS_WCO_OUT_PORT 0u +#define SRSS_WCO_OUT_PIN 1u + +/* HSIOM Connections */ +typedef enum +{ + /* Generic HSIOM connections */ + HSIOM_SEL_GPIO = 0, /* GPIO controls 'out' */ + HSIOM_SEL_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + HSIOM_SEL_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + HSIOM_SEL_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + HSIOM_SEL_AMUXA = 4, /* Analog mux bus A */ + HSIOM_SEL_AMUXB = 5, /* Analog mux bus B */ + HSIOM_SEL_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + HSIOM_SEL_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + HSIOM_SEL_ACT_0 = 8, /* Active functionality 0 */ + HSIOM_SEL_ACT_1 = 9, /* Active functionality 1 */ + HSIOM_SEL_ACT_2 = 10, /* Active functionality 2 */ + HSIOM_SEL_ACT_3 = 11, /* Active functionality 3 */ + HSIOM_SEL_DS_0 = 12, /* DeepSleep functionality 0 */ + HSIOM_SEL_DS_1 = 13, /* DeepSleep functionality 1 */ + HSIOM_SEL_DS_2 = 14, /* DeepSleep functionality 2 */ + HSIOM_SEL_DS_3 = 15, /* DeepSleep functionality 3 */ + HSIOM_SEL_ACT_4 = 16, /* Active functionality 4 */ + HSIOM_SEL_ACT_5 = 17, /* Active functionality 5 */ + HSIOM_SEL_ACT_6 = 18, /* Active functionality 6 */ + HSIOM_SEL_ACT_7 = 19, /* Active functionality 7 */ + HSIOM_SEL_ACT_8 = 20, /* Active functionality 8 */ + HSIOM_SEL_ACT_9 = 21, /* Active functionality 9 */ + HSIOM_SEL_ACT_10 = 22, /* Active functionality 10 */ + HSIOM_SEL_ACT_11 = 23, /* Active functionality 11 */ + HSIOM_SEL_ACT_12 = 24, /* Active functionality 12 */ + HSIOM_SEL_ACT_13 = 25, /* Active functionality 13 */ + HSIOM_SEL_ACT_14 = 26, /* Active functionality 14 */ + HSIOM_SEL_ACT_15 = 27, /* Active functionality 15 */ + HSIOM_SEL_DS_4 = 28, /* DeepSleep functionality 4 */ + HSIOM_SEL_DS_5 = 29, /* DeepSleep functionality 5 */ + HSIOM_SEL_DS_6 = 30, /* DeepSleep functionality 6 */ + HSIOM_SEL_DS_7 = 31, /* DeepSleep functionality 7 */ + + /* P0.0 */ + P0_0_GPIO = 0, /* GPIO controls 'out' */ + P0_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_0_AMUXA = 4, /* Analog mux bus A */ + P0_0_AMUXB = 5, /* Analog mux bus B */ + P0_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_0_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:0 */ + P0_0_TCPWM1_LINE0 = 9, /* Digital Active - tcpwm[1].line[0]:0 */ + P0_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:0 */ + P0_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:0 */ + P0_0_LCD_COM0 = 12, /* Digital Deep Sleep - lcd.com[0]:0 */ + P0_0_LCD_SEG0 = 13, /* Digital Deep Sleep - lcd.seg[0]:0 */ + P0_0_SRSS_EXT_CLK = 16, /* Digital Active - srss.ext_clk:0 */ + P0_0_SCB0_SPI_SELECT1 = 20, /* Digital Active - scb[0].spi_select1:0 */ + P0_0_PERI_TR_IO_INPUT0 = 24, /* Digital Active - peri.tr_io_input[0]:0 */ + + /* P0.1 */ + P0_1_GPIO = 0, /* GPIO controls 'out' */ + P0_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_1_AMUXA = 4, /* Analog mux bus A */ + P0_1_AMUXB = 5, /* Analog mux bus B */ + P0_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_1_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:0 */ + P0_1_TCPWM1_LINE_COMPL0 = 9, /* Digital Active - tcpwm[1].line_compl[0]:0 */ + P0_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:1 */ + P0_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:1 */ + P0_1_LCD_COM1 = 12, /* Digital Deep Sleep - lcd.com[1]:0 */ + P0_1_LCD_SEG1 = 13, /* Digital Deep Sleep - lcd.seg[1]:0 */ + P0_1_SCB0_SPI_SELECT2 = 20, /* Digital Active - scb[0].spi_select2:0 */ + P0_1_PERI_TR_IO_INPUT1 = 24, /* Digital Active - peri.tr_io_input[1]:0 */ + P0_1_CPUSS_SWJ_TRSTN = 29, /* Digital Deep Sleep - cpuss.swj_trstn */ + + /* P0.2 */ + P0_2_GPIO = 0, /* GPIO controls 'out' */ + P0_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_2_AMUXA = 4, /* Analog mux bus A */ + P0_2_AMUXB = 5, /* Analog mux bus B */ + P0_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_2_TCPWM0_LINE1 = 8, /* Digital Active - tcpwm[0].line[1]:0 */ + P0_2_TCPWM1_LINE1 = 9, /* Digital Active - tcpwm[1].line[1]:0 */ + P0_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:2 */ + P0_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:2 */ + P0_2_LCD_COM2 = 12, /* Digital Deep Sleep - lcd.com[2]:0 */ + P0_2_LCD_SEG2 = 13, /* Digital Deep Sleep - lcd.seg[2]:0 */ + P0_2_SCB0_UART_RX = 18, /* Digital Active - scb[0].uart_rx:0 */ + P0_2_SCB0_I2C_SCL = 19, /* Digital Active - scb[0].i2c_scl:0 */ + P0_2_SCB0_SPI_MOSI = 20, /* Digital Active - scb[0].spi_mosi:0 */ + + /* P0.3 */ + P0_3_GPIO = 0, /* GPIO controls 'out' */ + P0_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_3_AMUXA = 4, /* Analog mux bus A */ + P0_3_AMUXB = 5, /* Analog mux bus B */ + P0_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_3_TCPWM0_LINE_COMPL1 = 8, /* Digital Active - tcpwm[0].line_compl[1]:0 */ + P0_3_TCPWM1_LINE_COMPL1 = 9, /* Digital Active - tcpwm[1].line_compl[1]:0 */ + P0_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:3 */ + P0_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:3 */ + P0_3_LCD_COM3 = 12, /* Digital Deep Sleep - lcd.com[3]:0 */ + P0_3_LCD_SEG3 = 13, /* Digital Deep Sleep - lcd.seg[3]:0 */ + P0_3_SCB0_UART_TX = 18, /* Digital Active - scb[0].uart_tx:0 */ + P0_3_SCB0_I2C_SDA = 19, /* Digital Active - scb[0].i2c_sda:0 */ + P0_3_SCB0_SPI_MISO = 20, /* Digital Active - scb[0].spi_miso:0 */ + + /* P0.4 */ + P0_4_GPIO = 0, /* GPIO controls 'out' */ + P0_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_4_AMUXA = 4, /* Analog mux bus A */ + P0_4_AMUXB = 5, /* Analog mux bus B */ + P0_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_4_TCPWM0_LINE2 = 8, /* Digital Active - tcpwm[0].line[2]:0 */ + P0_4_TCPWM1_LINE2 = 9, /* Digital Active - tcpwm[1].line[2]:0 */ + P0_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:4 */ + P0_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:4 */ + P0_4_LCD_COM4 = 12, /* Digital Deep Sleep - lcd.com[4]:0 */ + P0_4_LCD_SEG4 = 13, /* Digital Deep Sleep - lcd.seg[4]:0 */ + P0_4_SCB0_UART_RTS = 18, /* Digital Active - scb[0].uart_rts:0 */ + P0_4_SCB0_SPI_CLK = 20, /* Digital Active - scb[0].spi_clk:0 */ + P0_4_PERI_TR_IO_OUTPUT0 = 25, /* Digital Active - peri.tr_io_output[0]:2 */ + + /* P0.5 */ + P0_5_GPIO = 0, /* GPIO controls 'out' */ + P0_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P0_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P0_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P0_5_AMUXA = 4, /* Analog mux bus A */ + P0_5_AMUXB = 5, /* Analog mux bus B */ + P0_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P0_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P0_5_TCPWM0_LINE_COMPL2 = 8, /* Digital Active - tcpwm[0].line_compl[2]:0 */ + P0_5_TCPWM1_LINE_COMPL2 = 9, /* Digital Active - tcpwm[1].line_compl[2]:0 */ + P0_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:5 */ + P0_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:5 */ + P0_5_LCD_COM5 = 12, /* Digital Deep Sleep - lcd.com[5]:0 */ + P0_5_LCD_SEG5 = 13, /* Digital Deep Sleep - lcd.seg[5]:0 */ + P0_5_SRSS_EXT_CLK = 16, /* Digital Active - srss.ext_clk:1 */ + P0_5_SCB0_UART_CTS = 18, /* Digital Active - scb[0].uart_cts:0 */ + P0_5_SCB0_SPI_SELECT0 = 20, /* Digital Active - scb[0].spi_select0:0 */ + P0_5_PERI_TR_IO_OUTPUT1 = 25, /* Digital Active - peri.tr_io_output[1]:2 */ + + /* P1.0 */ + P1_0_GPIO = 0, /* GPIO controls 'out' */ + P1_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_0_AMUXA = 4, /* Analog mux bus A */ + P1_0_AMUXB = 5, /* Analog mux bus B */ + P1_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_0_TCPWM0_LINE3 = 8, /* Digital Active - tcpwm[0].line[3]:0 */ + P1_0_TCPWM1_LINE3 = 9, /* Digital Active - tcpwm[1].line[3]:0 */ + P1_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:6 */ + P1_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:6 */ + P1_0_LCD_COM6 = 12, /* Digital Deep Sleep - lcd.com[6]:0 */ + P1_0_LCD_SEG6 = 13, /* Digital Deep Sleep - lcd.seg[6]:0 */ + P1_0_SCB7_UART_RX = 18, /* Digital Active - scb[7].uart_rx:0 */ + P1_0_SCB7_I2C_SCL = 19, /* Digital Active - scb[7].i2c_scl:0 */ + P1_0_SCB7_SPI_MOSI = 20, /* Digital Active - scb[7].spi_mosi:0 */ + P1_0_PERI_TR_IO_INPUT2 = 24, /* Digital Active - peri.tr_io_input[2]:0 */ + + /* P1.1 */ + P1_1_GPIO = 0, /* GPIO controls 'out' */ + P1_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_1_AMUXA = 4, /* Analog mux bus A */ + P1_1_AMUXB = 5, /* Analog mux bus B */ + P1_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_1_TCPWM0_LINE_COMPL3 = 8, /* Digital Active - tcpwm[0].line_compl[3]:0 */ + P1_1_TCPWM1_LINE_COMPL3 = 9, /* Digital Active - tcpwm[1].line_compl[3]:0 */ + P1_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:7 */ + P1_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:7 */ + P1_1_LCD_COM7 = 12, /* Digital Deep Sleep - lcd.com[7]:0 */ + P1_1_LCD_SEG7 = 13, /* Digital Deep Sleep - lcd.seg[7]:0 */ + P1_1_SCB7_UART_TX = 18, /* Digital Active - scb[7].uart_tx:0 */ + P1_1_SCB7_I2C_SDA = 19, /* Digital Active - scb[7].i2c_sda:0 */ + P1_1_SCB7_SPI_MISO = 20, /* Digital Active - scb[7].spi_miso:0 */ + P1_1_PERI_TR_IO_INPUT3 = 24, /* Digital Active - peri.tr_io_input[3]:0 */ + + /* P1.2 */ + P1_2_GPIO = 0, /* GPIO controls 'out' */ + P1_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_2_AMUXA = 4, /* Analog mux bus A */ + P1_2_AMUXB = 5, /* Analog mux bus B */ + P1_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_2_TCPWM0_LINE4 = 8, /* Digital Active - tcpwm[0].line[4]:4 */ + P1_2_TCPWM1_LINE12 = 9, /* Digital Active - tcpwm[1].line[12]:1 */ + P1_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:8 */ + P1_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:8 */ + P1_2_LCD_COM8 = 12, /* Digital Deep Sleep - lcd.com[8]:0 */ + P1_2_LCD_SEG8 = 13, /* Digital Deep Sleep - lcd.seg[8]:0 */ + P1_2_SCB7_UART_RTS = 18, /* Digital Active - scb[7].uart_rts:0 */ + P1_2_SCB7_SPI_CLK = 20, /* Digital Active - scb[7].spi_clk:0 */ + + /* P1.3 */ + P1_3_GPIO = 0, /* GPIO controls 'out' */ + P1_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_3_AMUXA = 4, /* Analog mux bus A */ + P1_3_AMUXB = 5, /* Analog mux bus B */ + P1_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_3_TCPWM0_LINE_COMPL4 = 8, /* Digital Active - tcpwm[0].line_compl[4]:4 */ + P1_3_TCPWM1_LINE_COMPL12 = 9, /* Digital Active - tcpwm[1].line_compl[12]:1 */ + P1_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:9 */ + P1_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:9 */ + P1_3_LCD_COM9 = 12, /* Digital Deep Sleep - lcd.com[9]:0 */ + P1_3_LCD_SEG9 = 13, /* Digital Deep Sleep - lcd.seg[9]:0 */ + P1_3_SCB7_UART_CTS = 18, /* Digital Active - scb[7].uart_cts:0 */ + P1_3_SCB7_SPI_SELECT0 = 20, /* Digital Active - scb[7].spi_select0:0 */ + + /* P1.4 */ + P1_4_GPIO = 0, /* GPIO controls 'out' */ + P1_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_4_AMUXA = 4, /* Analog mux bus A */ + P1_4_AMUXB = 5, /* Analog mux bus B */ + P1_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_4_TCPWM0_LINE5 = 8, /* Digital Active - tcpwm[0].line[5]:4 */ + P1_4_TCPWM1_LINE13 = 9, /* Digital Active - tcpwm[1].line[13]:1 */ + P1_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:10 */ + P1_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:10 */ + P1_4_LCD_COM10 = 12, /* Digital Deep Sleep - lcd.com[10]:0 */ + P1_4_LCD_SEG10 = 13, /* Digital Deep Sleep - lcd.seg[10]:0 */ + P1_4_SCB7_SPI_SELECT1 = 20, /* Digital Active - scb[7].spi_select1:0 */ + + /* P1.5 */ + P1_5_GPIO = 0, /* GPIO controls 'out' */ + P1_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P1_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P1_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P1_5_AMUXA = 4, /* Analog mux bus A */ + P1_5_AMUXB = 5, /* Analog mux bus B */ + P1_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P1_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P1_5_TCPWM0_LINE_COMPL5 = 8, /* Digital Active - tcpwm[0].line_compl[5]:4 */ + P1_5_TCPWM1_LINE_COMPL14 = 9, /* Digital Active - tcpwm[1].line_compl[14]:1 */ + P1_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:11 */ + P1_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:11 */ + P1_5_LCD_COM11 = 12, /* Digital Deep Sleep - lcd.com[11]:0 */ + P1_5_LCD_SEG11 = 13, /* Digital Deep Sleep - lcd.seg[11]:0 */ + P1_5_SCB7_SPI_SELECT2 = 20, /* Digital Active - scb[7].spi_select2:0 */ + + /* P5.0 */ + P5_0_GPIO = 0, /* GPIO controls 'out' */ + P5_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_0_AMUXA = 4, /* Analog mux bus A */ + P5_0_AMUXB = 5, /* Analog mux bus B */ + P5_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_0_TCPWM0_LINE4 = 8, /* Digital Active - tcpwm[0].line[4]:0 */ + P5_0_TCPWM1_LINE4 = 9, /* Digital Active - tcpwm[1].line[4]:0 */ + P5_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:30 */ + P5_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:30 */ + P5_0_LCD_COM30 = 12, /* Digital Deep Sleep - lcd.com[30]:0 */ + P5_0_LCD_SEG30 = 13, /* Digital Deep Sleep - lcd.seg[30]:0 */ + P5_0_SCB5_UART_RX = 18, /* Digital Active - scb[5].uart_rx:0 */ + P5_0_SCB5_I2C_SCL = 19, /* Digital Active - scb[5].i2c_scl:0 */ + P5_0_SCB5_SPI_MOSI = 20, /* Digital Active - scb[5].spi_mosi:0 */ + P5_0_AUDIOSS_CLK_I2S_IF = 22, /* Digital Active - audioss.clk_i2s_if */ + P5_0_PERI_TR_IO_INPUT10 = 24, /* Digital Active - peri.tr_io_input[10]:0 */ + + /* P5.1 */ + P5_1_GPIO = 0, /* GPIO controls 'out' */ + P5_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_1_AMUXA = 4, /* Analog mux bus A */ + P5_1_AMUXB = 5, /* Analog mux bus B */ + P5_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_1_TCPWM0_LINE_COMPL4 = 8, /* Digital Active - tcpwm[0].line_compl[4]:0 */ + P5_1_TCPWM1_LINE_COMPL4 = 9, /* Digital Active - tcpwm[1].line_compl[4]:0 */ + P5_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:31 */ + P5_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:31 */ + P5_1_LCD_COM31 = 12, /* Digital Deep Sleep - lcd.com[31]:0 */ + P5_1_LCD_SEG31 = 13, /* Digital Deep Sleep - lcd.seg[31]:0 */ + P5_1_SCB5_UART_TX = 18, /* Digital Active - scb[5].uart_tx:0 */ + P5_1_SCB5_I2C_SDA = 19, /* Digital Active - scb[5].i2c_sda:0 */ + P5_1_SCB5_SPI_MISO = 20, /* Digital Active - scb[5].spi_miso:0 */ + P5_1_AUDIOSS_TX_SCK = 22, /* Digital Active - audioss.tx_sck */ + P5_1_PERI_TR_IO_INPUT11 = 24, /* Digital Active - peri.tr_io_input[11]:0 */ + + /* P5.2 */ + P5_2_GPIO = 0, /* GPIO controls 'out' */ + P5_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_2_AMUXA = 4, /* Analog mux bus A */ + P5_2_AMUXB = 5, /* Analog mux bus B */ + P5_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_2_TCPWM0_LINE5 = 8, /* Digital Active - tcpwm[0].line[5]:0 */ + P5_2_TCPWM1_LINE5 = 9, /* Digital Active - tcpwm[1].line[5]:0 */ + P5_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:32 */ + P5_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:32 */ + P5_2_LCD_COM32 = 12, /* Digital Deep Sleep - lcd.com[32]:0 */ + P5_2_LCD_SEG32 = 13, /* Digital Deep Sleep - lcd.seg[32]:0 */ + P5_2_SCB5_UART_RTS = 18, /* Digital Active - scb[5].uart_rts:0 */ + P5_2_SCB5_SPI_CLK = 20, /* Digital Active - scb[5].spi_clk:0 */ + P5_2_AUDIOSS_TX_WS = 22, /* Digital Active - audioss.tx_ws */ + + /* P5.3 */ + P5_3_GPIO = 0, /* GPIO controls 'out' */ + P5_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_3_AMUXA = 4, /* Analog mux bus A */ + P5_3_AMUXB = 5, /* Analog mux bus B */ + P5_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_3_TCPWM0_LINE_COMPL5 = 8, /* Digital Active - tcpwm[0].line_compl[5]:0 */ + P5_3_TCPWM1_LINE_COMPL5 = 9, /* Digital Active - tcpwm[1].line_compl[5]:0 */ + P5_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:33 */ + P5_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:33 */ + P5_3_LCD_COM33 = 12, /* Digital Deep Sleep - lcd.com[33]:0 */ + P5_3_LCD_SEG33 = 13, /* Digital Deep Sleep - lcd.seg[33]:0 */ + P5_3_SCB5_UART_CTS = 18, /* Digital Active - scb[5].uart_cts:0 */ + P5_3_SCB5_SPI_SELECT0 = 20, /* Digital Active - scb[5].spi_select0:0 */ + P5_3_AUDIOSS_TX_SDO = 22, /* Digital Active - audioss.tx_sdo */ + + /* P5.4 */ + P5_4_GPIO = 0, /* GPIO controls 'out' */ + P5_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_4_AMUXA = 4, /* Analog mux bus A */ + P5_4_AMUXB = 5, /* Analog mux bus B */ + P5_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_4_TCPWM0_LINE6 = 8, /* Digital Active - tcpwm[0].line[6]:0 */ + P5_4_TCPWM1_LINE6 = 9, /* Digital Active - tcpwm[1].line[6]:0 */ + P5_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:34 */ + P5_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:34 */ + P5_4_LCD_COM34 = 12, /* Digital Deep Sleep - lcd.com[34]:0 */ + P5_4_LCD_SEG34 = 13, /* Digital Deep Sleep - lcd.seg[34]:0 */ + P5_4_SCB5_SPI_SELECT1 = 20, /* Digital Active - scb[5].spi_select1:0 */ + P5_4_AUDIOSS_RX_SCK = 22, /* Digital Active - audioss.rx_sck */ + + /* P5.5 */ + P5_5_GPIO = 0, /* GPIO controls 'out' */ + P5_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_5_AMUXA = 4, /* Analog mux bus A */ + P5_5_AMUXB = 5, /* Analog mux bus B */ + P5_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_5_TCPWM0_LINE_COMPL6 = 8, /* Digital Active - tcpwm[0].line_compl[6]:0 */ + P5_5_TCPWM1_LINE_COMPL6 = 9, /* Digital Active - tcpwm[1].line_compl[6]:0 */ + P5_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:35 */ + P5_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:35 */ + P5_5_LCD_COM35 = 12, /* Digital Deep Sleep - lcd.com[35]:0 */ + P5_5_LCD_SEG35 = 13, /* Digital Deep Sleep - lcd.seg[35]:0 */ + P5_5_SCB5_SPI_SELECT2 = 20, /* Digital Active - scb[5].spi_select2:0 */ + P5_5_AUDIOSS_RX_WS = 22, /* Digital Active - audioss.rx_ws */ + + /* P5.6 */ + P5_6_GPIO = 0, /* GPIO controls 'out' */ + P5_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P5_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P5_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P5_6_AMUXA = 4, /* Analog mux bus A */ + P5_6_AMUXB = 5, /* Analog mux bus B */ + P5_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P5_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P5_6_TCPWM0_LINE7 = 8, /* Digital Active - tcpwm[0].line[7]:0 */ + P5_6_TCPWM1_LINE7 = 9, /* Digital Active - tcpwm[1].line[7]:0 */ + P5_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:36 */ + P5_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:36 */ + P5_6_LCD_COM36 = 12, /* Digital Deep Sleep - lcd.com[36]:0 */ + P5_6_LCD_SEG36 = 13, /* Digital Deep Sleep - lcd.seg[36]:0 */ + P5_6_SCB5_SPI_SELECT3 = 20, /* Digital Active - scb[5].spi_select3:0 */ + P5_6_AUDIOSS_RX_SDI = 22, /* Digital Active - audioss.rx_sdi */ + + /* P6.0 */ + P6_0_GPIO = 0, /* GPIO controls 'out' */ + P6_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_0_AMUXA = 4, /* Analog mux bus A */ + P6_0_AMUXB = 5, /* Analog mux bus B */ + P6_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_0_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:1 */ + P6_0_TCPWM1_LINE8 = 9, /* Digital Active - tcpwm[1].line[8]:0 */ + P6_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:38 */ + P6_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:38 */ + P6_0_LCD_COM38 = 12, /* Digital Deep Sleep - lcd.com[38]:0 */ + P6_0_LCD_SEG38 = 13, /* Digital Deep Sleep - lcd.seg[38]:0 */ + P6_0_SCB8_I2C_SCL = 14, /* Digital Deep Sleep - scb[8].i2c_scl:0 */ + P6_0_SCB3_UART_RX = 18, /* Digital Active - scb[3].uart_rx:0 */ + P6_0_SCB3_I2C_SCL = 19, /* Digital Active - scb[3].i2c_scl:0 */ + P6_0_SCB3_SPI_MOSI = 20, /* Digital Active - scb[3].spi_mosi:0 */ + P6_0_CPUSS_FAULT_OUT0 = 25, /* Digital Active - cpuss.fault_out[0] */ + P6_0_SCB8_SPI_MOSI = 30, /* Digital Deep Sleep - scb[8].spi_mosi:0 */ + + /* P6.1 */ + P6_1_GPIO = 0, /* GPIO controls 'out' */ + P6_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_1_AMUXA = 4, /* Analog mux bus A */ + P6_1_AMUXB = 5, /* Analog mux bus B */ + P6_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_1_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:1 */ + P6_1_TCPWM1_LINE_COMPL8 = 9, /* Digital Active - tcpwm[1].line_compl[8]:0 */ + P6_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:39 */ + P6_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:39 */ + P6_1_LCD_COM39 = 12, /* Digital Deep Sleep - lcd.com[39]:0 */ + P6_1_LCD_SEG39 = 13, /* Digital Deep Sleep - lcd.seg[39]:0 */ + P6_1_SCB8_I2C_SDA = 14, /* Digital Deep Sleep - scb[8].i2c_sda:0 */ + P6_1_SCB3_UART_TX = 18, /* Digital Active - scb[3].uart_tx:0 */ + P6_1_SCB3_I2C_SDA = 19, /* Digital Active - scb[3].i2c_sda:0 */ + P6_1_SCB3_SPI_MISO = 20, /* Digital Active - scb[3].spi_miso:0 */ + P6_1_CPUSS_FAULT_OUT1 = 25, /* Digital Active - cpuss.fault_out[1] */ + P6_1_SCB8_SPI_MISO = 30, /* Digital Deep Sleep - scb[8].spi_miso:0 */ + + /* P6.2 */ + P6_2_GPIO = 0, /* GPIO controls 'out' */ + P6_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_2_AMUXA = 4, /* Analog mux bus A */ + P6_2_AMUXB = 5, /* Analog mux bus B */ + P6_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_2_TCPWM0_LINE1 = 8, /* Digital Active - tcpwm[0].line[1]:1 */ + P6_2_TCPWM1_LINE9 = 9, /* Digital Active - tcpwm[1].line[9]:0 */ + P6_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:40 */ + P6_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:40 */ + P6_2_LCD_COM40 = 12, /* Digital Deep Sleep - lcd.com[40]:0 */ + P6_2_LCD_SEG40 = 13, /* Digital Deep Sleep - lcd.seg[40]:0 */ + P6_2_SCB3_UART_RTS = 18, /* Digital Active - scb[3].uart_rts:0 */ + P6_2_SCB3_SPI_CLK = 20, /* Digital Active - scb[3].spi_clk:0 */ + P6_2_SCB8_SPI_CLK = 30, /* Digital Deep Sleep - scb[8].spi_clk:0 */ + + /* P6.3 */ + P6_3_GPIO = 0, /* GPIO controls 'out' */ + P6_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_3_AMUXA = 4, /* Analog mux bus A */ + P6_3_AMUXB = 5, /* Analog mux bus B */ + P6_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_3_TCPWM0_LINE_COMPL1 = 8, /* Digital Active - tcpwm[0].line_compl[1]:1 */ + P6_3_TCPWM1_LINE_COMPL9 = 9, /* Digital Active - tcpwm[1].line_compl[9]:0 */ + P6_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:41 */ + P6_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:41 */ + P6_3_LCD_COM41 = 12, /* Digital Deep Sleep - lcd.com[41]:0 */ + P6_3_LCD_SEG41 = 13, /* Digital Deep Sleep - lcd.seg[41]:0 */ + P6_3_SCB3_UART_CTS = 18, /* Digital Active - scb[3].uart_cts:0 */ + P6_3_SCB3_SPI_SELECT0 = 20, /* Digital Active - scb[3].spi_select0:0 */ + P6_3_SCB8_SPI_SELECT0 = 30, /* Digital Deep Sleep - scb[8].spi_select0:0 */ + + /* P6.4 */ + P6_4_GPIO = 0, /* GPIO controls 'out' */ + P6_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_4_AMUXA = 4, /* Analog mux bus A */ + P6_4_AMUXB = 5, /* Analog mux bus B */ + P6_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_4_TCPWM0_LINE2 = 8, /* Digital Active - tcpwm[0].line[2]:1 */ + P6_4_TCPWM1_LINE10 = 9, /* Digital Active - tcpwm[1].line[10]:0 */ + P6_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:42 */ + P6_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:42 */ + P6_4_LCD_COM42 = 12, /* Digital Deep Sleep - lcd.com[42]:0 */ + P6_4_LCD_SEG42 = 13, /* Digital Deep Sleep - lcd.seg[42]:0 */ + P6_4_SCB8_I2C_SCL = 14, /* Digital Deep Sleep - scb[8].i2c_scl:1 */ + P6_4_SCB6_UART_RX = 18, /* Digital Active - scb[6].uart_rx:2 */ + P6_4_SCB6_I2C_SCL = 19, /* Digital Active - scb[6].i2c_scl:2 */ + P6_4_SCB6_SPI_MOSI = 20, /* Digital Active - scb[6].spi_mosi:2 */ + P6_4_PERI_TR_IO_INPUT12 = 24, /* Digital Active - peri.tr_io_input[12]:0 */ + P6_4_PERI_TR_IO_OUTPUT0 = 25, /* Digital Active - peri.tr_io_output[0]:1 */ + P6_4_CPUSS_SWJ_SWO_TDO = 29, /* Digital Deep Sleep - cpuss.swj_swo_tdo */ + P6_4_SCB8_SPI_MOSI = 30, /* Digital Deep Sleep - scb[8].spi_mosi:1 */ + P6_4_SRSS_DDFT_PIN_IN0 = 31, /* Digital Deep Sleep - srss.ddft_pin_in[0]:0 */ + + /* P6.5 */ + P6_5_GPIO = 0, /* GPIO controls 'out' */ + P6_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_5_AMUXA = 4, /* Analog mux bus A */ + P6_5_AMUXB = 5, /* Analog mux bus B */ + P6_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_5_TCPWM0_LINE_COMPL2 = 8, /* Digital Active - tcpwm[0].line_compl[2]:1 */ + P6_5_TCPWM1_LINE_COMPL10 = 9, /* Digital Active - tcpwm[1].line_compl[10]:0 */ + P6_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:43 */ + P6_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:43 */ + P6_5_LCD_COM43 = 12, /* Digital Deep Sleep - lcd.com[43]:0 */ + P6_5_LCD_SEG43 = 13, /* Digital Deep Sleep - lcd.seg[43]:0 */ + P6_5_SCB8_I2C_SDA = 14, /* Digital Deep Sleep - scb[8].i2c_sda:1 */ + P6_5_SCB6_UART_TX = 18, /* Digital Active - scb[6].uart_tx:2 */ + P6_5_SCB6_I2C_SDA = 19, /* Digital Active - scb[6].i2c_sda:2 */ + P6_5_SCB6_SPI_MISO = 20, /* Digital Active - scb[6].spi_miso:2 */ + P6_5_PERI_TR_IO_INPUT13 = 24, /* Digital Active - peri.tr_io_input[13]:0 */ + P6_5_PERI_TR_IO_OUTPUT1 = 25, /* Digital Active - peri.tr_io_output[1]:1 */ + P6_5_CPUSS_SWJ_SWDOE_TDI = 29, /* Digital Deep Sleep - cpuss.swj_swdoe_tdi */ + P6_5_SCB8_SPI_MISO = 30, /* Digital Deep Sleep - scb[8].spi_miso:1 */ + P6_5_SRSS_DDFT_PIN_IN1 = 31, /* Digital Deep Sleep - srss.ddft_pin_in[1]:0 */ + + /* P6.6 */ + P6_6_GPIO = 0, /* GPIO controls 'out' */ + P6_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_6_AMUXA = 4, /* Analog mux bus A */ + P6_6_AMUXB = 5, /* Analog mux bus B */ + P6_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_6_TCPWM0_LINE3 = 8, /* Digital Active - tcpwm[0].line[3]:1 */ + P6_6_TCPWM1_LINE11 = 9, /* Digital Active - tcpwm[1].line[11]:0 */ + P6_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:44 */ + P6_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:44 */ + P6_6_LCD_COM44 = 12, /* Digital Deep Sleep - lcd.com[44]:0 */ + P6_6_LCD_SEG44 = 13, /* Digital Deep Sleep - lcd.seg[44]:0 */ + P6_6_SCB6_UART_RTS = 18, /* Digital Active - scb[6].uart_rts:2 */ + P6_6_SCB6_SPI_CLK = 20, /* Digital Active - scb[6].spi_clk:2 */ + P6_6_CPUSS_SWJ_SWDIO_TMS = 29, /* Digital Deep Sleep - cpuss.swj_swdio_tms */ + P6_6_SCB8_SPI_CLK = 30, /* Digital Deep Sleep - scb[8].spi_clk:1 */ + + /* P6.7 */ + P6_7_GPIO = 0, /* GPIO controls 'out' */ + P6_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P6_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P6_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P6_7_AMUXA = 4, /* Analog mux bus A */ + P6_7_AMUXB = 5, /* Analog mux bus B */ + P6_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P6_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P6_7_TCPWM0_LINE_COMPL3 = 8, /* Digital Active - tcpwm[0].line_compl[3]:1 */ + P6_7_TCPWM1_LINE_COMPL11 = 9, /* Digital Active - tcpwm[1].line_compl[11]:0 */ + P6_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:45 */ + P6_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:45 */ + P6_7_LCD_COM45 = 12, /* Digital Deep Sleep - lcd.com[45]:0 */ + P6_7_LCD_SEG45 = 13, /* Digital Deep Sleep - lcd.seg[45]:0 */ + P6_7_SCB6_UART_CTS = 18, /* Digital Active - scb[6].uart_cts:2 */ + P6_7_SCB6_SPI_SELECT0 = 20, /* Digital Active - scb[6].spi_select0:2 */ + P6_7_CPUSS_SWJ_SWCLK_TCLK = 29, /* Digital Deep Sleep - cpuss.swj_swclk_tclk */ + P6_7_SCB8_SPI_SELECT0 = 30, /* Digital Deep Sleep - scb[8].spi_select0:1 */ + + /* P7.0 */ + P7_0_GPIO = 0, /* GPIO controls 'out' */ + P7_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_0_AMUXA = 4, /* Analog mux bus A */ + P7_0_AMUXB = 5, /* Analog mux bus B */ + P7_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_0_TCPWM0_LINE4 = 8, /* Digital Active - tcpwm[0].line[4]:1 */ + P7_0_TCPWM1_LINE12 = 9, /* Digital Active - tcpwm[1].line[12]:0 */ + P7_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:46 */ + P7_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:46 */ + P7_0_LCD_COM46 = 12, /* Digital Deep Sleep - lcd.com[46]:0 */ + P7_0_LCD_SEG46 = 13, /* Digital Deep Sleep - lcd.seg[46]:0 */ + P7_0_SCB4_UART_RX = 18, /* Digital Active - scb[4].uart_rx:1 */ + P7_0_SCB4_I2C_SCL = 19, /* Digital Active - scb[4].i2c_scl:1 */ + P7_0_SCB4_SPI_MOSI = 20, /* Digital Active - scb[4].spi_mosi:1 */ + P7_0_PERI_TR_IO_INPUT14 = 24, /* Digital Active - peri.tr_io_input[14]:0 */ + P7_0_CPUSS_TRACE_CLOCK = 26, /* Digital Active - cpuss.trace_clock */ + + /* P7.1 */ + P7_1_GPIO = 0, /* GPIO controls 'out' */ + P7_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_1_AMUXA = 4, /* Analog mux bus A */ + P7_1_AMUXB = 5, /* Analog mux bus B */ + P7_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_1_TCPWM0_LINE_COMPL4 = 8, /* Digital Active - tcpwm[0].line_compl[4]:1 */ + P7_1_TCPWM1_LINE_COMPL12 = 9, /* Digital Active - tcpwm[1].line_compl[12]:0 */ + P7_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:47 */ + P7_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:47 */ + P7_1_LCD_COM47 = 12, /* Digital Deep Sleep - lcd.com[47]:0 */ + P7_1_LCD_SEG47 = 13, /* Digital Deep Sleep - lcd.seg[47]:0 */ + P7_1_SCB4_UART_TX = 18, /* Digital Active - scb[4].uart_tx:1 */ + P7_1_SCB4_I2C_SDA = 19, /* Digital Active - scb[4].i2c_sda:1 */ + P7_1_SCB4_SPI_MISO = 20, /* Digital Active - scb[4].spi_miso:1 */ + P7_1_PERI_TR_IO_INPUT15 = 24, /* Digital Active - peri.tr_io_input[15]:0 */ + + /* P7.2 */ + P7_2_GPIO = 0, /* GPIO controls 'out' */ + P7_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_2_AMUXA = 4, /* Analog mux bus A */ + P7_2_AMUXB = 5, /* Analog mux bus B */ + P7_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_2_TCPWM0_LINE5 = 8, /* Digital Active - tcpwm[0].line[5]:1 */ + P7_2_TCPWM1_LINE13 = 9, /* Digital Active - tcpwm[1].line[13]:0 */ + P7_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:48 */ + P7_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:48 */ + P7_2_LCD_COM48 = 12, /* Digital Deep Sleep - lcd.com[48]:0 */ + P7_2_LCD_SEG48 = 13, /* Digital Deep Sleep - lcd.seg[48]:0 */ + P7_2_SCB4_UART_RTS = 18, /* Digital Active - scb[4].uart_rts:1 */ + P7_2_SCB4_SPI_CLK = 20, /* Digital Active - scb[4].spi_clk:1 */ + + /* P7.3 */ + P7_3_GPIO = 0, /* GPIO controls 'out' */ + P7_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_3_AMUXA = 4, /* Analog mux bus A */ + P7_3_AMUXB = 5, /* Analog mux bus B */ + P7_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_3_TCPWM0_LINE_COMPL5 = 8, /* Digital Active - tcpwm[0].line_compl[5]:1 */ + P7_3_TCPWM1_LINE_COMPL13 = 9, /* Digital Active - tcpwm[1].line_compl[13]:0 */ + P7_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:49 */ + P7_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:49 */ + P7_3_LCD_COM49 = 12, /* Digital Deep Sleep - lcd.com[49]:0 */ + P7_3_LCD_SEG49 = 13, /* Digital Deep Sleep - lcd.seg[49]:0 */ + P7_3_SCB4_UART_CTS = 18, /* Digital Active - scb[4].uart_cts:1 */ + P7_3_SCB4_SPI_SELECT0 = 20, /* Digital Active - scb[4].spi_select0:1 */ + + /* P7.4 */ + P7_4_GPIO = 0, /* GPIO controls 'out' */ + P7_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_4_AMUXA = 4, /* Analog mux bus A */ + P7_4_AMUXB = 5, /* Analog mux bus B */ + P7_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_4_TCPWM0_LINE6 = 8, /* Digital Active - tcpwm[0].line[6]:1 */ + P7_4_TCPWM1_LINE14 = 9, /* Digital Active - tcpwm[1].line[14]:0 */ + P7_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:50 */ + P7_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:50 */ + P7_4_LCD_COM50 = 12, /* Digital Deep Sleep - lcd.com[50]:0 */ + P7_4_LCD_SEG50 = 13, /* Digital Deep Sleep - lcd.seg[50]:0 */ + P7_4_SCB4_SPI_SELECT1 = 20, /* Digital Active - scb[4].spi_select1:1 */ + P7_4_BLESS_EXT_LNA_RX_CTL_OUT = 26, /* Digital Active - bless.ext_lna_rx_ctl_out */ + P7_4_CPUSS_TRACE_DATA3 = 27, /* Digital Active - cpuss.trace_data[3]:2 */ + + /* P7.5 */ + P7_5_GPIO = 0, /* GPIO controls 'out' */ + P7_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_5_AMUXA = 4, /* Analog mux bus A */ + P7_5_AMUXB = 5, /* Analog mux bus B */ + P7_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_5_TCPWM0_LINE_COMPL6 = 8, /* Digital Active - tcpwm[0].line_compl[6]:1 */ + P7_5_TCPWM1_LINE_COMPL14 = 9, /* Digital Active - tcpwm[1].line_compl[14]:0 */ + P7_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:51 */ + P7_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:51 */ + P7_5_LCD_COM51 = 12, /* Digital Deep Sleep - lcd.com[51]:0 */ + P7_5_LCD_SEG51 = 13, /* Digital Deep Sleep - lcd.seg[51]:0 */ + P7_5_SCB4_SPI_SELECT2 = 20, /* Digital Active - scb[4].spi_select2:1 */ + P7_5_BLESS_EXT_PA_TX_CTL_OUT = 26, /* Digital Active - bless.ext_pa_tx_ctl_out */ + P7_5_CPUSS_TRACE_DATA2 = 27, /* Digital Active - cpuss.trace_data[2]:2 */ + + /* P7.6 */ + P7_6_GPIO = 0, /* GPIO controls 'out' */ + P7_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_6_AMUXA = 4, /* Analog mux bus A */ + P7_6_AMUXB = 5, /* Analog mux bus B */ + P7_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_6_TCPWM0_LINE7 = 8, /* Digital Active - tcpwm[0].line[7]:1 */ + P7_6_TCPWM1_LINE15 = 9, /* Digital Active - tcpwm[1].line[15]:0 */ + P7_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:52 */ + P7_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:52 */ + P7_6_LCD_COM52 = 12, /* Digital Deep Sleep - lcd.com[52]:0 */ + P7_6_LCD_SEG52 = 13, /* Digital Deep Sleep - lcd.seg[52]:0 */ + P7_6_SCB4_SPI_SELECT3 = 20, /* Digital Active - scb[4].spi_select3:1 */ + P7_6_BLESS_EXT_PA_LNA_CHIP_EN_OUT = 26, /* Digital Active - bless.ext_pa_lna_chip_en_out */ + P7_6_CPUSS_TRACE_DATA1 = 27, /* Digital Active - cpuss.trace_data[1]:2 */ + + /* P7.7 */ + P7_7_GPIO = 0, /* GPIO controls 'out' */ + P7_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P7_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P7_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P7_7_AMUXA = 4, /* Analog mux bus A */ + P7_7_AMUXB = 5, /* Analog mux bus B */ + P7_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P7_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P7_7_TCPWM0_LINE_COMPL7 = 8, /* Digital Active - tcpwm[0].line_compl[7]:1 */ + P7_7_TCPWM1_LINE_COMPL15 = 9, /* Digital Active - tcpwm[1].line_compl[15]:0 */ + P7_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:53 */ + P7_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:53 */ + P7_7_LCD_COM53 = 12, /* Digital Deep Sleep - lcd.com[53]:0 */ + P7_7_LCD_SEG53 = 13, /* Digital Deep Sleep - lcd.seg[53]:0 */ + P7_7_SCB3_SPI_SELECT1 = 20, /* Digital Active - scb[3].spi_select1:0 */ + P7_7_CPUSS_CLK_FM_PUMP = 21, /* Digital Active - cpuss.clk_fm_pump */ + P7_7_CPUSS_TRACE_DATA0 = 27, /* Digital Active - cpuss.trace_data[0]:2 */ + + /* P8.0 */ + P8_0_GPIO = 0, /* GPIO controls 'out' */ + P8_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_0_AMUXA = 4, /* Analog mux bus A */ + P8_0_AMUXB = 5, /* Analog mux bus B */ + P8_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_0_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:2 */ + P8_0_TCPWM1_LINE16 = 9, /* Digital Active - tcpwm[1].line[16]:0 */ + P8_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:54 */ + P8_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:54 */ + P8_0_LCD_COM54 = 12, /* Digital Deep Sleep - lcd.com[54]:0 */ + P8_0_LCD_SEG54 = 13, /* Digital Deep Sleep - lcd.seg[54]:0 */ + P8_0_SCB4_UART_RX = 18, /* Digital Active - scb[4].uart_rx:0 */ + P8_0_SCB4_I2C_SCL = 19, /* Digital Active - scb[4].i2c_scl:0 */ + P8_0_SCB4_SPI_MOSI = 20, /* Digital Active - scb[4].spi_mosi:0 */ + P8_0_PERI_TR_IO_INPUT16 = 24, /* Digital Active - peri.tr_io_input[16]:0 */ + + /* P8.1 */ + P8_1_GPIO = 0, /* GPIO controls 'out' */ + P8_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_1_AMUXA = 4, /* Analog mux bus A */ + P8_1_AMUXB = 5, /* Analog mux bus B */ + P8_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_1_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:2 */ + P8_1_TCPWM1_LINE_COMPL16 = 9, /* Digital Active - tcpwm[1].line_compl[16]:0 */ + P8_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:55 */ + P8_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:55 */ + P8_1_LCD_COM55 = 12, /* Digital Deep Sleep - lcd.com[55]:0 */ + P8_1_LCD_SEG55 = 13, /* Digital Deep Sleep - lcd.seg[55]:0 */ + P8_1_SCB4_UART_TX = 18, /* Digital Active - scb[4].uart_tx:0 */ + P8_1_SCB4_I2C_SDA = 19, /* Digital Active - scb[4].i2c_sda:0 */ + P8_1_SCB4_SPI_MISO = 20, /* Digital Active - scb[4].spi_miso:0 */ + P8_1_PERI_TR_IO_INPUT17 = 24, /* Digital Active - peri.tr_io_input[17]:0 */ + + /* P8.2 */ + P8_2_GPIO = 0, /* GPIO controls 'out' */ + P8_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_2_AMUXA = 4, /* Analog mux bus A */ + P8_2_AMUXB = 5, /* Analog mux bus B */ + P8_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_2_TCPWM0_LINE1 = 8, /* Digital Active - tcpwm[0].line[1]:2 */ + P8_2_TCPWM1_LINE17 = 9, /* Digital Active - tcpwm[1].line[17]:0 */ + P8_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:56 */ + P8_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:56 */ + P8_2_LCD_COM56 = 12, /* Digital Deep Sleep - lcd.com[56]:0 */ + P8_2_LCD_SEG56 = 13, /* Digital Deep Sleep - lcd.seg[56]:0 */ + P8_2_LPCOMP_DSI_COMP0 = 15, /* Digital Deep Sleep - lpcomp.dsi_comp0:0 */ + P8_2_SCB4_UART_RTS = 18, /* Digital Active - scb[4].uart_rts:0 */ + P8_2_SCB4_SPI_CLK = 20, /* Digital Active - scb[4].spi_clk:0 */ + + /* P8.3 */ + P8_3_GPIO = 0, /* GPIO controls 'out' */ + P8_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_3_AMUXA = 4, /* Analog mux bus A */ + P8_3_AMUXB = 5, /* Analog mux bus B */ + P8_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_3_TCPWM0_LINE_COMPL1 = 8, /* Digital Active - tcpwm[0].line_compl[1]:2 */ + P8_3_TCPWM1_LINE_COMPL17 = 9, /* Digital Active - tcpwm[1].line_compl[17]:0 */ + P8_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:57 */ + P8_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:57 */ + P8_3_LCD_COM57 = 12, /* Digital Deep Sleep - lcd.com[57]:0 */ + P8_3_LCD_SEG57 = 13, /* Digital Deep Sleep - lcd.seg[57]:0 */ + P8_3_LPCOMP_DSI_COMP1 = 15, /* Digital Deep Sleep - lpcomp.dsi_comp1:0 */ + P8_3_SCB4_UART_CTS = 18, /* Digital Active - scb[4].uart_cts:0 */ + P8_3_SCB4_SPI_SELECT0 = 20, /* Digital Active - scb[4].spi_select0:0 */ + + /* P8.4 */ + P8_4_GPIO = 0, /* GPIO controls 'out' */ + P8_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_4_AMUXA = 4, /* Analog mux bus A */ + P8_4_AMUXB = 5, /* Analog mux bus B */ + P8_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_4_TCPWM0_LINE2 = 8, /* Digital Active - tcpwm[0].line[2]:2 */ + P8_4_TCPWM1_LINE18 = 9, /* Digital Active - tcpwm[1].line[18]:0 */ + P8_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:58 */ + P8_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:58 */ + P8_4_LCD_COM58 = 12, /* Digital Deep Sleep - lcd.com[58]:0 */ + P8_4_LCD_SEG58 = 13, /* Digital Deep Sleep - lcd.seg[58]:0 */ + P8_4_SCB4_SPI_SELECT1 = 20, /* Digital Active - scb[4].spi_select1:0 */ + + /* P8.5 */ + P8_5_GPIO = 0, /* GPIO controls 'out' */ + P8_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_5_AMUXA = 4, /* Analog mux bus A */ + P8_5_AMUXB = 5, /* Analog mux bus B */ + P8_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_5_TCPWM0_LINE_COMPL2 = 8, /* Digital Active - tcpwm[0].line_compl[2]:2 */ + P8_5_TCPWM1_LINE_COMPL18 = 9, /* Digital Active - tcpwm[1].line_compl[18]:0 */ + P8_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:59 */ + P8_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:59 */ + P8_5_LCD_COM59 = 12, /* Digital Deep Sleep - lcd.com[59]:0 */ + P8_5_LCD_SEG59 = 13, /* Digital Deep Sleep - lcd.seg[59]:0 */ + P8_5_SCB4_SPI_SELECT2 = 20, /* Digital Active - scb[4].spi_select2:0 */ + + /* P8.6 */ + P8_6_GPIO = 0, /* GPIO controls 'out' */ + P8_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_6_AMUXA = 4, /* Analog mux bus A */ + P8_6_AMUXB = 5, /* Analog mux bus B */ + P8_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_6_TCPWM0_LINE3 = 8, /* Digital Active - tcpwm[0].line[3]:2 */ + P8_6_TCPWM1_LINE19 = 9, /* Digital Active - tcpwm[1].line[19]:0 */ + P8_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:60 */ + P8_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:60 */ + P8_6_LCD_COM60 = 12, /* Digital Deep Sleep - lcd.com[60]:0 */ + P8_6_LCD_SEG60 = 13, /* Digital Deep Sleep - lcd.seg[60]:0 */ + P8_6_SCB4_SPI_SELECT3 = 20, /* Digital Active - scb[4].spi_select3:0 */ + + /* P8.7 */ + P8_7_GPIO = 0, /* GPIO controls 'out' */ + P8_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P8_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P8_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P8_7_AMUXA = 4, /* Analog mux bus A */ + P8_7_AMUXB = 5, /* Analog mux bus B */ + P8_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P8_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P8_7_TCPWM0_LINE_COMPL3 = 8, /* Digital Active - tcpwm[0].line_compl[3]:2 */ + P8_7_TCPWM1_LINE_COMPL19 = 9, /* Digital Active - tcpwm[1].line_compl[19]:0 */ + P8_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:61 */ + P8_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:61 */ + P8_7_LCD_COM61 = 12, /* Digital Deep Sleep - lcd.com[61]:0 */ + P8_7_LCD_SEG61 = 13, /* Digital Deep Sleep - lcd.seg[61]:0 */ + P8_7_SCB3_SPI_SELECT2 = 20, /* Digital Active - scb[3].spi_select2:0 */ + + /* P9.0 */ + P9_0_GPIO = 0, /* GPIO controls 'out' */ + P9_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_0_AMUXA = 4, /* Analog mux bus A */ + P9_0_AMUXB = 5, /* Analog mux bus B */ + P9_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_0_TCPWM0_LINE4 = 8, /* Digital Active - tcpwm[0].line[4]:2 */ + P9_0_TCPWM1_LINE20 = 9, /* Digital Active - tcpwm[1].line[20]:0 */ + P9_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:62 */ + P9_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:62 */ + P9_0_LCD_COM0 = 12, /* Digital Deep Sleep - lcd.com[0]:1 */ + P9_0_LCD_SEG0 = 13, /* Digital Deep Sleep - lcd.seg[0]:1 */ + P9_0_SCB2_UART_RX = 18, /* Digital Active - scb[2].uart_rx:0 */ + P9_0_SCB2_I2C_SCL = 19, /* Digital Active - scb[2].i2c_scl:0 */ + P9_0_SCB2_SPI_MOSI = 20, /* Digital Active - scb[2].spi_mosi:0 */ + P9_0_PERI_TR_IO_INPUT18 = 24, /* Digital Active - peri.tr_io_input[18]:0 */ + P9_0_CPUSS_TRACE_DATA3 = 27, /* Digital Active - cpuss.trace_data[3]:0 */ + + /* P9.1 */ + P9_1_GPIO = 0, /* GPIO controls 'out' */ + P9_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_1_AMUXA = 4, /* Analog mux bus A */ + P9_1_AMUXB = 5, /* Analog mux bus B */ + P9_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_1_TCPWM0_LINE_COMPL4 = 8, /* Digital Active - tcpwm[0].line_compl[4]:2 */ + P9_1_TCPWM1_LINE_COMPL20 = 9, /* Digital Active - tcpwm[1].line_compl[20]:0 */ + P9_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:63 */ + P9_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:63 */ + P9_1_LCD_COM1 = 12, /* Digital Deep Sleep - lcd.com[1]:1 */ + P9_1_LCD_SEG1 = 13, /* Digital Deep Sleep - lcd.seg[1]:1 */ + P9_1_SCB2_UART_TX = 18, /* Digital Active - scb[2].uart_tx:0 */ + P9_1_SCB2_I2C_SDA = 19, /* Digital Active - scb[2].i2c_sda:0 */ + P9_1_SCB2_SPI_MISO = 20, /* Digital Active - scb[2].spi_miso:0 */ + P9_1_PERI_TR_IO_INPUT19 = 24, /* Digital Active - peri.tr_io_input[19]:0 */ + P9_1_CPUSS_TRACE_DATA2 = 27, /* Digital Active - cpuss.trace_data[2]:0 */ + P9_1_SRSS_DDFT_PIN_IN0 = 31, /* Digital Deep Sleep - srss.ddft_pin_in[0]:1 */ + + /* P9.2 */ + P9_2_GPIO = 0, /* GPIO controls 'out' */ + P9_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_2_AMUXA = 4, /* Analog mux bus A */ + P9_2_AMUXB = 5, /* Analog mux bus B */ + P9_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_2_TCPWM0_LINE5 = 8, /* Digital Active - tcpwm[0].line[5]:2 */ + P9_2_TCPWM1_LINE21 = 9, /* Digital Active - tcpwm[1].line[21]:0 */ + P9_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:64 */ + P9_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:64 */ + P9_2_LCD_COM2 = 12, /* Digital Deep Sleep - lcd.com[2]:1 */ + P9_2_LCD_SEG2 = 13, /* Digital Deep Sleep - lcd.seg[2]:1 */ + P9_2_SCB2_UART_RTS = 18, /* Digital Active - scb[2].uart_rts:0 */ + P9_2_SCB2_SPI_CLK = 20, /* Digital Active - scb[2].spi_clk:0 */ + P9_2_PASS_DSI_CTB_CMP0 = 22, /* Digital Active - pass.dsi_ctb_cmp0:1 */ + P9_2_CPUSS_TRACE_DATA1 = 27, /* Digital Active - cpuss.trace_data[1]:0 */ + + /* P9.3 */ + P9_3_GPIO = 0, /* GPIO controls 'out' */ + P9_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_3_AMUXA = 4, /* Analog mux bus A */ + P9_3_AMUXB = 5, /* Analog mux bus B */ + P9_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_3_TCPWM0_LINE_COMPL5 = 8, /* Digital Active - tcpwm[0].line_compl[5]:2 */ + P9_3_TCPWM1_LINE_COMPL21 = 9, /* Digital Active - tcpwm[1].line_compl[21]:0 */ + P9_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:65 */ + P9_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:65 */ + P9_3_LCD_COM3 = 12, /* Digital Deep Sleep - lcd.com[3]:1 */ + P9_3_LCD_SEG3 = 13, /* Digital Deep Sleep - lcd.seg[3]:1 */ + P9_3_SCB2_UART_CTS = 18, /* Digital Active - scb[2].uart_cts:0 */ + P9_3_SCB2_SPI_SELECT0 = 20, /* Digital Active - scb[2].spi_select0:0 */ + P9_3_PASS_DSI_CTB_CMP1 = 22, /* Digital Active - pass.dsi_ctb_cmp1:1 */ + P9_3_CPUSS_TRACE_DATA0 = 27, /* Digital Active - cpuss.trace_data[0]:0 */ + P9_3_SRSS_DDFT_PIN_IN1 = 31, /* Digital Deep Sleep - srss.ddft_pin_in[1]:1 */ + + /* P9.4 */ + P9_4_GPIO = 0, /* GPIO controls 'out' */ + P9_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_4_AMUXA = 4, /* Analog mux bus A */ + P9_4_AMUXB = 5, /* Analog mux bus B */ + P9_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_4_TCPWM0_LINE7 = 8, /* Digital Active - tcpwm[0].line[7]:5 */ + P9_4_TCPWM1_LINE0 = 9, /* Digital Active - tcpwm[1].line[0]:2 */ + P9_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:66 */ + P9_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:66 */ + P9_4_LCD_COM4 = 12, /* Digital Deep Sleep - lcd.com[4]:1 */ + P9_4_LCD_SEG4 = 13, /* Digital Deep Sleep - lcd.seg[4]:1 */ + P9_4_SCB2_SPI_SELECT1 = 20, /* Digital Active - scb[2].spi_select1:0 */ + + /* P9.5 */ + P9_5_GPIO = 0, /* GPIO controls 'out' */ + P9_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_5_AMUXA = 4, /* Analog mux bus A */ + P9_5_AMUXB = 5, /* Analog mux bus B */ + P9_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_5_TCPWM0_LINE_COMPL7 = 8, /* Digital Active - tcpwm[0].line_compl[7]:5 */ + P9_5_TCPWM1_LINE_COMPL0 = 9, /* Digital Active - tcpwm[1].line_compl[0]:2 */ + P9_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:67 */ + P9_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:67 */ + P9_5_LCD_COM5 = 12, /* Digital Deep Sleep - lcd.com[5]:1 */ + P9_5_LCD_SEG5 = 13, /* Digital Deep Sleep - lcd.seg[5]:1 */ + P9_5_SCB2_SPI_SELECT2 = 20, /* Digital Active - scb[2].spi_select2:0 */ + + /* P9.6 */ + P9_6_GPIO = 0, /* GPIO controls 'out' */ + P9_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_6_AMUXA = 4, /* Analog mux bus A */ + P9_6_AMUXB = 5, /* Analog mux bus B */ + P9_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_6_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:6 */ + P9_6_TCPWM1_LINE1 = 9, /* Digital Active - tcpwm[1].line[1]:2 */ + P9_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:68 */ + P9_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:68 */ + P9_6_LCD_COM6 = 12, /* Digital Deep Sleep - lcd.com[6]:1 */ + P9_6_LCD_SEG6 = 13, /* Digital Deep Sleep - lcd.seg[6]:1 */ + P9_6_SCB2_SPI_SELECT3 = 20, /* Digital Active - scb[2].spi_select3:0 */ + + /* P9.7 */ + P9_7_GPIO = 0, /* GPIO controls 'out' */ + P9_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P9_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P9_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P9_7_AMUXA = 4, /* Analog mux bus A */ + P9_7_AMUXB = 5, /* Analog mux bus B */ + P9_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P9_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P9_7_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:6 */ + P9_7_TCPWM1_LINE_COMPL1 = 9, /* Digital Active - tcpwm[1].line_compl[1]:2 */ + P9_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:69 */ + P9_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:69 */ + P9_7_LCD_COM7 = 12, /* Digital Deep Sleep - lcd.com[7]:1 */ + P9_7_LCD_SEG7 = 13, /* Digital Deep Sleep - lcd.seg[7]:1 */ + + /* P10.0 */ + P10_0_GPIO = 0, /* GPIO controls 'out' */ + P10_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_0_AMUXA = 4, /* Analog mux bus A */ + P10_0_AMUXB = 5, /* Analog mux bus B */ + P10_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_0_TCPWM0_LINE6 = 8, /* Digital Active - tcpwm[0].line[6]:2 */ + P10_0_TCPWM1_LINE22 = 9, /* Digital Active - tcpwm[1].line[22]:0 */ + P10_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:70 */ + P10_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:70 */ + P10_0_LCD_COM8 = 12, /* Digital Deep Sleep - lcd.com[8]:1 */ + P10_0_LCD_SEG8 = 13, /* Digital Deep Sleep - lcd.seg[8]:1 */ + P10_0_SCB1_UART_RX = 18, /* Digital Active - scb[1].uart_rx:1 */ + P10_0_SCB1_I2C_SCL = 19, /* Digital Active - scb[1].i2c_scl:1 */ + P10_0_SCB1_SPI_MOSI = 20, /* Digital Active - scb[1].spi_mosi:1 */ + P10_0_PERI_TR_IO_INPUT20 = 24, /* Digital Active - peri.tr_io_input[20]:0 */ + P10_0_CPUSS_TRACE_DATA3 = 27, /* Digital Active - cpuss.trace_data[3]:1 */ + + /* P10.1 */ + P10_1_GPIO = 0, /* GPIO controls 'out' */ + P10_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_1_AMUXA = 4, /* Analog mux bus A */ + P10_1_AMUXB = 5, /* Analog mux bus B */ + P10_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_1_TCPWM0_LINE_COMPL6 = 8, /* Digital Active - tcpwm[0].line_compl[6]:2 */ + P10_1_TCPWM1_LINE_COMPL22 = 9, /* Digital Active - tcpwm[1].line_compl[22]:0 */ + P10_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:71 */ + P10_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:71 */ + P10_1_LCD_COM9 = 12, /* Digital Deep Sleep - lcd.com[9]:1 */ + P10_1_LCD_SEG9 = 13, /* Digital Deep Sleep - lcd.seg[9]:1 */ + P10_1_SCB1_UART_TX = 18, /* Digital Active - scb[1].uart_tx:1 */ + P10_1_SCB1_I2C_SDA = 19, /* Digital Active - scb[1].i2c_sda:1 */ + P10_1_SCB1_SPI_MISO = 20, /* Digital Active - scb[1].spi_miso:1 */ + P10_1_PERI_TR_IO_INPUT21 = 24, /* Digital Active - peri.tr_io_input[21]:0 */ + P10_1_CPUSS_TRACE_DATA2 = 27, /* Digital Active - cpuss.trace_data[2]:1 */ + + /* P10.2 */ + P10_2_GPIO = 0, /* GPIO controls 'out' */ + P10_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_2_AMUXA = 4, /* Analog mux bus A */ + P10_2_AMUXB = 5, /* Analog mux bus B */ + P10_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_2_TCPWM0_LINE7 = 8, /* Digital Active - tcpwm[0].line[7]:2 */ + P10_2_TCPWM1_LINE23 = 9, /* Digital Active - tcpwm[1].line[23]:0 */ + P10_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:72 */ + P10_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:72 */ + P10_2_LCD_COM10 = 12, /* Digital Deep Sleep - lcd.com[10]:1 */ + P10_2_LCD_SEG10 = 13, /* Digital Deep Sleep - lcd.seg[10]:1 */ + P10_2_SCB1_UART_RTS = 18, /* Digital Active - scb[1].uart_rts:1 */ + P10_2_SCB1_SPI_CLK = 20, /* Digital Active - scb[1].spi_clk:1 */ + P10_2_CPUSS_TRACE_DATA1 = 27, /* Digital Active - cpuss.trace_data[1]:1 */ + + /* P10.3 */ + P10_3_GPIO = 0, /* GPIO controls 'out' */ + P10_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_3_AMUXA = 4, /* Analog mux bus A */ + P10_3_AMUXB = 5, /* Analog mux bus B */ + P10_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_3_TCPWM0_LINE_COMPL7 = 8, /* Digital Active - tcpwm[0].line_compl[7]:2 */ + P10_3_TCPWM1_LINE_COMPL23 = 9, /* Digital Active - tcpwm[1].line_compl[23]:0 */ + P10_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:73 */ + P10_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:73 */ + P10_3_LCD_COM11 = 12, /* Digital Deep Sleep - lcd.com[11]:1 */ + P10_3_LCD_SEG11 = 13, /* Digital Deep Sleep - lcd.seg[11]:1 */ + P10_3_SCB1_UART_CTS = 18, /* Digital Active - scb[1].uart_cts:1 */ + P10_3_SCB1_SPI_SELECT0 = 20, /* Digital Active - scb[1].spi_select0:1 */ + P10_3_CPUSS_TRACE_DATA0 = 27, /* Digital Active - cpuss.trace_data[0]:1 */ + + /* P10.4 */ + P10_4_GPIO = 0, /* GPIO controls 'out' */ + P10_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_4_AMUXA = 4, /* Analog mux bus A */ + P10_4_AMUXB = 5, /* Analog mux bus B */ + P10_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_4_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:3 */ + P10_4_TCPWM1_LINE0 = 9, /* Digital Active - tcpwm[1].line[0]:1 */ + P10_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:74 */ + P10_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:74 */ + P10_4_LCD_COM12 = 12, /* Digital Deep Sleep - lcd.com[12]:1 */ + P10_4_LCD_SEG12 = 13, /* Digital Deep Sleep - lcd.seg[12]:1 */ + P10_4_SCB1_SPI_SELECT1 = 20, /* Digital Active - scb[1].spi_select1:1 */ + P10_4_AUDIOSS_PDM_CLK = 21, /* Digital Active - audioss.pdm_clk:0 */ + + /* P10.5 */ + P10_5_GPIO = 0, /* GPIO controls 'out' */ + P10_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_5_AMUXA = 4, /* Analog mux bus A */ + P10_5_AMUXB = 5, /* Analog mux bus B */ + P10_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_5_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:3 */ + P10_5_TCPWM1_LINE_COMPL0 = 9, /* Digital Active - tcpwm[1].line_compl[0]:1 */ + P10_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:75 */ + P10_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:75 */ + P10_5_LCD_COM13 = 12, /* Digital Deep Sleep - lcd.com[13]:1 */ + P10_5_LCD_SEG13 = 13, /* Digital Deep Sleep - lcd.seg[13]:1 */ + P10_5_SCB1_SPI_SELECT2 = 20, /* Digital Active - scb[1].spi_select2:1 */ + P10_5_AUDIOSS_PDM_DATA = 21, /* Digital Active - audioss.pdm_data:0 */ + + /* P10.6 */ + P10_6_GPIO = 0, /* GPIO controls 'out' */ + P10_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P10_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P10_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P10_6_AMUXA = 4, /* Analog mux bus A */ + P10_6_AMUXB = 5, /* Analog mux bus B */ + P10_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P10_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P10_6_TCPWM0_LINE1 = 8, /* Digital Active - tcpwm[0].line[1]:6 */ + P10_6_TCPWM1_LINE2 = 9, /* Digital Active - tcpwm[1].line[2]:2 */ + P10_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:76 */ + P10_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:76 */ + P10_6_LCD_COM14 = 12, /* Digital Deep Sleep - lcd.com[14]:1 */ + P10_6_LCD_SEG14 = 13, /* Digital Deep Sleep - lcd.seg[14]:1 */ + P10_6_SCB1_SPI_SELECT3 = 20, /* Digital Active - scb[1].spi_select3:1 */ + + /* P11.0 */ + P11_0_GPIO = 0, /* GPIO controls 'out' */ + P11_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_0_AMUXA = 4, /* Analog mux bus A */ + P11_0_AMUXB = 5, /* Analog mux bus B */ + P11_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_0_TCPWM0_LINE1 = 8, /* Digital Active - tcpwm[0].line[1]:3 */ + P11_0_TCPWM1_LINE1 = 9, /* Digital Active - tcpwm[1].line[1]:1 */ + P11_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:78 */ + P11_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:78 */ + P11_0_LCD_COM16 = 12, /* Digital Deep Sleep - lcd.com[16]:1 */ + P11_0_LCD_SEG16 = 13, /* Digital Deep Sleep - lcd.seg[16]:1 */ + P11_0_SMIF_SPI_SELECT2 = 17, /* Digital Active - smif.spi_select2 */ + P11_0_SCB5_UART_RX = 18, /* Digital Active - scb[5].uart_rx:1 */ + P11_0_SCB5_I2C_SCL = 19, /* Digital Active - scb[5].i2c_scl:1 */ + P11_0_SCB5_SPI_MOSI = 20, /* Digital Active - scb[5].spi_mosi:1 */ + P11_0_PERI_TR_IO_INPUT22 = 24, /* Digital Active - peri.tr_io_input[22]:0 */ + + /* P11.1 */ + P11_1_GPIO = 0, /* GPIO controls 'out' */ + P11_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_1_AMUXA = 4, /* Analog mux bus A */ + P11_1_AMUXB = 5, /* Analog mux bus B */ + P11_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_1_TCPWM0_LINE_COMPL1 = 8, /* Digital Active - tcpwm[0].line_compl[1]:3 */ + P11_1_TCPWM1_LINE_COMPL1 = 9, /* Digital Active - tcpwm[1].line_compl[1]:1 */ + P11_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:79 */ + P11_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:79 */ + P11_1_LCD_COM17 = 12, /* Digital Deep Sleep - lcd.com[17]:1 */ + P11_1_LCD_SEG17 = 13, /* Digital Deep Sleep - lcd.seg[17]:1 */ + P11_1_SMIF_SPI_SELECT1 = 17, /* Digital Active - smif.spi_select1 */ + P11_1_SCB5_UART_TX = 18, /* Digital Active - scb[5].uart_tx:1 */ + P11_1_SCB5_I2C_SDA = 19, /* Digital Active - scb[5].i2c_sda:1 */ + P11_1_SCB5_SPI_MISO = 20, /* Digital Active - scb[5].spi_miso:1 */ + P11_1_PERI_TR_IO_INPUT23 = 24, /* Digital Active - peri.tr_io_input[23]:0 */ + + /* P11.2 */ + P11_2_GPIO = 0, /* GPIO controls 'out' */ + P11_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_2_AMUXA = 4, /* Analog mux bus A */ + P11_2_AMUXB = 5, /* Analog mux bus B */ + P11_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_2_TCPWM0_LINE2 = 8, /* Digital Active - tcpwm[0].line[2]:3 */ + P11_2_TCPWM1_LINE2 = 9, /* Digital Active - tcpwm[1].line[2]:1 */ + P11_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:80 */ + P11_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:80 */ + P11_2_LCD_COM18 = 12, /* Digital Deep Sleep - lcd.com[18]:1 */ + P11_2_LCD_SEG18 = 13, /* Digital Deep Sleep - lcd.seg[18]:1 */ + P11_2_SMIF_SPI_SELECT0 = 17, /* Digital Active - smif.spi_select0 */ + P11_2_SCB5_UART_RTS = 18, /* Digital Active - scb[5].uart_rts:1 */ + P11_2_SCB5_SPI_CLK = 20, /* Digital Active - scb[5].spi_clk:1 */ + + /* P11.3 */ + P11_3_GPIO = 0, /* GPIO controls 'out' */ + P11_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_3_AMUXA = 4, /* Analog mux bus A */ + P11_3_AMUXB = 5, /* Analog mux bus B */ + P11_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_3_TCPWM0_LINE_COMPL2 = 8, /* Digital Active - tcpwm[0].line_compl[2]:3 */ + P11_3_TCPWM1_LINE_COMPL2 = 9, /* Digital Active - tcpwm[1].line_compl[2]:1 */ + P11_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:81 */ + P11_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:81 */ + P11_3_LCD_COM19 = 12, /* Digital Deep Sleep - lcd.com[19]:1 */ + P11_3_LCD_SEG19 = 13, /* Digital Deep Sleep - lcd.seg[19]:1 */ + P11_3_SMIF_SPI_DATA3 = 17, /* Digital Active - smif.spi_data3 */ + P11_3_SCB5_UART_CTS = 18, /* Digital Active - scb[5].uart_cts:1 */ + P11_3_SCB5_SPI_SELECT0 = 20, /* Digital Active - scb[5].spi_select0:1 */ + P11_3_PERI_TR_IO_OUTPUT0 = 25, /* Digital Active - peri.tr_io_output[0]:0 */ + + /* P11.4 */ + P11_4_GPIO = 0, /* GPIO controls 'out' */ + P11_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_4_AMUXA = 4, /* Analog mux bus A */ + P11_4_AMUXB = 5, /* Analog mux bus B */ + P11_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_4_TCPWM0_LINE3 = 8, /* Digital Active - tcpwm[0].line[3]:3 */ + P11_4_TCPWM1_LINE3 = 9, /* Digital Active - tcpwm[1].line[3]:1 */ + P11_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:82 */ + P11_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:82 */ + P11_4_LCD_COM20 = 12, /* Digital Deep Sleep - lcd.com[20]:1 */ + P11_4_LCD_SEG20 = 13, /* Digital Deep Sleep - lcd.seg[20]:1 */ + P11_4_SMIF_SPI_DATA2 = 17, /* Digital Active - smif.spi_data2 */ + P11_4_SCB5_SPI_SELECT1 = 20, /* Digital Active - scb[5].spi_select1:1 */ + P11_4_PERI_TR_IO_OUTPUT1 = 25, /* Digital Active - peri.tr_io_output[1]:0 */ + + /* P11.5 */ + P11_5_GPIO = 0, /* GPIO controls 'out' */ + P11_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_5_AMUXA = 4, /* Analog mux bus A */ + P11_5_AMUXB = 5, /* Analog mux bus B */ + P11_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_5_TCPWM0_LINE_COMPL3 = 8, /* Digital Active - tcpwm[0].line_compl[3]:3 */ + P11_5_TCPWM1_LINE_COMPL3 = 9, /* Digital Active - tcpwm[1].line_compl[3]:1 */ + P11_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:83 */ + P11_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:83 */ + P11_5_LCD_COM21 = 12, /* Digital Deep Sleep - lcd.com[21]:1 */ + P11_5_LCD_SEG21 = 13, /* Digital Deep Sleep - lcd.seg[21]:1 */ + P11_5_SMIF_SPI_DATA1 = 17, /* Digital Active - smif.spi_data1 */ + P11_5_SCB5_SPI_SELECT2 = 20, /* Digital Active - scb[5].spi_select2:1 */ + + /* P11.6 */ + P11_6_GPIO = 0, /* GPIO controls 'out' */ + P11_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_6_AMUXA = 4, /* Analog mux bus A */ + P11_6_AMUXB = 5, /* Analog mux bus B */ + P11_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:84 */ + P11_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:84 */ + P11_6_LCD_COM22 = 12, /* Digital Deep Sleep - lcd.com[22]:1 */ + P11_6_LCD_SEG22 = 13, /* Digital Deep Sleep - lcd.seg[22]:1 */ + P11_6_SMIF_SPI_DATA0 = 17, /* Digital Active - smif.spi_data0 */ + P11_6_SCB5_SPI_SELECT3 = 20, /* Digital Active - scb[5].spi_select3:1 */ + + /* P11.7 */ + P11_7_GPIO = 0, /* GPIO controls 'out' */ + P11_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P11_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P11_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P11_7_AMUXA = 4, /* Analog mux bus A */ + P11_7_AMUXB = 5, /* Analog mux bus B */ + P11_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P11_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P11_7_SMIF_SPI_CLK = 17, /* Digital Active - smif.spi_clk */ + + /* P12.0 */ + P12_0_GPIO = 0, /* GPIO controls 'out' */ + P12_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_0_AMUXA = 4, /* Analog mux bus A */ + P12_0_AMUXB = 5, /* Analog mux bus B */ + P12_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_0_TCPWM0_LINE4 = 8, /* Digital Active - tcpwm[0].line[4]:3 */ + P12_0_TCPWM1_LINE4 = 9, /* Digital Active - tcpwm[1].line[4]:1 */ + P12_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:85 */ + P12_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:85 */ + P12_0_LCD_COM23 = 12, /* Digital Deep Sleep - lcd.com[23]:1 */ + P12_0_LCD_SEG23 = 13, /* Digital Deep Sleep - lcd.seg[23]:1 */ + P12_0_SMIF_SPI_DATA4 = 17, /* Digital Active - smif.spi_data4 */ + P12_0_SCB6_UART_RX = 18, /* Digital Active - scb[6].uart_rx:0 */ + P12_0_SCB6_I2C_SCL = 19, /* Digital Active - scb[6].i2c_scl:0 */ + P12_0_SCB6_SPI_MOSI = 20, /* Digital Active - scb[6].spi_mosi:0 */ + P12_0_PERI_TR_IO_INPUT24 = 24, /* Digital Active - peri.tr_io_input[24]:0 */ + + /* P12.1 */ + P12_1_GPIO = 0, /* GPIO controls 'out' */ + P12_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_1_AMUXA = 4, /* Analog mux bus A */ + P12_1_AMUXB = 5, /* Analog mux bus B */ + P12_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_1_TCPWM0_LINE_COMPL4 = 8, /* Digital Active - tcpwm[0].line_compl[4]:3 */ + P12_1_TCPWM1_LINE_COMPL4 = 9, /* Digital Active - tcpwm[1].line_compl[4]:1 */ + P12_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:86 */ + P12_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:86 */ + P12_1_LCD_COM24 = 12, /* Digital Deep Sleep - lcd.com[24]:1 */ + P12_1_LCD_SEG24 = 13, /* Digital Deep Sleep - lcd.seg[24]:1 */ + P12_1_SMIF_SPI_DATA5 = 17, /* Digital Active - smif.spi_data5 */ + P12_1_SCB6_UART_TX = 18, /* Digital Active - scb[6].uart_tx:0 */ + P12_1_SCB6_I2C_SDA = 19, /* Digital Active - scb[6].i2c_sda:0 */ + P12_1_SCB6_SPI_MISO = 20, /* Digital Active - scb[6].spi_miso:0 */ + P12_1_PERI_TR_IO_INPUT25 = 24, /* Digital Active - peri.tr_io_input[25]:0 */ + + /* P12.2 */ + P12_2_GPIO = 0, /* GPIO controls 'out' */ + P12_2_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_2_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_2_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_2_AMUXA = 4, /* Analog mux bus A */ + P12_2_AMUXB = 5, /* Analog mux bus B */ + P12_2_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_2_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_2_TCPWM0_LINE5 = 8, /* Digital Active - tcpwm[0].line[5]:3 */ + P12_2_TCPWM1_LINE5 = 9, /* Digital Active - tcpwm[1].line[5]:1 */ + P12_2_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:87 */ + P12_2_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:87 */ + P12_2_LCD_COM25 = 12, /* Digital Deep Sleep - lcd.com[25]:1 */ + P12_2_LCD_SEG25 = 13, /* Digital Deep Sleep - lcd.seg[25]:1 */ + P12_2_SMIF_SPI_DATA6 = 17, /* Digital Active - smif.spi_data6 */ + P12_2_SCB6_UART_RTS = 18, /* Digital Active - scb[6].uart_rts:0 */ + P12_2_SCB6_SPI_CLK = 20, /* Digital Active - scb[6].spi_clk:0 */ + + /* P12.3 */ + P12_3_GPIO = 0, /* GPIO controls 'out' */ + P12_3_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_3_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_3_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_3_AMUXA = 4, /* Analog mux bus A */ + P12_3_AMUXB = 5, /* Analog mux bus B */ + P12_3_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_3_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_3_TCPWM0_LINE_COMPL5 = 8, /* Digital Active - tcpwm[0].line_compl[5]:3 */ + P12_3_TCPWM1_LINE_COMPL5 = 9, /* Digital Active - tcpwm[1].line_compl[5]:1 */ + P12_3_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:88 */ + P12_3_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:88 */ + P12_3_LCD_COM26 = 12, /* Digital Deep Sleep - lcd.com[26]:1 */ + P12_3_LCD_SEG26 = 13, /* Digital Deep Sleep - lcd.seg[26]:1 */ + P12_3_SMIF_SPI_DATA7 = 17, /* Digital Active - smif.spi_data7 */ + P12_3_SCB6_UART_CTS = 18, /* Digital Active - scb[6].uart_cts:0 */ + P12_3_SCB6_SPI_SELECT0 = 20, /* Digital Active - scb[6].spi_select0:0 */ + + /* P12.4 */ + P12_4_GPIO = 0, /* GPIO controls 'out' */ + P12_4_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_4_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_4_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_4_AMUXA = 4, /* Analog mux bus A */ + P12_4_AMUXB = 5, /* Analog mux bus B */ + P12_4_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_4_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_4_TCPWM0_LINE6 = 8, /* Digital Active - tcpwm[0].line[6]:3 */ + P12_4_TCPWM1_LINE6 = 9, /* Digital Active - tcpwm[1].line[6]:1 */ + P12_4_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:89 */ + P12_4_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:89 */ + P12_4_LCD_COM27 = 12, /* Digital Deep Sleep - lcd.com[27]:1 */ + P12_4_LCD_SEG27 = 13, /* Digital Deep Sleep - lcd.seg[27]:1 */ + P12_4_SMIF_SPI_SELECT3 = 17, /* Digital Active - smif.spi_select3 */ + P12_4_SCB6_SPI_SELECT1 = 20, /* Digital Active - scb[6].spi_select1:0 */ + P12_4_AUDIOSS_PDM_CLK = 21, /* Digital Active - audioss.pdm_clk:1 */ + + /* P12.5 */ + P12_5_GPIO = 0, /* GPIO controls 'out' */ + P12_5_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_5_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_5_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_5_AMUXA = 4, /* Analog mux bus A */ + P12_5_AMUXB = 5, /* Analog mux bus B */ + P12_5_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_5_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_5_TCPWM0_LINE_COMPL6 = 8, /* Digital Active - tcpwm[0].line_compl[6]:3 */ + P12_5_TCPWM1_LINE_COMPL6 = 9, /* Digital Active - tcpwm[1].line_compl[6]:1 */ + P12_5_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:90 */ + P12_5_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:90 */ + P12_5_LCD_COM28 = 12, /* Digital Deep Sleep - lcd.com[28]:1 */ + P12_5_LCD_SEG28 = 13, /* Digital Deep Sleep - lcd.seg[28]:1 */ + P12_5_SCB6_SPI_SELECT2 = 20, /* Digital Active - scb[6].spi_select2:0 */ + P12_5_AUDIOSS_PDM_DATA = 21, /* Digital Active - audioss.pdm_data:1 */ + + /* P12.6 */ + P12_6_GPIO = 0, /* GPIO controls 'out' */ + P12_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_6_AMUXA = 4, /* Analog mux bus A */ + P12_6_AMUXB = 5, /* Analog mux bus B */ + P12_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_6_TCPWM0_LINE7 = 8, /* Digital Active - tcpwm[0].line[7]:3 */ + P12_6_TCPWM1_LINE7 = 9, /* Digital Active - tcpwm[1].line[7]:1 */ + P12_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:91 */ + P12_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:91 */ + P12_6_LCD_COM29 = 12, /* Digital Deep Sleep - lcd.com[29]:1 */ + P12_6_LCD_SEG29 = 13, /* Digital Deep Sleep - lcd.seg[29]:1 */ + P12_6_SCB6_SPI_SELECT3 = 20, /* Digital Active - scb[6].spi_select3:0 */ + + /* P12.7 */ + P12_7_GPIO = 0, /* GPIO controls 'out' */ + P12_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P12_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P12_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P12_7_AMUXA = 4, /* Analog mux bus A */ + P12_7_AMUXB = 5, /* Analog mux bus B */ + P12_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P12_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P12_7_TCPWM0_LINE_COMPL7 = 8, /* Digital Active - tcpwm[0].line_compl[7]:3 */ + P12_7_TCPWM1_LINE_COMPL7 = 9, /* Digital Active - tcpwm[1].line_compl[7]:1 */ + P12_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:92 */ + P12_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:92 */ + P12_7_LCD_COM30 = 12, /* Digital Deep Sleep - lcd.com[30]:1 */ + P12_7_LCD_SEG30 = 13, /* Digital Deep Sleep - lcd.seg[30]:1 */ + + /* P13.0 */ + P13_0_GPIO = 0, /* GPIO controls 'out' */ + P13_0_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P13_0_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P13_0_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P13_0_AMUXA = 4, /* Analog mux bus A */ + P13_0_AMUXB = 5, /* Analog mux bus B */ + P13_0_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P13_0_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P13_0_TCPWM0_LINE0 = 8, /* Digital Active - tcpwm[0].line[0]:4 */ + P13_0_TCPWM1_LINE8 = 9, /* Digital Active - tcpwm[1].line[8]:1 */ + P13_0_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:93 */ + P13_0_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:93 */ + P13_0_LCD_COM31 = 12, /* Digital Deep Sleep - lcd.com[31]:1 */ + P13_0_LCD_SEG31 = 13, /* Digital Deep Sleep - lcd.seg[31]:1 */ + P13_0_SCB6_UART_RX = 18, /* Digital Active - scb[6].uart_rx:1 */ + P13_0_SCB6_I2C_SCL = 19, /* Digital Active - scb[6].i2c_scl:1 */ + P13_0_SCB6_SPI_MOSI = 20, /* Digital Active - scb[6].spi_mosi:1 */ + P13_0_PERI_TR_IO_INPUT26 = 24, /* Digital Active - peri.tr_io_input[26]:0 */ + + /* P13.1 */ + P13_1_GPIO = 0, /* GPIO controls 'out' */ + P13_1_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P13_1_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P13_1_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P13_1_AMUXA = 4, /* Analog mux bus A */ + P13_1_AMUXB = 5, /* Analog mux bus B */ + P13_1_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P13_1_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P13_1_TCPWM0_LINE_COMPL0 = 8, /* Digital Active - tcpwm[0].line_compl[0]:4 */ + P13_1_TCPWM1_LINE_COMPL8 = 9, /* Digital Active - tcpwm[1].line_compl[8]:1 */ + P13_1_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:94 */ + P13_1_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:94 */ + P13_1_LCD_COM32 = 12, /* Digital Deep Sleep - lcd.com[32]:1 */ + P13_1_LCD_SEG32 = 13, /* Digital Deep Sleep - lcd.seg[32]:1 */ + P13_1_SCB6_UART_TX = 18, /* Digital Active - scb[6].uart_tx:1 */ + P13_1_SCB6_I2C_SDA = 19, /* Digital Active - scb[6].i2c_sda:1 */ + P13_1_SCB6_SPI_MISO = 20, /* Digital Active - scb[6].spi_miso:1 */ + P13_1_PERI_TR_IO_INPUT27 = 24, /* Digital Active - peri.tr_io_input[27]:0 */ + + /* P13.6 */ + P13_6_GPIO = 0, /* GPIO controls 'out' */ + P13_6_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P13_6_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P13_6_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P13_6_AMUXA = 4, /* Analog mux bus A */ + P13_6_AMUXB = 5, /* Analog mux bus B */ + P13_6_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P13_6_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P13_6_TCPWM0_LINE3 = 8, /* Digital Active - tcpwm[0].line[3]:4 */ + P13_6_TCPWM1_LINE11 = 9, /* Digital Active - tcpwm[1].line[11]:1 */ + P13_6_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:99 */ + P13_6_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:99 */ + P13_6_LCD_COM37 = 12, /* Digital Deep Sleep - lcd.com[37]:1 */ + P13_6_LCD_SEG37 = 13, /* Digital Deep Sleep - lcd.seg[37]:1 */ + P13_6_SCB6_SPI_SELECT3 = 20, /* Digital Active - scb[6].spi_select3:1 */ + + /* P13.7 */ + P13_7_GPIO = 0, /* GPIO controls 'out' */ + P13_7_GPIO_DSI = 1, /* GPIO controls 'out', DSI controls 'output enable' */ + P13_7_DSI_DSI = 2, /* DSI controls 'out' and 'output enable' */ + P13_7_DSI_GPIO = 3, /* DSI controls 'out', GPIO controls 'output enable' */ + P13_7_AMUXA = 4, /* Analog mux bus A */ + P13_7_AMUXB = 5, /* Analog mux bus B */ + P13_7_AMUXA_DSI = 6, /* Analog mux bus A, DSI control */ + P13_7_AMUXB_DSI = 7, /* Analog mux bus B, DSI control */ + P13_7_TCPWM0_LINE_COMPL3 = 8, /* Digital Active - tcpwm[0].line_compl[3]:4 */ + P13_7_TCPWM1_LINE_COMPL11 = 9, /* Digital Active - tcpwm[1].line_compl[11]:1 */ + P13_7_CSD_CSD_TX = 10, /* Digital Active - csd.csd_tx:100 */ + P13_7_CSD_CSD_TX_N = 11, /* Digital Active - csd.csd_tx_n:100 */ + P13_7_LCD_COM38 = 12, /* Digital Deep Sleep - lcd.com[38]:1 */ + P13_7_LCD_SEG38 = 13 /* Digital Deep Sleep - lcd.seg[38]:1 */ +} en_hsiom_sel_t; + +#endif /* _GPIO_PSOC63_116_BGA_BLE_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/gpio_psoc6ble_116_bga_ble.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/gpio_psoc6ble_116_bga_ble.h similarity index 100% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/gpio_psoc6ble_116_bga_ble.h rename to targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/gpio_psoc6ble_116_bga_ble.h diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/psoc63_config.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/psoc63_config.h new file mode 100644 index 0000000000..f4f6196d97 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/psoc63_config.h @@ -0,0 +1,2394 @@ +/***************************************************************************//** +* \file psoc63_config.h +* +* \brief +* PSoC 63 device configuration header +* +* \note +* Generated 9/21/2017 by CyDeviceHeaderGenerator v1.2.0.101 +* from the register map configuration rev#1007711 +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _PSOC63_CONFIG_H_ +#define _PSOC63_CONFIG_H_ + +/* Clock Connections */ +typedef enum +{ + PCLK_SCB0_CLOCK = 0, /* scb[0].clock */ + PCLK_SCB1_CLOCK = 1, /* scb[1].clock */ + PCLK_SCB2_CLOCK = 2, /* scb[2].clock */ + PCLK_SCB3_CLOCK = 3, /* scb[3].clock */ + PCLK_SCB4_CLOCK = 4, /* scb[4].clock */ + PCLK_SCB5_CLOCK = 5, /* scb[5].clock */ + PCLK_SCB6_CLOCK = 6, /* scb[6].clock */ + PCLK_SCB7_CLOCK = 7, /* scb[7].clock */ + PCLK_SCB8_CLOCK = 8, /* scb[8].clock */ + PCLK_UDB_CLOCKS0 = 9, /* udb.clocks[0] */ + PCLK_UDB_CLOCKS1 = 10, /* udb.clocks[1] */ + PCLK_UDB_CLOCKS2 = 11, /* udb.clocks[2] */ + PCLK_UDB_CLOCKS3 = 12, /* udb.clocks[3] */ + PCLK_UDB_CLOCKS4 = 13, /* udb.clocks[4] */ + PCLK_UDB_CLOCKS5 = 14, /* udb.clocks[5] */ + PCLK_UDB_CLOCKS6 = 15, /* udb.clocks[6] */ + PCLK_UDB_CLOCKS7 = 16, /* udb.clocks[7] */ + PCLK_SMARTIO8_CLOCK = 17, /* smartio[8].clock */ + PCLK_SMARTIO9_CLOCK = 18, /* smartio[9].clock */ + PCLK_TCPWM0_CLOCKS0 = 19, /* tcpwm[0].clocks[0] */ + PCLK_TCPWM0_CLOCKS1 = 20, /* tcpwm[0].clocks[1] */ + PCLK_TCPWM0_CLOCKS2 = 21, /* tcpwm[0].clocks[2] */ + PCLK_TCPWM0_CLOCKS3 = 22, /* tcpwm[0].clocks[3] */ + PCLK_TCPWM0_CLOCKS4 = 23, /* tcpwm[0].clocks[4] */ + PCLK_TCPWM0_CLOCKS5 = 24, /* tcpwm[0].clocks[5] */ + PCLK_TCPWM0_CLOCKS6 = 25, /* tcpwm[0].clocks[6] */ + PCLK_TCPWM0_CLOCKS7 = 26, /* tcpwm[0].clocks[7] */ + PCLK_TCPWM1_CLOCKS0 = 27, /* tcpwm[1].clocks[0] */ + PCLK_TCPWM1_CLOCKS1 = 28, /* tcpwm[1].clocks[1] */ + PCLK_TCPWM1_CLOCKS2 = 29, /* tcpwm[1].clocks[2] */ + PCLK_TCPWM1_CLOCKS3 = 30, /* tcpwm[1].clocks[3] */ + PCLK_TCPWM1_CLOCKS4 = 31, /* tcpwm[1].clocks[4] */ + PCLK_TCPWM1_CLOCKS5 = 32, /* tcpwm[1].clocks[5] */ + PCLK_TCPWM1_CLOCKS6 = 33, /* tcpwm[1].clocks[6] */ + PCLK_TCPWM1_CLOCKS7 = 34, /* tcpwm[1].clocks[7] */ + PCLK_TCPWM1_CLOCKS8 = 35, /* tcpwm[1].clocks[8] */ + PCLK_TCPWM1_CLOCKS9 = 36, /* tcpwm[1].clocks[9] */ + PCLK_TCPWM1_CLOCKS10 = 37, /* tcpwm[1].clocks[10] */ + PCLK_TCPWM1_CLOCKS11 = 38, /* tcpwm[1].clocks[11] */ + PCLK_TCPWM1_CLOCKS12 = 39, /* tcpwm[1].clocks[12] */ + PCLK_TCPWM1_CLOCKS13 = 40, /* tcpwm[1].clocks[13] */ + PCLK_TCPWM1_CLOCKS14 = 41, /* tcpwm[1].clocks[14] */ + PCLK_TCPWM1_CLOCKS15 = 42, /* tcpwm[1].clocks[15] */ + PCLK_TCPWM1_CLOCKS16 = 43, /* tcpwm[1].clocks[16] */ + PCLK_TCPWM1_CLOCKS17 = 44, /* tcpwm[1].clocks[17] */ + PCLK_TCPWM1_CLOCKS18 = 45, /* tcpwm[1].clocks[18] */ + PCLK_TCPWM1_CLOCKS19 = 46, /* tcpwm[1].clocks[19] */ + PCLK_TCPWM1_CLOCKS20 = 47, /* tcpwm[1].clocks[20] */ + PCLK_TCPWM1_CLOCKS21 = 48, /* tcpwm[1].clocks[21] */ + PCLK_TCPWM1_CLOCKS22 = 49, /* tcpwm[1].clocks[22] */ + PCLK_TCPWM1_CLOCKS23 = 50, /* tcpwm[1].clocks[23] */ + PCLK_CSD_CLOCK = 51, /* csd.clock */ + PCLK_LCD_CLOCK = 52, /* lcd.clock */ + PCLK_PROFILE_CLOCK_PROFILE = 53, /* profile.clock_profile */ + PCLK_CPUSS_CLOCK_TRACE_IN = 54, /* cpuss.clock_trace_in */ + PCLK_PASS_CLOCK_CTDAC = 55, /* pass.clock_ctdac */ + PCLK_PASS_CLOCK_PUMP_PERI = 56, /* pass.clock_pump_peri */ + PCLK_PASS_CLOCK_SAR = 57, /* pass.clock_sar */ + PCLK_USB_CLOCK_DEV_BRS = 58 /* usb.clock_dev_brs */ +} en_clk_dst_t; + +/* Trigger Group */ +/* This section contains the enums related to the Trigger multiplexer (TrigMux) driver. +* The constants are divided into four types because each signal of the TrigMux driver has a path +* through two multiplexers: the reduction multiplexer and the distribution multiplexer. This +* requires two calls for Cy_TrigMux_Connect() function. The first call - for the reduction +* multiplexer, the second call - for the distribution multiplexer. +* +* The four types of inputs/output parameters: +* 1) Parameters for reduction multiplexer's inputs (input signals of TrigMux) +* 2) Parameters for reduction multiplexer's outputs (intermediate signals); +* 3) Parameters for distribution multiplexer's inputs (intermediate signals); +* 4) Parameters for distribution multiplexer's outputs (output signals of TrigMux). +* +* The Cy_TrigMux_Connect() inTrig parameter can have 1) and 3) types parameters. The outTrig +* parameter can have 2) and 4) types parameters. +* The names of the constants for these parameters have the following format: +* +* 1) For reduction multiplexer's inputs: +* TRIG_IN_ +* the reduction multiplexer number; +* - the name of the IP block which is the source of the signal; +* - the source signal number in the IP block. +* +* Example: +* TRIG11_IN_TCPWM0_TR_OVERFLOW3 - the TCPWM0 tr_overflow[3] input of reduction multiplexer#11. +* +* 2) For reduction multiplexer's outputs: +* TRIG_OUT_TR_GROUP_INPUT +* - the reduction multiplexer number; +* - the distribution multiplexer number; +* - the input number of the distribution multiplexer. +* +* Example: +* TRIG11_OUT_TR_GROUP0_INPUT23 - Input#23 of the distribution multiplexer#0 is the destination +* of the reduction multiplexer#11. +* +* 3) For distribution multiplexer's inputs: +* TRIG_IN_TR_GROUP_OUTPUT +* - the reduction multiplexer number; +* - the distribution multiplexer number; +* - the output number of the reduction multiplexer; +* +* Example: +* TRIG0_IN_TR_GROUP11_OUTPUT15 - Output#15 of the reduction multiplexer#11 is the source of the +* distribution multiplexer#0. +* +* 4) For distribution multiplexer's outputs: +* TRIG_OUT_ +* - the distribution multiplexer number; +* - the name of the IP block which is the destination of the signal; +* - the input signal number in the IP block. +* +* Example: +* TRIG0_OUT_CPUSS_DW0_TR_IN3 - the DW0 tr_out[3] ouput of the distribution multiplexer 0.*/ +/* Trigger Group Inputs */ +/* Trigger Input Group 0 - DMA Request Assignments */ +typedef enum +{ + TRIG0_IN_CPUSS_ZERO = 0x00000000u, /* cpuss.zero */ + TRIG0_IN_TR_GROUP10_OUTPUT0 = 0x00000001u, /* tr_group[10].output[0] */ + TRIG0_IN_TR_GROUP10_OUTPUT1 = 0x00000002u, /* tr_group[10].output[1] */ + TRIG0_IN_TR_GROUP10_OUTPUT2 = 0x00000003u, /* tr_group[10].output[2] */ + TRIG0_IN_TR_GROUP10_OUTPUT3 = 0x00000004u, /* tr_group[10].output[3] */ + TRIG0_IN_TR_GROUP10_OUTPUT4 = 0x00000005u, /* tr_group[10].output[4] */ + TRIG0_IN_TR_GROUP10_OUTPUT5 = 0x00000006u, /* tr_group[10].output[5] */ + TRIG0_IN_TR_GROUP10_OUTPUT6 = 0x00000007u, /* tr_group[10].output[6] */ + TRIG0_IN_TR_GROUP10_OUTPUT7 = 0x00000008u, /* tr_group[10].output[7] */ + TRIG0_IN_TR_GROUP11_OUTPUT0 = 0x00000009u, /* tr_group[11].output[0] */ + TRIG0_IN_TR_GROUP11_OUTPUT1 = 0x0000000Au, /* tr_group[11].output[1] */ + TRIG0_IN_TR_GROUP11_OUTPUT2 = 0x0000000Bu, /* tr_group[11].output[2] */ + TRIG0_IN_TR_GROUP11_OUTPUT3 = 0x0000000Cu, /* tr_group[11].output[3] */ + TRIG0_IN_TR_GROUP11_OUTPUT4 = 0x0000000Du, /* tr_group[11].output[4] */ + TRIG0_IN_TR_GROUP11_OUTPUT5 = 0x0000000Eu, /* tr_group[11].output[5] */ + TRIG0_IN_TR_GROUP11_OUTPUT6 = 0x0000000Fu, /* tr_group[11].output[6] */ + TRIG0_IN_TR_GROUP11_OUTPUT7 = 0x00000010u, /* tr_group[11].output[7] */ + TRIG0_IN_TR_GROUP11_OUTPUT8 = 0x00000011u, /* tr_group[11].output[8] */ + TRIG0_IN_TR_GROUP11_OUTPUT9 = 0x00000012u, /* tr_group[11].output[9] */ + TRIG0_IN_TR_GROUP11_OUTPUT10 = 0x00000013u, /* tr_group[11].output[10] */ + TRIG0_IN_TR_GROUP11_OUTPUT11 = 0x00000014u, /* tr_group[11].output[11] */ + TRIG0_IN_TR_GROUP11_OUTPUT12 = 0x00000015u, /* tr_group[11].output[12] */ + TRIG0_IN_TR_GROUP11_OUTPUT13 = 0x00000016u, /* tr_group[11].output[13] */ + TRIG0_IN_TR_GROUP11_OUTPUT14 = 0x00000017u, /* tr_group[11].output[14] */ + TRIG0_IN_TR_GROUP11_OUTPUT15 = 0x00000018u, /* tr_group[11].output[15] */ + TRIG0_IN_TR_GROUP12_OUTPUT8 = 0x00000019u, /* tr_group[12].output[8] */ + TRIG0_IN_TR_GROUP12_OUTPUT9 = 0x0000001Au, /* tr_group[12].output[9] */ + TRIG0_IN_TR_GROUP13_OUTPUT0 = 0x0000001Bu, /* tr_group[13].output[0] */ + TRIG0_IN_TR_GROUP13_OUTPUT1 = 0x0000001Cu, /* tr_group[13].output[1] */ + TRIG0_IN_TR_GROUP13_OUTPUT2 = 0x0000001Du, /* tr_group[13].output[2] */ + TRIG0_IN_TR_GROUP13_OUTPUT3 = 0x0000001Eu, /* tr_group[13].output[3] */ + TRIG0_IN_TR_GROUP13_OUTPUT4 = 0x0000001Fu, /* tr_group[13].output[4] */ + TRIG0_IN_TR_GROUP13_OUTPUT5 = 0x00000020u, /* tr_group[13].output[5] */ + TRIG0_IN_TR_GROUP13_OUTPUT6 = 0x00000021u, /* tr_group[13].output[6] */ + TRIG0_IN_TR_GROUP13_OUTPUT7 = 0x00000022u, /* tr_group[13].output[7] */ + TRIG0_IN_TR_GROUP13_OUTPUT8 = 0x00000023u, /* tr_group[13].output[8] */ + TRIG0_IN_TR_GROUP13_OUTPUT9 = 0x00000024u, /* tr_group[13].output[9] */ + TRIG0_IN_TR_GROUP13_OUTPUT10 = 0x00000025u, /* tr_group[13].output[10] */ + TRIG0_IN_TR_GROUP13_OUTPUT11 = 0x00000026u, /* tr_group[13].output[11] */ + TRIG0_IN_TR_GROUP13_OUTPUT12 = 0x00000027u, /* tr_group[13].output[12] */ + TRIG0_IN_TR_GROUP13_OUTPUT13 = 0x00000028u, /* tr_group[13].output[13] */ + TRIG0_IN_TR_GROUP13_OUTPUT14 = 0x00000029u, /* tr_group[13].output[14] */ + TRIG0_IN_TR_GROUP13_OUTPUT15 = 0x0000002Au, /* tr_group[13].output[15] */ + TRIG0_IN_TR_GROUP14_OUTPUT0 = 0x0000002Bu, /* tr_group[14].output[0] */ + TRIG0_IN_TR_GROUP14_OUTPUT1 = 0x0000002Cu, /* tr_group[14].output[1] */ + TRIG0_IN_TR_GROUP14_OUTPUT2 = 0x0000002Du, /* tr_group[14].output[2] */ + TRIG0_IN_TR_GROUP14_OUTPUT3 = 0x0000002Eu, /* tr_group[14].output[3] */ + TRIG0_IN_TR_GROUP14_OUTPUT4 = 0x0000002Fu, /* tr_group[14].output[4] */ + TRIG0_IN_TR_GROUP14_OUTPUT5 = 0x00000030u, /* tr_group[14].output[5] */ + TRIG0_IN_TR_GROUP14_OUTPUT6 = 0x00000031u, /* tr_group[14].output[6] */ + TRIG0_IN_TR_GROUP14_OUTPUT7 = 0x00000032u /* tr_group[14].output[7] */ +} en_trig_input_grp0_t; + +/* Trigger Input Group 1 - DMA Request Assignments */ +typedef enum +{ + TRIG1_IN_CPUSS_ZERO = 0x00000100u, /* cpuss.zero */ + TRIG1_IN_TR_GROUP10_OUTPUT0 = 0x00000101u, /* tr_group[10].output[0] */ + TRIG1_IN_TR_GROUP10_OUTPUT1 = 0x00000102u, /* tr_group[10].output[1] */ + TRIG1_IN_TR_GROUP10_OUTPUT2 = 0x00000103u, /* tr_group[10].output[2] */ + TRIG1_IN_TR_GROUP10_OUTPUT3 = 0x00000104u, /* tr_group[10].output[3] */ + TRIG1_IN_TR_GROUP10_OUTPUT4 = 0x00000105u, /* tr_group[10].output[4] */ + TRIG1_IN_TR_GROUP10_OUTPUT5 = 0x00000106u, /* tr_group[10].output[5] */ + TRIG1_IN_TR_GROUP10_OUTPUT6 = 0x00000107u, /* tr_group[10].output[6] */ + TRIG1_IN_TR_GROUP10_OUTPUT7 = 0x00000108u, /* tr_group[10].output[7] */ + TRIG1_IN_TR_GROUP11_OUTPUT0 = 0x00000109u, /* tr_group[11].output[0] */ + TRIG1_IN_TR_GROUP11_OUTPUT1 = 0x0000010Au, /* tr_group[11].output[1] */ + TRIG1_IN_TR_GROUP11_OUTPUT2 = 0x0000010Bu, /* tr_group[11].output[2] */ + TRIG1_IN_TR_GROUP11_OUTPUT3 = 0x0000010Cu, /* tr_group[11].output[3] */ + TRIG1_IN_TR_GROUP11_OUTPUT4 = 0x0000010Du, /* tr_group[11].output[4] */ + TRIG1_IN_TR_GROUP11_OUTPUT5 = 0x0000010Eu, /* tr_group[11].output[5] */ + TRIG1_IN_TR_GROUP11_OUTPUT6 = 0x0000010Fu, /* tr_group[11].output[6] */ + TRIG1_IN_TR_GROUP11_OUTPUT7 = 0x00000110u, /* tr_group[11].output[7] */ + TRIG1_IN_TR_GROUP11_OUTPUT8 = 0x00000111u, /* tr_group[11].output[8] */ + TRIG1_IN_TR_GROUP11_OUTPUT9 = 0x00000112u, /* tr_group[11].output[9] */ + TRIG1_IN_TR_GROUP11_OUTPUT10 = 0x00000113u, /* tr_group[11].output[10] */ + TRIG1_IN_TR_GROUP11_OUTPUT11 = 0x00000114u, /* tr_group[11].output[11] */ + TRIG1_IN_TR_GROUP11_OUTPUT12 = 0x00000115u, /* tr_group[11].output[12] */ + TRIG1_IN_TR_GROUP11_OUTPUT13 = 0x00000116u, /* tr_group[11].output[13] */ + TRIG1_IN_TR_GROUP11_OUTPUT14 = 0x00000117u, /* tr_group[11].output[14] */ + TRIG1_IN_TR_GROUP11_OUTPUT15 = 0x00000118u, /* tr_group[11].output[15] */ + TRIG1_IN_TR_GROUP12_OUTPUT8 = 0x00000119u, /* tr_group[12].output[8] */ + TRIG1_IN_TR_GROUP12_OUTPUT9 = 0x0000011Au, /* tr_group[12].output[9] */ + TRIG1_IN_TR_GROUP13_OUTPUT0 = 0x0000011Bu, /* tr_group[13].output[0] */ + TRIG1_IN_TR_GROUP13_OUTPUT1 = 0x0000011Cu, /* tr_group[13].output[1] */ + TRIG1_IN_TR_GROUP13_OUTPUT2 = 0x0000011Du, /* tr_group[13].output[2] */ + TRIG1_IN_TR_GROUP13_OUTPUT3 = 0x0000011Eu, /* tr_group[13].output[3] */ + TRIG1_IN_TR_GROUP13_OUTPUT4 = 0x0000011Fu, /* tr_group[13].output[4] */ + TRIG1_IN_TR_GROUP13_OUTPUT5 = 0x00000120u, /* tr_group[13].output[5] */ + TRIG1_IN_TR_GROUP13_OUTPUT6 = 0x00000121u, /* tr_group[13].output[6] */ + TRIG1_IN_TR_GROUP13_OUTPUT7 = 0x00000122u, /* tr_group[13].output[7] */ + TRIG1_IN_TR_GROUP13_OUTPUT8 = 0x00000123u, /* tr_group[13].output[8] */ + TRIG1_IN_TR_GROUP13_OUTPUT9 = 0x00000124u, /* tr_group[13].output[9] */ + TRIG1_IN_TR_GROUP13_OUTPUT10 = 0x00000125u, /* tr_group[13].output[10] */ + TRIG1_IN_TR_GROUP13_OUTPUT11 = 0x00000126u, /* tr_group[13].output[11] */ + TRIG1_IN_TR_GROUP13_OUTPUT12 = 0x00000127u, /* tr_group[13].output[12] */ + TRIG1_IN_TR_GROUP13_OUTPUT13 = 0x00000128u, /* tr_group[13].output[13] */ + TRIG1_IN_TR_GROUP13_OUTPUT14 = 0x00000129u, /* tr_group[13].output[14] */ + TRIG1_IN_TR_GROUP13_OUTPUT15 = 0x0000012Au, /* tr_group[13].output[15] */ + TRIG1_IN_TR_GROUP14_OUTPUT0 = 0x0000012Bu, /* tr_group[14].output[0] */ + TRIG1_IN_TR_GROUP14_OUTPUT1 = 0x0000012Cu, /* tr_group[14].output[1] */ + TRIG1_IN_TR_GROUP14_OUTPUT2 = 0x0000012Du, /* tr_group[14].output[2] */ + TRIG1_IN_TR_GROUP14_OUTPUT3 = 0x0000012Eu, /* tr_group[14].output[3] */ + TRIG1_IN_TR_GROUP14_OUTPUT4 = 0x0000012Fu, /* tr_group[14].output[4] */ + TRIG1_IN_TR_GROUP14_OUTPUT5 = 0x00000130u, /* tr_group[14].output[5] */ + TRIG1_IN_TR_GROUP14_OUTPUT6 = 0x00000131u, /* tr_group[14].output[6] */ + TRIG1_IN_TR_GROUP14_OUTPUT7 = 0x00000132u /* tr_group[14].output[7] */ +} en_trig_input_grp1_t; + +/* Trigger Input Group 2 - TCPWM trigger inputs */ +typedef enum +{ + TRIG2_IN_CPUSS_ZERO = 0x00000200u, /* cpuss.zero */ + TRIG2_IN_TR_GROUP10_OUTPUT0 = 0x00000201u, /* tr_group[10].output[0] */ + TRIG2_IN_TR_GROUP10_OUTPUT1 = 0x00000202u, /* tr_group[10].output[1] */ + TRIG2_IN_TR_GROUP10_OUTPUT2 = 0x00000203u, /* tr_group[10].output[2] */ + TRIG2_IN_TR_GROUP10_OUTPUT3 = 0x00000204u, /* tr_group[10].output[3] */ + TRIG2_IN_TR_GROUP10_OUTPUT4 = 0x00000205u, /* tr_group[10].output[4] */ + TRIG2_IN_TR_GROUP10_OUTPUT5 = 0x00000206u, /* tr_group[10].output[5] */ + TRIG2_IN_TR_GROUP10_OUTPUT6 = 0x00000207u, /* tr_group[10].output[6] */ + TRIG2_IN_TR_GROUP10_OUTPUT7 = 0x00000208u, /* tr_group[10].output[7] */ + TRIG2_IN_TR_GROUP11_OUTPUT0 = 0x00000209u, /* tr_group[11].output[0] */ + TRIG2_IN_TR_GROUP11_OUTPUT1 = 0x0000020Au, /* tr_group[11].output[1] */ + TRIG2_IN_TR_GROUP11_OUTPUT2 = 0x0000020Bu, /* tr_group[11].output[2] */ + TRIG2_IN_TR_GROUP11_OUTPUT3 = 0x0000020Cu, /* tr_group[11].output[3] */ + TRIG2_IN_TR_GROUP11_OUTPUT4 = 0x0000020Du, /* tr_group[11].output[4] */ + TRIG2_IN_TR_GROUP11_OUTPUT5 = 0x0000020Eu, /* tr_group[11].output[5] */ + TRIG2_IN_TR_GROUP11_OUTPUT6 = 0x0000020Fu, /* tr_group[11].output[6] */ + TRIG2_IN_TR_GROUP11_OUTPUT7 = 0x00000210u, /* tr_group[11].output[7] */ + TRIG2_IN_TR_GROUP11_OUTPUT8 = 0x00000211u, /* tr_group[11].output[8] */ + TRIG2_IN_TR_GROUP11_OUTPUT9 = 0x00000212u, /* tr_group[11].output[9] */ + TRIG2_IN_TR_GROUP11_OUTPUT10 = 0x00000213u, /* tr_group[11].output[10] */ + TRIG2_IN_TR_GROUP11_OUTPUT11 = 0x00000214u, /* tr_group[11].output[11] */ + TRIG2_IN_TR_GROUP11_OUTPUT12 = 0x00000215u, /* tr_group[11].output[12] */ + TRIG2_IN_TR_GROUP11_OUTPUT13 = 0x00000216u, /* tr_group[11].output[13] */ + TRIG2_IN_TR_GROUP11_OUTPUT14 = 0x00000217u, /* tr_group[11].output[14] */ + TRIG2_IN_TR_GROUP11_OUTPUT15 = 0x00000218u, /* tr_group[11].output[15] */ + TRIG2_IN_TR_GROUP12_OUTPUT0 = 0x00000219u, /* tr_group[12].output[0] */ + TRIG2_IN_TR_GROUP12_OUTPUT1 = 0x0000021Au, /* tr_group[12].output[1] */ + TRIG2_IN_TR_GROUP12_OUTPUT2 = 0x0000021Bu, /* tr_group[12].output[2] */ + TRIG2_IN_TR_GROUP12_OUTPUT3 = 0x0000021Cu, /* tr_group[12].output[3] */ + TRIG2_IN_TR_GROUP12_OUTPUT4 = 0x0000021Du, /* tr_group[12].output[4] */ + TRIG2_IN_TR_GROUP12_OUTPUT5 = 0x0000021Eu, /* tr_group[12].output[5] */ + TRIG2_IN_TR_GROUP12_OUTPUT6 = 0x0000021Fu, /* tr_group[12].output[6] */ + TRIG2_IN_TR_GROUP12_OUTPUT7 = 0x00000220u, /* tr_group[12].output[7] */ + TRIG2_IN_TR_GROUP13_OUTPUT16 = 0x00000221u, /* tr_group[13].output[16] */ + TRIG2_IN_TR_GROUP13_OUTPUT17 = 0x00000222u, /* tr_group[13].output[17] */ + TRIG2_IN_TR_GROUP14_OUTPUT8 = 0x00000223u, /* tr_group[14].output[8] */ + TRIG2_IN_TR_GROUP14_OUTPUT9 = 0x00000224u, /* tr_group[14].output[9] */ + TRIG2_IN_TR_GROUP14_OUTPUT10 = 0x00000225u, /* tr_group[14].output[10] */ + TRIG2_IN_TR_GROUP14_OUTPUT11 = 0x00000226u, /* tr_group[14].output[11] */ + TRIG2_IN_TR_GROUP14_OUTPUT12 = 0x00000227u, /* tr_group[14].output[12] */ + TRIG2_IN_TR_GROUP14_OUTPUT13 = 0x00000228u, /* tr_group[14].output[13] */ + TRIG2_IN_TR_GROUP14_OUTPUT14 = 0x00000229u, /* tr_group[14].output[14] */ + TRIG2_IN_TR_GROUP14_OUTPUT15 = 0x0000022Au /* tr_group[14].output[15] */ +} en_trig_input_grp2_t; + +/* Trigger Input Group 3 - TCPWM trigger inputs */ +typedef enum +{ + TRIG3_IN_CPUSS_ZERO = 0x00000300u, /* cpuss.zero */ + TRIG3_IN_TR_GROUP10_OUTPUT0 = 0x00000301u, /* tr_group[10].output[0] */ + TRIG3_IN_TR_GROUP10_OUTPUT1 = 0x00000302u, /* tr_group[10].output[1] */ + TRIG3_IN_TR_GROUP10_OUTPUT2 = 0x00000303u, /* tr_group[10].output[2] */ + TRIG3_IN_TR_GROUP10_OUTPUT3 = 0x00000304u, /* tr_group[10].output[3] */ + TRIG3_IN_TR_GROUP10_OUTPUT4 = 0x00000305u, /* tr_group[10].output[4] */ + TRIG3_IN_TR_GROUP10_OUTPUT5 = 0x00000306u, /* tr_group[10].output[5] */ + TRIG3_IN_TR_GROUP10_OUTPUT6 = 0x00000307u, /* tr_group[10].output[6] */ + TRIG3_IN_TR_GROUP10_OUTPUT7 = 0x00000308u, /* tr_group[10].output[7] */ + TRIG3_IN_TR_GROUP11_OUTPUT0 = 0x00000309u, /* tr_group[11].output[0] */ + TRIG3_IN_TR_GROUP11_OUTPUT1 = 0x0000030Au, /* tr_group[11].output[1] */ + TRIG3_IN_TR_GROUP11_OUTPUT2 = 0x0000030Bu, /* tr_group[11].output[2] */ + TRIG3_IN_TR_GROUP11_OUTPUT3 = 0x0000030Cu, /* tr_group[11].output[3] */ + TRIG3_IN_TR_GROUP11_OUTPUT4 = 0x0000030Du, /* tr_group[11].output[4] */ + TRIG3_IN_TR_GROUP11_OUTPUT5 = 0x0000030Eu, /* tr_group[11].output[5] */ + TRIG3_IN_TR_GROUP11_OUTPUT6 = 0x0000030Fu, /* tr_group[11].output[6] */ + TRIG3_IN_TR_GROUP11_OUTPUT7 = 0x00000310u, /* tr_group[11].output[7] */ + TRIG3_IN_TR_GROUP11_OUTPUT8 = 0x00000311u, /* tr_group[11].output[8] */ + TRIG3_IN_TR_GROUP11_OUTPUT9 = 0x00000312u, /* tr_group[11].output[9] */ + TRIG3_IN_TR_GROUP11_OUTPUT10 = 0x00000313u, /* tr_group[11].output[10] */ + TRIG3_IN_TR_GROUP11_OUTPUT11 = 0x00000314u, /* tr_group[11].output[11] */ + TRIG3_IN_TR_GROUP11_OUTPUT12 = 0x00000315u, /* tr_group[11].output[12] */ + TRIG3_IN_TR_GROUP11_OUTPUT13 = 0x00000316u, /* tr_group[11].output[13] */ + TRIG3_IN_TR_GROUP11_OUTPUT14 = 0x00000317u, /* tr_group[11].output[14] */ + TRIG3_IN_TR_GROUP11_OUTPUT15 = 0x00000318u, /* tr_group[11].output[15] */ + TRIG3_IN_TR_GROUP12_OUTPUT0 = 0x00000319u, /* tr_group[12].output[0] */ + TRIG3_IN_TR_GROUP12_OUTPUT1 = 0x0000031Au, /* tr_group[12].output[1] */ + TRIG3_IN_TR_GROUP12_OUTPUT2 = 0x0000031Bu, /* tr_group[12].output[2] */ + TRIG3_IN_TR_GROUP12_OUTPUT3 = 0x0000031Cu, /* tr_group[12].output[3] */ + TRIG3_IN_TR_GROUP12_OUTPUT4 = 0x0000031Du, /* tr_group[12].output[4] */ + TRIG3_IN_TR_GROUP12_OUTPUT5 = 0x0000031Eu, /* tr_group[12].output[5] */ + TRIG3_IN_TR_GROUP12_OUTPUT6 = 0x0000031Fu, /* tr_group[12].output[6] */ + TRIG3_IN_TR_GROUP12_OUTPUT7 = 0x00000320u, /* tr_group[12].output[7] */ + TRIG3_IN_TR_GROUP13_OUTPUT16 = 0x00000321u, /* tr_group[13].output[16] */ + TRIG3_IN_TR_GROUP13_OUTPUT17 = 0x00000322u, /* tr_group[13].output[17] */ + TRIG3_IN_TR_GROUP14_OUTPUT8 = 0x00000323u, /* tr_group[14].output[8] */ + TRIG3_IN_TR_GROUP14_OUTPUT9 = 0x00000324u, /* tr_group[14].output[9] */ + TRIG3_IN_TR_GROUP14_OUTPUT10 = 0x00000325u, /* tr_group[14].output[10] */ + TRIG3_IN_TR_GROUP14_OUTPUT11 = 0x00000326u, /* tr_group[14].output[11] */ + TRIG3_IN_TR_GROUP14_OUTPUT12 = 0x00000327u, /* tr_group[14].output[12] */ + TRIG3_IN_TR_GROUP14_OUTPUT13 = 0x00000328u, /* tr_group[14].output[13] */ + TRIG3_IN_TR_GROUP14_OUTPUT14 = 0x00000329u, /* tr_group[14].output[14] */ + TRIG3_IN_TR_GROUP14_OUTPUT15 = 0x0000032Au /* tr_group[14].output[15] */ +} en_trig_input_grp3_t; + +/* Trigger Input Group 4 - PROFILE trigger multiplexer */ +typedef enum +{ + TRIG4_IN_CPUSS_ZERO = 0x00000400u, /* cpuss.zero */ + TRIG4_IN_TR_GROUP10_OUTPUT0 = 0x00000401u, /* tr_group[10].output[0] */ + TRIG4_IN_TR_GROUP10_OUTPUT1 = 0x00000402u, /* tr_group[10].output[1] */ + TRIG4_IN_TR_GROUP10_OUTPUT2 = 0x00000403u, /* tr_group[10].output[2] */ + TRIG4_IN_TR_GROUP10_OUTPUT3 = 0x00000404u, /* tr_group[10].output[3] */ + TRIG4_IN_TR_GROUP10_OUTPUT4 = 0x00000405u, /* tr_group[10].output[4] */ + TRIG4_IN_TR_GROUP10_OUTPUT5 = 0x00000406u, /* tr_group[10].output[5] */ + TRIG4_IN_TR_GROUP10_OUTPUT6 = 0x00000407u, /* tr_group[10].output[6] */ + TRIG4_IN_TR_GROUP10_OUTPUT7 = 0x00000408u, /* tr_group[10].output[7] */ + TRIG4_IN_TR_GROUP11_OUTPUT0 = 0x00000409u, /* tr_group[11].output[0] */ + TRIG4_IN_TR_GROUP11_OUTPUT1 = 0x0000040Au, /* tr_group[11].output[1] */ + TRIG4_IN_TR_GROUP11_OUTPUT2 = 0x0000040Bu, /* tr_group[11].output[2] */ + TRIG4_IN_TR_GROUP11_OUTPUT3 = 0x0000040Cu, /* tr_group[11].output[3] */ + TRIG4_IN_TR_GROUP11_OUTPUT4 = 0x0000040Du, /* tr_group[11].output[4] */ + TRIG4_IN_TR_GROUP11_OUTPUT5 = 0x0000040Eu, /* tr_group[11].output[5] */ + TRIG4_IN_TR_GROUP11_OUTPUT6 = 0x0000040Fu, /* tr_group[11].output[6] */ + TRIG4_IN_TR_GROUP11_OUTPUT7 = 0x00000410u, /* tr_group[11].output[7] */ + TRIG4_IN_TR_GROUP11_OUTPUT8 = 0x00000411u, /* tr_group[11].output[8] */ + TRIG4_IN_TR_GROUP11_OUTPUT9 = 0x00000412u, /* tr_group[11].output[9] */ + TRIG4_IN_TR_GROUP11_OUTPUT10 = 0x00000413u, /* tr_group[11].output[10] */ + TRIG4_IN_TR_GROUP11_OUTPUT11 = 0x00000414u, /* tr_group[11].output[11] */ + TRIG4_IN_TR_GROUP11_OUTPUT12 = 0x00000415u, /* tr_group[11].output[12] */ + TRIG4_IN_TR_GROUP11_OUTPUT13 = 0x00000416u, /* tr_group[11].output[13] */ + TRIG4_IN_TR_GROUP11_OUTPUT14 = 0x00000417u, /* tr_group[11].output[14] */ + TRIG4_IN_TR_GROUP11_OUTPUT15 = 0x00000418u, /* tr_group[11].output[15] */ + TRIG4_IN_TR_GROUP12_OUTPUT0 = 0x00000419u, /* tr_group[12].output[0] */ + TRIG4_IN_TR_GROUP12_OUTPUT1 = 0x0000041Au, /* tr_group[12].output[1] */ + TRIG4_IN_TR_GROUP12_OUTPUT2 = 0x0000041Bu, /* tr_group[12].output[2] */ + TRIG4_IN_TR_GROUP12_OUTPUT3 = 0x0000041Cu, /* tr_group[12].output[3] */ + TRIG4_IN_TR_GROUP12_OUTPUT4 = 0x0000041Du, /* tr_group[12].output[4] */ + TRIG4_IN_TR_GROUP12_OUTPUT5 = 0x0000041Eu, /* tr_group[12].output[5] */ + TRIG4_IN_TR_GROUP12_OUTPUT6 = 0x0000041Fu, /* tr_group[12].output[6] */ + TRIG4_IN_TR_GROUP12_OUTPUT7 = 0x00000420u, /* tr_group[12].output[7] */ + TRIG4_IN_TR_GROUP13_OUTPUT16 = 0x00000421u, /* tr_group[13].output[16] */ + TRIG4_IN_TR_GROUP13_OUTPUT17 = 0x00000422u, /* tr_group[13].output[17] */ + TRIG4_IN_TR_GROUP14_OUTPUT8 = 0x00000423u, /* tr_group[14].output[8] */ + TRIG4_IN_TR_GROUP14_OUTPUT9 = 0x00000424u, /* tr_group[14].output[9] */ + TRIG4_IN_TR_GROUP14_OUTPUT10 = 0x00000425u, /* tr_group[14].output[10] */ + TRIG4_IN_TR_GROUP14_OUTPUT11 = 0x00000426u, /* tr_group[14].output[11] */ + TRIG4_IN_TR_GROUP14_OUTPUT12 = 0x00000427u, /* tr_group[14].output[12] */ + TRIG4_IN_TR_GROUP14_OUTPUT13 = 0x00000428u, /* tr_group[14].output[13] */ + TRIG4_IN_TR_GROUP14_OUTPUT14 = 0x00000429u, /* tr_group[14].output[14] */ + TRIG4_IN_TR_GROUP14_OUTPUT15 = 0x0000042Au /* tr_group[14].output[15] */ +} en_trig_input_grp4_t; + +/* Trigger Input Group 5 - CPUSS.CTI trigger multiplexer */ +typedef enum +{ + TRIG5_IN_CPUSS_ZERO = 0x00000500u, /* cpuss.zero */ + TRIG5_IN_TR_GROUP10_OUTPUT0 = 0x00000501u, /* tr_group[10].output[0] */ + TRIG5_IN_TR_GROUP10_OUTPUT1 = 0x00000502u, /* tr_group[10].output[1] */ + TRIG5_IN_TR_GROUP10_OUTPUT2 = 0x00000503u, /* tr_group[10].output[2] */ + TRIG5_IN_TR_GROUP10_OUTPUT3 = 0x00000504u, /* tr_group[10].output[3] */ + TRIG5_IN_TR_GROUP10_OUTPUT4 = 0x00000505u, /* tr_group[10].output[4] */ + TRIG5_IN_TR_GROUP10_OUTPUT5 = 0x00000506u, /* tr_group[10].output[5] */ + TRIG5_IN_TR_GROUP10_OUTPUT6 = 0x00000507u, /* tr_group[10].output[6] */ + TRIG5_IN_TR_GROUP10_OUTPUT7 = 0x00000508u, /* tr_group[10].output[7] */ + TRIG5_IN_TR_GROUP11_OUTPUT0 = 0x00000509u, /* tr_group[11].output[0] */ + TRIG5_IN_TR_GROUP11_OUTPUT1 = 0x0000050Au, /* tr_group[11].output[1] */ + TRIG5_IN_TR_GROUP11_OUTPUT2 = 0x0000050Bu, /* tr_group[11].output[2] */ + TRIG5_IN_TR_GROUP11_OUTPUT3 = 0x0000050Cu, /* tr_group[11].output[3] */ + TRIG5_IN_TR_GROUP11_OUTPUT4 = 0x0000050Du, /* tr_group[11].output[4] */ + TRIG5_IN_TR_GROUP11_OUTPUT5 = 0x0000050Eu, /* tr_group[11].output[5] */ + TRIG5_IN_TR_GROUP11_OUTPUT6 = 0x0000050Fu, /* tr_group[11].output[6] */ + TRIG5_IN_TR_GROUP11_OUTPUT7 = 0x00000510u, /* tr_group[11].output[7] */ + TRIG5_IN_TR_GROUP11_OUTPUT8 = 0x00000511u, /* tr_group[11].output[8] */ + TRIG5_IN_TR_GROUP11_OUTPUT9 = 0x00000512u, /* tr_group[11].output[9] */ + TRIG5_IN_TR_GROUP11_OUTPUT10 = 0x00000513u, /* tr_group[11].output[10] */ + TRIG5_IN_TR_GROUP11_OUTPUT11 = 0x00000514u, /* tr_group[11].output[11] */ + TRIG5_IN_TR_GROUP11_OUTPUT12 = 0x00000515u, /* tr_group[11].output[12] */ + TRIG5_IN_TR_GROUP11_OUTPUT13 = 0x00000516u, /* tr_group[11].output[13] */ + TRIG5_IN_TR_GROUP11_OUTPUT14 = 0x00000517u, /* tr_group[11].output[14] */ + TRIG5_IN_TR_GROUP11_OUTPUT15 = 0x00000518u, /* tr_group[11].output[15] */ + TRIG5_IN_TR_GROUP12_OUTPUT0 = 0x00000519u, /* tr_group[12].output[0] */ + TRIG5_IN_TR_GROUP12_OUTPUT1 = 0x0000051Au, /* tr_group[12].output[1] */ + TRIG5_IN_TR_GROUP12_OUTPUT2 = 0x0000051Bu, /* tr_group[12].output[2] */ + TRIG5_IN_TR_GROUP12_OUTPUT3 = 0x0000051Cu, /* tr_group[12].output[3] */ + TRIG5_IN_TR_GROUP12_OUTPUT4 = 0x0000051Du, /* tr_group[12].output[4] */ + TRIG5_IN_TR_GROUP12_OUTPUT5 = 0x0000051Eu, /* tr_group[12].output[5] */ + TRIG5_IN_TR_GROUP12_OUTPUT6 = 0x0000051Fu, /* tr_group[12].output[6] */ + TRIG5_IN_TR_GROUP12_OUTPUT7 = 0x00000520u, /* tr_group[12].output[7] */ + TRIG5_IN_TR_GROUP13_OUTPUT16 = 0x00000521u, /* tr_group[13].output[16] */ + TRIG5_IN_TR_GROUP13_OUTPUT17 = 0x00000522u, /* tr_group[13].output[17] */ + TRIG5_IN_TR_GROUP14_OUTPUT8 = 0x00000523u, /* tr_group[14].output[8] */ + TRIG5_IN_TR_GROUP14_OUTPUT9 = 0x00000524u, /* tr_group[14].output[9] */ + TRIG5_IN_TR_GROUP14_OUTPUT10 = 0x00000525u, /* tr_group[14].output[10] */ + TRIG5_IN_TR_GROUP14_OUTPUT11 = 0x00000526u, /* tr_group[14].output[11] */ + TRIG5_IN_TR_GROUP14_OUTPUT12 = 0x00000527u, /* tr_group[14].output[12] */ + TRIG5_IN_TR_GROUP14_OUTPUT13 = 0x00000528u, /* tr_group[14].output[13] */ + TRIG5_IN_TR_GROUP14_OUTPUT14 = 0x00000529u, /* tr_group[14].output[14] */ + TRIG5_IN_TR_GROUP14_OUTPUT15 = 0x0000052Au /* tr_group[14].output[15] */ +} en_trig_input_grp5_t; + +/* Trigger Input Group 6 - PASS trigger multiplexer */ +typedef enum +{ + TRIG6_IN_CPUSS_ZERO = 0x00000600u, /* cpuss.zero */ + TRIG6_IN_TR_GROUP10_OUTPUT0 = 0x00000601u, /* tr_group[10].output[0] */ + TRIG6_IN_TR_GROUP10_OUTPUT1 = 0x00000602u, /* tr_group[10].output[1] */ + TRIG6_IN_TR_GROUP10_OUTPUT2 = 0x00000603u, /* tr_group[10].output[2] */ + TRIG6_IN_TR_GROUP10_OUTPUT3 = 0x00000604u, /* tr_group[10].output[3] */ + TRIG6_IN_TR_GROUP10_OUTPUT4 = 0x00000605u, /* tr_group[10].output[4] */ + TRIG6_IN_TR_GROUP10_OUTPUT5 = 0x00000606u, /* tr_group[10].output[5] */ + TRIG6_IN_TR_GROUP10_OUTPUT6 = 0x00000607u, /* tr_group[10].output[6] */ + TRIG6_IN_TR_GROUP10_OUTPUT7 = 0x00000608u, /* tr_group[10].output[7] */ + TRIG6_IN_TR_GROUP11_OUTPUT0 = 0x00000609u, /* tr_group[11].output[0] */ + TRIG6_IN_TR_GROUP11_OUTPUT1 = 0x0000060Au, /* tr_group[11].output[1] */ + TRIG6_IN_TR_GROUP11_OUTPUT2 = 0x0000060Bu, /* tr_group[11].output[2] */ + TRIG6_IN_TR_GROUP11_OUTPUT3 = 0x0000060Cu, /* tr_group[11].output[3] */ + TRIG6_IN_TR_GROUP11_OUTPUT4 = 0x0000060Du, /* tr_group[11].output[4] */ + TRIG6_IN_TR_GROUP11_OUTPUT5 = 0x0000060Eu, /* tr_group[11].output[5] */ + TRIG6_IN_TR_GROUP11_OUTPUT6 = 0x0000060Fu, /* tr_group[11].output[6] */ + TRIG6_IN_TR_GROUP11_OUTPUT7 = 0x00000610u, /* tr_group[11].output[7] */ + TRIG6_IN_TR_GROUP11_OUTPUT8 = 0x00000611u, /* tr_group[11].output[8] */ + TRIG6_IN_TR_GROUP11_OUTPUT9 = 0x00000612u, /* tr_group[11].output[9] */ + TRIG6_IN_TR_GROUP11_OUTPUT10 = 0x00000613u, /* tr_group[11].output[10] */ + TRIG6_IN_TR_GROUP11_OUTPUT11 = 0x00000614u, /* tr_group[11].output[11] */ + TRIG6_IN_TR_GROUP11_OUTPUT12 = 0x00000615u, /* tr_group[11].output[12] */ + TRIG6_IN_TR_GROUP11_OUTPUT13 = 0x00000616u, /* tr_group[11].output[13] */ + TRIG6_IN_TR_GROUP11_OUTPUT14 = 0x00000617u, /* tr_group[11].output[14] */ + TRIG6_IN_TR_GROUP11_OUTPUT15 = 0x00000618u, /* tr_group[11].output[15] */ + TRIG6_IN_TR_GROUP12_OUTPUT0 = 0x00000619u, /* tr_group[12].output[0] */ + TRIG6_IN_TR_GROUP12_OUTPUT1 = 0x0000061Au, /* tr_group[12].output[1] */ + TRIG6_IN_TR_GROUP12_OUTPUT2 = 0x0000061Bu, /* tr_group[12].output[2] */ + TRIG6_IN_TR_GROUP12_OUTPUT3 = 0x0000061Cu, /* tr_group[12].output[3] */ + TRIG6_IN_TR_GROUP12_OUTPUT4 = 0x0000061Du, /* tr_group[12].output[4] */ + TRIG6_IN_TR_GROUP12_OUTPUT5 = 0x0000061Eu, /* tr_group[12].output[5] */ + TRIG6_IN_TR_GROUP12_OUTPUT6 = 0x0000061Fu, /* tr_group[12].output[6] */ + TRIG6_IN_TR_GROUP12_OUTPUT7 = 0x00000620u, /* tr_group[12].output[7] */ + TRIG6_IN_TR_GROUP13_OUTPUT16 = 0x00000621u, /* tr_group[13].output[16] */ + TRIG6_IN_TR_GROUP13_OUTPUT17 = 0x00000622u, /* tr_group[13].output[17] */ + TRIG6_IN_TR_GROUP14_OUTPUT8 = 0x00000623u, /* tr_group[14].output[8] */ + TRIG6_IN_TR_GROUP14_OUTPUT9 = 0x00000624u, /* tr_group[14].output[9] */ + TRIG6_IN_TR_GROUP14_OUTPUT10 = 0x00000625u, /* tr_group[14].output[10] */ + TRIG6_IN_TR_GROUP14_OUTPUT11 = 0x00000626u, /* tr_group[14].output[11] */ + TRIG6_IN_TR_GROUP14_OUTPUT12 = 0x00000627u, /* tr_group[14].output[12] */ + TRIG6_IN_TR_GROUP14_OUTPUT13 = 0x00000628u, /* tr_group[14].output[13] */ + TRIG6_IN_TR_GROUP14_OUTPUT14 = 0x00000629u, /* tr_group[14].output[14] */ + TRIG6_IN_TR_GROUP14_OUTPUT15 = 0x0000062Au /* tr_group[14].output[15] */ +} en_trig_input_grp6_t; + +/* Trigger Input Group 7 - UDB general purpose trigger multiplexer */ +typedef enum +{ + TRIG7_IN_CPUSS_ZERO = 0x00000700u, /* cpuss.zero */ + TRIG7_IN_TR_GROUP10_OUTPUT0 = 0x00000701u, /* tr_group[10].output[0] */ + TRIG7_IN_TR_GROUP10_OUTPUT1 = 0x00000702u, /* tr_group[10].output[1] */ + TRIG7_IN_TR_GROUP10_OUTPUT2 = 0x00000703u, /* tr_group[10].output[2] */ + TRIG7_IN_TR_GROUP10_OUTPUT3 = 0x00000704u, /* tr_group[10].output[3] */ + TRIG7_IN_TR_GROUP10_OUTPUT4 = 0x00000705u, /* tr_group[10].output[4] */ + TRIG7_IN_TR_GROUP10_OUTPUT5 = 0x00000706u, /* tr_group[10].output[5] */ + TRIG7_IN_TR_GROUP10_OUTPUT6 = 0x00000707u, /* tr_group[10].output[6] */ + TRIG7_IN_TR_GROUP10_OUTPUT7 = 0x00000708u, /* tr_group[10].output[7] */ + TRIG7_IN_TR_GROUP11_OUTPUT0 = 0x00000709u, /* tr_group[11].output[0] */ + TRIG7_IN_TR_GROUP11_OUTPUT1 = 0x0000070Au, /* tr_group[11].output[1] */ + TRIG7_IN_TR_GROUP11_OUTPUT2 = 0x0000070Bu, /* tr_group[11].output[2] */ + TRIG7_IN_TR_GROUP11_OUTPUT3 = 0x0000070Cu, /* tr_group[11].output[3] */ + TRIG7_IN_TR_GROUP11_OUTPUT4 = 0x0000070Du, /* tr_group[11].output[4] */ + TRIG7_IN_TR_GROUP11_OUTPUT5 = 0x0000070Eu, /* tr_group[11].output[5] */ + TRIG7_IN_TR_GROUP11_OUTPUT6 = 0x0000070Fu, /* tr_group[11].output[6] */ + TRIG7_IN_TR_GROUP11_OUTPUT7 = 0x00000710u, /* tr_group[11].output[7] */ + TRIG7_IN_TR_GROUP11_OUTPUT8 = 0x00000711u, /* tr_group[11].output[8] */ + TRIG7_IN_TR_GROUP11_OUTPUT9 = 0x00000712u, /* tr_group[11].output[9] */ + TRIG7_IN_TR_GROUP11_OUTPUT10 = 0x00000713u, /* tr_group[11].output[10] */ + TRIG7_IN_TR_GROUP11_OUTPUT11 = 0x00000714u, /* tr_group[11].output[11] */ + TRIG7_IN_TR_GROUP11_OUTPUT12 = 0x00000715u, /* tr_group[11].output[12] */ + TRIG7_IN_TR_GROUP11_OUTPUT13 = 0x00000716u, /* tr_group[11].output[13] */ + TRIG7_IN_TR_GROUP11_OUTPUT14 = 0x00000717u, /* tr_group[11].output[14] */ + TRIG7_IN_TR_GROUP11_OUTPUT15 = 0x00000718u, /* tr_group[11].output[15] */ + TRIG7_IN_TR_GROUP12_OUTPUT0 = 0x00000719u, /* tr_group[12].output[0] */ + TRIG7_IN_TR_GROUP12_OUTPUT1 = 0x0000071Au, /* tr_group[12].output[1] */ + TRIG7_IN_TR_GROUP12_OUTPUT2 = 0x0000071Bu, /* tr_group[12].output[2] */ + TRIG7_IN_TR_GROUP12_OUTPUT3 = 0x0000071Cu, /* tr_group[12].output[3] */ + TRIG7_IN_TR_GROUP12_OUTPUT4 = 0x0000071Du, /* tr_group[12].output[4] */ + TRIG7_IN_TR_GROUP12_OUTPUT5 = 0x0000071Eu, /* tr_group[12].output[5] */ + TRIG7_IN_TR_GROUP12_OUTPUT6 = 0x0000071Fu, /* tr_group[12].output[6] */ + TRIG7_IN_TR_GROUP12_OUTPUT7 = 0x00000720u, /* tr_group[12].output[7] */ + TRIG7_IN_TR_GROUP13_OUTPUT16 = 0x00000721u, /* tr_group[13].output[16] */ + TRIG7_IN_TR_GROUP13_OUTPUT17 = 0x00000722u, /* tr_group[13].output[17] */ + TRIG7_IN_TR_GROUP14_OUTPUT8 = 0x00000723u, /* tr_group[14].output[8] */ + TRIG7_IN_TR_GROUP14_OUTPUT9 = 0x00000724u, /* tr_group[14].output[9] */ + TRIG7_IN_TR_GROUP14_OUTPUT10 = 0x00000725u, /* tr_group[14].output[10] */ + TRIG7_IN_TR_GROUP14_OUTPUT11 = 0x00000726u, /* tr_group[14].output[11] */ + TRIG7_IN_TR_GROUP14_OUTPUT12 = 0x00000727u, /* tr_group[14].output[12] */ + TRIG7_IN_TR_GROUP14_OUTPUT13 = 0x00000728u, /* tr_group[14].output[13] */ + TRIG7_IN_TR_GROUP14_OUTPUT14 = 0x00000729u, /* tr_group[14].output[14] */ + TRIG7_IN_TR_GROUP14_OUTPUT15 = 0x0000072Au /* tr_group[14].output[15] */ +} en_trig_input_grp7_t; + +/* Trigger Input Group 8 - Trigger multiplexer to pins */ +typedef enum +{ + TRIG8_IN_CPUSS_ZERO = 0x00000800u, /* cpuss.zero */ + TRIG8_IN_TR_GROUP10_OUTPUT0 = 0x00000801u, /* tr_group[10].output[0] */ + TRIG8_IN_TR_GROUP10_OUTPUT1 = 0x00000802u, /* tr_group[10].output[1] */ + TRIG8_IN_TR_GROUP10_OUTPUT2 = 0x00000803u, /* tr_group[10].output[2] */ + TRIG8_IN_TR_GROUP10_OUTPUT3 = 0x00000804u, /* tr_group[10].output[3] */ + TRIG8_IN_TR_GROUP10_OUTPUT4 = 0x00000805u, /* tr_group[10].output[4] */ + TRIG8_IN_TR_GROUP10_OUTPUT5 = 0x00000806u, /* tr_group[10].output[5] */ + TRIG8_IN_TR_GROUP10_OUTPUT6 = 0x00000807u, /* tr_group[10].output[6] */ + TRIG8_IN_TR_GROUP10_OUTPUT7 = 0x00000808u, /* tr_group[10].output[7] */ + TRIG8_IN_TR_GROUP11_OUTPUT0 = 0x00000809u, /* tr_group[11].output[0] */ + TRIG8_IN_TR_GROUP11_OUTPUT1 = 0x0000080Au, /* tr_group[11].output[1] */ + TRIG8_IN_TR_GROUP11_OUTPUT2 = 0x0000080Bu, /* tr_group[11].output[2] */ + TRIG8_IN_TR_GROUP11_OUTPUT3 = 0x0000080Cu, /* tr_group[11].output[3] */ + TRIG8_IN_TR_GROUP11_OUTPUT4 = 0x0000080Du, /* tr_group[11].output[4] */ + TRIG8_IN_TR_GROUP11_OUTPUT5 = 0x0000080Eu, /* tr_group[11].output[5] */ + TRIG8_IN_TR_GROUP11_OUTPUT6 = 0x0000080Fu, /* tr_group[11].output[6] */ + TRIG8_IN_TR_GROUP11_OUTPUT7 = 0x00000810u, /* tr_group[11].output[7] */ + TRIG8_IN_TR_GROUP11_OUTPUT8 = 0x00000811u, /* tr_group[11].output[8] */ + TRIG8_IN_TR_GROUP11_OUTPUT9 = 0x00000812u, /* tr_group[11].output[9] */ + TRIG8_IN_TR_GROUP11_OUTPUT10 = 0x00000813u, /* tr_group[11].output[10] */ + TRIG8_IN_TR_GROUP11_OUTPUT11 = 0x00000814u, /* tr_group[11].output[11] */ + TRIG8_IN_TR_GROUP11_OUTPUT12 = 0x00000815u, /* tr_group[11].output[12] */ + TRIG8_IN_TR_GROUP11_OUTPUT13 = 0x00000816u, /* tr_group[11].output[13] */ + TRIG8_IN_TR_GROUP11_OUTPUT14 = 0x00000817u, /* tr_group[11].output[14] */ + TRIG8_IN_TR_GROUP11_OUTPUT15 = 0x00000818u, /* tr_group[11].output[15] */ + TRIG8_IN_TR_GROUP12_OUTPUT0 = 0x00000819u, /* tr_group[12].output[0] */ + TRIG8_IN_TR_GROUP12_OUTPUT1 = 0x0000081Au, /* tr_group[12].output[1] */ + TRIG8_IN_TR_GROUP12_OUTPUT2 = 0x0000081Bu, /* tr_group[12].output[2] */ + TRIG8_IN_TR_GROUP12_OUTPUT3 = 0x0000081Cu, /* tr_group[12].output[3] */ + TRIG8_IN_TR_GROUP12_OUTPUT4 = 0x0000081Du, /* tr_group[12].output[4] */ + TRIG8_IN_TR_GROUP12_OUTPUT5 = 0x0000081Eu, /* tr_group[12].output[5] */ + TRIG8_IN_TR_GROUP12_OUTPUT6 = 0x0000081Fu, /* tr_group[12].output[6] */ + TRIG8_IN_TR_GROUP12_OUTPUT7 = 0x00000820u, /* tr_group[12].output[7] */ + TRIG8_IN_TR_GROUP13_OUTPUT16 = 0x00000821u, /* tr_group[13].output[16] */ + TRIG8_IN_TR_GROUP13_OUTPUT17 = 0x00000822u, /* tr_group[13].output[17] */ + TRIG8_IN_TR_GROUP14_OUTPUT8 = 0x00000823u, /* tr_group[14].output[8] */ + TRIG8_IN_TR_GROUP14_OUTPUT9 = 0x00000824u, /* tr_group[14].output[9] */ + TRIG8_IN_TR_GROUP14_OUTPUT10 = 0x00000825u, /* tr_group[14].output[10] */ + TRIG8_IN_TR_GROUP14_OUTPUT11 = 0x00000826u, /* tr_group[14].output[11] */ + TRIG8_IN_TR_GROUP14_OUTPUT12 = 0x00000827u, /* tr_group[14].output[12] */ + TRIG8_IN_TR_GROUP14_OUTPUT13 = 0x00000828u, /* tr_group[14].output[13] */ + TRIG8_IN_TR_GROUP14_OUTPUT14 = 0x00000829u, /* tr_group[14].output[14] */ + TRIG8_IN_TR_GROUP14_OUTPUT15 = 0x0000082Au /* tr_group[14].output[15] */ +} en_trig_input_grp8_t; + +/* Trigger Input Group 9 - Feedback mux to USB DMA interface */ +typedef enum +{ + TRIG9_IN_CPUSS_ZERO = 0x00000900u, /* cpuss.zero */ + TRIG9_IN_CPUSS_DW0_TR_OUT0 = 0x00000901u, /* cpuss.dw0_tr_out[0] */ + TRIG9_IN_CPUSS_DW0_TR_OUT1 = 0x00000902u, /* cpuss.dw0_tr_out[1] */ + TRIG9_IN_CPUSS_DW0_TR_OUT2 = 0x00000903u, /* cpuss.dw0_tr_out[2] */ + TRIG9_IN_CPUSS_DW0_TR_OUT3 = 0x00000904u, /* cpuss.dw0_tr_out[3] */ + TRIG9_IN_CPUSS_DW0_TR_OUT4 = 0x00000905u, /* cpuss.dw0_tr_out[4] */ + TRIG9_IN_CPUSS_DW0_TR_OUT5 = 0x00000906u, /* cpuss.dw0_tr_out[5] */ + TRIG9_IN_CPUSS_DW0_TR_OUT6 = 0x00000907u, /* cpuss.dw0_tr_out[6] */ + TRIG9_IN_CPUSS_DW0_TR_OUT7 = 0x00000908u, /* cpuss.dw0_tr_out[7] */ + TRIG9_IN_CPUSS_DW0_TR_OUT8 = 0x00000909u, /* cpuss.dw0_tr_out[8] */ + TRIG9_IN_CPUSS_DW0_TR_OUT9 = 0x0000090Au, /* cpuss.dw0_tr_out[9] */ + TRIG9_IN_CPUSS_DW0_TR_OUT10 = 0x0000090Bu, /* cpuss.dw0_tr_out[10] */ + TRIG9_IN_CPUSS_DW0_TR_OUT11 = 0x0000090Cu, /* cpuss.dw0_tr_out[11] */ + TRIG9_IN_CPUSS_DW0_TR_OUT12 = 0x0000090Du, /* cpuss.dw0_tr_out[12] */ + TRIG9_IN_CPUSS_DW0_TR_OUT13 = 0x0000090Eu, /* cpuss.dw0_tr_out[13] */ + TRIG9_IN_CPUSS_DW0_TR_OUT14 = 0x0000090Fu, /* cpuss.dw0_tr_out[14] */ + TRIG9_IN_CPUSS_DW0_TR_OUT15 = 0x00000910u, /* cpuss.dw0_tr_out[15] */ + TRIG9_IN_CPUSS_DW1_TR_OUT0 = 0x00000911u, /* cpuss.dw1_tr_out[0] */ + TRIG9_IN_CPUSS_DW1_TR_OUT1 = 0x00000912u, /* cpuss.dw1_tr_out[1] */ + TRIG9_IN_CPUSS_DW1_TR_OUT2 = 0x00000913u, /* cpuss.dw1_tr_out[2] */ + TRIG9_IN_CPUSS_DW1_TR_OUT3 = 0x00000914u, /* cpuss.dw1_tr_out[3] */ + TRIG9_IN_CPUSS_DW1_TR_OUT4 = 0x00000915u, /* cpuss.dw1_tr_out[4] */ + TRIG9_IN_CPUSS_DW1_TR_OUT5 = 0x00000916u, /* cpuss.dw1_tr_out[5] */ + TRIG9_IN_CPUSS_DW1_TR_OUT6 = 0x00000917u, /* cpuss.dw1_tr_out[6] */ + TRIG9_IN_CPUSS_DW1_TR_OUT7 = 0x00000918u, /* cpuss.dw1_tr_out[7] */ + TRIG9_IN_CPUSS_DW1_TR_OUT8 = 0x00000919u, /* cpuss.dw1_tr_out[8] */ + TRIG9_IN_CPUSS_DW1_TR_OUT9 = 0x0000091Au, /* cpuss.dw1_tr_out[9] */ + TRIG9_IN_CPUSS_DW1_TR_OUT10 = 0x0000091Bu, /* cpuss.dw1_tr_out[10] */ + TRIG9_IN_CPUSS_DW1_TR_OUT11 = 0x0000091Cu, /* cpuss.dw1_tr_out[11] */ + TRIG9_IN_CPUSS_DW1_TR_OUT12 = 0x0000091Du, /* cpuss.dw1_tr_out[12] */ + TRIG9_IN_CPUSS_DW1_TR_OUT13 = 0x0000091Eu, /* cpuss.dw1_tr_out[13] */ + TRIG9_IN_CPUSS_DW1_TR_OUT14 = 0x0000091Fu, /* cpuss.dw1_tr_out[14] */ + TRIG9_IN_CPUSS_DW1_TR_OUT15 = 0x00000920u /* cpuss.dw1_tr_out[15] */ +} en_trig_input_grp9_t; + +/* Trigger Input Group 10 - Reduces 32 datawire output triggers to 8 signals, used by all except USB */ +typedef enum +{ + TRIG10_IN_CPUSS_ZERO = 0x00000A00u, /* cpuss.zero */ + TRIG10_IN_CPUSS_DW0_TR_OUT0 = 0x00000A01u, /* cpuss.dw0_tr_out[0] */ + TRIG10_IN_CPUSS_DW0_TR_OUT1 = 0x00000A02u, /* cpuss.dw0_tr_out[1] */ + TRIG10_IN_CPUSS_DW0_TR_OUT2 = 0x00000A03u, /* cpuss.dw0_tr_out[2] */ + TRIG10_IN_CPUSS_DW0_TR_OUT3 = 0x00000A04u, /* cpuss.dw0_tr_out[3] */ + TRIG10_IN_CPUSS_DW0_TR_OUT4 = 0x00000A05u, /* cpuss.dw0_tr_out[4] */ + TRIG10_IN_CPUSS_DW0_TR_OUT5 = 0x00000A06u, /* cpuss.dw0_tr_out[5] */ + TRIG10_IN_CPUSS_DW0_TR_OUT6 = 0x00000A07u, /* cpuss.dw0_tr_out[6] */ + TRIG10_IN_CPUSS_DW0_TR_OUT7 = 0x00000A08u, /* cpuss.dw0_tr_out[7] */ + TRIG10_IN_CPUSS_DW0_TR_OUT8 = 0x00000A09u, /* cpuss.dw0_tr_out[8] */ + TRIG10_IN_CPUSS_DW0_TR_OUT9 = 0x00000A0Au, /* cpuss.dw0_tr_out[9] */ + TRIG10_IN_CPUSS_DW0_TR_OUT10 = 0x00000A0Bu, /* cpuss.dw0_tr_out[10] */ + TRIG10_IN_CPUSS_DW0_TR_OUT11 = 0x00000A0Cu, /* cpuss.dw0_tr_out[11] */ + TRIG10_IN_CPUSS_DW0_TR_OUT12 = 0x00000A0Du, /* cpuss.dw0_tr_out[12] */ + TRIG10_IN_CPUSS_DW0_TR_OUT13 = 0x00000A0Eu, /* cpuss.dw0_tr_out[13] */ + TRIG10_IN_CPUSS_DW0_TR_OUT14 = 0x00000A0Fu, /* cpuss.dw0_tr_out[14] */ + TRIG10_IN_CPUSS_DW0_TR_OUT15 = 0x00000A10u, /* cpuss.dw0_tr_out[15] */ + TRIG10_IN_CPUSS_DW1_TR_OUT0 = 0x00000A11u, /* cpuss.dw1_tr_out[0] */ + TRIG10_IN_CPUSS_DW1_TR_OUT1 = 0x00000A12u, /* cpuss.dw1_tr_out[1] */ + TRIG10_IN_CPUSS_DW1_TR_OUT2 = 0x00000A13u, /* cpuss.dw1_tr_out[2] */ + TRIG10_IN_CPUSS_DW1_TR_OUT3 = 0x00000A14u, /* cpuss.dw1_tr_out[3] */ + TRIG10_IN_CPUSS_DW1_TR_OUT4 = 0x00000A15u, /* cpuss.dw1_tr_out[4] */ + TRIG10_IN_CPUSS_DW1_TR_OUT5 = 0x00000A16u, /* cpuss.dw1_tr_out[5] */ + TRIG10_IN_CPUSS_DW1_TR_OUT6 = 0x00000A17u, /* cpuss.dw1_tr_out[6] */ + TRIG10_IN_CPUSS_DW1_TR_OUT7 = 0x00000A18u, /* cpuss.dw1_tr_out[7] */ + TRIG10_IN_CPUSS_DW1_TR_OUT8 = 0x00000A19u, /* cpuss.dw1_tr_out[8] */ + TRIG10_IN_CPUSS_DW1_TR_OUT9 = 0x00000A1Au, /* cpuss.dw1_tr_out[9] */ + TRIG10_IN_CPUSS_DW1_TR_OUT10 = 0x00000A1Bu, /* cpuss.dw1_tr_out[10] */ + TRIG10_IN_CPUSS_DW1_TR_OUT11 = 0x00000A1Cu, /* cpuss.dw1_tr_out[11] */ + TRIG10_IN_CPUSS_DW1_TR_OUT12 = 0x00000A1Du, /* cpuss.dw1_tr_out[12] */ + TRIG10_IN_CPUSS_DW1_TR_OUT13 = 0x00000A1Eu, /* cpuss.dw1_tr_out[13] */ + TRIG10_IN_CPUSS_DW1_TR_OUT14 = 0x00000A1Fu, /* cpuss.dw1_tr_out[14] */ + TRIG10_IN_CPUSS_DW1_TR_OUT15 = 0x00000A20u /* cpuss.dw1_tr_out[15] */ +} en_trig_input_grp10_t; + +/* Trigger Input Group 11 - Reduces 96 tcpwm output triggers to 16 signals, used by all sinks */ +typedef enum +{ + TRIG11_IN_CPUSS_ZERO = 0x00000B00u, /* cpuss.zero */ + TRIG11_IN_TCPWM0_TR_OVERFLOW0 = 0x00000B01u, /* tcpwm[0].tr_overflow[0] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW1 = 0x00000B02u, /* tcpwm[0].tr_overflow[1] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW2 = 0x00000B03u, /* tcpwm[0].tr_overflow[2] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW3 = 0x00000B04u, /* tcpwm[0].tr_overflow[3] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW4 = 0x00000B05u, /* tcpwm[0].tr_overflow[4] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW5 = 0x00000B06u, /* tcpwm[0].tr_overflow[5] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW6 = 0x00000B07u, /* tcpwm[0].tr_overflow[6] */ + TRIG11_IN_TCPWM0_TR_OVERFLOW7 = 0x00000B08u, /* tcpwm[0].tr_overflow[7] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH0 = 0x00000B09u, /* tcpwm[0].tr_compare_match[0] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH1 = 0x00000B0Au, /* tcpwm[0].tr_compare_match[1] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH2 = 0x00000B0Bu, /* tcpwm[0].tr_compare_match[2] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH3 = 0x00000B0Cu, /* tcpwm[0].tr_compare_match[3] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH4 = 0x00000B0Du, /* tcpwm[0].tr_compare_match[4] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH5 = 0x00000B0Eu, /* tcpwm[0].tr_compare_match[5] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH6 = 0x00000B0Fu, /* tcpwm[0].tr_compare_match[6] */ + TRIG11_IN_TCPWM0_TR_COMPARE_MATCH7 = 0x00000B10u, /* tcpwm[0].tr_compare_match[7] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW0 = 0x00000B11u, /* tcpwm[0].tr_underflow[0] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW1 = 0x00000B12u, /* tcpwm[0].tr_underflow[1] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW2 = 0x00000B13u, /* tcpwm[0].tr_underflow[2] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW3 = 0x00000B14u, /* tcpwm[0].tr_underflow[3] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW4 = 0x00000B15u, /* tcpwm[0].tr_underflow[4] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW5 = 0x00000B16u, /* tcpwm[0].tr_underflow[5] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW6 = 0x00000B17u, /* tcpwm[0].tr_underflow[6] */ + TRIG11_IN_TCPWM0_TR_UNDERFLOW7 = 0x00000B18u, /* tcpwm[0].tr_underflow[7] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW0 = 0x00000B19u, /* tcpwm[1].tr_overflow[0] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW1 = 0x00000B1Au, /* tcpwm[1].tr_overflow[1] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW2 = 0x00000B1Bu, /* tcpwm[1].tr_overflow[2] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW3 = 0x00000B1Cu, /* tcpwm[1].tr_overflow[3] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW4 = 0x00000B1Du, /* tcpwm[1].tr_overflow[4] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW5 = 0x00000B1Eu, /* tcpwm[1].tr_overflow[5] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW6 = 0x00000B1Fu, /* tcpwm[1].tr_overflow[6] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW7 = 0x00000B20u, /* tcpwm[1].tr_overflow[7] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW8 = 0x00000B21u, /* tcpwm[1].tr_overflow[8] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW9 = 0x00000B22u, /* tcpwm[1].tr_overflow[9] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW10 = 0x00000B23u, /* tcpwm[1].tr_overflow[10] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW11 = 0x00000B24u, /* tcpwm[1].tr_overflow[11] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW12 = 0x00000B25u, /* tcpwm[1].tr_overflow[12] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW13 = 0x00000B26u, /* tcpwm[1].tr_overflow[13] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW14 = 0x00000B27u, /* tcpwm[1].tr_overflow[14] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW15 = 0x00000B28u, /* tcpwm[1].tr_overflow[15] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW16 = 0x00000B29u, /* tcpwm[1].tr_overflow[16] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW17 = 0x00000B2Au, /* tcpwm[1].tr_overflow[17] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW18 = 0x00000B2Bu, /* tcpwm[1].tr_overflow[18] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW19 = 0x00000B2Cu, /* tcpwm[1].tr_overflow[19] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW20 = 0x00000B2Du, /* tcpwm[1].tr_overflow[20] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW21 = 0x00000B2Eu, /* tcpwm[1].tr_overflow[21] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW22 = 0x00000B2Fu, /* tcpwm[1].tr_overflow[22] */ + TRIG11_IN_TCPWM1_TR_OVERFLOW23 = 0x00000B30u, /* tcpwm[1].tr_overflow[23] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH0 = 0x00000B31u, /* tcpwm[1].tr_compare_match[0] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH1 = 0x00000B32u, /* tcpwm[1].tr_compare_match[1] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH2 = 0x00000B33u, /* tcpwm[1].tr_compare_match[2] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH3 = 0x00000B34u, /* tcpwm[1].tr_compare_match[3] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH4 = 0x00000B35u, /* tcpwm[1].tr_compare_match[4] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH5 = 0x00000B36u, /* tcpwm[1].tr_compare_match[5] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH6 = 0x00000B37u, /* tcpwm[1].tr_compare_match[6] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH7 = 0x00000B38u, /* tcpwm[1].tr_compare_match[7] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH8 = 0x00000B39u, /* tcpwm[1].tr_compare_match[8] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH9 = 0x00000B3Au, /* tcpwm[1].tr_compare_match[9] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH10 = 0x00000B3Bu, /* tcpwm[1].tr_compare_match[10] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH11 = 0x00000B3Cu, /* tcpwm[1].tr_compare_match[11] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH12 = 0x00000B3Du, /* tcpwm[1].tr_compare_match[12] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH13 = 0x00000B3Eu, /* tcpwm[1].tr_compare_match[13] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH14 = 0x00000B3Fu, /* tcpwm[1].tr_compare_match[14] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH15 = 0x00000B40u, /* tcpwm[1].tr_compare_match[15] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH16 = 0x00000B41u, /* tcpwm[1].tr_compare_match[16] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH17 = 0x00000B42u, /* tcpwm[1].tr_compare_match[17] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH18 = 0x00000B43u, /* tcpwm[1].tr_compare_match[18] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH19 = 0x00000B44u, /* tcpwm[1].tr_compare_match[19] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH20 = 0x00000B45u, /* tcpwm[1].tr_compare_match[20] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH21 = 0x00000B46u, /* tcpwm[1].tr_compare_match[21] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH22 = 0x00000B47u, /* tcpwm[1].tr_compare_match[22] */ + TRIG11_IN_TCPWM1_TR_COMPARE_MATCH23 = 0x00000B48u, /* tcpwm[1].tr_compare_match[23] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW0 = 0x00000B49u, /* tcpwm[1].tr_underflow[0] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW1 = 0x00000B4Au, /* tcpwm[1].tr_underflow[1] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW2 = 0x00000B4Bu, /* tcpwm[1].tr_underflow[2] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW3 = 0x00000B4Cu, /* tcpwm[1].tr_underflow[3] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW4 = 0x00000B4Du, /* tcpwm[1].tr_underflow[4] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW5 = 0x00000B4Eu, /* tcpwm[1].tr_underflow[5] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW6 = 0x00000B4Fu, /* tcpwm[1].tr_underflow[6] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW7 = 0x00000B50u, /* tcpwm[1].tr_underflow[7] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW8 = 0x00000B51u, /* tcpwm[1].tr_underflow[8] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW9 = 0x00000B52u, /* tcpwm[1].tr_underflow[9] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW10 = 0x00000B53u, /* tcpwm[1].tr_underflow[10] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW11 = 0x00000B54u, /* tcpwm[1].tr_underflow[11] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW12 = 0x00000B55u, /* tcpwm[1].tr_underflow[12] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW13 = 0x00000B56u, /* tcpwm[1].tr_underflow[13] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW14 = 0x00000B57u, /* tcpwm[1].tr_underflow[14] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW15 = 0x00000B58u, /* tcpwm[1].tr_underflow[15] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW16 = 0x00000B59u, /* tcpwm[1].tr_underflow[16] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW17 = 0x00000B5Au, /* tcpwm[1].tr_underflow[17] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW18 = 0x00000B5Bu, /* tcpwm[1].tr_underflow[18] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW19 = 0x00000B5Cu, /* tcpwm[1].tr_underflow[19] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW20 = 0x00000B5Du, /* tcpwm[1].tr_underflow[20] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW21 = 0x00000B5Eu, /* tcpwm[1].tr_underflow[21] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW22 = 0x00000B5Fu, /* tcpwm[1].tr_underflow[22] */ + TRIG11_IN_TCPWM1_TR_UNDERFLOW23 = 0x00000B60u /* tcpwm[1].tr_underflow[23] */ +} en_trig_input_grp11_t; + +/* Trigger Input Group 12 - Reduces 28 pin input signals to 10 triggers used by all sinks */ +typedef enum +{ + TRIG12_IN_CPUSS_ZERO = 0x00000C00u, /* cpuss.zero */ + TRIG12_IN_PERI_TR_IO_INPUT0 = 0x00000C01u, /* peri.tr_io_input[0] */ + TRIG12_IN_PERI_TR_IO_INPUT1 = 0x00000C02u, /* peri.tr_io_input[1] */ + TRIG12_IN_PERI_TR_IO_INPUT2 = 0x00000C03u, /* peri.tr_io_input[2] */ + TRIG12_IN_PERI_TR_IO_INPUT3 = 0x00000C04u, /* peri.tr_io_input[3] */ + TRIG12_IN_PERI_TR_IO_INPUT4 = 0x00000C05u, /* peri.tr_io_input[4] */ + TRIG12_IN_PERI_TR_IO_INPUT5 = 0x00000C06u, /* peri.tr_io_input[5] */ + TRIG12_IN_PERI_TR_IO_INPUT6 = 0x00000C07u, /* peri.tr_io_input[6] */ + TRIG12_IN_PERI_TR_IO_INPUT7 = 0x00000C08u, /* peri.tr_io_input[7] */ + TRIG12_IN_PERI_TR_IO_INPUT8 = 0x00000C09u, /* peri.tr_io_input[8] */ + TRIG12_IN_PERI_TR_IO_INPUT9 = 0x00000C0Au, /* peri.tr_io_input[9] */ + TRIG12_IN_PERI_TR_IO_INPUT10 = 0x00000C0Bu, /* peri.tr_io_input[10] */ + TRIG12_IN_PERI_TR_IO_INPUT11 = 0x00000C0Cu, /* peri.tr_io_input[11] */ + TRIG12_IN_PERI_TR_IO_INPUT12 = 0x00000C0Du, /* peri.tr_io_input[12] */ + TRIG12_IN_PERI_TR_IO_INPUT13 = 0x00000C0Eu, /* peri.tr_io_input[13] */ + TRIG12_IN_PERI_TR_IO_INPUT14 = 0x00000C0Fu, /* peri.tr_io_input[14] */ + TRIG12_IN_PERI_TR_IO_INPUT15 = 0x00000C10u, /* peri.tr_io_input[15] */ + TRIG12_IN_PERI_TR_IO_INPUT16 = 0x00000C11u, /* peri.tr_io_input[16] */ + TRIG12_IN_PERI_TR_IO_INPUT17 = 0x00000C12u, /* peri.tr_io_input[17] */ + TRIG12_IN_PERI_TR_IO_INPUT18 = 0x00000C13u, /* peri.tr_io_input[18] */ + TRIG12_IN_PERI_TR_IO_INPUT19 = 0x00000C14u, /* peri.tr_io_input[19] */ + TRIG12_IN_PERI_TR_IO_INPUT20 = 0x00000C15u, /* peri.tr_io_input[20] */ + TRIG12_IN_PERI_TR_IO_INPUT21 = 0x00000C16u, /* peri.tr_io_input[21] */ + TRIG12_IN_PERI_TR_IO_INPUT22 = 0x00000C17u, /* peri.tr_io_input[22] */ + TRIG12_IN_PERI_TR_IO_INPUT23 = 0x00000C18u, /* peri.tr_io_input[23] */ + TRIG12_IN_PERI_TR_IO_INPUT24 = 0x00000C19u, /* peri.tr_io_input[24] */ + TRIG12_IN_PERI_TR_IO_INPUT25 = 0x00000C1Au, /* peri.tr_io_input[25] */ + TRIG12_IN_PERI_TR_IO_INPUT26 = 0x00000C1Bu, /* peri.tr_io_input[26] */ + TRIG12_IN_PERI_TR_IO_INPUT27 = 0x00000C1Cu /* peri.tr_io_input[27] */ +} en_trig_input_grp12_t; + +/* Trigger Input Group 13 - Reduces DMA requests to 16+2 outputs used by all sinks */ +typedef enum +{ + TRIG13_IN_CPUSS_ZERO = 0x00000D00u, /* cpuss.zero */ + TRIG13_IN_SCB0_TR_TX_REQ = 0x00000D01u, /* scb[0].tr_tx_req */ + TRIG13_IN_SCB0_TR_RX_REQ = 0x00000D02u, /* scb[0].tr_rx_req */ + TRIG13_IN_SCB1_TR_TX_REQ = 0x00000D03u, /* scb[1].tr_tx_req */ + TRIG13_IN_SCB1_TR_RX_REQ = 0x00000D04u, /* scb[1].tr_rx_req */ + TRIG13_IN_SCB2_TR_TX_REQ = 0x00000D05u, /* scb[2].tr_tx_req */ + TRIG13_IN_SCB2_TR_RX_REQ = 0x00000D06u, /* scb[2].tr_rx_req */ + TRIG13_IN_SCB3_TR_TX_REQ = 0x00000D07u, /* scb[3].tr_tx_req */ + TRIG13_IN_SCB3_TR_RX_REQ = 0x00000D08u, /* scb[3].tr_rx_req */ + TRIG13_IN_SCB4_TR_TX_REQ = 0x00000D09u, /* scb[4].tr_tx_req */ + TRIG13_IN_SCB4_TR_RX_REQ = 0x00000D0Au, /* scb[4].tr_rx_req */ + TRIG13_IN_SCB5_TR_TX_REQ = 0x00000D0Bu, /* scb[5].tr_tx_req */ + TRIG13_IN_SCB5_TR_RX_REQ = 0x00000D0Cu, /* scb[5].tr_rx_req */ + TRIG13_IN_SCB6_TR_TX_REQ = 0x00000D0Du, /* scb[6].tr_tx_req */ + TRIG13_IN_SCB6_TR_RX_REQ = 0x00000D0Eu, /* scb[6].tr_rx_req */ + TRIG13_IN_SCB7_TR_TX_REQ = 0x00000D0Fu, /* scb[7].tr_tx_req */ + TRIG13_IN_SCB7_TR_RX_REQ = 0x00000D10u, /* scb[7].tr_rx_req */ + TRIG13_IN_SCB8_TR_TX_REQ = 0x00000D11u, /* scb[8].tr_tx_req */ + TRIG13_IN_SCB8_TR_RX_REQ = 0x00000D12u, /* scb[8].tr_rx_req */ + TRIG13_IN_AUDIOSS_TR_PDM_RX_REQ = 0x00000D13u, /* audioss.tr_pdm_rx_req */ + TRIG13_IN_AUDIOSS_TR_I2S_TX_REQ = 0x00000D14u, /* audioss.tr_i2s_tx_req */ + TRIG13_IN_AUDIOSS_TR_I2S_RX_REQ = 0x00000D15u, /* audioss.tr_i2s_rx_req */ + TRIG13_IN_SMIF_TR_TX_REQ = 0x00000D16u, /* smif.tr_tx_req */ + TRIG13_IN_SMIF_TR_RX_REQ = 0x00000D17u, /* smif.tr_rx_req */ + TRIG13_IN_USB_DMA_REQ0 = 0x00000D18u, /* usb.dma_req[0] */ + TRIG13_IN_USB_DMA_REQ1 = 0x00000D19u, /* usb.dma_req[1] */ + TRIG13_IN_USB_DMA_REQ2 = 0x00000D1Au, /* usb.dma_req[2] */ + TRIG13_IN_USB_DMA_REQ3 = 0x00000D1Bu, /* usb.dma_req[3] */ + TRIG13_IN_USB_DMA_REQ4 = 0x00000D1Cu, /* usb.dma_req[4] */ + TRIG13_IN_USB_DMA_REQ5 = 0x00000D1Du, /* usb.dma_req[5] */ + TRIG13_IN_USB_DMA_REQ6 = 0x00000D1Eu, /* usb.dma_req[6] */ + TRIG13_IN_USB_DMA_REQ7 = 0x00000D1Fu, /* usb.dma_req[7] */ + TRIG13_IN_CSD_TR_ADC_DONE = 0x00000D20u, /* csd.tr_adc_done */ + TRIG13_IN_CSD_DSI_SENSE_OUT = 0x00000D21u /* csd.dsi_sense_out */ +} en_trig_input_grp13_t; + +/* Trigger Input Group 14 - Reduces general purpose trigger inputs to 8+8 outputs used by all sinks */ +typedef enum +{ + TRIG14_IN_CPUSS_ZERO = 0x00000E00u, /* cpuss.zero */ + TRIG14_IN_UDB_TR_UDB0 = 0x00000E01u, /* udb.tr_udb[0] */ + TRIG14_IN_UDB_TR_UDB1 = 0x00000E02u, /* udb.tr_udb[1] */ + TRIG14_IN_UDB_TR_UDB2 = 0x00000E03u, /* udb.tr_udb[2] */ + TRIG14_IN_UDB_TR_UDB3 = 0x00000E04u, /* udb.tr_udb[3] */ + TRIG14_IN_UDB_TR_UDB4 = 0x00000E05u, /* udb.tr_udb[4] */ + TRIG14_IN_UDB_TR_UDB5 = 0x00000E06u, /* udb.tr_udb[5] */ + TRIG14_IN_UDB_TR_UDB6 = 0x00000E07u, /* udb.tr_udb[6] */ + TRIG14_IN_UDB_TR_UDB7 = 0x00000E08u, /* udb.tr_udb[7] */ + TRIG14_IN_UDB_TR_UDB8 = 0x00000E09u, /* udb.tr_udb[8] */ + TRIG14_IN_UDB_TR_UDB9 = 0x00000E0Au, /* udb.tr_udb[9] */ + TRIG14_IN_UDB_TR_UDB10 = 0x00000E0Bu, /* udb.tr_udb[10] */ + TRIG14_IN_UDB_TR_UDB11 = 0x00000E0Cu, /* udb.tr_udb[11] */ + TRIG14_IN_UDB_TR_UDB12 = 0x00000E0Du, /* udb.tr_udb[12] */ + TRIG14_IN_UDB_TR_UDB13 = 0x00000E0Eu, /* udb.tr_udb[13] */ + TRIG14_IN_UDB_TR_UDB14 = 0x00000E0Fu, /* udb.tr_udb[14] */ + TRIG14_IN_UDB_TR_UDB15 = 0x00000E10u, /* udb.tr_udb[15] */ + TRIG14_IN_UDB_DSI_OUT_TR0 = 0x00000E11u, /* udb.dsi_out_tr[0] */ + TRIG14_IN_UDB_DSI_OUT_TR1 = 0x00000E12u, /* udb.dsi_out_tr[1] */ + TRIG14_IN_CPUSS_CTI_TR_OUT0 = 0x00000E13u, /* cpuss.cti_tr_out[0] */ + TRIG14_IN_CPUSS_CTI_TR_OUT1 = 0x00000E14u, /* cpuss.cti_tr_out[1] */ + TRIG14_IN_PASS_TR_SAR_OUT = 0x00000E15u, /* pass.tr_sar_out */ + TRIG14_IN_PASS_TR_CTDAC_EMPTY = 0x00000E16u, /* pass.tr_ctdac_empty */ + TRIG14_IN_PASS_DSI_CTB_CMP0 = 0x00000E17u, /* pass.dsi_ctb_cmp0 */ + TRIG14_IN_PASS_DSI_CTB_CMP1 = 0x00000E18u, /* pass.dsi_ctb_cmp1 */ + TRIG14_IN_LPCOMP_DSI_COMP0 = 0x00000E19u, /* lpcomp.dsi_comp0 */ + TRIG14_IN_LPCOMP_DSI_COMP1 = 0x00000E1Au, /* lpcomp.dsi_comp1 */ + TRIG14_IN_SCB0_TR_I2C_SCL_FILTERED = 0x00000E1Bu, /* scb[0].tr_i2c_scl_filtered */ + TRIG14_IN_SCB1_TR_I2C_SCL_FILTERED = 0x00000E1Cu, /* scb[1].tr_i2c_scl_filtered */ + TRIG14_IN_SCB2_TR_I2C_SCL_FILTERED = 0x00000E1Du, /* scb[2].tr_i2c_scl_filtered */ + TRIG14_IN_SCB3_TR_I2C_SCL_FILTERED = 0x00000E1Eu, /* scb[3].tr_i2c_scl_filtered */ + TRIG14_IN_SCB4_TR_I2C_SCL_FILTERED = 0x00000E1Fu, /* scb[4].tr_i2c_scl_filtered */ + TRIG14_IN_SCB5_TR_I2C_SCL_FILTERED = 0x00000E20u, /* scb[5].tr_i2c_scl_filtered */ + TRIG14_IN_SCB6_TR_I2C_SCL_FILTERED = 0x00000E21u, /* scb[6].tr_i2c_scl_filtered */ + TRIG14_IN_SCB7_TR_I2C_SCL_FILTERED = 0x00000E22u, /* scb[7].tr_i2c_scl_filtered */ + TRIG14_IN_SCB8_TR_I2C_SCL_FILTERED = 0x00000E23u, /* scb[8].tr_i2c_scl_filtered */ + TRIG14_IN_CPUSS_TR_FAULT0 = 0x00000E24u, /* cpuss.tr_fault[0] */ + TRIG14_IN_CPUSS_TR_FAULT1 = 0x00000E25u /* cpuss.tr_fault[1] */ +} en_trig_input_grp14_t; + +/* Trigger Group Outputs */ +/* Trigger Output Group 0 - DMA Request Assignments */ +typedef enum +{ + TRIG0_OUT_CPUSS_DW0_TR_IN0 = 0x40000000u, /* cpuss.dw0_tr_in[0] */ + TRIG0_OUT_CPUSS_DW0_TR_IN1 = 0x40000001u, /* cpuss.dw0_tr_in[1] */ + TRIG0_OUT_CPUSS_DW0_TR_IN2 = 0x40000002u, /* cpuss.dw0_tr_in[2] */ + TRIG0_OUT_CPUSS_DW0_TR_IN3 = 0x40000003u, /* cpuss.dw0_tr_in[3] */ + TRIG0_OUT_CPUSS_DW0_TR_IN4 = 0x40000004u, /* cpuss.dw0_tr_in[4] */ + TRIG0_OUT_CPUSS_DW0_TR_IN5 = 0x40000005u, /* cpuss.dw0_tr_in[5] */ + TRIG0_OUT_CPUSS_DW0_TR_IN6 = 0x40000006u, /* cpuss.dw0_tr_in[6] */ + TRIG0_OUT_CPUSS_DW0_TR_IN7 = 0x40000007u, /* cpuss.dw0_tr_in[7] */ + TRIG0_OUT_CPUSS_DW0_TR_IN8 = 0x40000008u, /* cpuss.dw0_tr_in[8] */ + TRIG0_OUT_CPUSS_DW0_TR_IN9 = 0x40000009u, /* cpuss.dw0_tr_in[9] */ + TRIG0_OUT_CPUSS_DW0_TR_IN10 = 0x4000000Au, /* cpuss.dw0_tr_in[10] */ + TRIG0_OUT_CPUSS_DW0_TR_IN11 = 0x4000000Bu, /* cpuss.dw0_tr_in[11] */ + TRIG0_OUT_CPUSS_DW0_TR_IN12 = 0x4000000Cu, /* cpuss.dw0_tr_in[12] */ + TRIG0_OUT_CPUSS_DW0_TR_IN13 = 0x4000000Du, /* cpuss.dw0_tr_in[13] */ + TRIG0_OUT_CPUSS_DW0_TR_IN14 = 0x4000000Eu, /* cpuss.dw0_tr_in[14] */ + TRIG0_OUT_CPUSS_DW0_TR_IN15 = 0x4000000Fu /* cpuss.dw0_tr_in[15] */ +} en_trig_output_grp0_t; + +/* Trigger Output Group 1 - DMA Request Assignments */ +typedef enum +{ + TRIG1_OUT_CPUSS_DW1_TR_IN0 = 0x40000100u, /* cpuss.dw1_tr_in[0] */ + TRIG1_OUT_CPUSS_DW1_TR_IN1 = 0x40000101u, /* cpuss.dw1_tr_in[1] */ + TRIG1_OUT_CPUSS_DW1_TR_IN2 = 0x40000102u, /* cpuss.dw1_tr_in[2] */ + TRIG1_OUT_CPUSS_DW1_TR_IN3 = 0x40000103u, /* cpuss.dw1_tr_in[3] */ + TRIG1_OUT_CPUSS_DW1_TR_IN4 = 0x40000104u, /* cpuss.dw1_tr_in[4] */ + TRIG1_OUT_CPUSS_DW1_TR_IN5 = 0x40000105u, /* cpuss.dw1_tr_in[5] */ + TRIG1_OUT_CPUSS_DW1_TR_IN6 = 0x40000106u, /* cpuss.dw1_tr_in[6] */ + TRIG1_OUT_CPUSS_DW1_TR_IN7 = 0x40000107u, /* cpuss.dw1_tr_in[7] */ + TRIG1_OUT_CPUSS_DW1_TR_IN8 = 0x40000108u, /* cpuss.dw1_tr_in[8] */ + TRIG1_OUT_CPUSS_DW1_TR_IN9 = 0x40000109u, /* cpuss.dw1_tr_in[9] */ + TRIG1_OUT_CPUSS_DW1_TR_IN10 = 0x4000010Au, /* cpuss.dw1_tr_in[10] */ + TRIG1_OUT_CPUSS_DW1_TR_IN11 = 0x4000010Bu, /* cpuss.dw1_tr_in[11] */ + TRIG1_OUT_CPUSS_DW1_TR_IN12 = 0x4000010Cu, /* cpuss.dw1_tr_in[12] */ + TRIG1_OUT_CPUSS_DW1_TR_IN13 = 0x4000010Du, /* cpuss.dw1_tr_in[13] */ + TRIG1_OUT_CPUSS_DW1_TR_IN14 = 0x4000010Eu, /* cpuss.dw1_tr_in[14] */ + TRIG1_OUT_CPUSS_DW1_TR_IN15 = 0x4000010Fu /* cpuss.dw1_tr_in[15] */ +} en_trig_output_grp1_t; + +/* Trigger Output Group 2 - TCPWM trigger inputs */ +typedef enum +{ + TRIG2_OUT_TCPWM0_TR_IN0 = 0x40000200u, /* tcpwm[0].tr_in[0] */ + TRIG2_OUT_TCPWM0_TR_IN1 = 0x40000201u, /* tcpwm[0].tr_in[1] */ + TRIG2_OUT_TCPWM0_TR_IN2 = 0x40000202u, /* tcpwm[0].tr_in[2] */ + TRIG2_OUT_TCPWM0_TR_IN3 = 0x40000203u, /* tcpwm[0].tr_in[3] */ + TRIG2_OUT_TCPWM0_TR_IN4 = 0x40000204u, /* tcpwm[0].tr_in[4] */ + TRIG2_OUT_TCPWM0_TR_IN5 = 0x40000205u, /* tcpwm[0].tr_in[5] */ + TRIG2_OUT_TCPWM0_TR_IN6 = 0x40000206u, /* tcpwm[0].tr_in[6] */ + TRIG2_OUT_TCPWM0_TR_IN7 = 0x40000207u, /* tcpwm[0].tr_in[7] */ + TRIG2_OUT_TCPWM0_TR_IN8 = 0x40000208u, /* tcpwm[0].tr_in[8] */ + TRIG2_OUT_TCPWM0_TR_IN9 = 0x40000209u, /* tcpwm[0].tr_in[9] */ + TRIG2_OUT_TCPWM0_TR_IN10 = 0x4000020Au, /* tcpwm[0].tr_in[10] */ + TRIG2_OUT_TCPWM0_TR_IN11 = 0x4000020Bu, /* tcpwm[0].tr_in[11] */ + TRIG2_OUT_TCPWM0_TR_IN12 = 0x4000020Cu, /* tcpwm[0].tr_in[12] */ + TRIG2_OUT_TCPWM0_TR_IN13 = 0x4000020Du /* tcpwm[0].tr_in[13] */ +} en_trig_output_grp2_t; + +/* Trigger Output Group 3 - TCPWM trigger inputs */ +typedef enum +{ + TRIG3_OUT_TCPWM1_TR_IN0 = 0x40000300u, /* tcpwm[1].tr_in[0] */ + TRIG3_OUT_TCPWM1_TR_IN1 = 0x40000301u, /* tcpwm[1].tr_in[1] */ + TRIG3_OUT_TCPWM1_TR_IN2 = 0x40000302u, /* tcpwm[1].tr_in[2] */ + TRIG3_OUT_TCPWM1_TR_IN3 = 0x40000303u, /* tcpwm[1].tr_in[3] */ + TRIG3_OUT_TCPWM1_TR_IN4 = 0x40000304u, /* tcpwm[1].tr_in[4] */ + TRIG3_OUT_TCPWM1_TR_IN5 = 0x40000305u, /* tcpwm[1].tr_in[5] */ + TRIG3_OUT_TCPWM1_TR_IN6 = 0x40000306u, /* tcpwm[1].tr_in[6] */ + TRIG3_OUT_TCPWM1_TR_IN7 = 0x40000307u, /* tcpwm[1].tr_in[7] */ + TRIG3_OUT_TCPWM1_TR_IN8 = 0x40000308u, /* tcpwm[1].tr_in[8] */ + TRIG3_OUT_TCPWM1_TR_IN9 = 0x40000309u, /* tcpwm[1].tr_in[9] */ + TRIG3_OUT_TCPWM1_TR_IN10 = 0x4000030Au, /* tcpwm[1].tr_in[10] */ + TRIG3_OUT_TCPWM1_TR_IN11 = 0x4000030Bu, /* tcpwm[1].tr_in[11] */ + TRIG3_OUT_TCPWM1_TR_IN12 = 0x4000030Cu, /* tcpwm[1].tr_in[12] */ + TRIG3_OUT_TCPWM1_TR_IN13 = 0x4000030Du /* tcpwm[1].tr_in[13] */ +} en_trig_output_grp3_t; + +/* Trigger Output Group 4 - PROFILE trigger multiplexer */ +typedef enum +{ + TRIG4_OUT_PROFILE_TR_START = 0x40000400u, /* profile.tr_start */ + TRIG4_OUT_PROFILE_TR_STOP = 0x40000401u /* profile.tr_stop */ +} en_trig_output_grp4_t; + +/* Trigger Output Group 5 - CPUSS.CTI trigger multiplexer */ +typedef enum +{ + TRIG5_OUT_CPUSS_CTI_TR_IN0 = 0x40000500u, /* cpuss.cti_tr_in[0] */ + TRIG5_OUT_CPUSS_CTI_TR_IN1 = 0x40000501u /* cpuss.cti_tr_in[1] */ +} en_trig_output_grp5_t; + +/* Trigger Output Group 6 - PASS trigger multiplexer */ +typedef enum +{ + TRIG6_OUT_PASS_TR_SAR_IN = 0x40000600u /* pass.tr_sar_in */ +} en_trig_output_grp6_t; + +/* Trigger Output Group 7 - UDB general purpose trigger multiplexer */ +typedef enum +{ + TRIG7_OUT_UDB_TR_IN0 = 0x40000700u, /* udb.tr_in[0] */ + TRIG7_OUT_UDB_TR_IN1 = 0x40000701u /* udb.tr_in[1] */ +} en_trig_output_grp7_t; + +/* Trigger Output Group 8 - Trigger multiplexer to pins */ +typedef enum +{ + TRIG8_OUT_PERI_TR_IO_OUTPUT0 = 0x40000800u, /* peri.tr_io_output[0] */ + TRIG8_OUT_PERI_TR_IO_OUTPUT1 = 0x40000801u /* peri.tr_io_output[1] */ +} en_trig_output_grp8_t; + +/* Trigger Output Group 9 - Feedback mux to USB DMA interface */ +typedef enum +{ + TRIG9_OUT_USB_DMA_BURSTEND0 = 0x40000900u, /* usb.dma_burstend[0] */ + TRIG9_OUT_USB_DMA_BURSTEND1 = 0x40000901u, /* usb.dma_burstend[1] */ + TRIG9_OUT_USB_DMA_BURSTEND2 = 0x40000902u, /* usb.dma_burstend[2] */ + TRIG9_OUT_USB_DMA_BURSTEND3 = 0x40000903u, /* usb.dma_burstend[3] */ + TRIG9_OUT_USB_DMA_BURSTEND4 = 0x40000904u, /* usb.dma_burstend[4] */ + TRIG9_OUT_USB_DMA_BURSTEND5 = 0x40000905u, /* usb.dma_burstend[5] */ + TRIG9_OUT_USB_DMA_BURSTEND6 = 0x40000906u, /* usb.dma_burstend[6] */ + TRIG9_OUT_USB_DMA_BURSTEND7 = 0x40000907u /* usb.dma_burstend[7] */ +} en_trig_output_grp9_t; + +/* Trigger Output Group 10 - Reduces 32 datawire output triggers to 8 signals, used by all except USB */ +typedef enum +{ + TRIG10_OUT_UDB_TR_DW_ACK0 = 0x40000A00u, /* udb.tr_dw_ack[0] */ + TRIG10_OUT_TR_GROUP0_INPUT1 = 0x40000A00u, /* tr_group[0].input[1] */ + TRIG10_OUT_TR_GROUP1_INPUT1 = 0x40000A00u, /* tr_group[1].input[1] */ + TRIG10_OUT_TR_GROUP2_INPUT1 = 0x40000A00u, /* tr_group[2].input[1] */ + TRIG10_OUT_TR_GROUP3_INPUT1 = 0x40000A00u, /* tr_group[3].input[1] */ + TRIG10_OUT_TR_GROUP4_INPUT1 = 0x40000A00u, /* tr_group[4].input[1] */ + TRIG10_OUT_TR_GROUP5_INPUT1 = 0x40000A00u, /* tr_group[5].input[1] */ + TRIG10_OUT_TR_GROUP6_INPUT1 = 0x40000A00u, /* tr_group[6].input[1] */ + TRIG10_OUT_TR_GROUP7_INPUT1 = 0x40000A00u, /* tr_group[7].input[1] */ + TRIG10_OUT_TR_GROUP8_INPUT1 = 0x40000A00u, /* tr_group[8].input[1] */ + TRIG10_OUT_UDB_TR_DW_ACK1 = 0x40000A01u, /* udb.tr_dw_ack[1] */ + TRIG10_OUT_TR_GROUP0_INPUT2 = 0x40000A01u, /* tr_group[0].input[2] */ + TRIG10_OUT_TR_GROUP1_INPUT2 = 0x40000A01u, /* tr_group[1].input[2] */ + TRIG10_OUT_TR_GROUP2_INPUT2 = 0x40000A01u, /* tr_group[2].input[2] */ + TRIG10_OUT_TR_GROUP3_INPUT2 = 0x40000A01u, /* tr_group[3].input[2] */ + TRIG10_OUT_TR_GROUP4_INPUT2 = 0x40000A01u, /* tr_group[4].input[2] */ + TRIG10_OUT_TR_GROUP5_INPUT2 = 0x40000A01u, /* tr_group[5].input[2] */ + TRIG10_OUT_TR_GROUP6_INPUT2 = 0x40000A01u, /* tr_group[6].input[2] */ + TRIG10_OUT_TR_GROUP7_INPUT2 = 0x40000A01u, /* tr_group[7].input[2] */ + TRIG10_OUT_TR_GROUP8_INPUT2 = 0x40000A01u, /* tr_group[8].input[2] */ + TRIG10_OUT_UDB_TR_DW_ACK2 = 0x40000A02u, /* udb.tr_dw_ack[2] */ + TRIG10_OUT_TR_GROUP0_INPUT3 = 0x40000A02u, /* tr_group[0].input[3] */ + TRIG10_OUT_TR_GROUP1_INPUT3 = 0x40000A02u, /* tr_group[1].input[3] */ + TRIG10_OUT_TR_GROUP2_INPUT3 = 0x40000A02u, /* tr_group[2].input[3] */ + TRIG10_OUT_TR_GROUP3_INPUT3 = 0x40000A02u, /* tr_group[3].input[3] */ + TRIG10_OUT_TR_GROUP4_INPUT3 = 0x40000A02u, /* tr_group[4].input[3] */ + TRIG10_OUT_TR_GROUP5_INPUT3 = 0x40000A02u, /* tr_group[5].input[3] */ + TRIG10_OUT_TR_GROUP6_INPUT3 = 0x40000A02u, /* tr_group[6].input[3] */ + TRIG10_OUT_TR_GROUP7_INPUT3 = 0x40000A02u, /* tr_group[7].input[3] */ + TRIG10_OUT_TR_GROUP8_INPUT3 = 0x40000A02u, /* tr_group[8].input[3] */ + TRIG10_OUT_UDB_TR_DW_ACK3 = 0x40000A03u, /* udb.tr_dw_ack[3] */ + TRIG10_OUT_TR_GROUP0_INPUT4 = 0x40000A03u, /* tr_group[0].input[4] */ + TRIG10_OUT_TR_GROUP1_INPUT4 = 0x40000A03u, /* tr_group[1].input[4] */ + TRIG10_OUT_TR_GROUP2_INPUT4 = 0x40000A03u, /* tr_group[2].input[4] */ + TRIG10_OUT_TR_GROUP3_INPUT4 = 0x40000A03u, /* tr_group[3].input[4] */ + TRIG10_OUT_TR_GROUP4_INPUT4 = 0x40000A03u, /* tr_group[4].input[4] */ + TRIG10_OUT_TR_GROUP5_INPUT4 = 0x40000A03u, /* tr_group[5].input[4] */ + TRIG10_OUT_TR_GROUP6_INPUT4 = 0x40000A03u, /* tr_group[6].input[4] */ + TRIG10_OUT_TR_GROUP7_INPUT4 = 0x40000A03u, /* tr_group[7].input[4] */ + TRIG10_OUT_TR_GROUP8_INPUT4 = 0x40000A03u, /* tr_group[8].input[4] */ + TRIG10_OUT_UDB_TR_DW_ACK4 = 0x40000A04u, /* udb.tr_dw_ack[4] */ + TRIG10_OUT_TR_GROUP0_INPUT5 = 0x40000A04u, /* tr_group[0].input[5] */ + TRIG10_OUT_TR_GROUP1_INPUT5 = 0x40000A04u, /* tr_group[1].input[5] */ + TRIG10_OUT_TR_GROUP2_INPUT5 = 0x40000A04u, /* tr_group[2].input[5] */ + TRIG10_OUT_TR_GROUP3_INPUT5 = 0x40000A04u, /* tr_group[3].input[5] */ + TRIG10_OUT_TR_GROUP4_INPUT5 = 0x40000A04u, /* tr_group[4].input[5] */ + TRIG10_OUT_TR_GROUP5_INPUT5 = 0x40000A04u, /* tr_group[5].input[5] */ + TRIG10_OUT_TR_GROUP6_INPUT5 = 0x40000A04u, /* tr_group[6].input[5] */ + TRIG10_OUT_TR_GROUP7_INPUT5 = 0x40000A04u, /* tr_group[7].input[5] */ + TRIG10_OUT_TR_GROUP8_INPUT5 = 0x40000A04u, /* tr_group[8].input[5] */ + TRIG10_OUT_UDB_TR_DW_ACK5 = 0x40000A05u, /* udb.tr_dw_ack[5] */ + TRIG10_OUT_TR_GROUP0_INPUT6 = 0x40000A05u, /* tr_group[0].input[6] */ + TRIG10_OUT_TR_GROUP1_INPUT6 = 0x40000A05u, /* tr_group[1].input[6] */ + TRIG10_OUT_TR_GROUP2_INPUT6 = 0x40000A05u, /* tr_group[2].input[6] */ + TRIG10_OUT_TR_GROUP3_INPUT6 = 0x40000A05u, /* tr_group[3].input[6] */ + TRIG10_OUT_TR_GROUP4_INPUT6 = 0x40000A05u, /* tr_group[4].input[6] */ + TRIG10_OUT_TR_GROUP5_INPUT6 = 0x40000A05u, /* tr_group[5].input[6] */ + TRIG10_OUT_TR_GROUP6_INPUT6 = 0x40000A05u, /* tr_group[6].input[6] */ + TRIG10_OUT_TR_GROUP7_INPUT6 = 0x40000A05u, /* tr_group[7].input[6] */ + TRIG10_OUT_TR_GROUP8_INPUT6 = 0x40000A05u, /* tr_group[8].input[6] */ + TRIG10_OUT_UDB_TR_DW_ACK6 = 0x40000A06u, /* udb.tr_dw_ack[6] */ + TRIG10_OUT_TR_GROUP0_INPUT7 = 0x40000A06u, /* tr_group[0].input[7] */ + TRIG10_OUT_TR_GROUP1_INPUT7 = 0x40000A06u, /* tr_group[1].input[7] */ + TRIG10_OUT_TR_GROUP2_INPUT7 = 0x40000A06u, /* tr_group[2].input[7] */ + TRIG10_OUT_TR_GROUP3_INPUT7 = 0x40000A06u, /* tr_group[3].input[7] */ + TRIG10_OUT_TR_GROUP4_INPUT7 = 0x40000A06u, /* tr_group[4].input[7] */ + TRIG10_OUT_TR_GROUP5_INPUT7 = 0x40000A06u, /* tr_group[5].input[7] */ + TRIG10_OUT_TR_GROUP6_INPUT7 = 0x40000A06u, /* tr_group[6].input[7] */ + TRIG10_OUT_TR_GROUP7_INPUT7 = 0x40000A06u, /* tr_group[7].input[7] */ + TRIG10_OUT_TR_GROUP8_INPUT7 = 0x40000A06u, /* tr_group[8].input[7] */ + TRIG10_OUT_UDB_TR_DW_ACK7 = 0x40000A07u, /* udb.tr_dw_ack[7] */ + TRIG10_OUT_TR_GROUP0_INPUT8 = 0x40000A07u, /* tr_group[0].input[8] */ + TRIG10_OUT_TR_GROUP1_INPUT8 = 0x40000A07u, /* tr_group[1].input[8] */ + TRIG10_OUT_TR_GROUP2_INPUT8 = 0x40000A07u, /* tr_group[2].input[8] */ + TRIG10_OUT_TR_GROUP3_INPUT8 = 0x40000A07u, /* tr_group[3].input[8] */ + TRIG10_OUT_TR_GROUP4_INPUT8 = 0x40000A07u, /* tr_group[4].input[8] */ + TRIG10_OUT_TR_GROUP5_INPUT8 = 0x40000A07u, /* tr_group[5].input[8] */ + TRIG10_OUT_TR_GROUP6_INPUT8 = 0x40000A07u, /* tr_group[6].input[8] */ + TRIG10_OUT_TR_GROUP7_INPUT8 = 0x40000A07u, /* tr_group[7].input[8] */ + TRIG10_OUT_TR_GROUP8_INPUT8 = 0x40000A07u /* tr_group[8].input[8] */ +} en_trig_output_grp10_t; + +/* Trigger Output Group 11 - Reduces 96 tcpwm output triggers to 16 signals, used by all sinks */ +typedef enum +{ + TRIG11_OUT_TR_GROUP0_INPUT9 = 0x40000B00u, /* tr_group[0].input[9] */ + TRIG11_OUT_TR_GROUP1_INPUT9 = 0x40000B00u, /* tr_group[1].input[9] */ + TRIG11_OUT_TR_GROUP2_INPUT9 = 0x40000B00u, /* tr_group[2].input[9] */ + TRIG11_OUT_TR_GROUP3_INPUT9 = 0x40000B00u, /* tr_group[3].input[9] */ + TRIG11_OUT_TR_GROUP4_INPUT9 = 0x40000B00u, /* tr_group[4].input[9] */ + TRIG11_OUT_TR_GROUP5_INPUT9 = 0x40000B00u, /* tr_group[5].input[9] */ + TRIG11_OUT_TR_GROUP6_INPUT9 = 0x40000B00u, /* tr_group[6].input[9] */ + TRIG11_OUT_TR_GROUP7_INPUT9 = 0x40000B00u, /* tr_group[7].input[9] */ + TRIG11_OUT_TR_GROUP8_INPUT9 = 0x40000B00u, /* tr_group[8].input[9] */ + TRIG11_OUT_TR_GROUP0_INPUT10 = 0x40000B01u, /* tr_group[0].input[10] */ + TRIG11_OUT_TR_GROUP1_INPUT10 = 0x40000B01u, /* tr_group[1].input[10] */ + TRIG11_OUT_TR_GROUP2_INPUT10 = 0x40000B01u, /* tr_group[2].input[10] */ + TRIG11_OUT_TR_GROUP3_INPUT10 = 0x40000B01u, /* tr_group[3].input[10] */ + TRIG11_OUT_TR_GROUP4_INPUT10 = 0x40000B01u, /* tr_group[4].input[10] */ + TRIG11_OUT_TR_GROUP5_INPUT10 = 0x40000B01u, /* tr_group[5].input[10] */ + TRIG11_OUT_TR_GROUP6_INPUT10 = 0x40000B01u, /* tr_group[6].input[10] */ + TRIG11_OUT_TR_GROUP7_INPUT10 = 0x40000B01u, /* tr_group[7].input[10] */ + TRIG11_OUT_TR_GROUP8_INPUT10 = 0x40000B01u, /* tr_group[8].input[10] */ + TRIG11_OUT_TR_GROUP0_INPUT11 = 0x40000B02u, /* tr_group[0].input[11] */ + TRIG11_OUT_TR_GROUP1_INPUT11 = 0x40000B02u, /* tr_group[1].input[11] */ + TRIG11_OUT_TR_GROUP2_INPUT11 = 0x40000B02u, /* tr_group[2].input[11] */ + TRIG11_OUT_TR_GROUP3_INPUT11 = 0x40000B02u, /* tr_group[3].input[11] */ + TRIG11_OUT_TR_GROUP4_INPUT11 = 0x40000B02u, /* tr_group[4].input[11] */ + TRIG11_OUT_TR_GROUP5_INPUT11 = 0x40000B02u, /* tr_group[5].input[11] */ + TRIG11_OUT_TR_GROUP6_INPUT11 = 0x40000B02u, /* tr_group[6].input[11] */ + TRIG11_OUT_TR_GROUP7_INPUT11 = 0x40000B02u, /* tr_group[7].input[11] */ + TRIG11_OUT_TR_GROUP8_INPUT11 = 0x40000B02u, /* tr_group[8].input[11] */ + TRIG11_OUT_TR_GROUP0_INPUT12 = 0x40000B03u, /* tr_group[0].input[12] */ + TRIG11_OUT_TR_GROUP1_INPUT12 = 0x40000B03u, /* tr_group[1].input[12] */ + TRIG11_OUT_TR_GROUP2_INPUT12 = 0x40000B03u, /* tr_group[2].input[12] */ + TRIG11_OUT_TR_GROUP3_INPUT12 = 0x40000B03u, /* tr_group[3].input[12] */ + TRIG11_OUT_TR_GROUP4_INPUT12 = 0x40000B03u, /* tr_group[4].input[12] */ + TRIG11_OUT_TR_GROUP5_INPUT12 = 0x40000B03u, /* tr_group[5].input[12] */ + TRIG11_OUT_TR_GROUP6_INPUT12 = 0x40000B03u, /* tr_group[6].input[12] */ + TRIG11_OUT_TR_GROUP7_INPUT12 = 0x40000B03u, /* tr_group[7].input[12] */ + TRIG11_OUT_TR_GROUP8_INPUT12 = 0x40000B03u, /* tr_group[8].input[12] */ + TRIG11_OUT_TR_GROUP0_INPUT13 = 0x40000B04u, /* tr_group[0].input[13] */ + TRIG11_OUT_TR_GROUP1_INPUT13 = 0x40000B04u, /* tr_group[1].input[13] */ + TRIG11_OUT_TR_GROUP2_INPUT13 = 0x40000B04u, /* tr_group[2].input[13] */ + TRIG11_OUT_TR_GROUP3_INPUT13 = 0x40000B04u, /* tr_group[3].input[13] */ + TRIG11_OUT_TR_GROUP4_INPUT13 = 0x40000B04u, /* tr_group[4].input[13] */ + TRIG11_OUT_TR_GROUP5_INPUT13 = 0x40000B04u, /* tr_group[5].input[13] */ + TRIG11_OUT_TR_GROUP6_INPUT13 = 0x40000B04u, /* tr_group[6].input[13] */ + TRIG11_OUT_TR_GROUP7_INPUT13 = 0x40000B04u, /* tr_group[7].input[13] */ + TRIG11_OUT_TR_GROUP8_INPUT13 = 0x40000B04u, /* tr_group[8].input[13] */ + TRIG11_OUT_TR_GROUP0_INPUT14 = 0x40000B05u, /* tr_group[0].input[14] */ + TRIG11_OUT_TR_GROUP1_INPUT14 = 0x40000B05u, /* tr_group[1].input[14] */ + TRIG11_OUT_TR_GROUP2_INPUT14 = 0x40000B05u, /* tr_group[2].input[14] */ + TRIG11_OUT_TR_GROUP3_INPUT14 = 0x40000B05u, /* tr_group[3].input[14] */ + TRIG11_OUT_TR_GROUP4_INPUT14 = 0x40000B05u, /* tr_group[4].input[14] */ + TRIG11_OUT_TR_GROUP5_INPUT14 = 0x40000B05u, /* tr_group[5].input[14] */ + TRIG11_OUT_TR_GROUP6_INPUT14 = 0x40000B05u, /* tr_group[6].input[14] */ + TRIG11_OUT_TR_GROUP7_INPUT14 = 0x40000B05u, /* tr_group[7].input[14] */ + TRIG11_OUT_TR_GROUP8_INPUT14 = 0x40000B05u, /* tr_group[8].input[14] */ + TRIG11_OUT_TR_GROUP0_INPUT15 = 0x40000B06u, /* tr_group[0].input[15] */ + TRIG11_OUT_TR_GROUP1_INPUT15 = 0x40000B06u, /* tr_group[1].input[15] */ + TRIG11_OUT_TR_GROUP2_INPUT15 = 0x40000B06u, /* tr_group[2].input[15] */ + TRIG11_OUT_TR_GROUP3_INPUT15 = 0x40000B06u, /* tr_group[3].input[15] */ + TRIG11_OUT_TR_GROUP4_INPUT15 = 0x40000B06u, /* tr_group[4].input[15] */ + TRIG11_OUT_TR_GROUP5_INPUT15 = 0x40000B06u, /* tr_group[5].input[15] */ + TRIG11_OUT_TR_GROUP6_INPUT15 = 0x40000B06u, /* tr_group[6].input[15] */ + TRIG11_OUT_TR_GROUP7_INPUT15 = 0x40000B06u, /* tr_group[7].input[15] */ + TRIG11_OUT_TR_GROUP8_INPUT15 = 0x40000B06u, /* tr_group[8].input[15] */ + TRIG11_OUT_TR_GROUP0_INPUT16 = 0x40000B07u, /* tr_group[0].input[16] */ + TRIG11_OUT_TR_GROUP1_INPUT16 = 0x40000B07u, /* tr_group[1].input[16] */ + TRIG11_OUT_TR_GROUP2_INPUT16 = 0x40000B07u, /* tr_group[2].input[16] */ + TRIG11_OUT_TR_GROUP3_INPUT16 = 0x40000B07u, /* tr_group[3].input[16] */ + TRIG11_OUT_TR_GROUP4_INPUT16 = 0x40000B07u, /* tr_group[4].input[16] */ + TRIG11_OUT_TR_GROUP5_INPUT16 = 0x40000B07u, /* tr_group[5].input[16] */ + TRIG11_OUT_TR_GROUP6_INPUT16 = 0x40000B07u, /* tr_group[6].input[16] */ + TRIG11_OUT_TR_GROUP7_INPUT16 = 0x40000B07u, /* tr_group[7].input[16] */ + TRIG11_OUT_TR_GROUP8_INPUT16 = 0x40000B07u, /* tr_group[8].input[16] */ + TRIG11_OUT_TR_GROUP0_INPUT17 = 0x40000B08u, /* tr_group[0].input[17] */ + TRIG11_OUT_TR_GROUP1_INPUT17 = 0x40000B08u, /* tr_group[1].input[17] */ + TRIG11_OUT_TR_GROUP2_INPUT17 = 0x40000B08u, /* tr_group[2].input[17] */ + TRIG11_OUT_TR_GROUP3_INPUT17 = 0x40000B08u, /* tr_group[3].input[17] */ + TRIG11_OUT_TR_GROUP4_INPUT17 = 0x40000B08u, /* tr_group[4].input[17] */ + TRIG11_OUT_TR_GROUP5_INPUT17 = 0x40000B08u, /* tr_group[5].input[17] */ + TRIG11_OUT_TR_GROUP6_INPUT17 = 0x40000B08u, /* tr_group[6].input[17] */ + TRIG11_OUT_TR_GROUP7_INPUT17 = 0x40000B08u, /* tr_group[7].input[17] */ + TRIG11_OUT_TR_GROUP8_INPUT17 = 0x40000B08u, /* tr_group[8].input[17] */ + TRIG11_OUT_TR_GROUP0_INPUT18 = 0x40000B09u, /* tr_group[0].input[18] */ + TRIG11_OUT_TR_GROUP1_INPUT18 = 0x40000B09u, /* tr_group[1].input[18] */ + TRIG11_OUT_TR_GROUP2_INPUT18 = 0x40000B09u, /* tr_group[2].input[18] */ + TRIG11_OUT_TR_GROUP3_INPUT18 = 0x40000B09u, /* tr_group[3].input[18] */ + TRIG11_OUT_TR_GROUP4_INPUT18 = 0x40000B09u, /* tr_group[4].input[18] */ + TRIG11_OUT_TR_GROUP5_INPUT18 = 0x40000B09u, /* tr_group[5].input[18] */ + TRIG11_OUT_TR_GROUP6_INPUT18 = 0x40000B09u, /* tr_group[6].input[18] */ + TRIG11_OUT_TR_GROUP7_INPUT18 = 0x40000B09u, /* tr_group[7].input[18] */ + TRIG11_OUT_TR_GROUP8_INPUT18 = 0x40000B09u, /* tr_group[8].input[18] */ + TRIG11_OUT_TR_GROUP0_INPUT19 = 0x40000B0Au, /* tr_group[0].input[19] */ + TRIG11_OUT_TR_GROUP1_INPUT19 = 0x40000B0Au, /* tr_group[1].input[19] */ + TRIG11_OUT_TR_GROUP2_INPUT19 = 0x40000B0Au, /* tr_group[2].input[19] */ + TRIG11_OUT_TR_GROUP3_INPUT19 = 0x40000B0Au, /* tr_group[3].input[19] */ + TRIG11_OUT_TR_GROUP4_INPUT19 = 0x40000B0Au, /* tr_group[4].input[19] */ + TRIG11_OUT_TR_GROUP5_INPUT19 = 0x40000B0Au, /* tr_group[5].input[19] */ + TRIG11_OUT_TR_GROUP6_INPUT19 = 0x40000B0Au, /* tr_group[6].input[19] */ + TRIG11_OUT_TR_GROUP7_INPUT19 = 0x40000B0Au, /* tr_group[7].input[19] */ + TRIG11_OUT_TR_GROUP8_INPUT19 = 0x40000B0Au, /* tr_group[8].input[19] */ + TRIG11_OUT_TR_GROUP0_INPUT20 = 0x40000B0Bu, /* tr_group[0].input[20] */ + TRIG11_OUT_TR_GROUP1_INPUT20 = 0x40000B0Bu, /* tr_group[1].input[20] */ + TRIG11_OUT_TR_GROUP2_INPUT20 = 0x40000B0Bu, /* tr_group[2].input[20] */ + TRIG11_OUT_TR_GROUP3_INPUT20 = 0x40000B0Bu, /* tr_group[3].input[20] */ + TRIG11_OUT_TR_GROUP4_INPUT20 = 0x40000B0Bu, /* tr_group[4].input[20] */ + TRIG11_OUT_TR_GROUP5_INPUT20 = 0x40000B0Bu, /* tr_group[5].input[20] */ + TRIG11_OUT_TR_GROUP6_INPUT20 = 0x40000B0Bu, /* tr_group[6].input[20] */ + TRIG11_OUT_TR_GROUP7_INPUT20 = 0x40000B0Bu, /* tr_group[7].input[20] */ + TRIG11_OUT_TR_GROUP8_INPUT20 = 0x40000B0Bu, /* tr_group[8].input[20] */ + TRIG11_OUT_TR_GROUP0_INPUT21 = 0x40000B0Cu, /* tr_group[0].input[21] */ + TRIG11_OUT_TR_GROUP1_INPUT21 = 0x40000B0Cu, /* tr_group[1].input[21] */ + TRIG11_OUT_TR_GROUP2_INPUT21 = 0x40000B0Cu, /* tr_group[2].input[21] */ + TRIG11_OUT_TR_GROUP3_INPUT21 = 0x40000B0Cu, /* tr_group[3].input[21] */ + TRIG11_OUT_TR_GROUP4_INPUT21 = 0x40000B0Cu, /* tr_group[4].input[21] */ + TRIG11_OUT_TR_GROUP5_INPUT21 = 0x40000B0Cu, /* tr_group[5].input[21] */ + TRIG11_OUT_TR_GROUP6_INPUT21 = 0x40000B0Cu, /* tr_group[6].input[21] */ + TRIG11_OUT_TR_GROUP7_INPUT21 = 0x40000B0Cu, /* tr_group[7].input[21] */ + TRIG11_OUT_TR_GROUP8_INPUT21 = 0x40000B0Cu, /* tr_group[8].input[21] */ + TRIG11_OUT_TR_GROUP0_INPUT22 = 0x40000B0Du, /* tr_group[0].input[22] */ + TRIG11_OUT_TR_GROUP1_INPUT22 = 0x40000B0Du, /* tr_group[1].input[22] */ + TRIG11_OUT_TR_GROUP2_INPUT22 = 0x40000B0Du, /* tr_group[2].input[22] */ + TRIG11_OUT_TR_GROUP3_INPUT22 = 0x40000B0Du, /* tr_group[3].input[22] */ + TRIG11_OUT_TR_GROUP4_INPUT22 = 0x40000B0Du, /* tr_group[4].input[22] */ + TRIG11_OUT_TR_GROUP5_INPUT22 = 0x40000B0Du, /* tr_group[5].input[22] */ + TRIG11_OUT_TR_GROUP6_INPUT22 = 0x40000B0Du, /* tr_group[6].input[22] */ + TRIG11_OUT_TR_GROUP7_INPUT22 = 0x40000B0Du, /* tr_group[7].input[22] */ + TRIG11_OUT_TR_GROUP8_INPUT22 = 0x40000B0Du, /* tr_group[8].input[22] */ + TRIG11_OUT_TR_GROUP0_INPUT23 = 0x40000B0Eu, /* tr_group[0].input[23] */ + TRIG11_OUT_TR_GROUP1_INPUT23 = 0x40000B0Eu, /* tr_group[1].input[23] */ + TRIG11_OUT_TR_GROUP2_INPUT23 = 0x40000B0Eu, /* tr_group[2].input[23] */ + TRIG11_OUT_TR_GROUP3_INPUT23 = 0x40000B0Eu, /* tr_group[3].input[23] */ + TRIG11_OUT_TR_GROUP4_INPUT23 = 0x40000B0Eu, /* tr_group[4].input[23] */ + TRIG11_OUT_TR_GROUP5_INPUT23 = 0x40000B0Eu, /* tr_group[5].input[23] */ + TRIG11_OUT_TR_GROUP6_INPUT23 = 0x40000B0Eu, /* tr_group[6].input[23] */ + TRIG11_OUT_TR_GROUP7_INPUT23 = 0x40000B0Eu, /* tr_group[7].input[23] */ + TRIG11_OUT_TR_GROUP8_INPUT23 = 0x40000B0Eu, /* tr_group[8].input[23] */ + TRIG11_OUT_TR_GROUP0_INPUT24 = 0x40000B0Fu, /* tr_group[0].input[24] */ + TRIG11_OUT_TR_GROUP1_INPUT24 = 0x40000B0Fu, /* tr_group[1].input[24] */ + TRIG11_OUT_TR_GROUP2_INPUT24 = 0x40000B0Fu, /* tr_group[2].input[24] */ + TRIG11_OUT_TR_GROUP3_INPUT24 = 0x40000B0Fu, /* tr_group[3].input[24] */ + TRIG11_OUT_TR_GROUP4_INPUT24 = 0x40000B0Fu, /* tr_group[4].input[24] */ + TRIG11_OUT_TR_GROUP5_INPUT24 = 0x40000B0Fu, /* tr_group[5].input[24] */ + TRIG11_OUT_TR_GROUP6_INPUT24 = 0x40000B0Fu, /* tr_group[6].input[24] */ + TRIG11_OUT_TR_GROUP7_INPUT24 = 0x40000B0Fu, /* tr_group[7].input[24] */ + TRIG11_OUT_TR_GROUP8_INPUT24 = 0x40000B0Fu /* tr_group[8].input[24] */ +} en_trig_output_grp11_t; + +/* Trigger Output Group 12 - Reduces 28 pin input signals to 10 triggers used by all sinks */ +typedef enum +{ + TRIG12_OUT_TR_GROUP2_INPUT25 = 0x40000C00u, /* tr_group[2].input[25] */ + TRIG12_OUT_TR_GROUP3_INPUT25 = 0x40000C00u, /* tr_group[3].input[25] */ + TRIG12_OUT_TR_GROUP4_INPUT25 = 0x40000C00u, /* tr_group[4].input[25] */ + TRIG12_OUT_TR_GROUP5_INPUT25 = 0x40000C00u, /* tr_group[5].input[25] */ + TRIG12_OUT_TR_GROUP6_INPUT25 = 0x40000C00u, /* tr_group[6].input[25] */ + TRIG12_OUT_TR_GROUP7_INPUT25 = 0x40000C00u, /* tr_group[7].input[25] */ + TRIG12_OUT_TR_GROUP8_INPUT25 = 0x40000C00u, /* tr_group[8].input[25] */ + TRIG12_OUT_TR_GROUP2_INPUT26 = 0x40000C01u, /* tr_group[2].input[26] */ + TRIG12_OUT_TR_GROUP3_INPUT26 = 0x40000C01u, /* tr_group[3].input[26] */ + TRIG12_OUT_TR_GROUP4_INPUT26 = 0x40000C01u, /* tr_group[4].input[26] */ + TRIG12_OUT_TR_GROUP5_INPUT26 = 0x40000C01u, /* tr_group[5].input[26] */ + TRIG12_OUT_TR_GROUP6_INPUT26 = 0x40000C01u, /* tr_group[6].input[26] */ + TRIG12_OUT_TR_GROUP7_INPUT26 = 0x40000C01u, /* tr_group[7].input[26] */ + TRIG12_OUT_TR_GROUP8_INPUT26 = 0x40000C01u, /* tr_group[8].input[26] */ + TRIG12_OUT_TR_GROUP2_INPUT27 = 0x40000C02u, /* tr_group[2].input[27] */ + TRIG12_OUT_TR_GROUP3_INPUT27 = 0x40000C02u, /* tr_group[3].input[27] */ + TRIG12_OUT_TR_GROUP4_INPUT27 = 0x40000C02u, /* tr_group[4].input[27] */ + TRIG12_OUT_TR_GROUP5_INPUT27 = 0x40000C02u, /* tr_group[5].input[27] */ + TRIG12_OUT_TR_GROUP6_INPUT27 = 0x40000C02u, /* tr_group[6].input[27] */ + TRIG12_OUT_TR_GROUP7_INPUT27 = 0x40000C02u, /* tr_group[7].input[27] */ + TRIG12_OUT_TR_GROUP8_INPUT27 = 0x40000C02u, /* tr_group[8].input[27] */ + TRIG12_OUT_TR_GROUP2_INPUT28 = 0x40000C03u, /* tr_group[2].input[28] */ + TRIG12_OUT_TR_GROUP3_INPUT28 = 0x40000C03u, /* tr_group[3].input[28] */ + TRIG12_OUT_TR_GROUP4_INPUT28 = 0x40000C03u, /* tr_group[4].input[28] */ + TRIG12_OUT_TR_GROUP5_INPUT28 = 0x40000C03u, /* tr_group[5].input[28] */ + TRIG12_OUT_TR_GROUP6_INPUT28 = 0x40000C03u, /* tr_group[6].input[28] */ + TRIG12_OUT_TR_GROUP7_INPUT28 = 0x40000C03u, /* tr_group[7].input[28] */ + TRIG12_OUT_TR_GROUP8_INPUT28 = 0x40000C03u, /* tr_group[8].input[28] */ + TRIG12_OUT_TR_GROUP2_INPUT29 = 0x40000C04u, /* tr_group[2].input[29] */ + TRIG12_OUT_TR_GROUP3_INPUT29 = 0x40000C04u, /* tr_group[3].input[29] */ + TRIG12_OUT_TR_GROUP4_INPUT29 = 0x40000C04u, /* tr_group[4].input[29] */ + TRIG12_OUT_TR_GROUP5_INPUT29 = 0x40000C04u, /* tr_group[5].input[29] */ + TRIG12_OUT_TR_GROUP6_INPUT29 = 0x40000C04u, /* tr_group[6].input[29] */ + TRIG12_OUT_TR_GROUP7_INPUT29 = 0x40000C04u, /* tr_group[7].input[29] */ + TRIG12_OUT_TR_GROUP8_INPUT29 = 0x40000C04u, /* tr_group[8].input[29] */ + TRIG12_OUT_TR_GROUP2_INPUT30 = 0x40000C05u, /* tr_group[2].input[30] */ + TRIG12_OUT_TR_GROUP3_INPUT30 = 0x40000C05u, /* tr_group[3].input[30] */ + TRIG12_OUT_TR_GROUP4_INPUT30 = 0x40000C05u, /* tr_group[4].input[30] */ + TRIG12_OUT_TR_GROUP5_INPUT30 = 0x40000C05u, /* tr_group[5].input[30] */ + TRIG12_OUT_TR_GROUP6_INPUT30 = 0x40000C05u, /* tr_group[6].input[30] */ + TRIG12_OUT_TR_GROUP7_INPUT30 = 0x40000C05u, /* tr_group[7].input[30] */ + TRIG12_OUT_TR_GROUP8_INPUT30 = 0x40000C05u, /* tr_group[8].input[30] */ + TRIG12_OUT_TR_GROUP2_INPUT31 = 0x40000C06u, /* tr_group[2].input[31] */ + TRIG12_OUT_TR_GROUP3_INPUT31 = 0x40000C06u, /* tr_group[3].input[31] */ + TRIG12_OUT_TR_GROUP4_INPUT31 = 0x40000C06u, /* tr_group[4].input[31] */ + TRIG12_OUT_TR_GROUP5_INPUT31 = 0x40000C06u, /* tr_group[5].input[31] */ + TRIG12_OUT_TR_GROUP6_INPUT31 = 0x40000C06u, /* tr_group[6].input[31] */ + TRIG12_OUT_TR_GROUP7_INPUT31 = 0x40000C06u, /* tr_group[7].input[31] */ + TRIG12_OUT_TR_GROUP8_INPUT31 = 0x40000C06u, /* tr_group[8].input[31] */ + TRIG12_OUT_TR_GROUP2_INPUT32 = 0x40000C07u, /* tr_group[2].input[32] */ + TRIG12_OUT_TR_GROUP3_INPUT32 = 0x40000C07u, /* tr_group[3].input[32] */ + TRIG12_OUT_TR_GROUP4_INPUT32 = 0x40000C07u, /* tr_group[4].input[32] */ + TRIG12_OUT_TR_GROUP5_INPUT32 = 0x40000C07u, /* tr_group[5].input[32] */ + TRIG12_OUT_TR_GROUP6_INPUT32 = 0x40000C07u, /* tr_group[6].input[32] */ + TRIG12_OUT_TR_GROUP7_INPUT32 = 0x40000C07u, /* tr_group[7].input[32] */ + TRIG12_OUT_TR_GROUP8_INPUT32 = 0x40000C07u, /* tr_group[8].input[32] */ + TRIG12_OUT_TR_GROUP0_INPUT25 = 0x40000C08u, /* tr_group[0].input[25] */ + TRIG12_OUT_TR_GROUP1_INPUT25 = 0x40000C08u, /* tr_group[1].input[25] */ + TRIG12_OUT_TR_GROUP0_INPUT26 = 0x40000C09u, /* tr_group[0].input[26] */ + TRIG12_OUT_TR_GROUP1_INPUT26 = 0x40000C09u /* tr_group[1].input[26] */ +} en_trig_output_grp12_t; + +/* Trigger Output Group 13 - Reduces DMA requests to 16+2 outputs used by all sinks */ +typedef enum +{ + TRIG13_OUT_TR_GROUP0_INPUT27 = 0x40000D00u, /* tr_group[0].input[27] */ + TRIG13_OUT_TR_GROUP1_INPUT27 = 0x40000D00u, /* tr_group[1].input[27] */ + TRIG13_OUT_TR_GROUP0_INPUT28 = 0x40000D01u, /* tr_group[0].input[28] */ + TRIG13_OUT_TR_GROUP1_INPUT28 = 0x40000D01u, /* tr_group[1].input[28] */ + TRIG13_OUT_TR_GROUP0_INPUT29 = 0x40000D02u, /* tr_group[0].input[29] */ + TRIG13_OUT_TR_GROUP1_INPUT29 = 0x40000D02u, /* tr_group[1].input[29] */ + TRIG13_OUT_TR_GROUP0_INPUT30 = 0x40000D03u, /* tr_group[0].input[30] */ + TRIG13_OUT_TR_GROUP1_INPUT30 = 0x40000D03u, /* tr_group[1].input[30] */ + TRIG13_OUT_TR_GROUP0_INPUT31 = 0x40000D04u, /* tr_group[0].input[31] */ + TRIG13_OUT_TR_GROUP1_INPUT31 = 0x40000D04u, /* tr_group[1].input[31] */ + TRIG13_OUT_TR_GROUP0_INPUT32 = 0x40000D05u, /* tr_group[0].input[32] */ + TRIG13_OUT_TR_GROUP1_INPUT32 = 0x40000D05u, /* tr_group[1].input[32] */ + TRIG13_OUT_TR_GROUP0_INPUT33 = 0x40000D06u, /* tr_group[0].input[33] */ + TRIG13_OUT_TR_GROUP1_INPUT33 = 0x40000D06u, /* tr_group[1].input[33] */ + TRIG13_OUT_TR_GROUP0_INPUT34 = 0x40000D07u, /* tr_group[0].input[34] */ + TRIG13_OUT_TR_GROUP1_INPUT34 = 0x40000D07u, /* tr_group[1].input[34] */ + TRIG13_OUT_TR_GROUP0_INPUT35 = 0x40000D08u, /* tr_group[0].input[35] */ + TRIG13_OUT_TR_GROUP1_INPUT35 = 0x40000D08u, /* tr_group[1].input[35] */ + TRIG13_OUT_TR_GROUP0_INPUT36 = 0x40000D09u, /* tr_group[0].input[36] */ + TRIG13_OUT_TR_GROUP1_INPUT36 = 0x40000D09u, /* tr_group[1].input[36] */ + TRIG13_OUT_TR_GROUP0_INPUT37 = 0x40000D0Au, /* tr_group[0].input[37] */ + TRIG13_OUT_TR_GROUP1_INPUT37 = 0x40000D0Au, /* tr_group[1].input[37] */ + TRIG13_OUT_TR_GROUP0_INPUT38 = 0x40000D0Bu, /* tr_group[0].input[38] */ + TRIG13_OUT_TR_GROUP1_INPUT38 = 0x40000D0Bu, /* tr_group[1].input[38] */ + TRIG13_OUT_TR_GROUP0_INPUT39 = 0x40000D0Cu, /* tr_group[0].input[39] */ + TRIG13_OUT_TR_GROUP1_INPUT39 = 0x40000D0Cu, /* tr_group[1].input[39] */ + TRIG13_OUT_TR_GROUP0_INPUT40 = 0x40000D0Du, /* tr_group[0].input[40] */ + TRIG13_OUT_TR_GROUP1_INPUT40 = 0x40000D0Du, /* tr_group[1].input[40] */ + TRIG13_OUT_TR_GROUP0_INPUT41 = 0x40000D0Eu, /* tr_group[0].input[41] */ + TRIG13_OUT_TR_GROUP1_INPUT41 = 0x40000D0Eu, /* tr_group[1].input[41] */ + TRIG13_OUT_TR_GROUP0_INPUT42 = 0x40000D0Fu, /* tr_group[0].input[42] */ + TRIG13_OUT_TR_GROUP1_INPUT42 = 0x40000D0Fu, /* tr_group[1].input[42] */ + TRIG13_OUT_TR_GROUP2_INPUT33 = 0x40000D10u, /* tr_group[2].input[33] */ + TRIG13_OUT_TR_GROUP3_INPUT33 = 0x40000D10u, /* tr_group[3].input[33] */ + TRIG13_OUT_TR_GROUP4_INPUT33 = 0x40000D10u, /* tr_group[4].input[33] */ + TRIG13_OUT_TR_GROUP5_INPUT33 = 0x40000D10u, /* tr_group[5].input[33] */ + TRIG13_OUT_TR_GROUP6_INPUT33 = 0x40000D10u, /* tr_group[6].input[33] */ + TRIG13_OUT_TR_GROUP7_INPUT33 = 0x40000D10u, /* tr_group[7].input[33] */ + TRIG13_OUT_TR_GROUP8_INPUT33 = 0x40000D10u, /* tr_group[8].input[33] */ + TRIG13_OUT_TR_GROUP2_INPUT34 = 0x40000D11u, /* tr_group[2].input[34] */ + TRIG13_OUT_TR_GROUP3_INPUT34 = 0x40000D11u, /* tr_group[3].input[34] */ + TRIG13_OUT_TR_GROUP4_INPUT34 = 0x40000D11u, /* tr_group[4].input[34] */ + TRIG13_OUT_TR_GROUP5_INPUT34 = 0x40000D11u, /* tr_group[5].input[34] */ + TRIG13_OUT_TR_GROUP6_INPUT34 = 0x40000D11u, /* tr_group[6].input[34] */ + TRIG13_OUT_TR_GROUP7_INPUT34 = 0x40000D11u, /* tr_group[7].input[34] */ + TRIG13_OUT_TR_GROUP8_INPUT34 = 0x40000D11u /* tr_group[8].input[34] */ +} en_trig_output_grp13_t; + +/* Trigger Output Group 14 - Reduces general purpose trigger inputs to 8+8 outputs used by all sinks */ +typedef enum +{ + TRIG14_OUT_TR_GROUP0_INPUT43 = 0x40000E00u, /* tr_group[0].input[43] */ + TRIG14_OUT_TR_GROUP1_INPUT43 = 0x40000E00u, /* tr_group[1].input[43] */ + TRIG14_OUT_TR_GROUP0_INPUT44 = 0x40000E01u, /* tr_group[0].input[44] */ + TRIG14_OUT_TR_GROUP1_INPUT44 = 0x40000E01u, /* tr_group[1].input[44] */ + TRIG14_OUT_TR_GROUP0_INPUT45 = 0x40000E02u, /* tr_group[0].input[45] */ + TRIG14_OUT_TR_GROUP1_INPUT45 = 0x40000E02u, /* tr_group[1].input[45] */ + TRIG14_OUT_TR_GROUP0_INPUT46 = 0x40000E03u, /* tr_group[0].input[46] */ + TRIG14_OUT_TR_GROUP1_INPUT46 = 0x40000E03u, /* tr_group[1].input[46] */ + TRIG14_OUT_TR_GROUP0_INPUT47 = 0x40000E04u, /* tr_group[0].input[47] */ + TRIG14_OUT_TR_GROUP1_INPUT47 = 0x40000E04u, /* tr_group[1].input[47] */ + TRIG14_OUT_TR_GROUP0_INPUT48 = 0x40000E05u, /* tr_group[0].input[48] */ + TRIG14_OUT_TR_GROUP1_INPUT48 = 0x40000E05u, /* tr_group[1].input[48] */ + TRIG14_OUT_TR_GROUP0_INPUT49 = 0x40000E06u, /* tr_group[0].input[49] */ + TRIG14_OUT_TR_GROUP1_INPUT49 = 0x40000E06u, /* tr_group[1].input[49] */ + TRIG14_OUT_TR_GROUP0_INPUT50 = 0x40000E07u, /* tr_group[0].input[50] */ + TRIG14_OUT_TR_GROUP1_INPUT50 = 0x40000E07u, /* tr_group[1].input[50] */ + TRIG14_OUT_TR_GROUP2_INPUT35 = 0x40000E08u, /* tr_group[2].input[35] */ + TRIG14_OUT_TR_GROUP3_INPUT35 = 0x40000E08u, /* tr_group[3].input[35] */ + TRIG14_OUT_TR_GROUP4_INPUT35 = 0x40000E08u, /* tr_group[4].input[35] */ + TRIG14_OUT_TR_GROUP5_INPUT35 = 0x40000E08u, /* tr_group[5].input[35] */ + TRIG14_OUT_TR_GROUP6_INPUT35 = 0x40000E08u, /* tr_group[6].input[35] */ + TRIG14_OUT_TR_GROUP7_INPUT35 = 0x40000E08u, /* tr_group[7].input[35] */ + TRIG14_OUT_TR_GROUP8_INPUT35 = 0x40000E08u, /* tr_group[8].input[35] */ + TRIG14_OUT_TR_GROUP2_INPUT36 = 0x40000E09u, /* tr_group[2].input[36] */ + TRIG14_OUT_TR_GROUP3_INPUT36 = 0x40000E09u, /* tr_group[3].input[36] */ + TRIG14_OUT_TR_GROUP4_INPUT36 = 0x40000E09u, /* tr_group[4].input[36] */ + TRIG14_OUT_TR_GROUP5_INPUT36 = 0x40000E09u, /* tr_group[5].input[36] */ + TRIG14_OUT_TR_GROUP6_INPUT36 = 0x40000E09u, /* tr_group[6].input[36] */ + TRIG14_OUT_TR_GROUP7_INPUT36 = 0x40000E09u, /* tr_group[7].input[36] */ + TRIG14_OUT_TR_GROUP8_INPUT36 = 0x40000E09u, /* tr_group[8].input[36] */ + TRIG14_OUT_TR_GROUP2_INPUT37 = 0x40000E0Au, /* tr_group[2].input[37] */ + TRIG14_OUT_TR_GROUP3_INPUT37 = 0x40000E0Au, /* tr_group[3].input[37] */ + TRIG14_OUT_TR_GROUP4_INPUT37 = 0x40000E0Au, /* tr_group[4].input[37] */ + TRIG14_OUT_TR_GROUP5_INPUT37 = 0x40000E0Au, /* tr_group[5].input[37] */ + TRIG14_OUT_TR_GROUP6_INPUT37 = 0x40000E0Au, /* tr_group[6].input[37] */ + TRIG14_OUT_TR_GROUP7_INPUT37 = 0x40000E0Au, /* tr_group[7].input[37] */ + TRIG14_OUT_TR_GROUP8_INPUT37 = 0x40000E0Au, /* tr_group[8].input[37] */ + TRIG14_OUT_TR_GROUP2_INPUT38 = 0x40000E0Bu, /* tr_group[2].input[38] */ + TRIG14_OUT_TR_GROUP3_INPUT38 = 0x40000E0Bu, /* tr_group[3].input[38] */ + TRIG14_OUT_TR_GROUP4_INPUT38 = 0x40000E0Bu, /* tr_group[4].input[38] */ + TRIG14_OUT_TR_GROUP5_INPUT38 = 0x40000E0Bu, /* tr_group[5].input[38] */ + TRIG14_OUT_TR_GROUP6_INPUT38 = 0x40000E0Bu, /* tr_group[6].input[38] */ + TRIG14_OUT_TR_GROUP7_INPUT38 = 0x40000E0Bu, /* tr_group[7].input[38] */ + TRIG14_OUT_TR_GROUP8_INPUT38 = 0x40000E0Bu, /* tr_group[8].input[38] */ + TRIG14_OUT_TR_GROUP2_INPUT39 = 0x40000E0Cu, /* tr_group[2].input[39] */ + TRIG14_OUT_TR_GROUP3_INPUT39 = 0x40000E0Cu, /* tr_group[3].input[39] */ + TRIG14_OUT_TR_GROUP4_INPUT39 = 0x40000E0Cu, /* tr_group[4].input[39] */ + TRIG14_OUT_TR_GROUP5_INPUT39 = 0x40000E0Cu, /* tr_group[5].input[39] */ + TRIG14_OUT_TR_GROUP6_INPUT39 = 0x40000E0Cu, /* tr_group[6].input[39] */ + TRIG14_OUT_TR_GROUP7_INPUT39 = 0x40000E0Cu, /* tr_group[7].input[39] */ + TRIG14_OUT_TR_GROUP8_INPUT39 = 0x40000E0Cu, /* tr_group[8].input[39] */ + TRIG14_OUT_TR_GROUP2_INPUT40 = 0x40000E0Du, /* tr_group[2].input[40] */ + TRIG14_OUT_TR_GROUP3_INPUT40 = 0x40000E0Du, /* tr_group[3].input[40] */ + TRIG14_OUT_TR_GROUP4_INPUT40 = 0x40000E0Du, /* tr_group[4].input[40] */ + TRIG14_OUT_TR_GROUP5_INPUT40 = 0x40000E0Du, /* tr_group[5].input[40] */ + TRIG14_OUT_TR_GROUP6_INPUT40 = 0x40000E0Du, /* tr_group[6].input[40] */ + TRIG14_OUT_TR_GROUP7_INPUT40 = 0x40000E0Du, /* tr_group[7].input[40] */ + TRIG14_OUT_TR_GROUP8_INPUT40 = 0x40000E0Du, /* tr_group[8].input[40] */ + TRIG14_OUT_TR_GROUP2_INPUT41 = 0x40000E0Eu, /* tr_group[2].input[41] */ + TRIG14_OUT_TR_GROUP3_INPUT41 = 0x40000E0Eu, /* tr_group[3].input[41] */ + TRIG14_OUT_TR_GROUP4_INPUT41 = 0x40000E0Eu, /* tr_group[4].input[41] */ + TRIG14_OUT_TR_GROUP5_INPUT41 = 0x40000E0Eu, /* tr_group[5].input[41] */ + TRIG14_OUT_TR_GROUP6_INPUT41 = 0x40000E0Eu, /* tr_group[6].input[41] */ + TRIG14_OUT_TR_GROUP7_INPUT41 = 0x40000E0Eu, /* tr_group[7].input[41] */ + TRIG14_OUT_TR_GROUP8_INPUT41 = 0x40000E0Eu, /* tr_group[8].input[41] */ + TRIG14_OUT_TR_GROUP2_INPUT42 = 0x40000E0Fu, /* tr_group[2].input[42] */ + TRIG14_OUT_TR_GROUP3_INPUT42 = 0x40000E0Fu, /* tr_group[3].input[42] */ + TRIG14_OUT_TR_GROUP4_INPUT42 = 0x40000E0Fu, /* tr_group[4].input[42] */ + TRIG14_OUT_TR_GROUP5_INPUT42 = 0x40000E0Fu, /* tr_group[5].input[42] */ + TRIG14_OUT_TR_GROUP6_INPUT42 = 0x40000E0Fu, /* tr_group[6].input[42] */ + TRIG14_OUT_TR_GROUP7_INPUT42 = 0x40000E0Fu, /* tr_group[7].input[42] */ + TRIG14_OUT_TR_GROUP8_INPUT42 = 0x40000E0Fu /* tr_group[8].input[42] */ +} en_trig_output_grp14_t; + +/* Level or edge detection setting for a trigger mux */ +typedef enum +{ + /* The trigger is a simple level output */ + TRIGGER_TYPE_LEVEL = 0u, + /* The trigger is synchronized to the consumer blocks clock + and a two cycle pulse is generated on this clock */ + TRIGGER_TYPE_EDGE = 1u +} en_trig_type_t; + +/* Trigger Type Defines */ +/* TCPWM Trigger Types */ +#define TRIGGER_TYPE_TCPWM_LINE TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_TCPWM_LINE_COMPL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_TCPWM_TR_IN__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_TCPWM_TR_IN__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_TCPWM_TR_OVERFLOW TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_TCPWM_TR_COMPARE_MATCH TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_TCPWM_TR_UNDERFLOW TRIGGER_TYPE_EDGE +/* CSD Trigger Types */ +#define TRIGGER_TYPE_CSD_DSI_SAMPLE_OUT TRIGGER_TYPE_EDGE +/* SCB Trigger Types */ +#define TRIGGER_TYPE_SCB_TR_TX_REQ TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_SCB_TR_RX_REQ TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_SCB_TR_I2C_SCL_FILTERED TRIGGER_TYPE_LEVEL +/* PERI Trigger Types */ +#define TRIGGER_TYPE_PERI_TR_IO_INPUT__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_PERI_TR_IO_INPUT__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_PERI_TR_IO_OUTPUT__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_PERI_TR_IO_OUTPUT__EDGE TRIGGER_TYPE_EDGE +/* CPUSS Trigger Types */ +#define TRIGGER_TYPE_CPUSS_DW0_TR_IN__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_CPUSS_DW0_TR_IN__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_DW1_TR_IN__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_CPUSS_DW1_TR_IN__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_CTI_TR_IN TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_DW0_TR_OUT TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_DW1_TR_OUT TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_CTI_TR_OUT TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_CPUSS_TR_FAULT TRIGGER_TYPE_EDGE +/* AUDIOSS Trigger Types */ +#define TRIGGER_TYPE_AUDIOSS_TR_PDM_RX_REQ TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_AUDIOSS_TR_I2S_TX_REQ TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_AUDIOSS_TR_I2S_RX_REQ TRIGGER_TYPE_LEVEL +/* LPCOMP Trigger Types */ +#define TRIGGER_TYPE_LPCOMP_DSI_COMP0 TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_LPCOMP_DSI_COMP1 TRIGGER_TYPE_LEVEL +/* PASS Trigger Types */ +#define TRIGGER_TYPE_PASS_DSI_CTB_CMP0__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_PASS_DSI_CTB_CMP0__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_PASS_DSI_CTB_CMP1__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_PASS_DSI_CTB_CMP1__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_PASS_TR_SAR_IN__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_PASS_TR_SAR_IN__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_PASS_TR_SAR_OUT TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_PASS_TR_CTDAC_EMPTY TRIGGER_TYPE_EDGE +/* SMIF Trigger Types */ +#define TRIGGER_TYPE_SMIF_TR_TX_REQ TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_SMIF_TR_RX_REQ TRIGGER_TYPE_LEVEL +/* USB Trigger Types */ +#define TRIGGER_TYPE_USB_DMA_BURSTEND TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_USB_DMA_REQ TRIGGER_TYPE_EDGE +/* UDB Trigger Types */ +#define TRIGGER_TYPE_UDB_TR_IN__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_UDB_TR_IN__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_UDB_TR_DW_ACK__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_UDB_TR_DW_ACK__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_UDB_TR_UDB__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_UDB_TR_UDB__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_UDB_DSI_OUT_TR__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_UDB_DSI_OUT_TR__EDGE TRIGGER_TYPE_EDGE +/* PROFILE Trigger Types */ +#define TRIGGER_TYPE_PROFILE_TR_START TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_PROFILE_TR_STOP TRIGGER_TYPE_EDGE +/* TR_GROUP Trigger Types */ +#define TRIGGER_TYPE_TR_GROUP_OUTPUT__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_TR_GROUP_OUTPUT__EDGE TRIGGER_TYPE_EDGE +#define TRIGGER_TYPE_TR_GROUP_INPUT__LEVEL TRIGGER_TYPE_LEVEL +#define TRIGGER_TYPE_TR_GROUP_INPUT__EDGE TRIGGER_TYPE_EDGE + +/* Monitor Signal Defines */ +typedef enum +{ + PROFILE_ONE = 0, /* profile.one */ + CPUSS_MONITOR_CM0 = 1, /* cpuss.monitor_cm0 */ + CPUSS_MONITOR_CM4 = 2, /* cpuss.monitor_cm4 */ + CPUSS_MONITOR_FLASH = 3, /* cpuss.monitor_flash */ + CPUSS_MONITOR_DW0_AHB = 4, /* cpuss.monitor_dw0_ahb */ + CPUSS_MONITOR_DW1_AHB = 5, /* cpuss.monitor_dw1_ahb */ + CPUSS_MONITOR_CRYPTO = 6, /* cpuss.monitor_crypto */ + USB_MONITOR_AHB = 7, /* usb.monitor_ahb */ + SCB0_MONITOR_AHB = 8, /* scb[0].monitor_ahb */ + SCB1_MONITOR_AHB = 9, /* scb[1].monitor_ahb */ + SCB2_MONITOR_AHB = 10, /* scb[2].monitor_ahb */ + SCB3_MONITOR_AHB = 11, /* scb[3].monitor_ahb */ + SCB4_MONITOR_AHB = 12, /* scb[4].monitor_ahb */ + SCB5_MONITOR_AHB = 13, /* scb[5].monitor_ahb */ + SCB6_MONITOR_AHB = 14, /* scb[6].monitor_ahb */ + SCB7_MONITOR_AHB = 15, /* scb[7].monitor_ahb */ + SCB8_MONITOR_AHB = 16, /* scb[8].monitor_ahb */ + UDB_MONITOR_UDB0 = 17, /* udb.monitor_udb[0] */ + UDB_MONITOR_UDB1 = 18, /* udb.monitor_udb[1] */ + UDB_MONITOR_UDB2 = 19, /* udb.monitor_udb[2] */ + UDB_MONITOR_UDB3 = 20, /* udb.monitor_udb[3] */ + SMIF_MONITOR_SMIF_SPI_SELECT0 = 21, /* smif.monitor_smif_spi_select[0] */ + SMIF_MONITOR_SMIF_SPI_SELECT1 = 22, /* smif.monitor_smif_spi_select[1] */ + SMIF_MONITOR_SMIF_SPI_SELECT2 = 23, /* smif.monitor_smif_spi_select[2] */ + SMIF_MONITOR_SMIF_SPI_SELECT3 = 24, /* smif.monitor_smif_spi_select[3] */ + SMIF_MONITOR_SMIF_SPI_SELECT_ANY = 25, /* smif.monitor_smif_spi_select_any */ + BLESS_EXT_LNA_RX_CTL_OUT = 26, /* bless.ext_lna_rx_ctl_out */ + BLESS_EXT_PA_TX_CTL_OUT = 27 /* bless.ext_pa_tx_ctl_out */ +} en_ep_mon_sel_t; + +/* Total count of Energy Profiler monitor signal connections */ +#define EP_MONITOR_COUNT 28u + +/* Bus masters */ +typedef enum +{ + CPUSS_MS_ID_CM0 = 0, + CPUSS_MS_ID_CRYPTO = 1, + CPUSS_MS_ID_DW0 = 2, + CPUSS_MS_ID_DW1 = 3, + CPUSS_MS_ID_CM4 = 14, + CPUSS_MS_ID_TC = 15 +} en_prot_master_t; + +/* Parameter Defines */ +/* Number of regulator modules instantiated within SRSS */ +#define SRSS_NUM_ACTREG_PWRMOD 2u +/* Number of shorting switches between vccd and vccact */ +#define SRSS_NUM_ACTIVE_SWITCH 3u +/* ULP linear regulator system is present */ +#define SRSS_ULPLINREG_PRESENT 1u +/* HT linear regulator system is present */ +#define SRSS_HTLINREG_PRESENT 0u +/* SIMO buck core regulator is present. Only compatible with ULP linear regulator + system (ULPLINREG_PRESENT==1). */ +#define SRSS_SIMOBUCK_PRESENT 1u +/* Precision ILO (PILO) is present */ +#define SRSS_PILO_PRESENT 1u +/* External Crystal Oscillator is present (high frequency) */ +#define SRSS_ECO_PRESENT 1u +/* System Buck-Boost is present */ +#define SRSS_SYSBB_PRESENT 0u +/* Number of clock paths. Must be > 0 */ +#define SRSS_NUM_CLKPATH 5u +/* Number of PLLs present. Must be <= NUM_CLKPATH */ +#define SRSS_NUM_PLL 1u +/* Number of HFCLK roots present. Must be > 0 */ +#define SRSS_NUM_HFROOT 5u +/* Number of PWR_HIB_DATA registers */ +#define SRSS_NUM_HIBDATA 1u +/* Backup domain is present */ +#define SRSS_BACKUP_PRESENT 1u +/* Mask of HFCLK root clock supervisors (CSV). For each clock root i, bit[i] of + mask indicates presence of a CSV. */ +#define SRSS_MASK_HFCSV 0u +/* Clock supervisor is present on WCO. Must be 0 if BACKUP_PRESENT==0. */ +#define SRSS_WCOCSV_PRESENT 0u +/* Number of software watchdog timers. */ +#define SRSS_NUM_MCWDT 2u +/* Number of DSI inputs into clock muxes. This is used for logic optimization. */ +#define SRSS_NUM_DSI 2u +/* Alternate high-frequency clock is present. This is used for logic optimization. */ +#define SRSS_ALTHF_PRESENT 1u +/* Alternate low-frequency clock is present. This is used for logic optimization. */ +#define SRSS_ALTLF_PRESENT 0u +/* Use the hardened clkactfllmux block */ +#define SRSS_USE_HARD_CLKACTFLLMUX 1u +/* Number of clock paths, including direct paths in hardened clkactfllmux block + (Must be >= NUM_CLKPATH) */ +#define SRSS_HARD_CLKPATH 6u +/* Number of clock paths with muxes in hardened clkactfllmux block (Must be >= + NUM_PLL+1) */ +#define SRSS_HARD_CLKPATHMUX 6u +/* Number of HFCLKS present in hardened clkactfllmux block (Must be >= NUM_HFROOT) */ +#define SRSS_HARD_HFROOT 6u +/* ECO mux is present in hardened clkactfllmux block (Must be >= ECO_PRESENT) */ +#define SRSS_HARD_ECOMUX_PRESENT 1u +/* ALTHF mux is present in hardened clkactfllmux block (Must be >= ALTHF_PRESENT) */ +#define SRSS_HARD_ALTHFMUX_PRESENT 1u +/* Width of MCWDT Subcounters 0 and 1. Applies to all MCWDT. */ +#define SRSS_MCWDT_CTR_WIDTH 32u +/* Backup memory is present (only used when BACKUP_PRESENT==1) */ +#define SRSS_BACKUP_BMEM_PRESENT 0u +/* Number of Backup registers to include (each is 32b). Only used when + BACKUP_PRESENT==1. */ +#define SRSS_BACKUP_NUM_BREG 16u +/* Number of AMUX splitter cells */ +#define IOSS_HSIOM_AMUX_SPLIT_NR 9u +/* Number of HSIOM ports in device (same as GPIO.GPIO_PRT_NR) */ +#define IOSS_HSIOM_HSIOM_PORT_NR 15u +/* Number of PWR/GND MONITOR CELLs in the device */ +#define IOSS_HSIOM_MONITOR_NR 0u +/* Number of PWR/GND MONITOR CELLs in range 0..31 */ +#define IOSS_HSIOM_MONITOR_NR_0_31 0u +/* Number of PWR/GND MONITOR CELLs in range 32..63 */ +#define IOSS_HSIOM_MONITOR_NR_32_63 0u +/* Number of PWR/GND MONITOR CELLs in range 64..95 */ +#define IOSS_HSIOM_MONITOR_NR_64_95 0u +/* Number of PWR/GND MONITOR CELLs in range 96..127 */ +#define IOSS_HSIOM_MONITOR_NR_96_127 0u +/* Indicates the presence of alternate JTAG interface */ +#define IOSS_HSIOM_ALTJTAG_PRESENT 0u +/* Number of GPIO ports in range 0..31 */ +#define IOSS_GPIO_GPIO_PORT_NR_0_31 15u +/* Number of GPIO ports in range 32..63 */ +#define IOSS_GPIO_GPIO_PORT_NR_32_63 0u +/* Number of GPIO ports in range 64..95 */ +#define IOSS_GPIO_GPIO_PORT_NR_64_95 0u +/* Number of GPIO ports in range 96..127 */ +#define IOSS_GPIO_GPIO_PORT_NR_96_127 0u +/* Number of ports in device */ +#define IOSS_GPIO_GPIO_PORT_NR 15u +/* Mask of SMARTIO instances presence */ +#define IOSS_SMARTIO_SMARTIO_MASK 768u +/* The number of protection contexts ([2, 16]). */ +#define PERI_PC_NR 8u +/* Master interface presence mask (4 bits) */ +#define PERI_MS_PRESENT 15u +/* Master interface PPU combinatorial (1) or registerd (0) */ +#define PERI_MS_PPU_COMBINATORIAL 1u +/* The number of programmable PPU structures for PERI (all peripherals) */ +#define PERI_MS_PPU_PROG_STRUCT_NR 16u +/* Number of programmable clocks (outputs) */ +#define PERI_CLOCK_NR 59u +/* Number of 8.0 dividers */ +#define PERI_DIV_8_NR 8u +/* Number of 16.0 dividers */ +#define PERI_DIV_16_NR 16u +/* Number of 16.5 (fractional) dividers */ +#define PERI_DIV_16_5_NR 4u +/* Number of 24.5 (fractional) dividers */ +#define PERI_DIV_24_5_NR 1u +/* Divider number width: max(1,roundup(log2(max(DIV_*_NR))) */ +#define PERI_DIV_ADDR_WIDTH 4u +/* Trigger module present (0=No, 1=Yes) */ +#define PERI_TR 1u +/* Number of trigger groups */ +#define PERI_TR_GROUP_NR 15u +/* The number of protection contexts minus 1 ([1, 15]). */ +#define PERI_PPU_FIXED_STRUCT_PC_NR_MINUS1 7u +/* The number of protection contexts minus 1 ([1, 15]). */ +#define PERI_PPU_PROG_STRUCT_PC_NR_MINUS1 7u +/* UDB present or not ('0': no, '1': yes) */ +#define CPUSS_UDB_PRESENT 1u +/* System RAM 0 size in kilobytes */ +#define CPUSS_SRAM0_SIZE 288u +/* Number of macros used to implement System RAM 0. Example: 8 if 256 KB System + SRAM0 is implemented with 8 32KB macros. */ +#define CPUSS_RAMC0_MACRO_NR 9u +/* System RAM 1 present or not (0=No, 1=Yes) */ +#define CPUSS_RAMC1_PRESENT 0u +/* System RAM 1 size in kilobytes */ +#define CPUSS_SRAM1_SIZE 32u +/* Number of macros used to implement System RAM 1. Example: 8 if 256 KB System + RAM 1 is implemented with 8 32KB macros. */ +#define CPUSS_RAMC1_MACRO_NR 1u +/* System RAM 2 present or not (0=No, 1=Yes) */ +#define CPUSS_RAMC2_PRESENT 0u +/* System RAM 2 size in kilobytes */ +#define CPUSS_SRAM2_SIZE 256u +/* Number of macros used to implement System RAM 2. Example: 8 if 256 KB System + RAM 2 is implemented with 8 32KB macros. */ +#define CPUSS_RAMC2_MACRO_NR 16u +/* System ROM size in KB */ +#define CPUSS_ROM_SIZE 128u +/* Flash main region size in KB */ +#define CPUSS_FLASH_SIZE 1024u +/* Flash work region size in KB (EEPROM emulation, data) */ +#define CPUSS_WFLASH_SIZE 32u +/* Flash supervisory region size in KB */ +#define CPUSS_SFLASH_SIZE 32u +/* Flash data output size (in Bytes) */ +#define CPUSS_FLASHC_WORD_SIZE 16u +/* Flash row address width */ +#define CPUSS_FLASHC_ROW_ADDR_WIDTH 12u +/* Flash column address width */ +#define CPUSS_FLASHC_COL_ADDR_WIDTH 5u +/* Number of external slaves directly connected to slow AHB-Lite infrastructure. + Maximum nubmer of slave supported is 4. Width of this parameter is 4-bits. + 1-bit mask for each slave indicating present or not. Example: 4'b0011 - slave + 0 and slave 1 are present. Note: The SLOW_SLx_ADDR and SLOW_SLx_MASK + parameters (for the slaves present) should be derived from the Memory Map. */ +#define CPUSS_SLOW_SL_PRESENT 1u +/* Number of external slaves directly connected to fast AHB-Lite infrastructure. + Maximum nubmer of slave supported is 4. Width of this parameter is 4-bits. + 1-bit mask for each slave indicating present or not. Example: 4'b0011 - slave + 0 and slave 1 are present. Note: The FAST_SLx_ADDR and FAST_SLx_MASK + parameters (for the slaves present) should be derived from the Memory Map. */ +#define CPUSS_FAST_SL_PRESENT 1u +/* Number of external masters driving the slow AHB-Lite infrastructure. Maximum + number of masters supported is 2. Width of this parameter is 2-bits. 1-bit + mask for each master indicating present or not. Example: 2'b01 - master 0 is + present. */ +#define CPUSS_SLOW_MS_PRESENT 0u +/* Number of total interrupt request inputs to CPUSS */ +#define CPUSS_IRQ_NR 147u +/* Number of DeepSleep wakeup interrupt inputs to CPUSS */ +#define CPUSS_DPSLP_IRQ_NR 41u +/* Number of DeepSleep wakeup interrupt inputs to CM0+ (product configuration) */ +#define CPUSS_CM0_DPSLP_IRQ_NR 8u +/* Width of the CM4 interrupt priority bits. Legal range [3,8] Example: 3 = 8 + levels of priority 8 = 256 levels of priority */ +#define CPUSS_CM4_LVL_WIDTH 3u +/* CM4 Floating point unit present or not (0=No, 1=Yes) */ +#define CPUSS_CM4_FPU_PRESENT 1u +/* Debug level. Legal range [0,3] */ +#define CPUSS_DEBUG_LVL 3u +/* Trace level. Legal range [0,2] Note: CM4 HTM is not supported. Hence vaule 3 + for trace level is not supported in CPUSS. */ +#define CPUSS_TRACE_LVL 2u +/* Embedded Trace Buffer present or not (0=No, 1=Yes) */ +#define CPUSS_ETB_PRESENT 0u +/* CM0+ MTB SRAM buffer size in kilobytes. Legal vaules 4, 8 or 16 */ +#define CPUSS_MTB_SRAM_SIZE 4u +/* CM4 ETB SRAM buffer size in kilobytes. Legal vaules 4, 8 or 16 */ +#define CPUSS_ETB_SRAM_SIZE 16u +/* PTM interface present (0=No, 1=Yes) */ +#define CPUSS_PTM_PRESENT 1u +/* Width of the PTM interface in bits ([2,32]) */ +#define CPUSS_PTM_WIDTH 8u +/* Width of the TPIU interface in bits ([1,32]) */ +#define CPUSS_TPIU_WIDTH 4u +/* CoreSight Part Identification Number */ +#define CPUSS_JEPID 52u +/* CoreSight Part Identification Number */ +#define CPUSS_JEPCONTINUATION 0u +/* CoreSight Part Identification Number */ +#define CPUSS_FAMILYID 256u +/* Cryptography IP present or not (0=No, 1=Yes) */ +#define CPUSS_CRYPTO_PRESENT 1u +/* DataWire 0 present or not (0=No, 1=Yes) */ +#define CPUSS_DW0_PRESENT 1u +/* Number of DataWire 0 channels (8, 16 or 32) */ +#define CPUSS_DW0_CH_NR 16u +/* DataWire 1 present or not (0=No, 1=Yes) */ +#define CPUSS_DW1_PRESENT 1u +/* Number of DataWire 1 channels (8, 16 or 32) */ +#define CPUSS_DW1_CH_NR 16u +/* Number of Flash BIST_DATA registers */ +#define CPUSS_FLASHC_FLASHC_BIST_DATA_NR 4u +/* Page size in # of 32-bit words (1: 4 bytes, 2: 8 bytes, ... */ +#define CPUSS_FLASHC_PA_SIZE 128u +/* AES cipher support (0 = no support, 1 = support */ +#define CPUSS_CRYPTO_AES 1u +/* (Tripple) DES cipher support (0 = no support, 1 = support */ +#define CPUSS_CRYPTO_DES 1u +/* Pseudo random number generation support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_PR 1u +/* SHA support included */ +#define CPUSS_CRYPTO_SHA 1u +/* SHA1 hash support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_SHA1 1u +/* SHA256 hash support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_SHA256 1u +/* SHA512 hash support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_SHA512 1u +/* Cyclic Redundancy Check support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_CRC 1u +/* Vector unit support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_VU 1u +/* True random number generation support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_TR 1u +/* String support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_STR 1u +/* AHB-Lite master interface support (0 = no support, 1 = support) */ +#define CPUSS_CRYPTO_MASTER_IF 1u +/* Number of 32-bit words in the IP internal memory buffer (from the set [64, 128, + 256, 512, 1024, 2048, 4096], to allow for a 256 B, 512 B, 1 kB, 2 kB, 4 kB, 8 + kB and 16 kB memory buffer) */ +#define CPUSS_CRYPTO_BUFF_SIZE 1024u +/* Number of fault structures. Legal range [1, 4] */ +#define CPUSS_FAULT_FAULT_NR 2u +/* Number of IPC structures. Legal range [1, 16] */ +#define CPUSS_IPC_IPC_NR 16u +/* Number of IPC interrupt structures. Legal range [1, 16] */ +#define CPUSS_IPC_IPC_IRQ_NR 16u +/* Master 0 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS0_PC_NR_MINUS1 7u +/* Master 1 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS1_PC_NR_MINUS1 7u +/* Master 2 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS2_PC_NR_MINUS1 0u +/* Master 3 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS3_PC_NR_MINUS1 0u +/* Master 4 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS4_PC_NR_MINUS1 0u +/* Master 5 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS5_PC_NR_MINUS1 0u +/* Master 6 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS6_PC_NR_MINUS1 0u +/* Master 7 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS7_PC_NR_MINUS1 0u +/* Master 8 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS8_PC_NR_MINUS1 0u +/* Master 9 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS9_PC_NR_MINUS1 0u +/* Master 10 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS10_PC_NR_MINUS1 0u +/* Master 11 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS11_PC_NR_MINUS1 0u +/* Master 12 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS12_PC_NR_MINUS1 0u +/* Master 13 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS13_PC_NR_MINUS1 0u +/* Master 14 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS14_PC_NR_MINUS1 7u +/* Master 15 protect contexts minus one */ +#define CPUSS_PROT_SMPU_MS15_PC_NR_MINUS1 7u +/* Number of SMPU protection structures */ +#define CPUSS_PROT_SMPU_STRUCT_NR 16u +/* Number of protection contexts supported minus 1. Legal range [1,16] */ +#define CPUSS_SMPU_STRUCT_PC_NR_MINUS1 7u +/* Number of DataWire controllers present (max 2) */ +#define CPUSS_DW_NR 2u +/* Number of channels in each DataWire controller (must be the same for now) */ +#define CPUSS_DW_CH_NR 16u +/* Number of profiling counters. Legal range [1, 32] */ +#define PROFILE_PRFL_CNT_NR 8u +/* Number of monitor event signals. Legal range [1, 128] */ +#define PROFILE_PRFL_MONITOR_NR 128u +/* Number of instantiated eFUSE macros (256 bit macros). Legal range [1, 16] */ +#define EFUSE_EFUSE_NR 4u +/* SONOS Flash is used or not ('0': no, '1': yes) */ +#define SFLASH_FLASHC_IS_SONOS 1u +/* Number of UDB Interrupts */ +#define UDB_NUMINT 16u +/* Number of triggers */ +#define UDB_NUMTR 16u +/* Number of UDB array rows (must be multiple of 2) */ +#define UDB_NUMROW 2u +/* Number of UDB array columns */ +#define UDB_NUMCOL 6u +/* DSI on bottom (1) or on bottom and top (2) of UDB array */ +#define UDB_DSISIDES 2u +/* Number of UDBs = NUMROW * NUMCOL */ +#define UDB_NUMUDB 12u +/* Number of UDB pairs = NUMUDB / 2 */ +#define UDB_NUMUDBPAIR 6u +/* Number of DSIs = NUMCOL * DSISIDES */ +#define UDB_NUMDSI 12u +/* Number of quad clocks */ +#define UDB_NUMQCLK 3u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB0_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB0_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB0_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB0_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB0_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB0_I2C_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB0_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB0_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB0_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB0_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB0_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB0_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB0_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB0_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB0_UART 1u +/* SPI or UART (SPI | UART) */ +#define SCB0_SPI_UART 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB0_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB0_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB0_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB0_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB0_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB0_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB0_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB1_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB1_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB1_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB1_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB1_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB1_I2C_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB1_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB1_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB1_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB1_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB1_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB1_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB1_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB1_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB1_UART 1u +/* SPI or UART (SPI | UART) */ +#define SCB1_SPI_UART 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB1_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB1_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB1_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB1_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB1_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB1_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB1_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB2_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB2_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB2_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB2_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB2_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB2_I2C_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB2_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB2_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB2_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB2_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB2_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB2_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB2_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB2_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB2_UART 1u +/* SPI or UART (SPI | UART) */ +#define SCB2_SPI_UART 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB2_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB2_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB2_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB2_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB2_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB2_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB2_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB3_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB3_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB3_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB3_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB3_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB3_I2C_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB3_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB3_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB3_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB3_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB3_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB3_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB3_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB3_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB3_UART 1u +/* SPI or UART (SPI | UART) */ +#define SCB3_SPI_UART 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB3_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB3_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB3_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB3_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB3_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB3_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB3_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB4_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB4_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB4_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB4_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB4_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB4_I2C_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB4_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB4_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB4_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB4_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB4_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB4_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB4_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB4_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB4_UART 1u +/* SPI or UART (SPI | UART) */ +#define SCB4_SPI_UART 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB4_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB4_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB4_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB4_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB4_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB4_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB4_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB5_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB5_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB5_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB5_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB5_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB5_I2C_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB5_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB5_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB5_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB5_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB5_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB5_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB5_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB5_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB5_UART 1u +/* SPI or UART (SPI | UART) */ +#define SCB5_SPI_UART 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB5_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB5_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB5_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB5_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB5_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB5_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB5_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB6_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB6_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB6_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB6_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB6_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB6_I2C_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB6_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB6_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB6_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB6_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB6_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB6_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB6_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB6_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB6_UART 1u +/* SPI or UART (SPI | UART) */ +#define SCB6_SPI_UART 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB6_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB6_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB6_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB6_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB6_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB6_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB6_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB7_DEEPSLEEP 0u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB7_EC 0u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB7_I2C_M 1u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB7_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB7_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB7_I2C_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB7_I2C_EC 0u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB7_I2C_M_S 1u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB7_I2C_S_EC 0u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB7_SPI_M 1u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB7_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB7_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB7_SPI_EC 0u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB7_SPI_S_EC 0u +/* UART support? ('0': no, '1': yes) */ +#define SCB7_UART 1u +/* SPI or UART (SPI | UART) */ +#define SCB7_SPI_UART 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB7_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB7_CMD_RESP 0u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB7_EZ 0u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB7_EZ_CMD_RESP 0u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB7_I2C_S_EZ 0u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB7_SPI_S_EZ 0u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB7_I2C_FAST_PLUS 1u +/* DeepSleep support ('0':no, '1': yes) */ +#define SCB8_DEEPSLEEP 1u +/* Externally clocked support? ('0': no, '1': yes) */ +#define SCB8_EC 1u +/* I2C master support? ('0': no, '1': yes) */ +#define SCB8_I2C_M 0u +/* I2C slave support? ('0': no, '1': yes) */ +#define SCB8_I2C_S 1u +/* I2C support? (I2C_M | I2C_S) */ +#define SCB8_I2C 1u +/* I2C glitch filters present? ('0': no, '1': yes) */ +#define SCB8_I2C_GLITCH 1u +/* I2C externally clocked support? ('0': no, '1': yes) */ +#define SCB8_I2C_EC 1u +/* I2C master and slave support? (I2C_M & I2C_S) */ +#define SCB8_I2C_M_S 0u +/* I2C slave with EC? (I2C_S & I2C_EC) */ +#define SCB8_I2C_S_EC 1u +/* SPI master support? ('0': no, '1': yes) */ +#define SCB8_SPI_M 0u +/* SPI slave support? ('0': no, '1': yes) */ +#define SCB8_SPI_S 1u +/* SPI support? (SPI_M | SPI_S) */ +#define SCB8_SPI 1u +/* SPI externally clocked support? ('0': no, '1': yes) */ +#define SCB8_SPI_EC 1u +/* SPI slave with EC? (SPI_S & SPI_EC) */ +#define SCB8_SPI_S_EC 1u +/* UART support? ('0': no, '1': yes) */ +#define SCB8_UART 0u +/* SPI or UART (SPI | UART) */ +#define SCB8_SPI_UART 1u +/* Number of EZ memory Bytes ([32, 256, 512]). This memory is used in EZ mode, + CMD_RESP mode and FIFO mode. Note that in EZ mode, if EZ_DATA_NR is 512, only + 256 B are used. This is because the EZ mode uses 8-bit addresses. */ +#define SCB8_EZ_DATA_NR 256u +/* Command/response mode support? ('0': no, '1': yes) */ +#define SCB8_CMD_RESP 1u +/* EZ mode support? ('0': no, '1': yes) */ +#define SCB8_EZ 1u +/* Command/response mode or EZ mode support? (CMD_RESP | EZ) */ +#define SCB8_EZ_CMD_RESP 1u +/* I2C slave with EZ mode (I2C_S & EZ) */ +#define SCB8_I2C_S_EZ 1u +/* SPI slave with EZ mode (SPI_S & EZ) */ +#define SCB8_SPI_S_EZ 1u +/* Support I2C FM+/1Mbps speed ('0': no, '1': yes) */ +#define SCB8_I2C_FAST_PLUS 1u +/* Number of counters per IP (1..8) */ +#define TCPWM0_CNT_NR 8u +/* Counter width (in number of bits) */ +#define TCPWM0_CNT_CNT_WIDTH 32u +/* Number of counters per IP (1..8) */ +#define TCPWM1_CNT_NR 24u +/* Counter width (in number of bits) */ +#define TCPWM1_CNT_CNT_WIDTH 16u +/* Max number of LCD commons supported */ +#define LCD_COM_NR 8u +/* Max number of LCD pins (total) supported */ +#define LCD_PIN_NR 62u +/* Number of ports supoprting up to 4 COMs */ +#define LCD_NUMPORTS 8u +/* Number of ports supporting up to 8 COMs */ +#define LCD_NUMPORTS8 8u +/* Number of ports supporting up to 16 COMs */ +#define LCD_NUMPORTS16 0u +/* Number of IREF outputs from AREF */ +#define PASS_NR_IREFS 4u +/* Number of CTBs in the Subsystem */ +#define PASS_NR_CTBS 1u +/* Number of CTDACs in the Subsystem */ +#define PASS_NR_CTDACS 1u +/* CTB0 Exists */ +#define PASS_CTB0_EXISTS 1u +/* CTB1 Exists */ +#define PASS_CTB1_EXISTS 0u +/* CTB2 Exists */ +#define PASS_CTB2_EXISTS 0u +/* CTB3 Exists */ +#define PASS_CTB3_EXISTS 0u +/* CTDAC0 Exists */ +#define PASS_CTDAC0_EXISTS 1u +/* CTDAC1 Exists */ +#define PASS_CTDAC1_EXISTS 0u +/* CTDAC2 Exists */ +#define PASS_CTDAC2_EXISTS 0u +/* CTDAC3 Exists */ +#define PASS_CTDAC3_EXISTS 0u +/* Number of SAR channels */ +#define PASS_SAR_SAR_CHANNELS 16u +/* Averaging logic present in SAR */ +#define PASS_SAR_SAR_AVERAGE 1u +/* Range detect logic present in SAR */ +#define PASS_SAR_SAR_RANGEDET 1u +/* Support for UAB sampling */ +#define PASS_SAR_SAR_UAB 0u +#define PASS_CTBM_CTDAC_PRESENT 1u +/* Number of AHB-Lite "hmaster[]" bits ([1, 8]) */ +#define SMIF_MASTER_WIDTH 8u +/* Base address of the SMIF XIP memory region. This address must be a multiple of + the SMIF XIP memory capacity. This address must be a multiple of 64 KB. This + address must be in the [0x0000:0000, 0x1fff:ffff] memory region. The XIP + memory region should NOT overlap with other memory regions. */ +#define SMIF_SMIF_XIP_ADDR 402653184u +/* Capacity of the SMIF XIP memory region. The more significant bits of this + parameter must be '1' and the lesser significant bits of this paramter must + be '0'. E.g., 0xfff0:0000 specifies a 1 MB memory region. Legal values are + {0xffff:0000, 0xfffe:0000, 0xfffc:0000, 0xfff8:0000, 0xfff0:0000, + 0xffe0:0000, ..., 0xe000:0000}. */ +#define SMIF_SMIF_XIP_MASK 4160749568u +/* Cryptography (AES) support ('0' = no support, '1' = support) */ +#define SMIF_CRYPTO 1u +/* Number of external devices supported ([1,4]) */ +#define SMIF_DEVICE_NR 4u +/* External device write support. This is a 4-bit field. Each external device has + a dedicated bit. E.g., if bit 2 is '1', external device 2 has write support. */ +#define SMIF_DEVICE_WR_EN 15u +/* Set to 1 if IP will instantiate spares (0=None, 1=Max, 2=Min) */ +#define SMIF_SPARE_EN 1u +/* I2S capable? (0=No,1=Yes) */ +#define AUDIOSS_I2S 1u +/* PDM capable? (0=No,1=Yes) */ +#define AUDIOSS_PDM 1u + +#endif /* _PSOC63_CONFIG_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/psoc6ble_config.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/psoc6ble_config.h similarity index 100% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/TARGET_PSoC6_CY8C_CM0p/device/psoc6ble_config.h rename to targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/psoc6ble_config.h diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/system_psoc63.h b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/system_psoc63.h new file mode 100644 index 0000000000..b4d44c1618 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/device/system_psoc63.h @@ -0,0 +1,494 @@ +/***************************************************************************//** +* \file system_psoc63.h +* \version 2.0 +* +* \brief Device system header file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#ifndef _SYSTEM_PSOC63_H_ +#define _SYSTEM_PSOC63_H_ + +/** +* \defgroup group_system_config System Configuration Files (Startup) +* \{ +* Provides device startup, system configuration, and linker script files. +* The system startup provides the followings features: +* - See \ref group_system_config_device_initialization for the: +* * \ref group_system_config_dual_core_device_initialization +* * \ref group_system_config_single_core_device_initialization +* - See \ref group_system_config_device_memory_definition for the: +* * \ref group_system_config_device_memory_dual_core_definition +* * \ref group_system_config_device_memory_single_core_definition +* - \ref group_system_config_heap_stack_config +* - \ref group_system_config_merge_apps +* - Default interrupt handlers definition +* - \ref group_system_config_device_vector_table +* - \ref group_system_config_cm4_functions +* +* \section group_system_config_configuration Configuration Considerations +* +* \subsection group_system_config_device_memory_definition Device Memory Definition +* The physical flash and RAM memory is shared between the CPU cores. The flash +* and RAM allocation for each +* CPU is defined by the linker scripts. +* +* \subsubsection group_system_config_device_memory_dual_core_definition Dual-Core Devices +* By default, the flash and RAM memory is equally divided between two cores. +* This proportion can be changed by editing +* the linker configuration files. +* +* ARM GCC\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.ld', where 'xx' is the device group, and 'yy' is the target CPU; for +* example, 'cy8c6x7_cm0plus.ld' and 'cy8c6x7_cm4_dual.ld'. +* Note: if the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the +* Cy_SysEnableCM4() function call. +* +* The flash and RAM sizes can be changed by editing the LENGTH value in the +* linker files for both CPUs: +* - 'xx_cm0plus.ld', where 'xx' is the device group: +* * \code rom (rx) : ORIGIN = 0x10000000, LENGTH = 0x00080000 \endcode +* * \code ram_cm0p (rwx) : ORIGIN = 0x08000000, LENGTH = 0x00024000 \endcode +* - 'xx_cm4_dual.ld', where 'xx' is the device group: +* * \code rom (rx) : ORIGIN = 0x10080000, LENGTH = 0x00080000 \endcode +* * \code ram_cm4 (rwx) : ORIGIN = 0x08024000, LENGTH = 0x00024000 \endcode +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the rom ORIGIN's +* value in the 'xx_cm4_dual.ld' file, where 'xx' is the device group. Do this +* by either: +* - Passing the following commands to the compiler:\n +* * \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where 'xx' is device family:\n +* * \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* ARM MDK\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.scat', where 'xx' is the device group, and 'yy' is the target CPU; for +* example, 'cy8c6x7_cm0plus.scat' and 'cy8c6x7_cm4_dual.scat'. +* Note: if the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref +* Cy_SysEnableCM4() function call. +* +* The flash and RAM sizes can be changed by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.scat', where 'xx' is the device group: +* * \code #define FLASH_START 0x10000000 \endcode +* * \code #define FLASH_SIZE 0x00080000 \endcode +* - 'xx_cm4_dual.scat', where 'xx' is the device group: +* * \code #define FLASH_START 0x10080000 \endcode +* * \code #define FLASH_SIZE 0x00080000 \endcode +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the FLASH_START +* value in the 'xx_cm4_dual.scat' file, +* where 'xx' is the device group. Do this by either: +* - Passing the following commands to the compiler:\n +* * \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where +* 'xx' is device family:\n +* * \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* IAR\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.icf', where 'xx' is the device group, and 'yy' is the target CPU; for +* example, 'cy8c6x7_cm0plus.icf' and 'cy8c6x7_cm4_dual.icf'. +* Note: if the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref +* Cy_SysEnableCM4() function call. +* +* The flash and RAM sizes can be changed by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.icf', where 'xx' is the device group: +* * \code define symbol __ICFEDIT_region_IROM_start__ = 0x10000000; \endcode +* * \code define symbol __ICFEDIT_region_IROM_end__ = 0x10080000; \endcode +* * \code define symbol __ICFEDIT_region_IRAM_CM0P_start__ = 0x08000000; \endcode +* * \code define symbol __ICFEDIT_region_IRAM_CM0P_end__ = 0x08024000; \endcode +* - 'xx_cm4_dual.icf', where 'xx' is the device group: +* * \code define symbol __ICFEDIT_region_IROM_start__ = 0x10080000; \endcode +* * \code define symbol __ICFEDIT_region_IROM_end__ = 0x10100000; \endcode +* * \code define symbol __ICFEDIT_region_IRAM_CM4_start__ = 0x08024000; \endcode +* * \code define symbol __ICFEDIT_region_IRAM_CM4_end__ = 0x08048000; \endcode +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the +* __ICFEDIT_region_IROM_start__ value in the 'xx_cm4_dual.icf' file, where 'xx' +* is the device group. Do this by either: +* - Passing the following commands to the compiler:\n +* * \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where +* 'xx' is device family:\n +* * \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* \subsubsection group_system_config_device_memory_single_core_definition Single-Core Devices +* For single-core devices, 8 KB of flash and RAM are reserved for the pre-build +* Cortex-M0+ application that is loaded for the hidden Cortex-M0+. +* +* \subsection group_system_config_device_initialization Device Initialization +* After a power-on-reset (POR), the boot process is handled by the boot code +* from the on-chip ROM that is always executed by the Cortex-M0+ core. The boot +* code passes the control to the Cortex-M0+ startup code located in flash. +* +* \subsubsection group_system_config_dual_core_device_initialization Dual-Core Devices +* The Cortex-M0+ startup code performs the device initialization by a call to +* SystemInit() and then calls the main() function. The Cortex-M4 core is disabled +* by default. Enable the core using the \ref Cy_SysEnableCM4() function. +* See \ref group_system_config_cm4_functions for more details. +* +* \subsubsection group_system_config_single_core_device_initialization Single-Core Devices +* The Cortex-M0+ core is not user-accessible on these devices. In this case the +* Cortex-M0+ pre-built application image handles setup of the CM0+ core and +* starts the Cortex-M4 core. +* +* CM0+ NVIC IRQn channels 26-31 are reserved for system use. Other IRQn channels +* are available to the user application. The pre-built application configures: +* * IRQn 26-27 for the IPC driver +* * IRQn 28-30 for the Crypto driver +* * IRQn 31 for system communication +* +* The Cortex-M0+ application image performs the following tasks: +* * Enables global interrupts on the Cortex-M0+ core. +* * Starts the crypto server. See [Cryptography (Crypto)](\ref group_crypto) for details. +* * Enables the Cortex-M4 core by calling \ref Cy_SysEnableCM4(). +* * Requests Deep Sleep mode entry with wakeup on interrupt in the infinite loop. +* +* \subsection group_system_config_heap_stack_config Heap and Stack Configuration +* There are two ways to adjust heap and stack configurations: +* -# Editing source code files +* -# Specifying via command line +* +* By default, the stack size is set to 0x00001000 and the heap size is set to 0x00000400. +* +* \subsubsection group_system_config_heap_stack_config_gcc ARM GCC +* - Editing source code files\n +* The heap and stack sizes are defined in the assembler startup files: +* 'startup_xx_yy.S', where 'xx' is the device family, and 'yy' is the target CPU; +* for example, startup_psoc63_cm0plus.s and startup_psoc63_cm4.s. +* Change the heap and stack sizes by modifying the following lines:\n +* * \code .equ Stack_Size, 0x00001000 \endcode +* * \code .equ Heap_Size, 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the compiler:\n +* * \code -D __STACK_SIZE=0x000000400 \endcode +* * \code -D __HEAP_SIZE=0x000000100 \endcode +* +* \subsubsection group_system_config_heap_stack_config_mdk ARM MDK +* - Editing source code files\n +* The heap and stack sizes are defined in the assembler startup files: +* 'startup_xx_yy.s', where 'xx' is the device family, and 'yy' is the target +* CPU; for example, startup_psoc63_cm0plus.s and startup_psoc63_cm4.s. +* Change the heap and stack sizes by modifying the following lines:\n +* * \code Stack_Size EQU 0x00001000 \endcode +* * \code Heap_Size EQU 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the assembler:\n +* * \code "--predefine=___STACK_SIZE SETA 0x000000400" \endcode +* * \code "--predefine=__HEAP_SIZE SETA 0x000000100" \endcode +* +* \subsubsection group_system_config_heap_stack_config_iar IAR +* - Editing source code files\n +* The heap and stack sizes are defined in the linker scatter files: 'xx_yy.icf', +* where 'xx' is the device family, and 'yy' is the target CPU; for example, +* cy8c6x7_cm0plus.icf and cy8c6x7_cm4_dual.icf. +* Change the heap and stack sizes by modifying the following lines:\n +* * \code Stack_Size EQU 0x00001000 \endcode +* * \code Heap_Size EQU 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the +* linker (including quotation marks):\n +* * \code --define_symbol __STACK_SIZE=0x000000400 \endcode +* * \code --define_symbol __HEAP_SIZE=0x000000100 \endcode +* +* - \subsection group_system_config_merge_apps Merging CM0+ and CM4 Executables +* The CM0+ project and linker script build the CM0+ application image. Similarly, +* the CM4 linker script builds the CM4 application image. Each specifies +* locations, sizes, and contents of sections in memory. See +* \ref group_system_config_device_memory_definition for the symbols and default +* values. +* +* The cypdlelftool is invoked by a post-build command. The precise project +* setting is IDE-specific. +* +* The cypdlelftool combines the two executables. The tool examines the +* executables to ensure that memory regions either do not overlap, or contain +* identical bytes (shared). If there are no problems, it creates a new ELF file +* with the merged image, without changing any of the addresses or data. +* +* \subsection group_system_config_device_vector_table Vectors Table Copy from Flash to RAM +* This process uses memory sections defined in the linker script. The startup +* code actually defines the contents of the vector table and performs the copy. +* \subsubsection group_system_config_device_vector_table_gcc ARM GCC +* The linker script file is 'xx_yy.ld', where 'xx' is the device family, and +* 'yy' is the target CPU; for example, cy8c6x7_cm0plus.ld and cy8c6x7_cm4_dual.ld. +* It defines sections and locations in memory.\n +* Copy interrupt vectors from flash to RAM: \n +* From: \code LONG (__Vectors) \endcode +* To: \code LONG (__ram_vectors_start__) \endcode +* Size: \code LONG (__Vectors_End - __Vectors) \endcode +* The vector table address (and the vector table itself) are defined in the +* assembler startup files: 'startup_xx_yy.S', where 'xx' is the device family, +* and 'yy' is the target CPU; for example, startup_psoc63_cm0plus.S and +* startup_psoc63_cm4.S. The code in these files copies the vector table from +* Flash to RAM. +* \subsubsection group_system_config_device_vector_table_mdk ARM MDK +* The linker script file is 'xx_yy.scat', where 'xx' is the device family, +* and 'yy' is the target CPU; for example, cy8c6x7_cm0plus.scat and +* cy8c6x7_cm4_dual.scat. The linker script specifies that the vector table +* (RESET_RAM) shall be first in the RAM section.\n +* RESET_RAM represents the vector table. It is defined in the assembler startup +* files: 'startup_xx_yy.s', where 'xx' is the device family, and 'yy' is the +* target CPU; for example, startup_psoc63_cm0plus.s and startup_psoc63_cm4.s. +* The code in these files copies the vector table from Flash to RAM. +* +* \subsubsection group_system_config_device_vector_table_iar IAR +* The linker script file is 'xx_yy.icf', where 'xx' is the device family, and +* 'yy' is the target CPU; for example, cy8c6x7_cm0plus.icf and cy8c6x7_cm4_dual.icf. +* This file defines the .intvec_ram section and its location. +* \code place at start of IRAM1_region { readwrite section .intvec_ram}; \endcode +* The vector table address (and the vector table itself) are defined in the +* assembler startup files: 'startup_xx_yy.s', where 'xx' is the device family, +* and 'yy' is the target CPU; for example, startup_psoc63_cm0plus.s and +* startup_psoc63_cm4.s. The code in these files copies the vector table +* from Flash to RAM. +* +* \section group_system_config_more_information More Information +* Refer to the PDL User Guide for the +* more details. +* +* \section group_system_config_MISRA MISRA Compliance +* The drivers violates the following MISRA-C:2004 rules: +* +* +* +* +* +* +* +* +*
    MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
    +* +* +* \section group_system_config_changelog Changelog +* +* +* +* +* +* +* +* +* +* +* +*
    VersionChangesReason for Change
    1.0Initial version
    +* +* +* \defgroup group_system_config_macro Macro +* \{ +* \defgroup group_system_config_system_macro System +* \defgroup group_system_config_cm4_status_macro Cortex-M4 Status +* \defgroup group_system_config_user_settings_macro User Settings +* \} +* \defgroup group_system_config_functions Functions +* \{ +* \defgroup group_system_config_system_functions System +* \defgroup group_system_config_cm4_functions Cortex-M4 Control +* \} +* \defgroup group_system_config_globals Global Variables +* +* \} +*/ + +#ifdef __cplusplus +extern "C" { +#endif + + +/******************************************************************************* +* Include files +*******************************************************************************/ +#include + + +/******************************************************************************* +* Global preprocessor symbols/macros ('define') +*******************************************************************************/ +#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined (__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3))) + #define CY_SYSTEM_CPU_CM0P 1UL +#else + #define CY_SYSTEM_CPU_CM0P 0UL +#endif + +#if defined (CY_PSOC_CREATOR_USED) && (CY_PSOC_CREATOR_USED == 1U) + #include "cyfitter.h" +#endif /* (CY_PSOC_CREATOR_USED) && (CY_PSOC_CREATOR_USED == 1U) */ + + +/******************************************************************************* +* +* START OF USER SETTINGS HERE +* =========================== +* +* All lines with '<<<' can be set by user. +* +*******************************************************************************/ + +/** +* \addtogroup group_system_config_user_settings_macro +* \{ +*/ + + +#if defined (CYDEV_CLK_EXTCLK__HZ) + #define CY_CLK_EXT_FREQ_HZ (CYDEV_CLK_EXTCLK__HZ) +#else + /***************************************************************************//** + * External Clock Frequency (in Hz, [value]UL). If compiled within + * PSoC Creator and the clock is enabled in the DWR, the value from DWR used. + * Otherwise, edit the value below. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_EXT_FREQ_HZ (24000000UL) /* <<< 24 MHz */ +#endif /* (CYDEV_CLK_EXTCLK__HZ) */ + + +#if defined (CYDEV_CLK_ECO__HZ) + #define CY_CLK_ECO_FREQ_HZ (CYDEV_CLK_ECO__HZ) +#else + /***************************************************************************//** + * \brief External crystal oscillator frequency (in Hz, [value]UL). If compiled + * within PSoC Creator and the clock is enabled in the DWR, the value from DWR + * used. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_ECO_FREQ_HZ (24000000UL) /* <<< 24 MHz */ +#endif /* (CYDEV_CLK_ECO__HZ) */ + + +#if defined (CYDEV_CLK_ALTHF__HZ) + #define CY_CLK_ALTHF_FREQ_HZ (CYDEV_CLK_ALTHF__HZ) +#else + /***************************************************************************//** + * \brief Alternate high frequency (in Hz, [value]UL). If compiled within + * PSoC Creator and the clock is enabled in the DWR, the value from DWR used. + * Otherwise, edit the value below. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_ALTHF_FREQ_HZ (32000000UL) /* <<< 32 MHz */ +#endif /* (CYDEV_CLK_ALTHF__HZ) */ + + +/***************************************************************************//** +* \brief Start address of the Cortex-M4 application ([address]UL) +* (USER SETTING) +*******************************************************************************/ +#define CY_CORTEX_M4_APPL_ADDR (0x10080000UL) /* <<< 512 KB reserved for the Cortex-M0+ application */ + + +/******************************************************************************* +* +* END OF USER SETTINGS HERE +* ========================= +* +*******************************************************************************/ + +/** \} group_system_config_user_settings_macro */ + + +/** +* \addtogroup group_system_config_system_macro +* \{ +*/ + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) + /** The Cortex-M0+ startup driver identifier */ + #define CY_STARTUP_M0P_ID ((uint32_t)((uint32_t)((0x0Eu) & 0x3FFFu) << 18u)) +#endif + +#if (CY_SYSTEM_CPU_CM0P != 1UL) || defined(CY_DOXYGEN) + /** The Cortex-M4 startup driver identifier */ + #define CY_STARTUP_M4_ID ((uint32_t)((uint32_t)((0x0Fu) & 0x3FFFu) << 18u)) +#endif + +/** \} group_system_config_system_macro */ + + +/** +* \addtogroup group_system_config_system_functions +* \{ +*/ +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); +/** \} group_system_config_system_functions */ + + +/** +* \addtogroup group_system_config_cm4_functions +* \{ +*/ +extern uint32_t Cy_SysGetCM4Status(void); +extern void Cy_SysEnableCM4(uint32_t vectorTableOffset); +extern void Cy_SysDisableCM4(void); +extern void Cy_SysRetainCM4(void); +extern void Cy_SysResetCM4(void); +/** \} group_system_config_cm4_functions */ + + +/** \cond */ +extern void Default_Handler (void); +extern uint32_t Cy_SaveIRQ(void); +extern void Cy_RestoreIRQ(uint32_t saved); + +extern void Cy_SystemInit(void); +extern void Cy_SystemInitFpuEnable(void); + +extern uint32_t cy_delayFreqHz; +extern uint32_t cy_delayFreqKhz; +extern uint8_t cy_delayFreqMhz; +extern uint32_t cy_delay32kMs; +/** \endcond */ + + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) +/** +* \addtogroup group_system_config_cm4_status_macro +* \{ +*/ +#define CY_SYS_CM4_STATUS_ENABLED (3u) /**< The Cortex-M4 core is enabled: power on, clock on, no isolate, no reset and no retain. */ +#define CY_SYS_CM4_STATUS_DISABLED (0u) /**< The Cortex-M4 core is disabled: power off, clock off, isolate, reset and no retain. */ +#define CY_SYS_CM4_STATUS_RETAINED (2u) /**< The Cortex-M4 core is retained. power off, clock off, isolate, no reset and retain. */ +#define CY_SYS_CM4_STATUS_RESET (1u) /**< The Cortex-M4 core is in the Reset mode: clock off, no isolated, no retain and reset. */ +/** \} group_system_config_cm4_status_macro */ + +#endif + +/** \addtogroup group_system_config_globals +* \{ +*/ + +extern uint32_t SystemCoreClock; +extern uint32_t cy_BleEcoClockFreqHz; +extern uint32_t cy_Hfclk0FreqHz; +extern uint32_t cy_PeriClkFreqHz; + +/** \} group_system_config_globals */ + +#ifdef __cplusplus +} +#endif + +#endif /* _SYSTEM_PSOC63_H_ */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto.h new file mode 100644 index 0000000000..59f8f484fa --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto.h @@ -0,0 +1,1678 @@ +/***************************************************************************//** +* \file cy_crypto.h +* \version 2.0 +* +* \brief +* This file provides the public interface for the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_crypto Cryptography (Crypto) +* \{ +* The Crypto driver provides a public API to perform cryptographic and hash +* operations, as well as generate both true and pseudo random numbers +* (TRNG, PRNG). It uses a hardware IP block to accelerate operations. The driver +* supports these standards: DES, TDES, AES (128, 192, 256 bits), CMAC-AES, SHA, +* HMAC, PRNG, TRNG, CRC, and RSA. +* +* This document contains the following topics: +* - \ref group_crypto_overview +* - \ref group_crypto_configuration_considerations +* - \ref group_crypto_server_init +* - \ref group_crypto_client_init +* - \ref group_crypto_irq_implements +* - \ref group_crypto_rsa_considerations +* - \ref group_crypto_definitions +* - \ref group_crypto_more_information +* +* \section group_crypto_overview Overview +* The Crypto driver uses a client-server architecture. +* +* Firmware initializes and starts the Crypto server. The server runs only on the +* CM0+ core, and works with the Crypto hardware. The Crypto server is implemented +* as a secure block. It performs all cryptographic operations for the client. +* Access to the server is through the Inter Process Communication (IPC) driver. +* Direct access is not allowed. +* +* The Crypto client can run on either core. Firmware initializes and starts the +* client. The firmware then provides the configuration data required for the +* desired cryptographic technique, and requests that the server run the +* cryptographic operation. +* +* \image html crypto_architecture.png +* +* Firmware sets up a cryptographic operation using configuration structures, or +* by passing in required data as parameters in function calls. +* +* Most Crypto functions require one or more contexts. A context is a data +* structure that the driver uses for its operations. Firmware declares the +* context (allocates memory) but does not write or read the values in the +* context. In effect the context is a scratch pad you provide to the driver. +* The driver uses the context to store and manipulate data during cryptographic +* operations. +* +* There is a common context shared by all cryptographic methods. Several methods +* require an additional context unique to the particular cryptographic technique. +* The Crypto driver header files declare all the required structures for both +* configuration and context. +* +* IPC communication between the client and server is completely transparent. +* Default PDL source files configure the IPC channel. Using IPC for communication +* provides a simple synchronization mechanism to handle concurrent requests from +* different cores. +* +* The Crypto driver (both client and server) is provided as compiled binary +* libraries, not as source code. Header files define the API and required data +* structures. +* +* The Crypto driver uses: +* - One IPC channel for data exchange between client and server +* - Three interrupts: an IPC notify interrupt, an IPC release interrupt, +* and an interrupt for error handling +* +* The \ref group_crypto_definitions section provides more information on cryptographic terms of +* art, and the particular supported encryption standards. +* +* \section group_crypto_configuration_considerations Configuration Considerations +* +* IPC communication for the Crypto driver is handled transparently. The +* cy_crytpo_config files set up the IPC channel, and configure the required +* notify, release, and error interrupts. +* +* Initialization routines \ref Cy_Crypto_Server_Start (server) and +* \ref Cy_Crypto_Init (client) use separate instances of the same +* cy_stc_crypto_config_t configuration structure. Some fields should be the same, +* and some are set specifically by either the server or client. See the +* cy_crypto_config files for the default implementation. The table lists each +* field in the config structure, which initialization routine sets the value, +* and the default MACRO that defines the value. +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    FieldWhichMACRO / FunctionNotes
    \link cy_stc_crypto_config_t::ipcChannel ipcChannel\endlinkServer and ClientCY_IPC_CHAN_CRYPTOIPC Channel, same for both
    \link cy_stc_crypto_config_t::acquireNotifierChannel acquireNotifierChannel\endlinkServer and ClientCY_CRYPTO_IPC_INTR_NOTIFY_NUMNotify interrupt number, same for both
    \link cy_stc_crypto_config_t::releaseNotifierChannel releaseNotifierChannel\endlinkServer and ClientCY_CRYPTO_IPC_INTR_RELEASE_NUMRelease interrupt number, same for both
    \link cy_stc_crypto_config_t::userCompleteCallback userCompleteCallback\endlinkClientUser-defined callback for the Release interrupt handler; can be NULLSee Implementing Crypto Interrupts
    \link cy_stc_crypto_config_t::releaseNotifierConfig releaseNotifierConfig \endlinkClientSource: CY_CRYPTO_IPC_INTR_RELEASE_NUM; Priority: \ref CY_CRYPTO_RELEASE_INTR_PRconfiguration for the interrupt
    \link cy_stc_crypto_config_t::userGetDataHandler userGetDataHandler\endlinkServerUser-defined function to override default interrupt handler; NULL = use defaultISR for the Notify interrupt
    \link cy_stc_crypto_config_t::acquireNotifierConfig acquireNotifierConfig\endlinkServerSource: \ref CY_CRYPTO_CM0_NOTIFY_INTR_NR; Priority: \ref CY_CRYPTO_NOTIFY_INTR_PRconfiguration for the interrupt
    \link cy_stc_crypto_config_t::userErrorHandler userErrorHandler\endlinkServerUser-defined function to override default interrupt handler; NULL = use defaultISR for a server error
    \link cy_stc_crypto_config_t::cryptoErrorIntrConfig cryptoErrorIntrConfig\endlinkServerSource: \ref CY_CRYPTO_CM0_ERROR_INTR_NR; Priority: \ref CY_CRYPTO_ERROR_INTR_PRconfiguration for the interrupt
    +* +* On the CM0+, the error, release, and notify interrupts are assigned to +* NVIC IRQn 28-30 respectively. Do not modify these values. +* See System Interrupt (SysInt) for background on CM0+ interrupts. +* +* \section group_crypto_server_init Server Initialization +* +* Use \ref Cy_Crypto_Server_Start. This call must be made from the CM0+ core only. +* Provide the configuration parameters (cy_stc_crypto_config_t) and a pointer +* to the server context (cy_stc_crypto_server_context_t). +* Do not fill in the values for the context structure. +* +* Because the two cores operate asynchronously, ensure that server +* initialization is complete before initializing the client. +* There are several ways to do this: +* +* - Use \ref Cy_Crypto_Sync as a blocking call, before initializing the client. +* - Enable the CM4 core (\ref Cy_SysEnableCM4) after +* \ref Cy_Crypto_Server_Start executes successfully. +* - Check the return status from calls to \ref Cy_Crypto_Init or +* \ref Cy_Crypto_Enable to ensure \ref CY_CRYPTO_SUCCESS. +* +* All crypto operations are asynchronous. To ensure that any crypto operation +* is complete and the result is valid, use \ref Cy_Crypto_Sync. +* Use the \ref CY_CRYPTO_SYNC_NON_BLOCKING parameter to check status. +* Use \ref CY_CRYPTO_SYNC_BLOCKING to wait for the operation to complete. +* +* \section group_crypto_client_init Client initialization +* +* Use \ref Cy_Crypto_Init to initialize the Crypto client with the configuration +* parameters (cy_stc_crypto_config_t) and a pointer to the context +* (cy_stc_crypto_context_t). Do not fill in the values for the context structure. +* +* Then call \ref Cy_Crypto_Enable to enable the Crypto hardware IP block. +* After this, the Crypto driver is ready to execute crypto functions. +* These calls must be made on the client side. +* Firmware can implement the client on either core. +* +* Some encryption techniques require additional initialization specific to the +* technique. If there is an Init function, you must call it before using any +* other function for that technique, and reinitialize after you use a different +* encryption technique. +* +* For example, use \ref Cy_Crypto_Aes_Init to configure an AES encryption +* operation with the encryption key, and key length. +* Provide pointers to two context structures. You can then call AES Run functions. +* If later on you use DES, you must re-initialize AES encryption before using +* it again. +* +* See the documentation for details about each Cy_Crypto_XXX_Init function. +* +* \section group_crypto_irq_implements Implementing Crypto Interrupts +* +* The Crypto driver uses three interrupts: +* - A notify interrupt when data is ready for a cryptographic operation +* - A release interrupt when a cryptographic operation is complete +* - An error interrupt if the server encounters a hardware error +* +* You can modify default behavior for each interrupt. +* +* Notify Interrupt: the Crypto server has a default ISR to handle this +* interrupt, \ref Cy_Crypto_Server_GetDataHandler. The default ISR clears the +* interrupt, retrieves the data from the IPC channel, and dispatches control to +* the desired cryptographic operation. +* +* To use the default handler, set the \link +* cy_stc_crypto_config_t::userGetDataHandler userGetDataHandler \endlink field +* of the cy_stc_crypto_config_t structure to NULL. To override, populate this +* field with your ISR. Then call \ref Cy_Crypto_Server_Start. +* Your ISR can perform additional tasks required by your application logic, +* but must also call \ref Cy_Crypto_Server_GetDataHandler to dispatch the data +* to the correct cryptographic operation. +* +* Release Interrupt: The Crypto driver includes a handler for this +* interrupt. The interrupt handler clears the interrupt and calls a user-provided +* callback routine. You cannot override this interrupt handler. +* By default the interrupt is disabled. +* +* To use default behavior (interrupt disabled), set the \link +* cy_stc_crypto_config_t::userCompleteCallback userCompleteCallback \endlink +* field of the cy_stc_crypto_config_t structure to NULL. +* To enable the interrupt, populate this field with your callback function. +* Then call \ref Cy_Crypto_Init. If the callback function is not NULL, the Init +* function enables the interrupt, and default behavior calls your routine. +* +* When performing cryptographic operations, firmware must ensure the operation +* is complete before acting on the results. If the release interrupt is disabled, +* typically calls to \ref Cy_Crypto_Sync should be blocking. If the interrupt is +* enabled, your callback function is called when the operation is complete. +* This lets you avoid blocking calls to \ref Cy_Crypto_Sync. +* +* Error Interrupt: The Crypto server has a default ISR to handle this +* interrupt. It clears the interrupt and sets an internal flag that an error +* has occurred. +* +* To use the default handler, set the userErrorHandler field of the +* cy_stc_crypto_config_t structure to NULL. To override, populate this field +* with your ISR. Then call \ref Cy_Crypto_Server_Start. +* +* Your ISR must call \ref Cy_Crypto_Server_ErrorHandler, and can perform any +* additional tasks required by your application logic. +* +* \section group_crypto_rsa_considerations RSA Usage Considerations +* +* General RSA encryption and decryption is supported. +* \ref Cy_Crypto_Rsa_Proc encrypts or decrypts data based on the parameters +* passed to the function. If you pass in plain text and a public key, the output +* is encrypted (cipher text). If you pass in cipher text and a private key, the +* output is decrypted (plain text). +* +* One parameter for this function call is a structure that defines the key: +* cy_stc_crypto_rsa_pub_key_t. The four modulus and exponent fields are +* mandatory, and represent the data for either the public or private key as +* appropriate. +* +* The remaining fields represent three pre-calculated coefficients that can +* reduce execution time by up to 5x. The fields are: coefficient for Barrett +* reduction, binary inverse of the modulus, and the result of +* (2^moduloLength mod modulo). These fields are optional, and can be set to NULL. +* +* Calculate these coefficients with \ref Cy_Crypto_Rsa_CalcCoefs. +* Pass in the address of the key structure with the modulus and exponent values +* for the key. The function returns the coefficients for the key in the key +* structure, replacing any previous values. +* +* The RSA functionality also implements functions to decrypt a signature using +* a public key. This signature must follow the RSASSA-PKCS-v1_5 standard. +* The signature must contain a SHA digest (hash). +* MD2, MD4, and MD5 message digests are not supported. +* +* An encrypted signature is stored as big-endian data. It must be inverted for +* RSA processing. To use the provided signature decryption, firmware must +* -# Calculate the SHA digest of the data to be verified with +* \ref Cy_Crypto_Sha_Run. +* -# Ensure that the RSA signature is in little-endian format. +* Use \ref Cy_Crypto_Rsa_InvertEndianness. +* -# Decrypt the RSA signature with a public key, by calling +* \ref Cy_Crypto_Rsa_Proc. +* -# Invert the byte order of the output, to return to big-endian format. +* Use \ref Cy_Crypto_Rsa_InvertEndianness. +* -# Call \ref Cy_Crypto_Rsa_Verify (which requires data in big-endian format). +* +* \section group_crypto_definitions Definitions +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    TermDefinition
    PlaintextAn unencrypted message
    CiphertextAn encrypted message
    Block CipherAn encryption function for fixed-size blocks of data. +* This function takes a fixed-size key and a block of plaintext data from +* the message and encrypts it to generate ciphertext. Block ciphers are +* reversible. The function performed on a block of encrypted data will +* decrypt it.
    Block Cipher ModeA mode of encrypting a message using block ciphers for messages of +* arbitrary length. The message is padded so that its length is an integer +* multiple of the block size. ECB (Electronic Code Book), CBC (Cipher Block +* Chaining), and CFB (Cipher Feedback) are all modes of using block ciphers +* to create an encrypted message of arbitrary length.
    Data Encryption Standard (DES)Is a symmetric-key algorithm for the encryption of electronic data. +* It uses a 56-bit key and a 64-bit message block size.
    Triple DES (3DES or TDES)Is a symmetric-key block cipher, which applies the Data Encryption +* Standard (DES) cipher algorithm three times to each data block. +* It uses three 56-bit keys. The block size is 64-bits.
    Advanced Encryption Standard (AES)The standard specifies the Rijndael algorithm, a symmetric block +* cipher that can process data blocks of 128 bits, using cipher keys with +* lengths of 128, 192, and 256 bits. Rijndael was designed to handle +* additional block sizes and key lengths, however they are not adopted in +* this standard. AES is also used for message authentication.
    Cipher-based Message Authentication Code (CMAC)This is a block cipher-based message authentication code algorithm. +* It computes the MAC value using the AES block cipher algorithm.
    Secure Hash Algorithm (SHA)Is a cryptographic hash function. +* This function takes a message of the arbitrary length and reduces it to a +* fixed-length residue or message digest after performing a series of +* mathematically defined operations that practically guarantee that any +* change in the message will change the hash value. It is used for message +* authentication by transmitting a message with a hash value appended to it +* and recalculating the message hash value using the same algorithm at the +* recipient's end. If the hashes differ, then the message is corrupted.
    Message Authentication Code (MAC)MACs are used to verify that a received message has not been altered. +* This is done by first computing a MAC value at the sender's end and +* appending it to the transmitted message. When the message is received, +* the MAC is computed again and checked against the MAC value transmitted +* with the message. If they do not match, the message has been altered. +* Either a Hash algorithm (such as SHA) or a block cipher (such as AES) can +* be used to produce the MAC value. Keyed MAC schemes use a Secret Key +* along with the message, thus the Key value must be known to be able to +* compute the MAC value.
    Hash Message Authentication Code (HMAC)Is a specific type of message authentication code (MAC) involving a +* cryptographic hash function and a secret cryptographic key. +* It computes the MAC value using a Hash algorithm.
    Pseudo Random Number Generator (PRNG)Is a Linear Feedback Shift Registers-based algorithm for generating a +* sequence of numbers starting from a non-zero seed.
    True Random Number Generator (TRNG)A block that generates a number that is statistically random and based +* on some physical random variation. The number cannot be duplicated by +* running the process again.
    Symmetric Key CryptographyUses a common, known key to encrypt and decrypt messages (a shared +* secret between sender and receiver). An efficient method used for +* encrypting and decrypting messages after the authenticity of the other +* party has been established. DES (now obsolete), 3DES, and AES (currently +* used) are well-known symmetric cryptography methods.
    Asymmetric Key CryptographyAlso referred to as Public Key encryption. Someone who wishes to +* receive a message, publishes a very large public key (up to 4096 bits +* currently), which is one of two prime factors of a very large number. The +* other prime factor is the private key of the recipient and a secret. +* Someone wishing to send a message to the publisher of the public key +* encrypts the message with the public key. This message can now be +* decrypted only with the private key (the other prime factor held secret by +* the recipient). The message is now sent over any channel to the recipient +* who can decrypt it with the private, secret, key. The same process is used +* to send messages to the sender of the original message. The asymmetric +* cryptography relies on the mathematical impracticality (usually related to +* the processing power available at any given time) of factoring the keys. +* Common, computationally intensive, asymmetric algorithms are RSA and ECC. +* The public key is described by the pair (n, e) where n is a product of two +* randomly chosen primes p and q. The exponent e is a random integer +* 1 < e < Q where Q = (p-1) (q-1). The private key d is uniquely defined +* by the integer 1 < d < Q such that ed congruent to 1 (mod Q ).
    +* +* \section group_crypto_more_information More Information +* +* RSASSA-PKCS1-v1_5 described here, page 31: +* http://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf* +* +* See the Cryptographic Function Block chapter of the Technical Reference Manual. +* +* \section group_crypto_MISRA MISRA-C Compliance +* This driver does not contains any driver-specific MISRA violations. +* +* \section group_crypto_changelog Changelog +* +* +* +* +* +* +* +*
    VersionChangesReason for Change
    1.0Initial version
    +* +* +* \defgroup group_crypto_common Configuration +* \{ +* \defgroup group_crypto_config_macros Macros +* \defgroup group_crypto_config_structure Structure +* \} +* +* \defgroup group_crypto_client Crypto Client +* \{ +* \defgroup group_crypto_macros Macros +* \defgroup group_crypto_enums Enumerated Types +* \defgroup group_crypto_cli_data_structures Data Structures +* \defgroup group_crypto_cli_functions Functions +* \} +* +* \defgroup group_crypto_server Crypto Server +* \{ +* \defgroup group_crypto_srv_data_structures Data Structures +* \defgroup group_crypto_srv_functions Functions +* \} +*/ + +#if !defined(CY_CRYPTO_H) +#define CY_CRYPTO_H + + +#include +#include +#include "cy_device_headers.h" +#include "crypto/cy_crypto_common.h" + +#if (CPUSS_CRYPTO_PRESENT == 1) + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** \cond INTERNAL */ + +cy_en_crypto_status_t Cy_Crypto_GetLibraryInfo(cy_en_crypto_lib_info_t *cryptoInfo); + +/** \endcond */ + +/** +* \addtogroup group_crypto_cli_functions +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_Crypto_Init +****************************************************************************//** +* +* This function initializes the Crypto context buffer and +* configures the Crypto driver. Must be called at first. +* +* To start working with Crypto methods after Crypto_Init(), +* call Crypto_Enable() to turn-on the Crypto Hardware. +* +* \param config +* The pointer to the Crypto configuration structure. +* Could be used with default values from cy_crypto_config.h +* +* \param context +* The pointer to the \ref cy_stc_crypto_context_t instance of structure +* that stores the Crypto driver common context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Init(cy_stc_crypto_config_t const *config, cy_stc_crypto_context_t *context); + +/******************************************************************************* +* Function Name: Cy_Crypto_DeInit +****************************************************************************//** +* +* This function de-initializes the Crypto driver. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_DeInit(void); + +/******************************************************************************* +* Function Name: Cy_Crypto_Enable +****************************************************************************//** +* +* This function enables (turns on) the Crypto hardware. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Enable(void); + +/******************************************************************************* +* Function Name: Cy_Crypto_Disable +****************************************************************************//** +* +* This function disables (turns off) the Crypto hardware. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Disable(void); + +/******************************************************************************* +* Function Name: Cy_Crypto_Sync +****************************************************************************//** +* +* This function waits or just checks (depending on the parameter) +* for the Crypto operation to complete. +* +* \param isBlocking +* Set whether Crypto_Sync is blocking: +* True - is blocking. +* False - is not blocking. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Sync(bool isBlocking); + +/******************************************************************************* +* Function Name: Cy_Crypto_GetErrorStatus +****************************************************************************//** +* +* This function returns a cause of a Crypto hardware error. +* It is independent of the Crypto previous state. +* +* \param hwErrorCause +* \ref cy_stc_crypto_hw_error_t. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_GetErrorStatus(cy_stc_crypto_hw_error_t *hwErrorCause); + +#if (CPUSS_CRYPTO_PR == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Prng_Init +****************************************************************************//** +* +* This function initializes parameters of the PRNG. +* +* Call to initialize this encryption technique before using any associated +* functions. You must initialize this technique again after using any other +* encryption technique. +* Invoking this function resets the pseudo random sequence. +* +* \param lfsr32InitState +* A non-zero seed value for the first LFSR. + +* \param lfsr31InitState +* A non-zero seed value for the second LFSR. + +* \param lfsr29InitState +* A non-zero seed value for the third LFSR. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_prng_t structure that stores +* the Crypto function context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Prng_Init(uint32_t lfsr32InitState, + uint32_t lfsr31InitState, + uint32_t lfsr29InitState, + cy_stc_crypto_context_prng_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Prng_Generate +****************************************************************************//** +* +* This function generates 32-bit the Pseudo Random Number. +* It depends on Cy_Crypto_Prng_Init that should be called before. +* +* \param max +* The maximum value of a random number. +* +* \param randomNum +* The pointer to a variable to store the generated pseudo random number. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_prng_t structure that stores +* the Crypto function context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Prng_Generate(uint32_t max, + uint32_t *randomNum, + cy_stc_crypto_context_prng_t *cfContext); +#endif /* #if (CPUSS_CRYPTO_PR == 1) */ + +#if (CPUSS_CRYPTO_AES == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Init +****************************************************************************//** +* +* This function initializes the AES operation by setting key and key length. +* +* Call to initialize this encryption technique before using any associated +* functions. You must initialize this technique again after using any other +* encryption technique. +* +* \param key +* The pointer to the encryption/decryption key. +* +* \param keyLength +* \ref cy_en_crypto_aes_key_length_t +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure that stores all internal variables +* the Crypto driver requires. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Init(uint32_t *key, + cy_en_crypto_aes_key_length_t keyLength, + cy_stc_crypto_context_aes_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Ecb_Run +****************************************************************************//** +* +* This function performs AES operation on one block. +* The key must be set before by invoking Cy_Crypto_Aes_Init(). +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT (\ref cy_en_crypto_dir_mode_t). +* +* \param srcBlock +* The pointer to a source block. +* +* \param dstBlock +* The pointer to a destination cipher block. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_aes_t instance of structure +* that stores all AES internal variables. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Ecb_Run(cy_en_crypto_dir_mode_t dirMode, + uint32_t *dstBlock, + uint32_t *srcBlock, + cy_stc_crypto_context_aes_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Cbc_Run +****************************************************************************//** +* +* This function performs AES operation on a plain text with Cipher Block Chaining (CBC). +* The key must be set before by invoking Cy_Crypto_Aes_Init(). +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT (\ref cy_en_crypto_dir_mode_t) +* +* \param srcSize +* The size of the source plain text. +* +* \param ivPtr +* The pointer to the initial vector. +* +* \param dst +* The pointer to a destination cipher text. +* +* \param src +* The pointer to a source plain text. Must be 4-Byte aligned. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure that stores all internal variables +* the Crypto driver requires. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Cbc_Run(cy_en_crypto_dir_mode_t dirMode, + uint32_t srcSize, + uint32_t *ivPtr, + uint32_t *dst, + uint32_t *src, + cy_stc_crypto_context_aes_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Cfb_Run +****************************************************************************//** +* +* This function performs AES operation on a plain text with Cipher Feedback mode (CFB). +* The key must be set before by invoking Cy_Crypto_Aes_Init(). +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT (\ref cy_en_crypto_dir_mode_t) +* +* \param srcSize +* The size of the source plain text. +* +* \param ivPtr +* The pointer to the initial vector. +* +* \param dst +* The pointer to a destination cipher text. +* +* \param src +* The pointer to a source plain text. Must be 4-Byte aligned. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure that stores all internal variables +* the Crypto driver requires. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Cfb_Run(cy_en_crypto_dir_mode_t dirMode, + uint32_t srcSize, + uint32_t *ivPtr, + uint32_t *dst, + uint32_t *src, + cy_stc_crypto_context_aes_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Ctr_Run +****************************************************************************//** +* +* This function performs AES operation on a plain text with Cipher Block Counter mode (CTR). +* NOTE: preparation of the unique nonceCounter for each block is +* the user's responsibility. This function is dependent on +* the key being set before invoking \ref Cy_Crypto_Aes_Init(). +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT (\ref cy_en_crypto_dir_mode_t) +* +* \param srcSize +* The size of a source plain text. +* +* \param srcOffset +* The size of an offset within the current block stream for resuming within the current cipher stream. +* +* \param nonceCounter +* The 128-bit nonce and counter. +* +* \param streamBlock +* The saved stream-block for resuming. Is over-written by the function. +* +* \param dst +* The pointer to a destination cipher text. +* +* \param src +* The pointer to a source plain text. Must be 4-Byte aligned. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure that stores all internal variables +* the Crypto driver requires. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Ctr_Run(cy_en_crypto_dir_mode_t dirMode, + uint32_t srcSize, + uint32_t *srcOffset, + uint32_t nonceCounter[CY_CRYPTO_AES_BLOCK_SIZE / 8u], + uint32_t streamBlock[CY_CRYPTO_AES_BLOCK_SIZE / 8u], + uint32_t *dst, + uint32_t *src, + cy_stc_crypto_context_aes_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Aes_Cmac_Run +****************************************************************************//** +* +* This function performs the cipher-block chaining-message authentication-code. +* +* There is no Init function. Provide the required parameters and the pointer to +* the context structure when making this function call. +* +* \param src +* The pointer to a source plain text. Must be 4-Byte aligned. +* +* \param srcSize +* The size of a source plain text. +* +* \param key +* The pointer to the encryption key. +* +* \param keyLength +* \ref cy_en_crypto_aes_key_length_t +* +* \param cmacPtr +* The pointer to the calculated CMAC. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_aes_t structure that stores all +* internal variables the Crypto driver requires. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Aes_Cmac_Run(uint32_t *src, + uint32_t srcSize, + uint32_t *key, + cy_en_crypto_aes_key_length_t keyLength, + uint32_t *cmacPtr, + cy_stc_crypto_context_aes_t *cfContext); +#endif /* #if (CPUSS_CRYPTO_AES == 1) */ + +#if (CPUSS_CRYPTO_SHA == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Sha_Run +****************************************************************************//** +* +* This function performs the SHA Hash function. +* There is no Init function. Provide the required parameters and the pointer +* to the context structure when making this function call. +* It is independent of the previous Crypto state because it already contains +* preparation, calculation, and finalization steps. +* +* \param mode +* \ref cy_en_crypto_sha_mode_t +* +* \param message +* The pointer to a message whose hash value is being computed. +* +* \param messageSize +* The size of a message. +* +* \param digest +* The pointer to the hash digest. +* +* \param cfContext +* the pointer to the \ref cy_stc_crypto_context_sha_t structure that stores all +* internal variables for Crypto driver. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Sha_Run(uint32_t *message, + uint32_t messageSize, + uint32_t *digest, + cy_en_crypto_sha_mode_t mode, + cy_stc_crypto_context_sha_t *cfContext); +#endif /* #if (CPUSS_CRYPTO_SHA == 1) */ + +#if (CPUSS_CRYPTO_SHA == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Hmac_Run +****************************************************************************//** +* +* This function performs HMAC calculation. +* There is no Init function. Provide the required parameters and the pointer +* to the context structure when making this function call. +* It is independent of the previous Crypto state because it already contains +* preparation, calculation, and finalization steps. +* +* \param hmac +* The pointer to the calculated HMAC. +* +* \param message +* The pointer to a message whose hash value is being computed. +* +* \param messageSize +* The size of a message. +* +* \param key +* The pointer to the key. +* +* \param keyLength +* The length of the key. +* +* \param mode +* \ref cy_en_crypto_sha_mode_t +* +* \param cfContext +* the pointer to the \ref cy_stc_crypto_context_sha_t structure that stores all internal variables +* for the Crypto driver. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Hmac_Run(uint32_t *hmac, + uint32_t *message, + uint32_t messageSize, + uint32_t *key, + uint32_t keyLength, + cy_en_crypto_sha_mode_t mode, + cy_stc_crypto_context_sha_t *cfContext); +#endif /* #if (CPUSS_CRYPTO_SHA == 1) */ + +#if (CPUSS_CRYPTO_STR == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Str_MemCpy +****************************************************************************//** +* +* This function copy memory block. It operates data in the user SRAM and doesn't +* use Crypto internal SRAM. +* +* \note Memory blocks should not overlap. +* +* There is no alignment restriction. +* This function is independent of the previous Crypto state. +* +* \param dst +* The pointer to the destination of MemCpy. +* +* \param src +* The pointer to the source of MemCpy. +* +* \param size +* The size in bytes of the copy operation. Maximum size is 65535 Bytes. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_str_t structure that stores all internal variables +* for the Crypto driver. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Str_MemCpy(void *dst, + void const *src, + uint16_t size, + cy_stc_crypto_context_str_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Str_MemSet +****************************************************************************//** +* +* This function sets the memory block. It operates data in the user SRAM and +* doesn't use Crypto internal SRAM. +* +* There is no alignment restriction. +* This function is independent from the previous Crypto state. +* +* \param dst +* The pointer to the destination of MemSet. +* +* \param data +* The value to be set. +* +* \param size +* The size in bytes of the set operation. Maximum size is 65535 Bytes. +* +* \param cfContext +* the pointer to the \ref cy_stc_crypto_context_str_t structure that stores all internal variables +* for the Crypto driver. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Str_MemSet(void *dst, + uint8_t data, + uint16_t size, + cy_stc_crypto_context_str_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Str_MemCmp +****************************************************************************//** +* +* This function compares memory blocks. It operates data in the user SRAM and +* doesn't use Crypto internal SRAM. +* +* There is no alignment restriction. +* This function is independent from the previous Crypto state. +* +* \param src0 +* The pointer to the first source of MemCmp. +* +* \param src1 +* The pointer to the second source of MemCmp. +* +* \param size +* The size in bytes of the compare operation. Maximum size is 65535 Bytes. +* +* \param resultPtr +* The pointer to the result of compare: +* - 0 - if Source 1 equal Source 2 +* - 1 - if Source 1 not equal Source 2 +* +* \param cfContext +* the pointer to the \ref cy_stc_crypto_context_str_t structure that stores all internal variables +* for the Crypto driver. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Str_MemCmp(void const *src0, + void const *src1, + uint16_t size, + uint32_t *resultPtr, + cy_stc_crypto_context_str_t *cfContext); + +/******************************************************************************* +* Function Name: Crypto_Str_MemXor +****************************************************************************//** +* +* This function calculate XOR of two memory blocks. It operates data in the user +* SRAM and doesn't use Crypto internal SRAM. +* +* \note Memory structures should not overlap. +* +* There is no alignment restriction. +* This function is independent from the previous Crypto state. +* +* \param src0 +* The pointer to the first source of MemXor. + +* \param src1 +* The pointer to the second source of MemXor. + +* \param dst +* The pointer to the destination of MemXor. +* +* \param size +* The size in bytes of the compare operation. Maximum size is 65535 Bytes. +* +* \param cfContext +* the pointer to the \ref cy_stc_crypto_context_str_t structure that stores all internal variables +* for the Crypto driver. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Str_MemXor(void const *src0, + void const *src1, + void *dst, + uint16_t size, + cy_stc_crypto_context_str_t *cfContext); +#endif /* #if (CPUSS_CRYPTO_STR == 1) */ + +#if (CPUSS_CRYPTO_CRC == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Crc_Init +****************************************************************************//** +* +* This function performs CRC initialization. +* +* Call to initialize this encryption technique before using any associated +* functions. You must initialize this technique again after using any other +* encryption technique. +* +* One peculiar of the CRC hardware block is that for some polynomials +* calculated, CRC is MSB aligned and others are LSB aligned. +* Below is the table with known polynomials and their +* calculated CRCs from the string "123456789". +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    CRC modes and parameters
    NameWidthPolyInitData RevData XORRem RevRem XORExpected CRCOutput of the CRC block
    CRC-3 / ROHC30x30x71010x00x60x00000006
    CRC-4 / ITU40x30x01010x00x70x00000007
    CRC-5 / EPC50x90x90000x00x00x00000000
    CRC-5 / ITU50x150x01010x00x70x00000007
    CRC-5 / USB50x50x1F1010x1F0x190x00000019
    CRC-6 / CDMA2000-A60x270x3F0000x00xD0xD0000000
    CRC-6 / CDMA2000-B60x70x3F0000x00x3B0x3B000000
    CRC-6 / DARC60x190x01010x00x260x00000026
    CRC-6 / ITU60x30x01010x00x60x00000006
    CRC-770x90x00000x00x750x75000000
    CRC-7 / ROHC70x4F0x7F1010x00x530x00000053
    CRC-880x70x00000x00xF40xF4000000
    CRC-8 / CDMA200080x9B0xFF0000x00xDA0xDA000000
    CRC-8 / DARC80x390x01010x00x150x00000015
    CRC-8 / DVB-S280xD50x00000x00xBC0xBC000000
    CRC-8 / EBU80x1D0xFF1010x00x970x00000097
    CRC-8 / I-CODE80x1D0xFD0000x00x7E0x7E000000
    CRC-8 / ITU80x70x00000x550xA10xA1000000
    CRC-8 / MAXIM80x310x01010x00xA10x000000A1
    CRC-8 / ROHC80x70xFF1010x00xD00x000000D0
    CRC-8 / WCDMA80x9B0x01010x00x250x00000025
    CRC-10100x2330x00000x00x1990x19900000
    CRC-10 / CDMA2000100x3D90x3FF0000x00x2330x23300000
    CRC-11110x3850x1A0000x00x5A30x5A300000
    CRC-12 / 3GPP120x80F0x00010x00xDAF0x00000DAF
    CRC-12 / CDMA2000120xF130xFFF0000x00xD4D0xD4D00000
    CRC-12 / DECT120x80F0x00000x00xF5B0xF5B00000
    CRC-13 / BBC130x1CF50x00000x00x4FA0x4FA00000
    CRC-14 / DARC140x8050x01010x00x82D0x0000082D
    CRC-15150x45990x00000x00x59E0x59E00000
    CRC-15 / MPT1327150x68150x00000x10x25660x25660000
    CRC-24240x0864CFB0x00B704CE0000x00x21CF020x21CF0200
    CRC-24 / FLEXRAY-A240x05D6DCB0x00FEDCBA0000x00x7979BD0x7979BD00
    CRC-24 / FLEXRAY-B240x05D6DCB0x00ABCDEF0000x00x1F23B80x1F23B800
    CRC-31 / PHILIPS310x4C11DB70x7FFFFFFF0000x7FFFFFFF0xCE9E46C0xCE9E46C0
    CRC-16 / ARC160x80050x00001010x00000xBB3D0x0000BB3D
    CRC-16 / AUG-CCITT160x10210x1D0F0000x00000xE5CC0xE5CC0000
    CRC-16 / BUYPASS160x80050x00000000x00000xFEE80xFEE80000
    CRC-16 / CCITT-0160x10210xFFFF0000x00000x29B10x29B10000
    CRC-16 / CDMA2000160xC8670xFFFF0000x00000x4C060x4C060000
    CRC-16 / DDS-110160x80050x800D0000x00000x9ECF0x9ECF0000
    CRC-16 / DECT-R160x05890x00000000x00010x007E0x007E0000
    CRC-16 / DECT-X160x05890x00000000x00000x007F0x007F0000
    CRC-16 / DNP160x3D650x00001010xFFFF0xEA820x0000EA82
    CRC-16 / EN-13757160x3D650x00000000xFFFF0xC2B70xC2B70000
    CRC-16 / GENIBUS160x10210xFFFF0000xFFFF0xD64E0xD64E0000
    CRC-16 / MAXIM160x80050x00001010xFFFF0x44C20x000044C2
    CRC-16 / MCRF4XX160x10210xFFFF1010x00000x6F910x00006F91
    CRC-16 / RIELLO160x10210xB2AA1010x00000x63D00x000063D0
    CRC-16 / T10-DIF160x8BB70x00000000x00000xD0DB0xD0DB0000
    CRC-16 / TELEDISK160xA0970x00000000x00000x0FB30x0FB30000
    CRC-16 / TMS37157160x10210x89EC1010x00000x26B10x000026B1
    CRC-16 / USB160x80050xFFFF1010xFFFF0xB4C80x0000B4C8
    CRC-A160x10210xC6C61010x00000xBF050x0000BF05
    CRC-16 / KERMIT160x10210x00001010x00000x21890x00002189
    CRC-16 / MODBUS160x80050xFFFF1010x00000x4B370x00004B37
    CRC-16 / X-25160x10210xFFFF1010xFFFF0x906E0x0000906E
    CRC-16 / XMODEM160x10210x00000000x00000x31C30x31C30000
    CRC-32320x04C11DB70xFFFFFFFF1010xFFFFFFFF0xCBF439260xCBF43926
    CRC-32 / BZIP2320x04C11DB70xFFFFFFFF0000xFFFFFFFF0xFC8919180xFC891918
    CRC-32C320x1EDC6F410xFFFFFFFF1010xFFFFFFFF0xE30692830xE3069283
    CRC-32D320xA833982B0xFFFFFFFF1010xFFFFFFFF0x873155760x87315576
    CRC-32 / MPEG-2320x04C11DB70xFFFFFFFF0000x000000000x0376E6E70x0376E6E7
    CRC-32 / POSIX320x04C11DB70x000000000000xFFFFFFFF0x765E76800x765E7680
    CRC-32Q320x814141AB0x000000000000x000000000x3010BF7F0x3010BF7F
    CRC-32 / JAMCRC320x04C11DB70xFFFFFFFF1010x000000000x340BC6D90x340BC6D9
    CRC-32 / XFER320x000000AF0x000000000000x000000000xBD0BE3380xBD0BE338
    +* +* +* \param polynomial +* The polynomial (specified using 32 bits) used in the computing CRC. +* +* \param dataReverse +* The order in which data bytes are processed. 0 - MSB first; 1- LSB first. +* +* \param dataXor +* The byte mask for XORing data +* +* \param remReverse +* A reminder reverse: 0 means the remainder is not reversed. 1 means reversed. +* +* \param remXor +* Specifies a mask with which the LFSR32 register is XORed to produce a remainder. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_crc_t structure that stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Crc_Init(uint32_t polynomial, + uint8_t dataReverse, + uint8_t dataXor, + uint8_t remReverse, + uint32_t remXor, + cy_stc_crypto_context_crc_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Crc_Run +****************************************************************************//** +* +* This function performs CRC calculation on a message. +* It depends on \ref Cy_Crypto_Crc_Init(), +* which should be called before. +* +* \param data +* The pointer to the message whose CRC is being computed. +* +* \param dataSize +* The size of a message in bytes. +* +* \param crc +* The pointer to a computed CRC value. +* +* \param lfsrInitState +* The initial state of the LFSR. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_crc_t structure that stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Crc_Run(void *data, + uint16_t dataSize, + uint32_t *crc, + uint32_t lfsrInitState, + cy_stc_crypto_context_crc_t *cfContext); +#endif /* #if (CPUSS_CRYPTO_CRC == 1) */ + +#if (CPUSS_CRYPTO_TR == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Trng_Generate +****************************************************************************//** +* +* This function generates a 32-bit True Random Number. +* +* \param GAROPol; +* The polynomial for the programmable Galois ring oscillator. +* +* \param FIROPol; +* The polynomial for the programmable Fibonacci ring oscillator. +* +* \param max +* The maximum length of a random number, in the range [0, 32] bits. +* +* \param randomNum +* The pointer to a generated true random number. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_trng_t structure that stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Trng_Generate(uint32_t GAROPol, + uint32_t FIROPol, + uint32_t max, + uint32_t *randomNum, + cy_stc_crypto_context_trng_t *cfContext); +#endif /* #if (CPUSS_CRYPTO_TR == 1) */ + +#if (CPUSS_CRYPTO_DES == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Des_Run +****************************************************************************//** +* +* This function performs DES operation on a Single Block. All addresses must be +* 4-Byte aligned. +* Ciphertext (dstBlock) may overlap with plaintext (srcBlock) +* There is no Init function. Provide the required parameters and the pointer +* to the context structure when making this function call. +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT (\ref cy_en_crypto_dir_mode_t) +* +* \param key +* The pointer to the encryption/decryption key. +* +* \param srcBlock +* The pointer to a source block. Must be 4-byte aligned. +* +* \param dstBlock +* The pointer to a destination cipher block. +* +* \param cfContext +* The pointer to the cy_stc_crypto_context_des_t structure that stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Des_Run(cy_en_crypto_dir_mode_t dirMode, + uint32_t *key, + uint32_t *dstBlock, + uint32_t *srcBlock, + cy_stc_crypto_context_des_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Tdes_Run +****************************************************************************//** +* +* This function performs the TDES operation on a single block. All addresses +* must be 4-byte aligned. +* Ciphertext (dstBlock) may overlap with plaintext (srcBlock). +* There is no Init function. Provide the required parameters and the pointer +* to the context structure when making this function call. +* +* \param dirMode +* Can be CRYPTO_ENCRYPT or CRYPTO_DECRYPT (\ref cy_en_crypto_dir_mode_t) +* +* \param key +* The pointer to the encryption/decryption key. +* +* \param srcBlock +* The pointer to a source block. Must be 4-vyte aligned. +* +* \param dstBlock +* The pointer to a destination cipher block. +* +* \param cfContext +* The pointer to the cy_stc_crypto_context_des_t structure that stores +* the Crypto driver context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Tdes_Run(cy_en_crypto_dir_mode_t dirMode, + uint32_t *key, + uint32_t *dstBlock, + uint32_t *srcBlock, + cy_stc_crypto_context_des_t *cfContext); +#endif /* #if (CPUSS_CRYPTO_DES == 1) */ + +#if (CPUSS_CRYPTO_VU == 1) +/******************************************************************************* +* Function Name: Cy_Crypto_Rsa_Proc +****************************************************************************//** +* +* This function calculates (m^e mod modulo) where m is Message (Signature), e - public exponent +* using a public key in the next representation, it contains: +* modulo, +* public exponent, +* coefficient for Barrett reduction, +* binary inverse of the modulo, and +* result of (2^moduloLength mod modulo). +* +* Not all fields in a key must be given. Modulo and public exponents are mandatory; +* Barrett coefficient, inverse modulo, and r-bar are optional. +* If they don't exist, their according pointers should be NULL. These coefficients +* could be calculated by \ref Cy_Crypto_Rsa_CalcCoefs. +* Their presence accelerates performance by five times. +* Approximate performance for 1024-bit modulo is 41.6 ms; for 2048-bit modulo is 142 ms +* when using a 25 MHz clock for Crypto HW. These numbers just for reference. +* They depend on many factors (compiler, optimization level, etc.). +* +* Returns the processed value and a success value. +* +* \note Incoming message and result processed message are little-endianess big +* integer values. To convert it from (to) binary (octet) strings use the \ref +* Cy_Crypto_Rsa_InvertEndianness function. +* +* +* \param pubKey +* The pointer to the \ref cy_stc_crypto_rsa_pub_key_t structure that stores +* public key. +* +* \param message +* The pointer to the message to be processed. +* +* \param messageSize +* The length of the message to be processed. +* +* \param processedMessage +* The pointer to processed message. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_rsa_t structure that stores +* the RSA context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Rsa_Proc(cy_stc_crypto_rsa_pub_key_t const *pubKey, + uint32_t const *message, + uint32_t messageSize, + uint32_t *processedMessage, + cy_stc_crypto_context_rsa_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Rsa_CalcCoefs +****************************************************************************//** +* +* This function calculates constant coefficients (which is dependent only on modulo +* and independent on message). With this pre-calculated coefficients calculations +* speed-up by five times. +* +* These coefficients are: +* coefficient for Barrett reduction, +* binary inverse of the modulo, +* result of (2^moduloLength mod modulo) +* +* Calculated coefficients will be placed by addresses provided in the +* pubKey structure for according coefficients. +* Function overwrites previous values. +* Approximate performance for 1024-bit modulo is 33.2 ms; for 2048-bit modulo is 113 ms +* when using a 25 MHz clock for Crypto HW. These numbers are just for reference. +* They depend on many factors (compiler, optimization level, etc.). +* +* \param pubKey +* The pointer to the \ref cy_stc_crypto_rsa_pub_key_t structure that stores a +* public key. +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_rsa_t structure that stores +* the RSA context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Rsa_CalcCoefs(cy_stc_crypto_rsa_pub_key_t const *pubKey, + cy_stc_crypto_context_rsa_t *cfContext); +#endif /* #if (CPUSS_CRYPTO_VU == 1) */ + +/******************************************************************************* +* Function Name: Cy_Crypto_Rsa_Verify +****************************************************************************//** +* +* This function does an RSA verification with checks for content, paddings, and +* signature format. +* The SHA digest of the message and decrypted message should be calculated first. +* Supports only PKCS1-v1_5 format. Inside of this format supported padding +* using only SHA. Cases with MD2 and MD5 are not supported. +* +* PKCS1-v1_5 described here, page 31: +* http://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf +* +* Returns the verification result \ref cy_en_crypto_rsa_ver_result_t. +* +* \param verResult +* The pointer to the verification result \ref cy_en_crypto_rsa_ver_result_t. +* +* \param digestType +* SHA mode used for hash calculation \ref cy_en_crypto_sha_mode_t. +* +* \param digest +* The pointer to the hash of the message whose signature is to be verified. +* +* \param decryptedSignature +* The pointer to the decrypted signature to be verified. +* +* \param decryptedSignatureLength +* The length of the decrypted signature to be verified (in bytes) +* +* \param cfContext +* The pointer to the \ref cy_stc_crypto_context_rsa_ver_t structure that stores +* the RSA context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Rsa_Verify(cy_en_crypto_rsa_ver_result_t *verResult, + cy_en_crypto_sha_mode_t digestType, + uint32_t const *digest, + uint32_t const *decryptedSignature, + uint32_t decryptedSignatureLength, + cy_stc_crypto_context_rsa_ver_t *cfContext); + +/******************************************************************************* +* Function Name: Cy_Crypto_Rsa_InvertEndianness +****************************************************************************//** +* +* This function reverts byte-array memory block, like:
    +* inArr[0] <---> inArr[n]
    +* inArr[1] <---> inArr[n-1]
    +* inArr[2] <---> inArr[n-2]
    +* ........................
    +* inArr[n/2] <---> inArr[n/2-1]
    +* +* Odd or even byteSize are acceptable. +* +* \param inArrPtr +* The pointer to the memory whose endianness is to be inverted. +* +* \param byteSize +* The length of the memory array whose endianness is to be inverted (in bytes) +* +*******************************************************************************/ +void Cy_Crypto_Rsa_InvertEndianness(void *inArrPtr, uint32_t byteSize); + + +/** \} group_crypto_cli_functions */ + + +#if defined(__cplusplus) +} +#endif + +#endif /* #if (CPUSS_CRYPTO_PRESENT == 1) */ + +#endif /* (CY_CRYPTO_H) */ + +/** \} group_crypto */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_common.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_common.h new file mode 100644 index 0000000000..d723e03be3 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_common.h @@ -0,0 +1,727 @@ +/***************************************************************************//** +* \file cy_crypto_common.h +* \version 2.0 +* +* \brief +* This file provides common constants and parameters +* for the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_CRYPTO_COMMON_H) +#define CY_CRYPTO_COMMON_H + +#include +#include +#include "cy_device_headers.h" +#include "sysint/cy_sysint.h" +#include "syslib/cy_syslib.h" + +#ifndef CY_IP_MXCRYPTO + #error "The CRYPTO driver is not supported on this device" +#endif + +#if (CPUSS_CRYPTO_PRESENT == 1) + +#define CY_CRYPTO_CORE_ENABLE (1) + +/** Driver major version */ +#define CY_CRYPTO_DRV_VERSION_MAJOR 2 + +/** Driver minor version */ +#define CY_CRYPTO_DRV_VERSION_MINOR 0 + +/** Defines the Crypto notify interrupt number */ +#define CY_CRYPTO_IPC_INTR_NOTIFY_NUM CY_IPC_INTR_CRYPTO_SRV + +/** Defines the Crypto release interrupt number */ +#define CY_CRYPTO_IPC_INTR_RELEASE_NUM CY_IPC_INTR_CRYPTO_CLI + +/** +* \addtogroup group_crypto_macros +* \{ +*/ + +/** Defines Crypto_Sync blocking execution type parameter */ +#define CY_CRYPTO_SYNC_BLOCKING (true) + +/** Defines Crypto_Sync non-blocking execution type parameter */ +#define CY_CRYPTO_SYNC_NON_BLOCKING (false) + +/** Defines the Crypto DES key size (in bytes) */ +#define CY_CRYPTO_DES_KEY_SIZE (8u) + +/** Defines the Crypto TDES key size (in bytes) */ +#define CY_CRYPTO_TDES_KEY_SIZE (24u) + +/** Defines the Crypto AES block size (in bytes) */ +#define CY_CRYPTO_AES_BLOCK_SIZE (16u) + +/** Defines the Crypto AES key maximum size (in bytes) */ +#define CY_CRYPTO_AES_128_KEY_SIZE (16u) + +/** Defines the Crypto AES key maximum size (in bytes) */ +#define CY_CRYPTO_AES_192_KEY_SIZE (24u) + +/** Defines the Crypto AES key maximum size (in bytes) */ +#define CY_CRYPTO_AES_256_KEY_SIZE (32u) + +/** Defines size of the AES block, in four-byte words */ +#define CY_CRYPTO_AES_BLOCK_SIZE_U32 (uint32_t)(CY_CRYPTO_AES_BLOCK_SIZE / 4ul) + +#if (CPUSS_CRYPTO_SHA == 1) + +/** Hash size for the SHA1 mode (in bytes) */ +#define CY_CRYPTO_SHA1_DIGEST_SIZE (20u) +/** Hash size for the SHA224 mode (in bytes) */ +#define CY_CRYPTO_SHA224_DIGEST_SIZE (28u) +/** Hash size for the SHA256 mode (in bytes) */ +#define CY_CRYPTO_SHA256_DIGEST_SIZE (32u) +/** Hash size for the SHA384 mode (in bytes) */ +#define CY_CRYPTO_SHA384_DIGEST_SIZE (48u) +/** Hash size for the SHA512 mode (in bytes) */ +#define CY_CRYPTO_SHA512_DIGEST_SIZE (64u) +/** Hash size for the SHA512_224 mode (in bytes) */ +#define CY_CRYPTO_SHA512_224_DIGEST_SIZE (28u) +/** Hash size for the SHA512_256 mode (in bytes) */ +#define CY_CRYPTO_SHA512_256_DIGEST_SIZE (32u) + +#endif /* #if (CPUSS_CRYPTO_SHA == 1) */ + + +#if (CPUSS_CRYPTO_VU == 1) + +/** Processed message size for the RSA 1024Bit mode (in bytes) */ +#define CY_CRYPTO_RSA1024_MESSAGE_SIZE (128) +/** Processed message size for the RSA 1536Bit mode (in bytes) */ +#define CY_CRYPTO_RSA1536_MESSAGE_SIZE (192) +/** Processed message size for the RSA 2048Bit mode (in bytes) */ +#define CY_CRYPTO_RSA2048_MESSAGE_SIZE (256) + +#endif /* #if (CPUSS_CRYPTO_VU == 1) */ + + +/** Crypto Driver PDL ID */ +#define CY_CRYPTO_ID CY_PDL_DRV_ID(0x0Cu) + +/** \} group_crypto_macros */ + +/** +* \addtogroup group_crypto_config_structure +* \{ +*/ + +/** The Crypto user callback function type. + Callback is called at the end of Crypto calculation. */ +typedef void (*cy_crypto_callback_ptr_t)(void); + +/** The Crypto configuration structure. */ +typedef struct +{ + /** Defines the IPC channel used for client-server data exchange */ + uint32_t ipcChannel; + + /** Specifies the IPC notifier channel (IPC interrupt structure number) + to notify server that data for the operation is prepared */ + uint32_t acquireNotifierChannel; + + /** Specifies the IPC notifier channel (IPC interrupt structure number) + to notify client that operation is complete and data is valid */ + uint32_t releaseNotifierChannel; + + /** Specifies the release notifier interrupt configuration. It used for + internal purposes and user doesn't fill it. */ + cy_stc_sysint_t releaseNotifierConfig; + + /** User callback function. + If this field is NOT NULL, it called when Crypto operation + is complete. */ + cy_crypto_callback_ptr_t userCompleteCallback; + +#if (CY_CRYPTO_CORE_ENABLE) + /** Server-side user IRQ handler function, called when data for the + operation is prepared to process. + - If this field is NULL, server will use own interrupt handler + to get data. + - If this field is not NULL, server will call this interrupt handler. + This interrupt handler must call the + \ref Cy_Crypto_Server_GetDataHandler to get data to process. + + Note: In the second case user should process data separately and + clear interrupt by calling \ref Cy_Crypto_Server_Process. + This model is used in the + multitasking environment (e.g. CyOS). */ + cy_israddress userGetDataHandler; + + /** Server-side user IRQ handler function, called when a Crypto hardware + error occurs (interrupt was raised). + - If this field is NULL - server will use own interrupt handler + for error processing. + - If this field is not NULL - server will call this interrupt handler. + This interrupt handler must call the + \ref Cy_Crypto_Server_ErrorHandler to clear the interrupt. */ + cy_israddress userErrorHandler; + + /** Specifies the prepared data notifier interrupt configuration. It used + for internal purposes and user doesn't fill it. */ + cy_stc_sysint_t acquireNotifierConfig; + + /** Specifies the hardware error processing interrupt configuration. It used + for internal purposes and user doesn't fill it. */ + cy_stc_sysint_t cryptoErrorIntrConfig; +#endif /* (CY_CRYPTO_CORE_ENABLE) */ + +} cy_stc_crypto_config_t; + +/** \} group_crypto_config_structure */ + +/** +* \addtogroup group_crypto_cli_data_structures +* \{ +*/ + +#if (CPUSS_CRYPTO_VU == 1) +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the RSA public key and + * additional coefficients to accelerate RSA calculation. + * + * RSA key contained from two fields: + * - n - modulus part of the key + * - e - exponent part of the key. + * + * Other fields are accelerating coefficients and can be calculated by + * \ref Cy_Crypto_Rsa_CalcCoefs. +*/ +typedef struct +{ + /** The pointer to the modulus part of public key. */ + uint8_t *moduloPtr; + /** The modulus length, in bits, maximum supported size is 2048Bit */ + uint32_t moduloLength; + + /** The pointer to the exponent part of public key */ + uint8_t *pubExpPtr; + /** The exponent length, in bits, maximum supported size is 256Bit */ + uint32_t pubExpLength; + + /** The pointer to the Barrett coefficient. Memory for it should be + allocated by user with size moduloLength + 1. */ + uint8_t *barretCoefPtr; + + /** The pointer to the binary inverse of the modulo. Memory for it + should be allocated by user with size moduloLength. */ + uint8_t *inverseModuloPtr; + + /** The pointer to the (2^moduloLength mod modulo). Memory for it should + be allocated by user with size moduloLength */ + uint8_t *rBarPtr; +} cy_stc_crypto_rsa_pub_key_t; + +#endif /* #if (CPUSS_CRYPTO_VU == 1) */ + +/** Structure for storing a description of a Crypto hardware error */ +typedef struct +{ + /** + Captures error description information: + for INSTR_OPC_ERROR: - violating the instruction. + for INSTR_CC_ERROR : - violating the instruction condition code. + for BUS_ERROR : - violating the transfer address. */ + uint32_t errorStatus0; + + /** + [31] - Specifies if ERROR_STATUS0 and ERROR_STATUS1 capture valid + error-information. + [26..24] - The error source: + "0": INSTR_OPC_ERROR - an instruction decoder error. + "1": INSTR_CC_ERROR - an instruction condition code-error. + "2": BUS_ERROR - a bus master interface AHB-Lite bus-error. + "3": TR_AP_DETECT_ERROR. + [23..0] - Captures error description information. + For BUS_ERROR: + - violating the transfer, read the attribute (DATA23[0]). + - violating the transfer, the size attribute (DATA23[5:4]). + "0": an 8-bit transfer; + "1": 16 bits transfer; + "2": 32-bit transfer. */ + uint32_t errorStatus1; +} cy_stc_crypto_hw_error_t; + +/** \} group_crypto_cli_data_structures */ + + +/** The Crypto library functionality level. */ +typedef enum +{ + CY_CRYPTO_NO_LIBRARY = 0x00u, + CY_CRYPTO_BASE_LIBRARY = 0x01u, + CY_CRYPTO_EXTRA_LIBRARY = 0x02u, + CY_CRYPTO_FULL_LIBRARY = 0x03u, +} cy_en_crypto_lib_info_t; + + +/** +* \addtogroup group_crypto_enums +* \{ +*/ + +#if (CPUSS_CRYPTO_AES == 1) +/** The key length options for the AES method. */ +typedef enum +{ + CY_CRYPTO_KEY_AES_128 = 0x00u, /**< The AES key size is 128 bits */ + CY_CRYPTO_KEY_AES_192 = 0x01u, /**< The AES key size is 192 bits */ + CY_CRYPTO_KEY_AES_256 = 0x02u /**< The AES key size is 256 bits */ +} cy_en_crypto_aes_key_length_t; +#endif /* #if (CPUSS_CRYPTO_AES == 1) */ + +/** Defines the direction of the Crypto methods */ +typedef enum +{ + /** The forward mode, plain text will be encrypted into cipher text */ + CY_CRYPTO_ENCRYPT = 0x00u, + /** The reverse mode, cipher text will be decrypted into plain text */ + CY_CRYPTO_DECRYPT = 0x01u +} cy_en_crypto_dir_mode_t; + +#if (CPUSS_CRYPTO_SHA == 1) +/** Defines modes of SHA method */ +typedef enum +{ +#if (CPUSS_CRYPTO_SHA1 == 1) + CY_CRYPTO_MODE_SHA1 = 0x00u, /**< Sets the SHA1 mode */ +#endif /* #if (CPUSS_CRYPTO_SHA1 == 1) */ + +#if (CPUSS_CRYPTO_SHA256 == 1) + CY_CRYPTO_MODE_SHA224 = 0x11u, /**< Sets the SHA224 mode */ + CY_CRYPTO_MODE_SHA256 = 0x01u, /**< Sets the SHA256 mode */ +#endif /* #if (CPUSS_CRYPTO_SHA256 == 1) */ + +#if (CPUSS_CRYPTO_SHA512 == 1) + CY_CRYPTO_MODE_SHA384 = 0x12u, /**< Sets the SHA384 mode */ + CY_CRYPTO_MODE_SHA512 = 0x02u, /**< Sets the SHA512 mode */ + CY_CRYPTO_MODE_SHA512_256 = 0x22u, /**< Sets the SHA512/256 mode */ + CY_CRYPTO_MODE_SHA512_224 = 0x32u /**< Sets the SHA512/224 mode */ +#endif /* #if (CPUSS_CRYPTO_SHA512 == 1) */ +} cy_en_crypto_sha_mode_t; +#endif /* #if (CPUSS_CRYPTO_SHA == 1) */ + +/** Signature verification status */ +typedef enum +{ + CY_CRYPTO_RSA_VERIFY_SUCCESS = 0x00u, /**< PKCS1-v1.5 verify SUCCESS */ + CY_CRYPTO_RSA_VERIFY_FAIL = 0x01u /**< PKCS1-v1.5 verify FAILED */ +} cy_en_crypto_rsa_ver_result_t; + +/** Errors of the Crypto block */ +typedef enum +{ + /** Operation completed successfully. */ + CY_CRYPTO_SUCCESS = 0x00u, + + /** A hardware error occurred, detailed information is in stc_crypto_hw_error_t. */ + CY_CRYPTO_HW_ERROR = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x01u, + + /** The size of input data is not multiple of 16. */ + CY_CRYPTO_SIZE_NOT_X16 = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x02u, + + /** The key for the DES method is weak. */ + CY_CRYPTO_DES_WEAK_KEY = CY_CRYPTO_ID | CY_PDL_STATUS_WARNING | 0x03u, + + /** Communication between the client and server via IPC is broken. */ + CY_CRYPTO_COMM_FAIL = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x04u, + + /** The Crypto server is not started. */ + CY_CRYPTO_SERVER_NOT_STARTED = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x06u, + + /** The Crypto server in process state. */ + CY_CRYPTO_SERVER_BUSY = CY_CRYPTO_ID | CY_PDL_STATUS_INFO | 0x07u, + + /** The Crypto driver is not initialized. */ + CY_CRYPTO_NOT_INITIALIZED = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x08u, + + /** The Crypto hardware is not enabled. */ + CY_CRYPTO_HW_NOT_ENABLED = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x09u, + + /** The Crypto operation is not supported. */ + CY_CRYPTO_NOT_SUPPORTED = CY_CRYPTO_ID | CY_PDL_STATUS_ERROR | 0x0Au + +} cy_en_crypto_status_t; + +/** \} group_crypto_enums */ + +/** \cond INTERNAL */ + +/** Instruction to communicate between Client and Server */ +typedef enum +{ + CY_CRYPTO_INSTR_UNKNOWN = 0x00u, + CY_CRYPTO_INSTR_ENABLE = 0x01u, + CY_CRYPTO_INSTR_DISABLE = 0x02u, + +#if (CPUSS_CRYPTO_PR == 1) + CY_CRYPTO_INSTR_PRNG_INIT = 0x03u, + CY_CRYPTO_INSTR_PRNG = 0x04u, +#endif /* #if (CPUSS_CRYPTO_PR == 1) */ + +#if (CPUSS_CRYPTO_TR == 1) + CY_CRYPTO_INSTR_TRNG_INIT = 0x05u, + CY_CRYPTO_INSTR_TRNG = 0x06u, +#endif /* #if (CPUSS_CRYPTO_PR == 1) */ + +#if (CPUSS_CRYPTO_AES == 1) + CY_CRYPTO_INSTR_AES_INIT = 0x07u, + CY_CRYPTO_INSTR_AES_ECB = 0x08u, + CY_CRYPTO_INSTR_AES_CBC = 0x09u, + CY_CRYPTO_INSTR_AES_CFB = 0x0Au, + CY_CRYPTO_INSTR_AES_CTR = 0x0Bu, + CY_CRYPTO_INSTR_CMAC = 0x0Cu, +#endif /* #if (CPUSS_CRYPTO_AES == 1) */ + +#if (CPUSS_CRYPTO_SHA == 1) + CY_CRYPTO_INSTR_SHA = 0x0Du, +#endif /* #if (CPUSS_CRYPTO_SHA == 1) */ + +#if (CPUSS_CRYPTO_SHA == 1) + CY_CRYPTO_INSTR_HMAC = 0x0Eu, +#endif /* #if (CPUSS_CRYPTO_SHA == 1) */ + +#if (CPUSS_CRYPTO_STR == 1) + CY_CRYPTO_INSTR_MEM_CPY = 0x0Fu, + CY_CRYPTO_INSTR_MEM_SET = 0x10u, + CY_CRYPTO_INSTR_MEM_CMP = 0x11u, + CY_CRYPTO_INSTR_MEM_XOR = 0x12u, +#endif /* #if (CPUSS_CRYPTO_STR == 1) */ + +#if (CPUSS_CRYPTO_CRC == 1) + CY_CRYPTO_INSTR_CRC_INIT = 0x13u, + CY_CRYPTO_INSTR_CRC = 0x14u, +#endif /* #if (CPUSS_CRYPTO_CRC == 1) */ + +#if (CPUSS_CRYPTO_DES == 1) + CY_CRYPTO_INSTR_DES = 0x15u, + CY_CRYPTO_INSTR_3DES = 0x16u, +#endif /* #if (CPUSS_CRYPTO_DES == 1) */ + +#if (CPUSS_CRYPTO_VU == 1) + CY_CRYPTO_INSTR_RSA_PROC = 0x17u, + CY_CRYPTO_INSTR_RSA_COEF = 0x18u, +#endif /* #if (CPUSS_CRYPTO_VU == 1) */ + +#if (CPUSS_CRYPTO_SHA == 1) + CY_CRYPTO_INSTR_RSA_VER = 0x19u, +#endif /* #if (CPUSS_CRYPTO_SHA == 1) */ + + CY_CRYPTO_INSTR_SRV_INFO = 0x55u +} cy_en_crypto_comm_instr_t; + +/** \endcond */ + +/** +* \addtogroup group_crypto_cli_data_structures +* \{ +*/ + +#if (CPUSS_CRYPTO_AES == 1) +/** Structure for storing the AES state */ +typedef struct +{ + /** Pointer to AES key */ + uint32_t *key; + /** Pointer to AES inversed key */ + uint32_t *invKey; + /** AES key length */ + cy_en_crypto_aes_key_length_t keyLength; + /** AES processed block index (for CMAC, SHA operations) */ + uint32_t blockIdx; +} cy_stc_crypto_aes_state_t; +#endif /* #if (CPUSS_CRYPTO_AES == 1) */ + +/** \} group_crypto_cli_data_structures */ + +/************************************************************* +* Structures used for communication between Client and Server +***************************************************************/ + +/** +* \addtogroup group_crypto_srv_data_structures +* \{ +*/ + +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the server + * context. + */ +typedef struct +{ + /** IPC communication channel number */ + uint32_t ipcChannel; + /** IPC acquire interrupt channel number */ + uint32_t acquireNotifierChannel; + /** IPC release interrupt channel number */ + cy_israddress getDataHandlerPtr; + /** Crypto hardware errors interrupt handler */ + cy_israddress errorHandlerPtr; + /** Acquire notifier interrupt configuration */ + cy_stc_sysint_t acquireNotifierConfig; + /** Crypto hardware errors interrupt configuration */ + cy_stc_sysint_t cryptoErrorIntrConfig; + /** Hardware error occurrence flag */ + bool isHwErrorOccured; +} cy_stc_crypto_server_context_t; + +/** \} group_crypto_srv_data_structures */ + +/** +* \addtogroup group_crypto_cli_data_structures +* \{ +*/ + +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the global + * context. + */ +typedef struct +{ + /** Operation instruction code */ + cy_en_crypto_comm_instr_t instr; + /** Response from executed crypto function */ + cy_en_crypto_status_t resp; + /** Hardware processing errors */ + cy_stc_crypto_hw_error_t hwErrorStatus; + /** IPC communication channel number */ + uint32_t ipcChannel; + /** IPC acquire interrupt channel number */ + uint32_t acquireNotifierChannel; + /** IPC release interrupt channel number */ + uint32_t releaseNotifierChannel; + /** User callback for Crypto HW calculation complete event */ + cy_crypto_callback_ptr_t userCompleteCallback; + /** Release notifier interrupt configuration */ + cy_stc_sysint_t releaseNotifierConfig; + /** Pointer to the crypto function specific context data */ + void *xdata; +} cy_stc_crypto_context_t; + + +#if (CPUSS_CRYPTO_DES == 1) +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the DES operational + * context. + */ +typedef struct +{ + /** Operation direction (Encrypt / Decrypt) */ + cy_en_crypto_dir_mode_t dirMode; + /** Pointer to key data */ + uint32_t *key; + /** Pointer to data destination block */ + uint32_t *dst; + /** Pointer to data source block */ + uint32_t *src; +} cy_stc_crypto_context_des_t; +#endif /* #if (CPUSS_CRYPTO_DES == 1) */ + +#if (CPUSS_CRYPTO_AES == 1) +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the AES operational + * context. + */ +typedef struct +{ + /** AES state data */ + cy_stc_crypto_aes_state_t aesState; + /** Operation direction (Encrypt / Decrypt) */ + cy_en_crypto_dir_mode_t dirMode; + /** Operation data size */ + uint32_t srcSize; + /** Size of the last non-complete block (for CTR mode only) */ + uint32_t *srcOffset; + /** Initialization vector, in the CTR mode is used as nonceCounter */ + uint32_t *ivPtr; + /** AES processed block pointer (for CTR mode only) */ + uint32_t *streamBlock; + /** Pointer to data destination block */ + uint32_t *dst; + /** Pointer to data source block */ + uint32_t *src; +} cy_stc_crypto_context_aes_t; +#endif /* #if (CPUSS_CRYPTO_AES == 1) */ + +#if (CPUSS_CRYPTO_SHA == 1) +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the SHA operational + * context. + */ +typedef struct +{ + /** Pointer to data source block */ + uint32_t *message; + /** Operation data size */ + uint32_t messageSize; + /** Pointer to data destination block */ + uint32_t *dst; + /** SHA mode */ + cy_en_crypto_sha_mode_t mode; + /** Pointer to key data (for HMAC only) */ + uint32_t *key; + /** Key data length (for HMAC only) */ + uint32_t keyLength; +} cy_stc_crypto_context_sha_t; +#endif /* #if (CPUSS_CRYPTO_SHA == 1) */ + +#if (CPUSS_CRYPTO_PR == 1) +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the PRNG operational + * context. + */ +typedef struct +{ + uint32_t lfsr32InitState; /**< lfsr32 initialization data */ + uint32_t lfsr31InitState; /**< lfsr31 initialization data */ + uint32_t lfsr29InitState; /**< lfsr29 initialization data */ + uint32_t max; /**< Maximum of the generated value */ + uint32_t *prngNum; /**< Pointer to generated value */ +} cy_stc_crypto_context_prng_t; +#endif /* #if (CPUSS_CRYPTO_PR == 1) */ + +#if (CPUSS_CRYPTO_TR == 1) +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the TRNG operational + * context. + */ +typedef struct +{ + /** + The polynomial for the programmable Galois ring oscillator (TR_GARO_CTL). + The polynomial is represented WITHOUT the high order bit (this bit is + always assumed '1'). + The polynomial should be aligned so that more significant bits + (bit 30 and down) contain the polynomial and less significant bits + (bit 0 and up) contain padding '0's. */ + uint32_t GAROPol; + + /** + The polynomial for the programmable Fibonacci ring oscillator(TR_FIRO_CTL). + The polynomial is represented WITHOUT the high order bit (this bit is + always assumed '1'). + The polynomial should be aligned so that more significant bits + (bit 30 and down) contain the polynomial and less significant bits + (bit 0 and up) contain padding '0's. */ + uint32_t FIROPol; + /** Maximum of the generated value */ + uint32_t max; + /** Pointer to generated value */ + uint32_t *trngNum; +} cy_stc_crypto_context_trng_t; +#endif /* #if (CPUSS_CRYPTO_TR == 1) */ + +#if (CPUSS_CRYPTO_STR == 1) +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the STR operational + * context. + */ +typedef struct +{ + void const *src0; /**< Pointer to 1-st string source */ + void const *src1; /**< Pointer to 2-nd string source */ + void *dst; /**< Pointer to string destination */ + uint32_t dataSize; /**< Operation data size */ + uint32_t data; /**< Operation data value (for memory setting) */ +} cy_stc_crypto_context_str_t; +#endif /* #if (CPUSS_CRYPTO_STR == 1) */ + +#if (CPUSS_CRYPTO_CRC == 1) +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the CRC operational + * context. + */ +typedef struct +{ + void* srcData; /**< Pointer to data source block */ + uint32_t dataSize; /**< Operation data size */ + uint32_t *crc; /**< Pointer to CRC destination variable */ + uint32_t polynomial; /**< Polynomial for CRC calculate */ + uint32_t lfsrInitState; /**< CRC calculation initial value */ + uint32_t dataReverse; /**< Input data reverse flag */ + uint32_t dataXor; /**< Input data XOR flag */ + uint32_t remReverse; /**< Output data reverse flag */ + uint32_t remXor; /**< Output data XOR flag */ +} cy_stc_crypto_context_crc_t; +#endif /* #if (CPUSS_CRYPTO_CRC == 1) */ + +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the RSA verifying + * context. + */ +typedef struct +{ + /** Pointer to verification result /ref cy_en_crypto_rsa_ver_result_t */ + cy_en_crypto_rsa_ver_result_t *verResult; + /** SHA digest type, used with SHA calculation of the message */ + cy_en_crypto_sha_mode_t digestType; + /** SHA digest of the message, calculated with digestType */ + uint32_t const *hash; + /** Previously decrypted RSA signature */ + uint32_t const *decryptedSignature; + /** Length of the decrypted RSA signature */ + uint32_t decryptedSignatureLength; +} cy_stc_crypto_context_rsa_ver_t; + +#if (CPUSS_CRYPTO_VU == 1) +/** + * Firmware allocates memory and provides a pointer to this structure in + * function calls. Firmware does not write or read values in this structure. + * The driver uses this structure to store and manipulate the RSA operational + * context. + */ +typedef struct +{ + /** Pointer to key data */ + cy_stc_crypto_rsa_pub_key_t const *key; + /** Pointer to data source block */ + uint32_t const *message; + /** Operation data size */ + uint32_t messageSize; + /** Pointer to data destination block */ + uint32_t *result; +} cy_stc_crypto_context_rsa_t; +#endif /* #if (CPUSS_CRYPTO_VU == 1) */ + +/** \} group_crypto_cli_data_structures */ + +#endif /* (CPUSS_CRYPTO_PRESENT == 1) */ + +#endif /* #if !defined(CY_CRYPTO_COMMON_H) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_config.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_config.c new file mode 100644 index 0000000000..99532a4a23 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_config.c @@ -0,0 +1,69 @@ +/***************************************************************************//** +* \file +* \version 2.0 +* +* Description: +* This C file is not intended to be part of the Crypto driver. It is the code +* required to configure the crypto driver by user. +* +******************************************************************************** +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_crypto_config.h" + +#include "ipc/cy_ipc_drv.h" +#include "sysint/cy_sysint.h" + + +/** The Crypto configuration structure. */ +const cy_stc_crypto_config_t cryptoConfig = +{ + /* .ipcChannel */ CY_IPC_CHAN_CRYPTO, + /* .acquireNotifierChannel */ CY_CRYPTO_IPC_INTR_NOTIFY_NUM, + /* .releaseNotifierChannel */ CY_CRYPTO_IPC_INTR_RELEASE_NUM, + + /* .releaseNotifierConfig */ { +#if (CY_CPU_CORTEX_M0P) + /* .intrSrc */ CY_CRYPTO_CM0_RELEASE_INTR_NR, + /* .cm0pSrc */ (cy_en_intr_t)CY_IPC_INTR_NUM_TO_VECT((int32_t)CY_CRYPTO_IPC_INTR_RELEASE_NUM), +#else + /* .intrSrc */ (IRQn_Type)CY_IPC_INTR_NUM_TO_VECT((int32_t)CY_CRYPTO_IPC_INTR_RELEASE_NUM), +#endif + /* .intrPriority */ CY_CRYPTO_RELEASE_INTR_PR, + }, + /* .userCompleteCallback */ NULL + +#if (CY_CRYPTO_CORE_ENABLE) + , + /* .userGetDataHandler */ NULL, + /* .userErrorHandler */ NULL, + + /* .acquireNotifierConfig */ { +#if (CY_CPU_CORTEX_M0P) + /* .intrSrc */ CY_CRYPTO_CM0_NOTIFY_INTR_NR, + /* .cm0pSrc */ (cy_en_intr_t)CY_IPC_INTR_NUM_TO_VECT((int32_t)CY_CRYPTO_IPC_INTR_NOTIFY_NUM), +#else + /* .intrSrc */ (IRQn_Type)CY_IPC_INTR_NUM_TO_VECT((int32_t)CY_CRYPTO_IPC_INTR_NOTIFY_NUM), +#endif + /* .intrPriority */ CY_CRYPTO_NOTIFY_INTR_PR, + }, + /* .cryptoErrorIntrConfig */ { +#if (CY_CPU_CORTEX_M0P) + /* .intrSrc */ CY_CRYPTO_CM0_ERROR_INTR_NR, + /* .cm0pSrc */ cpuss_interrupt_crypto_IRQn, +#else + /* .intrSrc */ cpuss_interrupt_crypto_IRQn, +#endif + /* .intrPriority */ CY_CRYPTO_ERROR_INTR_PR, + } +#endif + +}; + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_config.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_config.h new file mode 100644 index 0000000000..d99a8e61a5 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_config.h @@ -0,0 +1,57 @@ +/***************************************************************************//** +* \file cy_crypto_config.h +* \version 2.0 +* +* \brief +* This file provides user parameters for the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CRYPTO_CONFIG_H) +#define CY_CRYPTO_CONFIG_H + +#include "cy_device_headers.h" +#include "crypto/cy_crypto_common.h" + +/* Defines to configure Crypto driver */ +extern const cy_stc_crypto_config_t cryptoConfig; + +/** +* \addtogroup group_crypto_config_macros +* \{ +* +* These constants defines an interrupts settings for IPC channel used for the +* client-server communications. +* +* On the CM4 core crypto driver uses IPC hardware depended interrupt sources. +* +* For CM0+ core user must define the multiplexed interrupt sources by yourself. +*/ + +/** Number of Crypto Notify interrupt mapped to CM0+ */ +#define CY_CRYPTO_CM0_NOTIFY_INTR_NR (NvicMux2_IRQn) +/** Priority of Crypto Notify interrupt, equal to CM0+ and CM4 cores */ +#define CY_CRYPTO_NOTIFY_INTR_PR (2u) + +/** Number of Crypto Release interrupt mapped to CM0+ */ +#define CY_CRYPTO_CM0_RELEASE_INTR_NR (NvicMux30_IRQn) +/** Priority of Crypto Release interrupt, equal to CM0+ and CM4 cores */ +#define CY_CRYPTO_RELEASE_INTR_PR (2u) + +/** Number of Crypto Error interrupt mapped to CM0+ */ +#define CY_CRYPTO_CM0_ERROR_INTR_NR (NvicMux31_IRQn) +/** Priority of Crypto Error interrupt mapped to CM0+ */ +#define CY_CRYPTO_ERROR_INTR_PR (2u) + +/** \} group_crypto_config_macros */ + +#endif /* #if !defined(CY_CRYPTO_CONFIG_H) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_server.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_server.h new file mode 100644 index 0000000000..9fc2dc6721 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/crypto/cy_crypto_server.h @@ -0,0 +1,125 @@ +/***************************************************************************//** +* \file cy_crypto_server.h +* \version 2.0 +* +* \brief +* This file provides the prototypes for common API +* in the Crypto driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#if !defined(CY_CRYPTO_SERVER_H) +#define CY_CRYPTO_SERVER_H + +#include "crypto/cy_crypto_common.h" +#include "syslib/cy_syslib.h" + +#if (CY_CRYPTO_CORE_ENABLE) + +#if (CPUSS_CRYPTO_PRESENT == 1) + +#if defined(__cplusplus) +extern "C" { +#endif + +/** +* \addtogroup group_crypto_srv_functions +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_Start +****************************************************************************//** +* +* This function starts the Crypto server on the CM0+ core, sets up an interrupt +* for the IPC Crypto channel on the CM0+ core, sets up an interrupt +* to catch Crypto HW errors. Should be invoked only on CM0. +* +* This function available for CM0+ core only. +* +* \param config +* The Crypto configuration structure. +* +* \param context +* The pointer to the \ref cy_stc_crypto_server_context_t structure that stores +* the Crypto server context. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Server_Start(cy_stc_crypto_config_t const *config, + cy_stc_crypto_server_context_t *context); + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_Stop +****************************************************************************//** +* +* This function stops the Crypto server by disabling the IPC notify interrupt +* and Crypto error interrupt. Should be invoked only on CM0. +* +* This function available for CM0+ core only. +* +* \return +* A Crypto status \ref cy_en_crypto_status_t. +* +*******************************************************************************/ +cy_en_crypto_status_t Cy_Crypto_Server_Stop(void); + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_Process +****************************************************************************//** +* +* This function parses input data received from the Crypto Client, +* runs the appropriate Crypto function and releases the Crypto IPC channel. +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +void Cy_Crypto_Server_Process(void); + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_GetDataHandler +****************************************************************************//** +* +* This function is a IPC Crypto channel notify interrupt-routine. +* It receives information from the Crypto client, +* runs the process if user not setup own handler. +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +void Cy_Crypto_Server_GetDataHandler(void); + +/******************************************************************************* +* Function Name: Cy_Crypto_Server_ErrorHandler +****************************************************************************//** +* +* This function is a routine to handle an interrupt caused by the Crypto hardware error. +* +* This function available for CM0+ core only. +* +*******************************************************************************/ +void Cy_Crypto_Server_ErrorHandler(void); + +/** \} group_crypto_srv_functions */ + +#if defined(__cplusplus) +} +#endif + +#endif /* #if (CPUSS_CRYPTO_PRESENT == 1) */ + +#endif /* #if (CY_CRYPTO_CORE_ENABLE) */ + +#endif /* #if !defined(CY_CRYPTO_SERVER_H) */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctb/cy_ctb.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctb/cy_ctb.c new file mode 100644 index 0000000000..3755204f1f --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctb/cy_ctb.c @@ -0,0 +1,1311 @@ +/***************************************************************************//** +* \file cy_ctb.c +* \version 1.0 +* +* \brief +* Provides the public functions for the CTB driver. +* +******************************************************************************** +* \copyright +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "ctb/cy_ctb.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/*************************************** +* Fast Config Selections +***************************************/ +const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Unused = +{ + /*.oa0Power */ CY_CTB_POWER_OFF, + /*.oa0Mode */ CY_CTB_MODE_OPAMP1X, + /*.oa0SwitchCtrl */ CY_CTB_DEINIT, + /*.ctdSwitchCtrl */ CY_CTB_DEINIT, +}; + +const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Comp = +{ + /*.oa0Power */ CY_CTB_POWER_MEDIUM, + /*.oa0Mode */ CY_CTB_MODE_COMP, + /*.oa0SwitchCtrl */ CY_CTB_DEINIT, + /*.ctdSwitchCtrl */ CY_CTB_DEINIT, +}; + +const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Opamp1x = +{ + /*.oa0Power */ CY_CTB_POWER_MEDIUM, + /*.oa0Mode */ CY_CTB_MODE_OPAMP1X, + /*.oa0SwitchCtrl */ CY_CTB_DEINIT, + /*.ctdSwitchCtrl */ CY_CTB_DEINIT, +}; + +const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Opamp10x = +{ + /*.oa0Power */ CY_CTB_POWER_MEDIUM, + /*.oa0Mode */ CY_CTB_MODE_OPAMP10X, + /*.oa0SwitchCtrl */ CY_CTB_DEINIT, + /*.ctdSwitchCtrl */ CY_CTB_DEINIT, +}; + +const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Diffamp = +{ + /*.oa0Power */ CY_CTB_POWER_MEDIUM, + /*.oa0Mode */ CY_CTB_MODE_OPAMP10X, + /*.oa0SwitchCtrl */ (uint32_t) CY_CTB_SW_OA0_POS_PIN0_MASK | (uint32_t) CY_CTB_SW_OA0_NEG_PIN1_MASK, + /*.ctdSwitchCtrl */ (uint32_t) CY_CTB_SW_CTD_CHOLD_OA0_POS_ISOLATE_MASK, +}; + +const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Vdac_Out = +{ + /*.oa0Power */ CY_CTB_POWER_MEDIUM, + /*.oa0Mode */ CY_CTB_MODE_OPAMP10X, + /*.oa0SwitchCtrl */ (uint32_t) CY_CTB_SW_OA0_NEG_OUT_MASK | (uint32_t) CY_CTB_SW_OA0_OUT_SHORT_1X_10X_MASK, + /*.ctdSwitchCtrl */ (uint32_t) CY_CTB_SW_CTD_OUT_CHOLD_MASK | (uint32_t) CY_CTB_SW_CTD_CHOLD_OA0_POS_MASK, +}; + +const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Vdac_Out_SH = +{ + /*.oa0Power */ CY_CTB_POWER_MEDIUM, + /*.oa0Mode */ CY_CTB_MODE_OPAMP10X, + /*.oa0SwitchCtrl */ (uint32_t) CY_CTB_SW_OA0_NEG_OUT_MASK | (uint32_t) CY_CTB_SW_OA0_OUT_SHORT_1X_10X_MASK, + /*.ctdSwitchCtrl */ (uint32_t) CY_CTB_SW_CTD_OUT_CHOLD_MASK | (uint32_t) CY_CTB_SW_CTD_CHOLD_OA0_POS_MASK | (uint32_t) CY_CTB_SW_CTD_CHOLD_CONNECT_MASK, +}; + +const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Unused = +{ + /*.oa1Power */ CY_CTB_POWER_OFF, + /*.oa1Mode */ CY_CTB_MODE_OPAMP1X, + /*.oa1SwitchCtrl */ CY_CTB_DEINIT, + /*.ctdSwitchCtrl */ CY_CTB_DEINIT, +}; + +const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Comp = +{ + /*.oa1Power */ CY_CTB_POWER_MEDIUM, + /*.oa1Mode */ CY_CTB_MODE_COMP, + /*.oa1SwitchCtrl */ CY_CTB_DEINIT, + /*.ctdSwitchCtrl */ CY_CTB_DEINIT, +}; + +const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Opamp1x = +{ + /*.oa1Power */ CY_CTB_POWER_MEDIUM, + /*.oa1Mode */ CY_CTB_MODE_OPAMP1X, + /*.oa1SwitchCtrl */ CY_CTB_DEINIT, + /*.ctdSwitchCtrl */ CY_CTB_DEINIT, +}; + +const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Opamp10x = +{ + /*.oa1Power */ CY_CTB_POWER_MEDIUM, + /*.oa1Mode */ CY_CTB_MODE_OPAMP10X, + /*.oa1SwitchCtrl */ CY_CTB_DEINIT, + /*.ctdSwitchCtrl */ CY_CTB_DEINIT, +}; + +const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Diffamp = +{ + /*.oa1Power */ CY_CTB_POWER_MEDIUM, + /*.oa1Mode */ CY_CTB_MODE_OPAMP10X, + /*.oa1SwitchCtrl */ (uint32_t) CY_CTB_SW_OA1_POS_PIN7_MASK | (uint32_t) CY_CTB_SW_OA1_NEG_PIN4_MASK, + /*.ctdSwitchCtrl */ CY_CTB_DEINIT, +}; + +const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Vdac_Ref_Aref = +{ + /*.oa1Power */ CY_CTB_POWER_MEDIUM, + /*.oa1Mode */ CY_CTB_MODE_OPAMP1X, + /*.oa1SwitchCtrl */ (uint32_t) CY_CTB_SW_OA1_NEG_OUT_MASK | (uint32_t) CY_CTB_SW_OA1_POS_AREF_MASK, + /*.ctdSwitchCtrl */ (uint32_t) CY_CTB_SW_CTD_REF_OA1_OUT_MASK, +}; + +const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Vdac_Ref_Pin5 = +{ + /*.oa1Power */ CY_CTB_POWER_MEDIUM, + /*.oa1Mode */ CY_CTB_MODE_OPAMP1X, + /*.oa1SwitchCtrl */ (uint32_t) CY_CTB_SW_OA1_NEG_OUT_MASK | (uint32_t) CY_CTB_SW_OA1_POS_PIN5_MASK, + /*.ctdSwitchCtrl */ (uint32_t) CY_CTB_SW_CTD_REF_OA1_OUT_MASK, +}; + +/******************************************************************************* +* Function Name: Cy_CTB_Init +****************************************************************************//** +* +* Initializes or restores the CTB and both Opamps according to the +* provided settings. Parameters are usually set only once, at initialization. +* +* \param base +* Pointer to structure describing registers +* +* \param config +* Pointer to structure containing configuration data +* +* \return cy_en_ctb_status_t +* Status of initialization, CY_CTB_SUCCESS or CY_CTB_BAD_PARAM +* +*******************************************************************************/ +cy_en_ctb_status_t Cy_CTB_Init(CTBM_Type *base, const cy_stc_ctb_config_t *config) +{ + CY_ASSERT_L1(NULL != base); + CY_ASSERT_L1(NULL != config); + + cy_en_ctb_status_t result; + + if ((NULL == base) || (NULL == config)) + { + result = CY_CTB_BAD_PARAM; + } + else + { + CY_ASSERT_L3(CY_CTB_DEEPSLEEP(config->deepSleep)); + + /* Enum checks for Opamp0 config */ + CY_ASSERT_L3(CY_CTB_OAPOWER(config->oa0Power)); + CY_ASSERT_L3(CY_CTB_OAMODE(config->oa0Mode)); + CY_ASSERT_L3(CY_CTB_OAPUMP(config->oa0Pump)); + CY_ASSERT_L3(CY_CTB_COMPEDGE(config->oa0CompEdge)); + CY_ASSERT_L3(CY_CTB_COMPLEVEL(config->oa0CompLevel)); + CY_ASSERT_L3(CY_CTB_COMPBYPASS(config->oa0CompBypass)); + CY_ASSERT_L3(CY_CTB_COMPHYST(config->oa0CompHyst)); + + /* Enum checks for Opamp0 config */ + CY_ASSERT_L3(CY_CTB_OAPOWER(config->oa1Power)); + CY_ASSERT_L3(CY_CTB_OAMODE(config->oa1Mode)); + CY_ASSERT_L3(CY_CTB_OAPUMP(config->oa1Pump)); + CY_ASSERT_L3(CY_CTB_COMPEDGE(config->oa1CompEdge)); + CY_ASSERT_L3(CY_CTB_COMPLEVEL(config->oa1CompLevel)); + CY_ASSERT_L3(CY_CTB_COMPBYPASS(config->oa1CompBypass)); + CY_ASSERT_L3(CY_CTB_COMPHYST(config->oa1CompHyst)); + + /* Boundary checks for analog routing switch masks */ + CY_ASSERT_L2(CY_CTB_OA0SWITCH(config->oa0SwitchCtrl)); + CY_ASSERT_L2(CY_CTB_OA1SWITCH(config->oa1SwitchCtrl)); + CY_ASSERT_L2(CY_CTB_CTDSWITCH(config->ctdSwitchCtrl)); + + base->CTB_CTRL = (uint32_t) config->deepSleep; + base->OA_RES0_CTRL = (uint32_t) config->oa0Power \ + | (uint32_t) config->oa0Mode \ + | (uint32_t) config->oa0Pump \ + | (uint32_t) config->oa0CompEdge \ + | (uint32_t) config->oa0CompLevel \ + | (uint32_t) config->oa0CompBypass \ + | (uint32_t) config->oa0CompHyst \ + | ((CY_CTB_MODE_OPAMP1X == config->oa0Mode) ? CY_CTB_OPAMP_BOOST_ENABLE : CY_CTB_OPAMP_BOOST_DISABLE); + + base->OA_RES1_CTRL = (uint32_t) config->oa1Power \ + | (uint32_t) config->oa1Mode \ + | (uint32_t) config->oa1Pump \ + | (uint32_t) config->oa1CompEdge \ + | (uint32_t) config->oa1CompLevel \ + | (uint32_t) config->oa1CompBypass \ + | (uint32_t) config->oa1CompHyst \ + | ((CY_CTB_MODE_OPAMP1X == config->oa1Mode) ? CY_CTB_OPAMP_BOOST_ENABLE : CY_CTB_OPAMP_BOOST_DISABLE); + + base->INTR_MASK = (config->oa0CompIntrEn ? CTBM_INTR_MASK_COMP0_MASK_Msk : CY_CTB_DEINIT) \ + | (config->oa1CompIntrEn ? CTBM_INTR_MASK_COMP1_MASK_Msk : CY_CTB_DEINIT); + + base->OA0_COMP_TRIM = (uint32_t) ((config->oa0Mode == CY_CTB_MODE_OPAMP10X) ? CY_CTB_OPAMP_COMPENSATION_CAP_MAX: CY_CTB_OPAMP_COMPENSATION_CAP_MIN); + base->OA1_COMP_TRIM = (uint32_t) ((config->oa1Mode == CY_CTB_MODE_OPAMP10X) ? CY_CTB_OPAMP_COMPENSATION_CAP_MAX: CY_CTB_OPAMP_COMPENSATION_CAP_MIN); + + if (config->configRouting) + { + base->OA0_SW = config->oa0SwitchCtrl; + base->OA1_SW = config->oa1SwitchCtrl; + base->CTD_SW = config->ctdSwitchCtrl; + } + + if (config->enable) + { + Cy_CTB_Enable(base); + } + + result = CY_CTB_SUCCESS; + } + + return result; +} + +/******************************************************************************* +* Function Name: Cy_CTB_OpampInit +****************************************************************************//** +* +* Initializes each Opamp separately without impacting analog routing. +* Intended for use by automatic analog routing and configuration tools +* to configure each Opamp without having to integrate the settings with +* those of the other Opamp first. +* +* Can also be used to configure both Opamps to have the same settings. +* +* \param base +* Pointer to structure describing registers +* +* \param opampNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \param config +* Pointer to structure containing configuration data +* +* \return cy_en_ctb_status_t +* Status of initialization, CY_CTB_SUCCESS or CY_CTB_BAD_PARAM +* +*******************************************************************************/ +cy_en_ctb_status_t Cy_CTB_OpampInit(CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum, const cy_stc_ctb_opamp_config_t *config) +{ + CY_ASSERT_L1(NULL != base); + CY_ASSERT_L1(NULL != config); + + cy_en_ctb_status_t result; + uint32_t oaResCtrl; + + if ((NULL == base) || (NULL == config)) + { + result = CY_CTB_BAD_PARAM; + } + else + { + CY_ASSERT_L3(CY_CTB_OPAMPNUM(opampNum)); + CY_ASSERT_L3(CY_CTB_DEEPSLEEP(config->deepSleep)); + CY_ASSERT_L3(CY_CTB_OAPOWER(config->oaPower)); + CY_ASSERT_L3(CY_CTB_OAMODE(config->oaMode)); + CY_ASSERT_L3(CY_CTB_OAPUMP(config->oaPump)); + CY_ASSERT_L3(CY_CTB_COMPEDGE(config->oaCompEdge)); + CY_ASSERT_L3(CY_CTB_COMPLEVEL(config->oaCompLevel)); + CY_ASSERT_L3(CY_CTB_COMPBYPASS(config->oaCompBypass)); + CY_ASSERT_L3(CY_CTB_COMPHYST(config->oaCompHyst)); + + base->CTB_CTRL = (uint32_t) config->deepSleep; + + /* The two Opamp control registers are symmetrical */ + oaResCtrl = (uint32_t) config->oaPower \ + | (uint32_t) config->oaMode \ + | (uint32_t) config->oaPump \ + | (uint32_t) config->oaCompEdge \ + | (uint32_t) config->oaCompLevel \ + | (uint32_t) config->oaCompBypass \ + | (uint32_t) config->oaCompHyst \ + | ((CY_CTB_MODE_OPAMP1X == config->oaMode) ? CY_CTB_OPAMP_BOOST_ENABLE : CY_CTB_OPAMP_BOOST_DISABLE); + + if ((opampNum == CY_CTB_OPAMP_0) || (opampNum == CY_CTB_OPAMP_BOTH)) + { + base->OA_RES0_CTRL = oaResCtrl; + base->OA0_COMP_TRIM = (uint32_t) ((config->oaMode == CY_CTB_MODE_OPAMP10X) ? CY_CTB_OPAMP_COMPENSATION_CAP_MAX: CY_CTB_OPAMP_COMPENSATION_CAP_MIN); + + /* The INTR_MASK register is shared between the two Opamps */ + base->INTR_MASK |= (config->oaCompIntrEn ? CTBM_INTR_MASK_COMP0_MASK_Msk : CY_CTB_DEINIT); + } + + if ((opampNum == CY_CTB_OPAMP_1) || (opampNum == CY_CTB_OPAMP_BOTH)) + { + base->OA_RES1_CTRL = oaResCtrl; + base->OA1_COMP_TRIM = (uint32_t) ((config->oaMode == CY_CTB_MODE_OPAMP10X) ? CY_CTB_OPAMP_COMPENSATION_CAP_MAX: CY_CTB_OPAMP_COMPENSATION_CAP_MIN); + + /* The INTR_MASK register is shared between the two Opamps */ + base->INTR_MASK |= (config->oaCompIntrEn ? CTBM_INTR_MASK_COMP1_MASK_Msk : CY_CTB_DEINIT); + } + + if (config->enable) + { + Cy_CTB_Enable(base); + } + + + result = CY_CTB_SUCCESS; + } + + return result; +} + +/******************************************************************************* +* Function Name: Cy_CTB_DeInit +****************************************************************************//** +* +* Reset CTB registers back to power on reset defaults. +* +* \param base +* Pointer to structure describing registers +* +* \param deInitRouting +* If true, all analog routing switches are reset to their default state. +* If false, analog switch registers are untouched. +* +* \return cy_en_ctb_status_t +* Status of initialization, CY_CTB_SUCCESS or CY_CTB_BAD_PARAM +* +*******************************************************************************/ +cy_en_ctb_status_t Cy_CTB_DeInit(CTBM_Type *base, bool deInitRouting) +{ + CY_ASSERT_L1(NULL != base); + + cy_en_ctb_status_t result; + + if (NULL == base) + { + result = CY_CTB_BAD_PARAM; + } + else + { + base->CTB_CTRL = CY_CTB_DEINIT; + base->OA_RES0_CTRL = CY_CTB_DEINIT; + base->OA_RES1_CTRL = CY_CTB_DEINIT; + base->INTR_MASK = CY_CTB_DEINIT; + + if (deInitRouting) + { + base->OA0_SW_CLEAR = CY_CTB_DEINIT_OA0_SW; + base->OA1_SW_CLEAR = CY_CTB_DEINIT_OA1_SW; + base->CTD_SW_CLEAR = CY_CTB_DEINIT_CTD_SW; + } + + result = CY_CTB_SUCCESS; + } + + return result; +} + +/******************************************************************************* +* Function Name: Cy_CTB_FastInit +****************************************************************************//** +* +* Initializes each Opamp of the CTB to one of the common use modes. +* These provide a quick and easy method of configuring the CTB when using +* the PDL driver for device configuration. Only routing switches required for +* the selected mode are configured, leaving final input and output connections +* to the user. Additional use modes are provided. These correspond with VDAC +* driver modes to support easy configuration of VDAC output buffer and input +* reference buffer options when used with the VDAC PDL driver. +* +* Other configuration options are set to: +* - .oaPump = CY_CTB_PUMP_ENABLE +* - .oaCompEdge = CY_CTB_COMP_EDGE_BOTH +* - .oaCompLevel = CY_CTB_COMP_DSI_TRIGGER_OUT_PULSE +* - .oaCompBypass = CY_CTB_COMP_BYPASS_SYNC +* - .oaCompHyst = CY_CTB_COMP_HYST_10MV +* - .oaCompIntrEn = true + +* \param base +* Pointer to structure describing registers +* +* \param config0 +* Pointer to structure containing configuration data for quick initialization +* of Opamp0. Use one of the provided structures or define your own. +* - \ref Cy_CTB_Fast_Opamp0_Unused +* - \ref Cy_CTB_Fast_Opamp0_Comp +* - \ref Cy_CTB_Fast_Opamp0_Opamp1x +* - \ref Cy_CTB_Fast_Opamp0_Opamp10x +* - \ref Cy_CTB_Fast_Opamp0_Diffamp +* - \ref Cy_CTB_Fast_Opamp0_Vdac_Out +* - \ref Cy_CTB_Fast_Opamp0_Vdac_Out_SH +* +* \param config1 +* Pointer to structure containing configuration data for quick initialization +* of Opamp1. Use one of the provided structures or define your own. +* - \ref Cy_CTB_Fast_Opamp1_Unused +* - \ref Cy_CTB_Fast_Opamp1_Comp +* - \ref Cy_CTB_Fast_Opamp1_Opamp1x +* - \ref Cy_CTB_Fast_Opamp1_Opamp10x +* - \ref Cy_CTB_Fast_Opamp1_Diffamp +* - \ref Cy_CTB_Fast_Opamp1_Vdac_Ref_Aref +* - \ref Cy_CTB_Fast_Opamp1_Vdac_Ref_Pin5 +* +* \return cy_en_ctb_status_t +* Status of initialization, CY_CTB_SUCCESS or CY_CTB_BAD_PARAM +* +*******************************************************************************/ +cy_en_ctb_status_t Cy_CTB_FastInit(CTBM_Type *base, const cy_stc_ctb_fast_config_oa0_t *config0, const cy_stc_ctb_fast_config_oa1_t *config1) +{ + CY_ASSERT_L1(NULL != base); + CY_ASSERT_L1(NULL != config0); + CY_ASSERT_L1(NULL != config1); + + cy_en_ctb_status_t result; + + if ((NULL == base) || (NULL == config0) || (NULL == config1)) + { + result = CY_CTB_BAD_PARAM; + } + else + { + /* Enum and boundary checks for config0 */ + CY_ASSERT_L3(CY_CTB_OAPOWER(config0->oa0Power)); + CY_ASSERT_L3(CY_CTB_OAMODE(config0->oa0Mode)); + CY_ASSERT_L2(CY_CTB_OA0SWITCH(config0->oa0SwitchCtrl)); + CY_ASSERT_L2(CY_CTB_CTDSWITCH(config0->ctdSwitchCtrl)); + + /* Enum and boundary checks for config1 */ + CY_ASSERT_L3(CY_CTB_OAPOWER(config1->oa1Power)); + CY_ASSERT_L3(CY_CTB_OAMODE(config1->oa1Mode)); + CY_ASSERT_L2(CY_CTB_OA1SWITCH(config1->oa1SwitchCtrl)); + CY_ASSERT_L2(CY_CTB_CTDSWITCH(config1->ctdSwitchCtrl)); + + base->CTB_CTRL = (uint32_t) CY_CTB_DEEPSLEEP_DISABLE; + + base->OA_RES0_CTRL = (uint32_t) config0->oa0Power \ + | (uint32_t) config0->oa0Mode \ + | (uint32_t) CY_CTB_PUMP_ENABLE \ + | (uint32_t) CY_CTB_COMP_EDGE_BOTH \ + | (uint32_t) CY_CTB_COMP_DSI_TRIGGER_OUT_PULSE \ + | (uint32_t) CY_CTB_COMP_BYPASS_SYNC \ + | (uint32_t) CY_CTB_COMP_HYST_10MV \ + | ((CY_CTB_MODE_OPAMP1X == config0->oa0Mode) ? CY_CTB_OPAMP_BOOST_ENABLE : CY_CTB_OPAMP_BOOST_DISABLE); + + base->OA_RES1_CTRL = (uint32_t) config1->oa1Power \ + | (uint32_t) config1->oa1Mode \ + | (uint32_t) CY_CTB_PUMP_ENABLE \ + | (uint32_t) CY_CTB_COMP_EDGE_BOTH \ + | (uint32_t) CY_CTB_COMP_DSI_TRIGGER_OUT_PULSE \ + | (uint32_t) CY_CTB_COMP_BYPASS_SYNC \ + | (uint32_t) CY_CTB_COMP_HYST_10MV \ + | ((CY_CTB_MODE_OPAMP1X == config1->oa1Mode) ? CY_CTB_OPAMP_BOOST_ENABLE : CY_CTB_OPAMP_BOOST_DISABLE); + + base->INTR_MASK = CTBM_INTR_MASK_COMP0_MASK_Msk | CTBM_INTR_MASK_COMP1_MASK_Msk; + + base->OA0_COMP_TRIM = (uint32_t) ((config0->oa0Mode == CY_CTB_MODE_OPAMP10X) ? CY_CTB_OPAMP_COMPENSATION_CAP_MAX: CY_CTB_OPAMP_COMPENSATION_CAP_MIN); + base->OA1_COMP_TRIM = (uint32_t) ((config1->oa1Mode == CY_CTB_MODE_OPAMP10X) ? CY_CTB_OPAMP_COMPENSATION_CAP_MAX: CY_CTB_OPAMP_COMPENSATION_CAP_MIN); + + base->OA0_SW = config0->oa0SwitchCtrl; + base->OA1_SW = config1->oa1SwitchCtrl; + base->CTD_SW = config0->ctdSwitchCtrl | config1->ctdSwitchCtrl; + + result = CY_CTB_SUCCESS; + } + + return result; +} + +/******************************************************************************* +* Function Name: Cy_CTB_SetCurrentMode +****************************************************************************//** +* +* High level API function for configuring the current modes of the Opamps. +* This API configures all Opamps of the CTB to the same current mode. +* These modes are differentiated by the IPTAT current level, the Opamp +* input range, and the Deep Sleep mode operation. +* +* - The reference current level is set using \ref Cy_CTB_SetIptatLevel +* - When 1 uA current level is used in Deep Sleep, +* - All generators in the AREF must be enabled in Deep Sleep. That is, +* \ref Cy_SysAnalog_SetDeepSleepMode is called with CY_SYSANALOG_DEEPSLEEP_IPTAT_IZTAT_VREF. +* - When 100 nA current level is used, +* - \ref Cy_CTB_EnableRedirect is called to route the AREF IPTAT reference +* to the Opamp IZTAT and disable the Opamps IPTAT. +* - The IPTAT generator is enabled in Deep Sleep. That is, +* \ref Cy_SysAnalog_SetDeepSleepMode is called with CY_SYSANALOG_DEEPSLEEP_IPTAT_2 +* unless it is already configured for CY_SYSANALOG_DEEPSLEEP_IPTAT_IZTAT_VREF. +* +* Note that the IPTAT level is a chip wide configuration so multiple +* Opamps cannot operate at different IPTAT levels. +* When calling \ref Cy_CTB_SetCurrentMode for a CTB instance on the device, +* it should be called for all other CTB instances as well. +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    Current ModeIPTAT LevelInput RangeDeep Sleep Operation
    CY_CTB_CURRENT_HIGH_ACTIVE1 uARail-to-Rail (charge pump enabled)Disabled in Deep Sleep
    CY_CTB_CURRENT_HIGH_ACTIVE_DEEPSLEEP1 uA0 - VDDA-1.5 V (charge pump disabled)Enabled in Deep Sleep
    CY_CTB_CURRENT_LOW_ACTIVE_DEEPSLEEP100 nA0 - VDDA-1.5 V (charge pump disabled)Enabled in Deep Sleep
    +* +* NOTE: The output range of the Opamp is 0.2 V to VDDA-0.2 V (depending on output load). +* +* \param base +* Pointer to structure describing registers +* +* \param currentMode +* Enable or disable CTB in Deep Sleep. +* +* \return None +* +*******************************************************************************/ +void Cy_CTB_SetCurrentMode(CTBM_Type *base, cy_en_ctb_current_mode_t currentMode) +{ + CY_ASSERT_L3(CY_CTB_CURRENTMODE(currentMode)); + + cy_en_sysanalog_deep_sleep_t arefDeepSleep; + + switch(currentMode) + { + case CY_CTB_CURRENT_HIGH_ACTIVE: + + /* Does not disable AREF for Deep Sleep in case the AREF is used by other blocks */ + + /* Use a 1 uA IPTAT level and disable redirection */ + Cy_CTB_SetIptatLevel(CY_CTB_IPTAT_NORMAL); + Cy_CTB_DisableRedirect(); + + /* Disable Deep Sleep mode for the CTB - not Opamp specific */ + Cy_CTB_SetDeepSleepMode(base, CY_CTB_DEEPSLEEP_DISABLE); + + /* Enable Opamp0 pump */ + base->OA_RES0_CTRL |= CTBM_OA_RES0_CTRL_OA0_PUMP_EN_Msk; + + /* Enable Opamp1 pump */ + base->OA_RES1_CTRL |= CTBM_OA_RES1_CTRL_OA1_PUMP_EN_Msk; + + break; + case CY_CTB_CURRENT_HIGH_ACTIVE_DEEPSLEEP: + + /* All generators (IPTAT, IZTAT, and VREF) of the AREF block must be enabled for Deep Sleep */ + Cy_SysAnalog_SetDeepSleepMode(CY_SYSANALOG_DEEPSLEEP_IPTAT_IZTAT_VREF); + + /* Use a 1 uA IPTAT level and disable redirection */ + Cy_CTB_SetIptatLevel(CY_CTB_IPTAT_NORMAL); + Cy_CTB_DisableRedirect(); + + /* Enable Deep Sleep mode for the CTB - not Opamp specific */ + Cy_CTB_SetDeepSleepMode(base, CY_CTB_DEEPSLEEP_ENABLE); + + /* Disable Opamp0 pump */ + base->OA_RES0_CTRL &= ~CTBM_OA_RES0_CTRL_OA0_PUMP_EN_Msk; + + /* Disable Opamp1 pump */ + base->OA_RES1_CTRL &= ~CTBM_OA_RES1_CTRL_OA1_PUMP_EN_Msk; + + break; + case CY_CTB_CURRENT_LOW_ACTIVE_DEEPSLEEP: + default: + + /* The AREF IPTAT output for the Opamps must be enabled in Deep Sleep. + * This means a minimum Deep Sleep mode setting of CY_SYSANALOG_DEEPSLEEP_IPTAT_2. */ + arefDeepSleep = Cy_SysAnalog_GetDeepSleepMode(); + if ((arefDeepSleep == CY_SYSANALOG_DEEPSLEEP_DISABLE) || (arefDeepSleep == CY_SYSANALOG_DEEPSLEEP_IPTAT_1)) + { + Cy_SysAnalog_SetDeepSleepMode(CY_SYSANALOG_DEEPSLEEP_IPTAT_2); + } + + /* Use a 100 nA IPTAT level and enable redirection */ + Cy_CTB_SetIptatLevel(CY_CTB_IPTAT_LOW); + Cy_CTB_EnableRedirect(); + + /* Enable Deep Sleep mode for the CTB - not Opamp specific */ + Cy_CTB_SetDeepSleepMode(base, CY_CTB_DEEPSLEEP_ENABLE); + + /* Disable Opamp0 pump */ + base->OA_RES0_CTRL &= ~CTBM_OA_RES0_CTRL_OA0_PUMP_EN_Msk; + + /* Disable Opamp1 pump */ + base->OA_RES1_CTRL &= ~CTBM_OA_RES1_CTRL_OA1_PUMP_EN_Msk; + break; + } +} + +/******************************************************************************* +* Function Name: Cy_CTB_SetDeepSleepMode +****************************************************************************//** +* +* Sets whether to allow the CTB to continue to stay powered in Deep Sleep mode. +* +* If enabled, the AREF block must also be enabled for Deep Sleep (see +* \ref Cy_SysAnalog_SetDeepSleepMode). +* Also, if any of the COS, CA0, CHD, CH6, COB, COR, CRS, or CRD switches +* are used in Deep Sleep, the CTDAC must also be enabled for Deep Sleep (see +* \ref Cy_CTDAC_SetDeepSleepMode). +* +* See the \ref group_ctb_dependencies section for more information. +* +* Note that in Deep Sleep mode, the charge pump is disabled so the input +* range is reduced to 0 - VDDA-1.5 V. +* +* \param base +* Pointer to structure describing registers +* +* \param deepSleep +* Enable or disable CTB in Deep Sleep. +* +* \return None +* +*******************************************************************************/ +void Cy_CTB_SetDeepSleepMode(CTBM_Type *base, cy_en_ctb_deep_sleep_t deepSleep) +{ + CY_ASSERT_L3(CY_CTB_DEEPSLEEP(deepSleep)); + + uint32_t ctbCtrl; + + ctbCtrl = base->CTB_CTRL & ~CTBM_CTB_CTRL_DEEPSLEEP_ON_Msk; + + base->CTB_CTRL = ctbCtrl | (uint32_t)deepSleep; +} + +/******************************************************************************* +* Function Name: Cy_CTB_SetOutputMode +****************************************************************************//** +* +* Sets the Opamp output mode to 1x drive, 10x drive, or comparator mode. +* +* \param base +* Pointer to structure describing registers +* +* \param opampNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \param mode +* Opamp mode selection +* +* \return None +* +*******************************************************************************/ +void Cy_CTB_SetOutputMode(CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum, cy_en_ctb_mode_t mode) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(opampNum)); + CY_ASSERT_L3(CY_CTB_OAMODE(mode)); + + uint32_t oaCtrlReg; + + if ((opampNum == CY_CTB_OPAMP_0) || (opampNum == CY_CTB_OPAMP_BOTH)) + { + + /* Clear the three affected bits before setting them */ + oaCtrlReg = base->OA_RES0_CTRL & ~(CTBM_OA_RES0_CTRL_OA0_DRIVE_STR_SEL_Msk | CTBM_OA_RES0_CTRL_OA0_COMP_EN_Msk | CTBM_OA_RES0_CTRL_OA0_BOOST_EN_Msk); + base->OA_RES0_CTRL = oaCtrlReg | (uint32_t) mode | ((mode == CY_CTB_MODE_OPAMP10X) ? CY_CTB_OPAMP_BOOST_DISABLE : CY_CTB_OPAMP_BOOST_ENABLE); + base->OA0_COMP_TRIM = (uint32_t) ((mode == CY_CTB_MODE_OPAMP10X) ? CY_CTB_OPAMP_COMPENSATION_CAP_MAX: CY_CTB_OPAMP_COMPENSATION_CAP_MIN); + } + + if ((opampNum == CY_CTB_OPAMP_1) || (opampNum == CY_CTB_OPAMP_BOTH)) + { + oaCtrlReg = base->OA_RES1_CTRL & ~(CTBM_OA_RES1_CTRL_OA1_DRIVE_STR_SEL_Msk | CTBM_OA_RES1_CTRL_OA1_COMP_EN_Msk | CTBM_OA_RES1_CTRL_OA1_BOOST_EN_Msk); + base->OA_RES1_CTRL = oaCtrlReg | (uint32_t) mode | ((mode == CY_CTB_MODE_OPAMP10X) ? CY_CTB_OPAMP_BOOST_DISABLE : CY_CTB_OPAMP_BOOST_ENABLE); + base->OA1_COMP_TRIM = (uint32_t) ((mode == CY_CTB_MODE_OPAMP10X) ? CY_CTB_OPAMP_COMPENSATION_CAP_MAX: CY_CTB_OPAMP_COMPENSATION_CAP_MIN); + } +} + +/******************************************************************************* +* Function Name: Cy_CTB_SetPower +****************************************************************************//** +* +* Sets the Opamp power mode to one of three levels to trade off power for +* gain bandwidth. Also enable or disable voltage pump to increase input +* range to supply rails. +* +* \param base +* Pointer to structure describing registers +* +* \param opampNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \param power +* Power mode selection +* +* \param pump +* Enable or disable the charge pump for increased input range +* +* \return None +* +*******************************************************************************/ +void Cy_CTB_SetPower(CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum, cy_en_ctb_power_t power, cy_en_ctb_pump_t pump) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(opampNum)); + CY_ASSERT_L3(CY_CTB_OAPOWER(power)); + CY_ASSERT_L3(CY_CTB_OAPUMP(pump)); + + uint32_t oaCtrlReg; + + if ((opampNum == CY_CTB_OPAMP_0) || (opampNum == CY_CTB_OPAMP_BOTH)) + { + + /* Clear the two affected bits before setting them */ + oaCtrlReg = base->OA_RES0_CTRL & ~(CTBM_OA_RES0_CTRL_OA0_PWR_MODE_Msk | CTBM_OA_RES0_CTRL_OA0_PUMP_EN_Msk); + base->OA_RES0_CTRL = oaCtrlReg | (uint32_t) power | (uint32_t) pump; + } + + if ((opampNum == CY_CTB_OPAMP_1) || (opampNum == CY_CTB_OPAMP_BOTH)) + { + oaCtrlReg = base->OA_RES1_CTRL & ~(CTBM_OA_RES1_CTRL_OA1_PWR_MODE_Msk | CTBM_OA_RES1_CTRL_OA1_PUMP_EN_Msk); + base->OA_RES1_CTRL = oaCtrlReg | (uint32_t) power | (uint32_t) pump; + } +} + +/******************************************************************************* +* Function Name: Cy_CTB_DACSampleAndHold +****************************************************************************//** +* +* Performs sampling and holding of the CTDAC output. +* To perform a sample or a hold, a preparation step must first be executed to +* open the required switches. Because of this, each sample or hold +* requires three function calls: +* +* -# Call this function to prepare for a sample or hold +* -# Enable or disable the CTDAC output +* -# Call this function again to perform a sample or hold +* +* For example, +* +* To sample the CTDAC output voltage: +* -# Cy_CTB_DACSampleAndHold(CTBM0, CY_CTB_SH_PREPARE_SAMPLE); +* -# Cy_CTDAC_SetOutputMode(CTDAC0, CY_CTDAC_OUTPUT_VALUE); +* -# Cy_CTB_DACSampleAndHold(CTBM0, CY_CTB_SH_SAMPLE); +* -# Cy_SysLib_DelayUs(10); +* +* It takes 10 us to perform a sample of the CTDAC output to provide +* time for the capacitor to settle to the new value. +* +* To hold the CTDAC output voltage: +* -# Cy_CTB_DACSampleAndHold(CTBM0, CY_CTB_SH_PREPARE_HOLD); +* -# Cy_CTDAC_SetOutputMode(CTDAC0, CY_CTDAC_OUTPUT_HIGHZ); +* -# Cy_CTB_DACSampleAndHold(CTBM0, CY_CTB_SH_HOLD); +* +* \param base +* Pointer to structure describing registers +* +* \param mode +* Mode to prepare or perform a sample or hold, or disable the ability +* +* \return None +* +*******************************************************************************/ +void Cy_CTB_DACSampleAndHold(CTBM_Type *base, cy_en_ctb_sample_hold_mode_t mode) +{ + CY_ASSERT_L3(CY_CTB_SAMPLEHOLD(mode)); + + switch(mode) + { + case CY_CTB_SH_DISABLE: + base->CTD_SW_CLEAR = (uint32_t) CY_CTB_SW_CTD_OUT_OA0_1X_OUT_MASK /* Open COB switch */ + | (uint32_t) CY_CTB_SW_CTD_CHOLD_OA0_POS_ISOLATE_MASK /* Open CIS switch */ + | (uint32_t) CY_CTB_SW_CTD_CHOLD_LEAKAGE_REDUCTION_MASK /* Open ILR switch */ + | (uint32_t) CY_CTB_SW_CTD_CHOLD_CONNECT_MASK; /* Open CHD switch */ + base->CTD_SW = (uint32_t) CY_CTB_SW_CTD_OUT_CHOLD_MASK; /* Close COS switch */ + break; + case CY_CTB_SH_PREPARE_SAMPLE: + base->CTD_SW_CLEAR = (uint32_t) CY_CTB_SW_CTD_OUT_OA0_1X_OUT_MASK /* Open COB switch */ + | (uint32_t) CY_CTB_SW_CTD_CHOLD_OA0_POS_ISOLATE_MASK /* Open CIS switch */ + | (uint32_t) CY_CTB_SW_CTD_CHOLD_LEAKAGE_REDUCTION_MASK; /* Open ILR switch */ + base->CTD_SW = (uint32_t) CY_CTB_SW_CTD_CHOLD_CONNECT_MASK; /* Close CHD switch */ + break; + case CY_CTB_SH_SAMPLE: + base->CTD_SW = (uint32_t) CY_CTB_SW_CTD_OUT_CHOLD_MASK; /* Close COS switch */ + break; + case CY_CTB_SH_PREPARE_HOLD: + base->CTD_SW_CLEAR = (uint32_t) CY_CTB_SW_CTD_OUT_CHOLD_MASK /* Open COS switch */ + | (uint32_t) CY_CTB_SW_CTD_CHOLD_OA0_POS_ISOLATE_MASK; /* Open CIS switch */ + break; + case CY_CTB_SH_HOLD: + default: + base->CTD_SW = (uint32_t) CY_CTB_SW_CTD_OUT_OA0_1X_OUT_MASK /* Close COB switch to reduce leakage through COS switch */ + | (uint32_t) CY_CTB_SW_CTD_CHOLD_LEAKAGE_REDUCTION_MASK; /* Close ILR switch to reduce leakage through CIS switch */ + break; + } +} + +/******************************************************************************* +* Function Name: Cy_CTB_OpampSetOffset +****************************************************************************//** +* +* Overrides the CTB opamp offset factory trim. +* The trim is a six bit value and the MSB is a direction bit. +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    Bit 5Bits 4:0Note
    000000Negative trim direction - minimum setting
    011111Negative trim direction - maximum setting
    100000Positive trim direction - minimum setting
    111111Positive trim direction - maximum setting
    +* +* \param base +* Pointer to structure describing registers +* +* \param opampNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \param trim +* Trim value from 0 to 63 +* +* \return None +* +*******************************************************************************/ +void Cy_CTB_OpampSetOffset(CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum, uint32_t trim) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(opampNum)); + CY_ASSERT_L2(CY_CTB_TRIM(trim)); + + if ((opampNum == CY_CTB_OPAMP_0) || (opampNum == CY_CTB_OPAMP_BOTH)) + { + base->OA0_OFFSET_TRIM = (trim << CTBM_OA0_OFFSET_TRIM_OA0_OFFSET_TRIM_Pos) & CTBM_OA0_OFFSET_TRIM_OA0_OFFSET_TRIM_Msk; + } + + if ((opampNum == CY_CTB_OPAMP_1) || (opampNum == CY_CTB_OPAMP_BOTH)) + { + base->OA1_OFFSET_TRIM = (trim << CTBM_OA1_OFFSET_TRIM_OA1_OFFSET_TRIM_Pos) & CTBM_OA1_OFFSET_TRIM_OA1_OFFSET_TRIM_Msk; + } +} + +/******************************************************************************* +* Function Name: Cy_CTB_OpampGetOffset +****************************************************************************//** +* +* Returns the current CTB Opamp offset trim value. +* +* \param base +* Pointer to structure describing registers +* +* \param opampNum +* CY_CTB_OPAMP_0 or CY_CTB_OPAMP_1 +* +* \return Offset trim value +* +*******************************************************************************/ +uint32_t Cy_CTB_OpampGetOffset(const CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM_0_1(opampNum)); + + uint32_t trimReg; + + if (opampNum == CY_CTB_OPAMP_0) + { + trimReg = base->OA0_OFFSET_TRIM; + } + else + { + trimReg = base->OA1_OFFSET_TRIM; + } + + return trimReg; +} + +/******************************************************************************* +* Function Name: Cy_CTB_OpampSetSlope +****************************************************************************//** +* +* Override the CTB Opamp slope factory trim. +* The offset of the Opamp will vary across temperature. +* This trim compensates for the slope of the offset across temperature. +* This compensation uses a bias current from the Analaog Reference block. +* To disable it, set the trim to 0. +* +* The trim is a six bit value and the MSB is a direction bit. +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    Bit 5Bits 4:0Note
    000000Negative trim direction - minimum setting
    011111Negative trim direction - maximum setting
    100000Positive trim direction - minimum setting
    111111Positive trim direction - maximum setting
    +* +* \param base +* Pointer to structure describing registers +* +* \param opampNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \param trim +* Trim value from 0 to 63 +* +* \return None +* +*******************************************************************************/ +void Cy_CTB_OpampSetSlope(CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum, uint32_t trim) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(opampNum)); + CY_ASSERT_L2(CY_CTB_TRIM(trim)); + + if ((opampNum == CY_CTB_OPAMP_0) || (opampNum == CY_CTB_OPAMP_BOTH)) + { + base->OA0_SLOPE_OFFSET_TRIM = (trim << CTBM_OA0_SLOPE_OFFSET_TRIM_OA0_SLOPE_OFFSET_TRIM_Pos) & CTBM_OA0_SLOPE_OFFSET_TRIM_OA0_SLOPE_OFFSET_TRIM_Msk; + } + + if ((opampNum == CY_CTB_OPAMP_1) || (opampNum == CY_CTB_OPAMP_BOTH)) + { + base->OA1_SLOPE_OFFSET_TRIM = (trim << CTBM_OA1_SLOPE_OFFSET_TRIM_OA1_SLOPE_OFFSET_TRIM_Pos) & CTBM_OA1_SLOPE_OFFSET_TRIM_OA1_SLOPE_OFFSET_TRIM_Msk; + } +} + +/******************************************************************************* +* Function Name: Cy_CTB_OpampGetSlope +****************************************************************************//** +* +* Returns the current CTB Opamp slope trim value. +* +* \param base +* Pointer to structure describing registers +* +* \param opampNum +* CY_CTB_OPAMP_0 or CY_CTB_OPAMP_1 +* +* \return Slope trim value +* +*******************************************************************************/ +uint32_t Cy_CTB_OpampGetSlope(const CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM_0_1(opampNum)); + + uint32_t trimReg; + + if (opampNum == CY_CTB_OPAMP_0) + { + trimReg = base->OA0_SLOPE_OFFSET_TRIM; + } + else + { + trimReg = base->OA1_SLOPE_OFFSET_TRIM; + } + + return trimReg; +} + +/******************************************************************************* +* Function Name: Cy_CTB_SetAnalogSwitch +****************************************************************************//** +* +* Provides firmware control of the CTB switches. Each call to this function +* can open a set of switches or close a set of switches in one register. +* +* \param base +* Pointer to structure describing registers +* +* \param switchSelect +* A value of the enum \ref cy_en_ctb_switch_register_sel_t to select the switch +* register +* +* \param switchMask +* The mask of the switches to either open or close. +* The switch masks can be found in the following enums: \ref cy_en_ctb_oa0_switches_t, +* \ref cy_en_ctb_oa1_switches_t, and \ref cy_en_ctb_ctd_switches_t. +* +* \param state +* CY_CTB_SWITCH_OPEN or CY_CTB_SWITCH_CLOSE +* +* For example, to route the non-inverting input of opamp0 to Pin 0 of the CTB port, +* and the inverting input of opamp0 to Pin 1: +* switchSelect = CY_CTB_SWITCH_OA0_SW; +* switchMask = CY_CTB_SW_OA0_POS_PIN0_MASK | CY_CTB_SW_OA0_NEG_PIN1_MASK; +* state = CY_CTB_SWITCH_CLOSE; +* +* \return None +* +*******************************************************************************/ +void Cy_CTB_SetAnalogSwitch(CTBM_Type *base, cy_en_ctb_switch_register_sel_t switchSelect, uint32_t switchMask, cy_en_ctb_switch_state_t state) +{ + CY_ASSERT_L3(CY_CTB_SWITCHSELECT(switchSelect)); + CY_ASSERT_L2(CY_CTB_SWITCHMASK(switchSelect, switchMask)); + CY_ASSERT_L3(CY_CTB_SWITCHSTATE(state)); + + __IOM uint32_t *switchReg; + __IOM uint32_t *switchClearReg; + + switch(switchSelect) + { + case CY_CTB_SWITCH_OA0_SW: + switchReg = &base->OA0_SW; + switchClearReg = &base->OA0_SW_CLEAR; + break; + case CY_CTB_SWITCH_OA1_SW: + switchReg = &base->OA1_SW; + switchClearReg = &base->OA1_SW_CLEAR; + break; + case CY_CTB_SWITCH_CTD_SW: + default: + switchReg = &base->CTD_SW; + switchClearReg = &base->CTD_SW_CLEAR; + break; + } + + switch(state) + { + case CY_CTB_SWITCH_CLOSE: + *switchReg = switchMask; + break; + case CY_CTB_SWITCH_OPEN: + default: + *switchClearReg = switchMask; + break; + } +} + +/******************************************************************************* +* Function Name: Cy_CTB_GetAnalogSwitch +****************************************************************************//** +* +* Returns the open or closed state of the specified analog switch. +* +* \param base +* Pointer to structure describing registers +* +* \param switchSelect +* A value of the enum \ref cy_en_ctb_switch_register_sel_t to select the switch +* register +* +* \return uint32_t +* Compare this value to the switch masks in the following enums: +* \ref cy_en_ctb_oa0_switches_t, \ref cy_en_ctb_oa1_switches_t, and \ref cy_en_ctb_ctd_switches_t. +* +*******************************************************************************/ +uint32_t Cy_CTB_GetAnalogSwitch(const CTBM_Type *base, cy_en_ctb_switch_register_sel_t switchSelect) +{ + CY_ASSERT_L3(CY_CTB_SWITCHSELECT(switchSelect)); + + uint32_t switchRegValue; + + switch(switchSelect) + { + case CY_CTB_SWITCH_OA0_SW: + switchRegValue = base->OA0_SW; + break; + case CY_CTB_SWITCH_OA1_SW: + switchRegValue = base->OA1_SW; + break; + case CY_CTB_SWITCH_CTD_SW: + default: + switchRegValue = base->CTD_SW; + break; + } + + return switchRegValue; +} + +/******************************************************************************* +* Function Name: Cy_CTB_OpenAllSwitches +****************************************************************************//** +* +* Open all the switches and disable all hardware control of the switches. +* Primarily used as a quick method of reconfiguring all analog connections +* that are sparsely closed. +* +* \param base +* Pointer to structure describing registers +* +* \return None +* +*******************************************************************************/ +void Cy_CTB_OpenAllSwitches(CTBM_Type *base) +{ + base->OA0_SW_CLEAR = CY_CTB_DEINIT_OA0_SW; + base->OA1_SW_CLEAR = CY_CTB_DEINIT_OA1_SW; + base->CTD_SW_CLEAR = CY_CTB_DEINIT_CTD_SW; + base->CTB_SW_DS_CTRL = CY_CTB_DEINIT; + base->CTB_SW_SQ_CTRL = CY_CTB_DEINIT; +} + +/******************************************************************************* +* Function Name: Cy_CTB_CompSetConfig +****************************************************************************//** +* +* Configures the CTB comparator for pulse or level output, to bypass clock +* synchronization, and to enable hysteresis. +* +* \param base +* Pointer to structure describing registers +* +* \param compNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \param level +* Configure output to produce a pulse or level output signal + +* \param bypass +* Configure output to be clock synchronized or unsynchronized + +* \param hyst +* Enable or disable input hysteresis + +* \return None +* +*******************************************************************************/ +void Cy_CTB_CompSetConfig(CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum, cy_en_ctb_comp_level_t level, cy_en_ctb_comp_bypass_t bypass, cy_en_ctb_comp_hyst_t hyst) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(compNum)); + CY_ASSERT_L3(CY_CTB_COMPLEVEL(level)); + CY_ASSERT_L3(CY_CTB_COMPBYPASS(bypass)); + CY_ASSERT_L3(CY_CTB_COMPHYST(hyst)); + + uint32_t opampCtrlReg; + + if ((compNum == CY_CTB_OPAMP_0) || (compNum == CY_CTB_OPAMP_BOTH)) + { + opampCtrlReg = base->OA_RES0_CTRL & ~(CTBM_OA_RES0_CTRL_OA0_HYST_EN_Msk | CTBM_OA_RES0_CTRL_OA0_BYPASS_DSI_SYNC_Msk | CTBM_OA_RES0_CTRL_OA0_DSI_LEVEL_Msk); + base->OA_RES0_CTRL = opampCtrlReg | (uint32_t) level |(uint32_t) bypass | (uint32_t) hyst; + } + + if ((compNum == CY_CTB_OPAMP_1) || (compNum == CY_CTB_OPAMP_BOTH)) + { + opampCtrlReg = base->OA_RES1_CTRL & ~(CTBM_OA_RES1_CTRL_OA1_HYST_EN_Msk | CTBM_OA_RES1_CTRL_OA1_BYPASS_DSI_SYNC_Msk | CTBM_OA_RES1_CTRL_OA1_DSI_LEVEL_Msk); + base->OA_RES1_CTRL = opampCtrlReg | (uint32_t) level |(uint32_t) bypass | (uint32_t) hyst; + } +} + +/******************************************************************************* +* Function Name: Cy_CTB_CompGetConfig +****************************************************************************//** +* +* Returns the CTB comparator operating configuration. +* +* \param base +* Pointer to structure describing registers +* +* \param compNum +* CY_CTB_OPAMP_0 or CY_CTB_OPAMP_1 +* +* \return comparator status +* Compare the register value with the masks in \ref cy_en_ctb_comp_level_t, +* \ref cy_en_ctb_comp_bypass_t, and \ref cy_en_ctb_comp_hyst_t. +* +*******************************************************************************/ +uint32_t Cy_CTB_CompGetConfig(const CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM_0_1(compNum)); + + uint32_t config; + + if (compNum == CY_CTB_OPAMP_0) + { + config = base->OA_RES0_CTRL & (CTBM_OA_RES0_CTRL_OA0_HYST_EN_Msk | CTBM_OA_RES0_CTRL_OA0_BYPASS_DSI_SYNC_Msk | CTBM_OA_RES0_CTRL_OA0_DSI_LEVEL_Msk); + } + else + { + config = base->OA_RES1_CTRL & (CTBM_OA_RES1_CTRL_OA1_HYST_EN_Msk | CTBM_OA_RES1_CTRL_OA1_BYPASS_DSI_SYNC_Msk | CTBM_OA_RES1_CTRL_OA1_DSI_LEVEL_Msk); + } + + return config; +} + +/******************************************************************************* +* Function Name: Cy_CTB_CompSetInterruptEdgeType +****************************************************************************//** +* +* Configures the type of edge that will trigger a comparator interrupt. +* +* \param base +* Pointer to structure describing registers +* +* \param compNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \param edge +* Edge type +* +* \return None +* +*******************************************************************************/ +void Cy_CTB_CompSetInterruptEdgeType(CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum, cy_en_ctb_comp_edge_t edge) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(compNum)); + CY_ASSERT_L3(CY_CTB_COMPEDGE(edge)); + + uint32_t opampCtrlReg; + + if ((compNum == CY_CTB_OPAMP_0) || (compNum == CY_CTB_OPAMP_BOTH)) + { + opampCtrlReg = base->OA_RES0_CTRL & ~(CTBM_OA_RES0_CTRL_OA0_COMPINT_Msk); + base->OA_RES0_CTRL = opampCtrlReg | (uint32_t) edge; + } + + if ((compNum == CY_CTB_OPAMP_1) || (compNum == CY_CTB_OPAMP_BOTH)) + { + opampCtrlReg = base->OA_RES1_CTRL & ~(CTBM_OA_RES1_CTRL_OA1_COMPINT_Msk); + base->OA_RES1_CTRL = opampCtrlReg | (uint32_t) edge; + } +} + +/******************************************************************************* +* Function Name: Cy_CTB_CompGetStatus +****************************************************************************//** +* +* Returns status of the indicated comparator output. +* +* \param base +* Pointer to structure describing registers +* +* \param compNum +* CY_CTB_OPAMP_0 or CY_CTB_OPAMP_1 +* +* \return comparator status +* 0 - Comparator output low +* 1 - Comparator output high +* +* A value of 0 is returned if compNum is an invalid value, CY_CTB_OPAMP_NONE +* or CY_CTB_OPAMP_BOTH. +* +*******************************************************************************/ +uint32_t Cy_CTB_CompGetStatus(const CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM_0_1(compNum)); + + uint32_t compStatusResult; + + if (CY_CTB_OPAMP_0 == compNum) + { + compStatusResult = (base->COMP_STAT & CTBM_COMP_STAT_OA0_COMP_Msk) >> CTBM_COMP_STAT_OA0_COMP_Pos; + } + else if (CY_CTB_OPAMP_1 == compNum) + { + compStatusResult = (base->COMP_STAT & CTBM_COMP_STAT_OA1_COMP_Msk) >> CTBM_COMP_STAT_OA1_COMP_Pos; + } + else + { + compStatusResult = 0uL; + } + + return compStatusResult; +} + +#if defined(__cplusplus) +} +#endif + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctb/cy_ctb.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctb/cy_ctb.h new file mode 100644 index 0000000000..4e8903d590 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctb/cy_ctb.h @@ -0,0 +1,1334 @@ +/***************************************************************************//** +* \file cy_ctb.h +* \version 1.0 +* +* Header file for the CTB driver +* +******************************************************************************** +* \copyright +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_ctb Continuous Time Block (CTB) +* \{ +* This driver provides API functions to configure and use the analog CTB. +* The CTB comprises two identical Opamps, a switch routing matrix, +* and a sample and hold circuit. The high level features are: +* +* - Two highly configurable Opamps +* - Each Opamp has programmable power and output drive strength +* - Each Opamp can be configured as a voltage follower using internal routing +* - Each Opamp can be configured as a comparator with optional 10 mV hysteresis +* - Flexible input and output routing +* - Works as a buffer or amplifier for SAR ADC inputs +* - Works as a buffer, amplifier, or sample-and-hold for the CTDAC output +* - Can operate in Deep Sleep power mode +* +* Each Opamp, marked OA0 and OA1, has one input and three output stages, +* all of which share the common input stage. +* Note that only one output stage can be selected at a time. +* The output stage can operate as a low-drive strength Opamp (1X), a high-drive strength +* Opamp (10X), or a comparator. +* +* The input range of the Opamp can be rail-to-rail if the charge pump is enabled. +* Without the charge pump, the input range is 0 - VDDA-1.5 V. The output range +* of the Opamp is 0.2 V to VDDA-0.2 V, but this depends on the load. See the +* device datasheet for more detail. +* +* Using the switching matrix, the Opamp inputs and outputs +* can be connected to dedicated general-purpose I/Os or other internal analog +* blocks. See the device datasheet for the dedicated CTB port. +* +* \image html ctb_block_diagram.png +* \image latex ctb_block_diagram.png +* +* \section group_ctb_init Initialization +* +* Before enabling the CTB, set up any external components (such as resistors) +* that are needed for the design. To configure the entire hardware block, call \ref Cy_CTB_Init. +* The base address of the CTB hardware can be found in the device specific header file. +* Alternatively, to configure only one opamp without any routing, call \ref Cy_CTB_OpampInit. +* The driver also provides a \ref Cy_CTB_FastInit function for fast and easy initialization of the CTB +* based on commonly used configurations. They are pre-defined in the driver as: +* +* Opamp0 +* - \ref Cy_CTB_Fast_Opamp0_Unused +* - \ref Cy_CTB_Fast_Opamp0_Comp +* - \ref Cy_CTB_Fast_Opamp0_Opamp1x +* - \ref Cy_CTB_Fast_Opamp0_Opamp10x +* - \ref Cy_CTB_Fast_Opamp0_Diffamp +* - \ref Cy_CTB_Fast_Opamp0_Vdac_Out +* - \ref Cy_CTB_Fast_Opamp0_Vdac_Out_SH +* +* Opamp1 +* - \ref Cy_CTB_Fast_Opamp1_Unused +* - \ref Cy_CTB_Fast_Opamp1_Comp +* - \ref Cy_CTB_Fast_Opamp1_Opamp1x +* - \ref Cy_CTB_Fast_Opamp1_Opamp10x +* - \ref Cy_CTB_Fast_Opamp1_Diffamp +* - \ref Cy_CTB_Fast_Opamp1_Vdac_Ref_Aref +* - \ref Cy_CTB_Fast_Opamp1_Vdac_Ref_Pin5 +* +* After initialization, call \ref Cy_CTB_Enable to enable the hardware. +* +* \section group_ctb_comparator Comparator Mode +* +* Each Opamp can be configured as a comparator. Note that when used as a +* comparator, the hardware shuts down the 1X and 10X output drivers. +* Specific to the comparator mode, there is an optional 10 mV input hysteresis +* and configurable edge detection interrupt handling. +* The comparator output is connected to an edge detector +* block, which is used to detect the edge (rising, falling, both, or disabled) +* for interrupt generation. +* +* \section group_ctb_sample_hold Sample and Hold Mode +* +* The CTB has a sample and hold (S/H) circuit at the non-inverting input of Opamp0. +* The circuit includes a hold capacitor, Chold, with a firmware controlled switch, CHD. +* Sampling and holding the source voltage is performed +* by closing and opening appropriate switches in the CTB using firmware. +* If the S/H circuit is used for the CTDAC, the \ref Cy_CTB_DACSampleAndHold function +* should be called. +* +* \image html ctb_fast_config_vdac_sh.png +* \image latex ctb_fast_config_vdac_sh.png +* +* \section group_ctb_dependencies Configuration Dependencies +* +* The CTB relies on other blocks to function properly. The dependencies +* are documented here. +* +*Charge Pump Configuration +* +* Each Opamp of the CTB has a charge pump that when enabled increases the +* input range to the supply rails. When disabled, the Opamp input range is 0 - VDDA - 1.5 V. +* When enabled, the pump requires a clock. +* Call the \ref Cy_CTB_SetClkPumpSource function in the \ref group_sysanalog driver to +* set the clock source for all CTBs. This clock can come from one of two sources: +* +* -# A dedicated clock divider from one of the CLK_PATH in the SRSS +* +* Call the following functions to configure the pump clock from the SRSS: +* - \ref Cy_SysClk_ClkPumpSetSource +* - \ref Cy_SysClk_ClkPumpSetDivider +* - \ref Cy_SysClk_ClkPumpEnable +* -# One of the Peri Clock dividers +* +* Call the following functions to configure a Peri Clock divider as the +* pump clock: +* - \ref Cy_SysClk_PeriphAssignDivider with the IP block set to PCLK_PASS_CLOCK_PUMP_PERI +* - \ref Cy_SysClk_PeriphSetDivider +* - \ref Cy_SysClk_PeriphEnableDivider +* +* When the charge pump is enabled, the clock frequency should be set as follows: +* +* +* +* +* +* +* +* +* +* +* +*
    Opamp PowerPump Clock Freq
    Low or Medium8 - 24 MHz
    High24 MHz
    +* +* The High power level of the Opamp requires a 24 MHz pump clock. +* In Deep Sleep mode, all high frequency clocks are +* disabled and the charge pump will be disabled. +* +* Note that the same pump clock is used by all Opamps on the device. Be aware of this +* when configuring different Opamps to different power levels. +* +* Reference Current Configurations +* +* The CTB uses two reference current generators, IPTAT and IZTAT, from +* the AREF block (see \ref group_sysanalog driver). The IPTAT current is +* used to trim the slope of the Opamp offset across temperature. +* The AREF must be initialized and enabled for the CTB to function properly. +* +* If the CTB is configured to operate in Deep Sleep mode, +* the appropriate reference current generators from the AREF block must be enabled in Deep Sleep. +* When waking up from Deep Sleep, +* the AREF block has a wakeup time that must be +* considered. Note that configurations in the AREF block +* are chip wide and affect all CTBs on the device. +* +* The following reference current configurations are supported: +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    Reference Current LevelSupported ModeInput Range
    1 uAActive/Low PowerRail-to-Rail (charge pump enabled)
    1 uAActive/Low Power/Deep Sleep0 - VDDA-1.5 V (charge pump disabled)
    100 nAActive/Low Power/Deep Sleep0 - VDDA-1.5 V (charge pump disabled)
    +* +* The first configuration provides low offset and drift with maximum input range +* while consuming the most current. +* For Deep Sleep operation, use the other two configurations with the charge pump disabled. +* For ultra low power, use the 100 nA current level. +* To configure the Opamps to operate in one of these options, call \ref Cy_CTB_SetCurrentMode. +* +* Sample and Hold Switch Control +* +* The following eight switches that are contained in the CTB are enabled by the CTDAC IP +* block: +* +* - COS, CA0, CHD, CH6, COB, COR, CRS and CRD +* +* If any of the above switches are used, the \ref Cy_CTDAC_Enable function must be called. +* Additionally, if any of the switches are used in Deep Sleep mode, the CTDAC must also +* be configured to operate in Deep Sleep (see \ref Cy_CTDAC_SetDeepSleepMode). +* +* \section group_ctb_code_example Complete Code Example +* +* The following example code demonstrates how to configure Opamp0 +* as a comparator and Opamp1 as a voltage follower. The terminals +* are routed to external pins by closing the switches shown. +* +* \image html ctb_code_example.png +* \image latex ctb_code_example.png +* +* The example code also shows how to handle the comparator interrupt. +* +* \code +* #include "ctb/cy_ctb.h" +* #include "sysanalog/cy_sysanalog.h" +* #include "sysint/cy_sysint.h" +* #include "gpio/cy_gpio.h" +* \endcode +* +* \snippet ctb_sut_01.cydsn/main_cm0p.c CTB_CODE_EXAMPLE +* +* \section group_ctb_more_information More Information +* +* Refer to technical reference manual (TRM) and the device datasheet. +* +* \section group_ctb_MISRA MISRA-C Compliance] +* +* This driver does not have any specific deviations. +* +* \section group_ctb_changelog Changelog +* +* +* +* +* +* +* +*
    VersionChangesReason for Change
    1.0Initial version
    +* +* \defgroup group_ctb_macros Macros +* \defgroup group_ctb_functions Functions +* \{ +* \defgroup group_ctb_functions_init Initialization Functions +* \defgroup group_ctb_functions_basic Basic Configuration Functions +* \defgroup group_ctb_functions_comparator Comparator Functions +* \defgroup group_ctb_functions_sample_hold Sample and Hold Functions +* \defgroup group_ctb_functions_interrupts Interrupt Functions +* \defgroup group_ctb_functions_switches Switch Control Functions +* \defgroup group_ctb_functions_trim Offset and Slope Trim Functions +* \defgroup group_ctb_functions_aref Reference Current Mode Functions +* \} +* \defgroup group_ctb_globals Global Variables +* \defgroup group_ctb_data_structures Data structures +* \defgroup group_ctb_enums Enumerated Types +*/ + +#if !defined(CY_CTB_H) +#define CY_CTB_H + +#include +#include +#include +#include "cy_device_headers.h" +#include "syslib/cy_syslib.h" +#include "sysanalog/cy_sysanalog.h" + +#ifndef CY_IP_MXS40PASS_CTB + #error "The CTB driver is not supported on this device" +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +/** \addtogroup group_ctb_macros +* \{ +*/ + +/** Driver major version */ +#define CY_CTB_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_CTB_DRV_VERSION_MINOR 0 + +/** CTB driver identifier*/ +#define CY_CTB_ID CY_PDL_DRV_ID(0x0Bu) + +/** \cond INTERNAL */ + +/**< De-init value for most CTB registers */ +#define CY_CTB_DEINIT (0uL) + +/**< De-init value for the opamp0 switch control register */ +#define CY_CTB_DEINIT_OA0_SW (CTBM_OA0_SW_CLEAR_OA0P_A00_Msk \ + | CTBM_OA0_SW_CLEAR_OA0P_A20_Msk \ + | CTBM_OA0_SW_CLEAR_OA0P_A30_Msk \ + | CTBM_OA0_SW_CLEAR_OA0M_A11_Msk \ + | CTBM_OA0_SW_CLEAR_OA0M_A81_Msk \ + | CTBM_OA0_SW_CLEAR_OA0O_D51_Msk \ + | CTBM_OA0_SW_CLEAR_OA0O_D81_Msk) + +/**< De-init value for the opamp1 switch control register */ +#define CY_CTB_DEINIT_OA1_SW (CTBM_OA1_SW_CLEAR_OA1P_A03_Msk \ + | CTBM_OA1_SW_CLEAR_OA1P_A13_Msk \ + | CTBM_OA1_SW_CLEAR_OA1P_A43_Msk \ + | CTBM_OA1_SW_CLEAR_OA1P_A73_Msk \ + | CTBM_OA1_SW_CLEAR_OA1M_A22_Msk \ + | CTBM_OA1_SW_CLEAR_OA1M_A82_Msk \ + | CTBM_OA1_SW_CLEAR_OA1O_D52_Msk \ + | CTBM_OA1_SW_CLEAR_OA1O_D62_Msk \ + | CTBM_OA1_SW_CLEAR_OA1O_D82_Msk) + +/**< De-init value for the CTDAC switch control register */ +#define CY_CTB_DEINIT_CTD_SW (CTBM_CTD_SW_CLEAR_CTDD_CRD_Msk \ + | CTBM_CTD_SW_CLEAR_CTDS_CRS_Msk \ + | CTBM_CTD_SW_CLEAR_CTDS_COR_Msk \ + | CTBM_CTD_SW_CLEAR_CTDO_C6H_Msk \ + | CTBM_CTD_SW_CLEAR_CTDO_COS_Msk \ + | CTBM_CTD_SW_CLEAR_CTDH_COB_Msk \ + | CTBM_CTD_SW_CLEAR_CTDH_CHD_Msk \ + | CTBM_CTD_SW_CLEAR_CTDH_CA0_Msk \ + | CTBM_CTD_SW_CLEAR_CTDH_CIS_Msk \ + | CTBM_CTD_SW_CLEAR_CTDH_ILR_Msk) + +#define CY_CTB_TRIM_VALUE_MAX (63uL) + +/**< Macros for conditions used by CY_ASSERT calls */ + +#define CY_CTB_OPAMPNUM(num) (((num) == CY_CTB_OPAMP_0) || ((num) == CY_CTB_OPAMP_1) || ((num) == CY_CTB_OPAMP_BOTH)) +#define CY_CTB_OPAMPNUM_0_1(num) (((num) == CY_CTB_OPAMP_0) || ((num) == CY_CTB_OPAMP_1)) +#define CY_CTB_OPAMPNUM_ALL(num) (((num) == CY_CTB_OPAMP_NONE) \ + || ((num) == CY_CTB_OPAMP_0) \ + || ((num) == CY_CTB_OPAMP_1) \ + || ((num) == CY_CTB_OPAMP_BOTH)) +#define CY_CTB_IPTAT(iptat) (((iptat) == CY_CTB_IPTAT_NORMAL) || ((iptat) == CY_CTB_IPTAT_LOW)) +#define CY_CTB_CLKPUMP(clkPump) (((clkPump) == CY_CTB_CLK_PUMP_SRSS) || ((clkPump) == CY_CTB_CLK_PUMP_PERI)) +#define CY_CTB_DEEPSLEEP(deepSleep) (((deepSleep) == CY_CTB_DEEPSLEEP_DISABLE) || ((deepSleep) == CY_CTB_DEEPSLEEP_ENABLE)) +#define CY_CTB_OAPOWER(power) ((power) <= CY_CTB_POWER_HIGH) +#define CY_CTB_OAMODE(mode) (((mode) == CY_CTB_MODE_OPAMP1X) \ + || ((mode) == CY_CTB_MODE_OPAMP10X) \ + || ((mode) == CY_CTB_MODE_COMP)) +#define CY_CTB_OAPUMP(pump) (((pump) == CY_CTB_PUMP_DISABLE) || ((pump) == CY_CTB_PUMP_ENABLE)) +#define CY_CTB_COMPEDGE(edge) (((edge) == CY_CTB_COMP_EDGE_DISABLE) \ + || ((edge) == CY_CTB_COMP_EDGE_RISING) \ + || ((edge) == CY_CTB_COMP_EDGE_FALLING) \ + || ((edge) == CY_CTB_COMP_EDGE_BOTH)) +#define CY_CTB_COMPLEVEL(level) (((level) == CY_CTB_COMP_DSI_TRIGGER_OUT_PULSE) || ((level) == CY_CTB_COMP_DSI_TRIGGER_OUT_LEVEL)) +#define CY_CTB_COMPBYPASS(bypass) (((bypass) == CY_CTB_COMP_BYPASS_SYNC) || ((bypass) == CY_CTB_COMP_BYPASS_NO_SYNC)) +#define CY_CTB_COMPHYST(hyst) (((hyst) == CY_CTB_COMP_HYST_DISABLE) || ((hyst) == CY_CTB_COMP_HYST_10MV)) +#define CY_CTB_CURRENTMODE(mode) (((mode) == CY_CTB_CURRENT_HIGH_ACTIVE) \ + || ((mode) == CY_CTB_CURRENT_HIGH_ACTIVE_DEEPSLEEP) \ + || ((mode) == CY_CTB_CURRENT_LOW_ACTIVE_DEEPSLEEP)) +#define CY_CTB_SAMPLEHOLD(mode) ((mode) <= CY_CTB_SH_HOLD) +#define CY_CTB_TRIM(trim) ((trim) <= CY_CTB_TRIM_VALUE_MAX) +#define CY_CTB_SWITCHSELECT(select) (((select) == CY_CTB_SWITCH_OA0_SW) \ + || ((select) == CY_CTB_SWITCH_OA1_SW) \ + || ((select) == CY_CTB_SWITCH_CTD_SW)) +#define CY_CTB_SWITCHSTATE(state) (((state) == CY_CTB_SWITCH_OPEN) || ((state) == CY_CTB_SWITCH_CLOSE)) +#define CY_CTB_OA0SWITCH(mask) (((mask) & (~CY_CTB_DEINIT_OA0_SW)) == 0uL) +#define CY_CTB_OA1SWITCH(mask) (((mask) & (~CY_CTB_DEINIT_OA1_SW)) == 0uL) +#define CY_CTB_CTDSWITCH(mask) (((mask) & (~CY_CTB_DEINIT_CTD_SW)) == 0uL) +#define CY_CTB_SWITCHMASK(select,mask) (((select) == CY_CTB_SWITCH_OA0_SW) ? (((mask) & (~CY_CTB_DEINIT_OA0_SW)) == 0uL) : \ + (((select) == CY_CTB_SWITCH_OA1_SW) ? (((mask) & (~CY_CTB_DEINIT_OA1_SW)) == 0uL) : \ + (((mask) & (~CY_CTB_DEINIT_CTD_SW)) == 0uL))) + +/** \endcond */ + +/** \} group_ctb_macros */ + +/*************************************** +* Enumerated Types +***************************************/ + +/** +* \addtogroup group_ctb_enums +* \{ +*/ + +/** +* Most functions allow you to configure a single opamp or both opamps at once. +* The \ref Cy_CTB_SetInterruptMask function can be called with CY_CTB_OPAMP_NONE +* and interrupts will be disabled. +*/ +typedef enum{ + CY_CTB_OPAMP_NONE = 0, /**< For disabling interrupts for both opamps. Used with \ref Cy_CTB_SetInterruptMask */ + CY_CTB_OPAMP_0 = CTBM_INTR_COMP0_Msk, /**< For configuring Opamp0 */ + CY_CTB_OPAMP_1 = CTBM_INTR_COMP1_Msk, /**< For configuring Opamp1 */ + CY_CTB_OPAMP_BOTH = CTBM_INTR_COMP0_Msk | CTBM_INTR_COMP1_Msk, /**< For configuring both Opamp0 and Opamp1 */ +}cy_en_ctb_opamp_sel_t; + +/** Enable or disable CTB while in Deep Sleep mode. +*/ +typedef enum { + CY_CTB_DEEPSLEEP_DISABLE = 0u, /**< CTB is disabled during Deep Sleep power mode */ + CY_CTB_DEEPSLEEP_ENABLE = CTBM_CTB_CTRL_DEEPSLEEP_ON_Msk, /**< CTB remains enabled during Deep Sleep power mode */ +}cy_en_ctb_deep_sleep_t; + +/** +* Configure the power mode of each opamp. Each power setting +* consumes different levels of current and supports a different +* input range and gain bandwidth. +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    Opamp PowerIDDGain bandwidth
    OFF0NA
    LOW350 uA1 MHz
    MEDIUM600 uA3 MHz for 1X, 2.5 MHz for 10x
    HIGH1.5 mA8 MHz for 1X, 6 MHz for 10x
    +* +*/ +typedef enum { + CY_CTB_POWER_OFF = 0u, /**< Opamp is off */ + CY_CTB_POWER_LOW = 1u, /**< Low power: IDD = 350 uA, GBW = 1 MHz for both 1x and 10x */ + CY_CTB_POWER_MEDIUM = 2u, /**< Medium power: IDD = 600 uA, GBW = 3 MHz for 1x and 2.5 MHz for 10x */ + CY_CTB_POWER_HIGH = 3u, /**< High power: IDD = 1500 uA, GBW = 8 MHz for 1x and 6 MHz for 10x */ +}cy_en_ctb_power_t; + +/** +* The output stage of each Opamp can be configured for low-drive strength (1X) to drive internal circuits, +* for high-drive strength (10X) to drive external circuits, or as a comparator. +*/ +typedef enum { + CY_CTB_MODE_OPAMP1X = 0u, /**< Configure Opamp for low drive strength (1x) */ + CY_CTB_MODE_OPAMP10X = 1u << CTBM_OA_RES0_CTRL_OA0_DRIVE_STR_SEL_Pos, /**< Configure Opamp high drive strength (10x) */ + CY_CTB_MODE_COMP = 1u << CTBM_OA_RES0_CTRL_OA0_COMP_EN_Pos, /**< Configure Opamp as a comparator */ +}cy_en_ctb_mode_t; + +/** +* Each Opamp has a charge pump to increase the input range to the rails. +* When the charge pump is enabled, the input range is 0 to VDDA. +* When disabled, the input range is 0 to VDDA - 1.5 V. +* +** +* +* +* +* +* +* +* +* +* +*
    Charge PumpInput Range (V)
    OFF0 to VDDA-1.5
    ON0 to VDDA
    +* +* Note that in Deep Sleep mode, the charge pump is disabled so the input +* range is reduced. +*/ +typedef enum{ + CY_CTB_PUMP_DISABLE = 0u, /**< Charge pump is disabled for an input range of 0 to VDDA - 1.5 V */ + CY_CTB_PUMP_ENABLE = CTBM_OA_RES0_CTRL_OA0_PUMP_EN_Msk, /**< Charge pump is enabled for an input range of 0 to VDDA */ +}cy_en_ctb_pump_t; + +/** +* Configure the type of edge that will trigger a comparator interrupt or +* disable the interrupt entirely. +*/ +typedef enum +{ + CY_CTB_COMP_EDGE_DISABLE = 0u, /**< Disabled, no interrupts generated */ + CY_CTB_COMP_EDGE_RISING = 1u << CTBM_OA_RES0_CTRL_OA0_COMPINT_Pos, /**< Rising edge generates an interrupt */ + CY_CTB_COMP_EDGE_FALLING = 2u << CTBM_OA_RES0_CTRL_OA0_COMPINT_Pos, /**< Falling edge generates an interrupt */ + CY_CTB_COMP_EDGE_BOTH = 3u << CTBM_OA_RES0_CTRL_OA0_COMPINT_Pos, /**< Both edges generate an interrupt */ +}cy_en_ctb_comp_edge_t; + +/** Configure the comparator DSI trigger output level when output is synchronized. */ +typedef enum +{ + CY_CTB_COMP_DSI_TRIGGER_OUT_PULSE = 0u, /**< Send pulse on DSI for each edge of comparator output */ + CY_CTB_COMP_DSI_TRIGGER_OUT_LEVEL = CTBM_OA_RES0_CTRL_OA0_DSI_LEVEL_Msk, /**< DSI output is synchronized version of comparator output */ +}cy_en_ctb_comp_level_t; + +/** Bypass the comparator output synchronization for DSI trigger. */ +typedef enum +{ + CY_CTB_COMP_BYPASS_SYNC = 0u, /**< Comparator output is synchronized for DSI trigger */ + CY_CTB_COMP_BYPASS_NO_SYNC = CTBM_OA_RES0_CTRL_OA0_BYPASS_DSI_SYNC_Msk, /**< Comparator output is not synchronized for DSI trigger */ +}cy_en_ctb_comp_bypass_t; + +/** Disable or enable the 10 mV hysteresis for the comparator. */ +typedef enum +{ + CY_CTB_COMP_HYST_DISABLE = 0u, /**< Disable hysteresis */ + CY_CTB_COMP_HYST_10MV = CTBM_OA_RES0_CTRL_OA0_HYST_EN_Msk, /**< Enable the 10 mV hysteresis */ +}cy_en_ctb_comp_hyst_t; + +/** Switch state, either open or closed, to be used in \ref Cy_CTB_SetAnalogSwitch. */ +typedef enum +{ + CY_CTB_SWITCH_OPEN = 0uL, /**< Open the switch */ + CY_CTB_SWITCH_CLOSE = 1uL /**< Close the switch */ +}cy_en_ctb_switch_state_t; + +/** +* The switch register to be used in \ref Cy_CTB_SetAnalogSwitch. +* The CTB has three registers for configuring the switch routing matrix. +* */ +typedef enum +{ + CY_CTB_SWITCH_OA0_SW = 0u, /**< Switch register for Opamp0 */ + CY_CTB_SWITCH_OA1_SW = 1u, /**< Switch register for Opamp1 */ + CY_CTB_SWITCH_CTD_SW = 2u, /**< Switch register for CTDAC routing */ +}cy_en_ctb_switch_register_sel_t; + +/** +* Switch masks for Opamp0 to be used in \ref Cy_CTB_SetAnalogSwitch. +*/ +typedef enum +{ + CY_CTB_SW_OA0_POS_AMUXBUSA_MASK = CTBM_OA0_SW_OA0P_A00_Msk, /**< Switch A00: Opamp0 non-inverting input to AMUXBUS A */ + CY_CTB_SW_OA0_POS_PIN0_MASK = CTBM_OA0_SW_OA0P_A20_Msk, /**< Switch A20: Opamp0 non-inverting input to Pin 0 of CTB device port */ + CY_CTB_SW_OA0_POS_PIN6_MASK = CTBM_OA0_SW_OA0P_A30_Msk, /**< Switch A30: Opamp0 non-inverting input to Pin 6 of CTB device port */ + CY_CTB_SW_OA0_NEG_PIN1_MASK = CTBM_OA0_SW_OA0M_A11_Msk, /**< Switch A11: Opamp0 inverting input to Pin 1 of CTB device port */ + CY_CTB_SW_OA0_NEG_OUT_MASK = CTBM_OA0_SW_OA0M_A81_Msk, /**< Switch A81: Opamp0 inverting input to Opamp0 output */ + CY_CTB_SW_OA0_OUT_SARBUS0_MASK = CTBM_OA0_SW_OA0O_D51_Msk, /**< Switch D51: Opamp0 output to sarbus0 */ + CY_CTB_SW_OA0_OUT_SHORT_1X_10X_MASK = CTBM_OA0_SW_OA0O_D81_Msk, /**< Switch D81: Short Opamp0 1x with 10x outputs */ +}cy_en_ctb_oa0_switches_t; + +/** +* Switch masks for Opamp1 to be used in \ref Cy_CTB_SetAnalogSwitch. +*/ +typedef enum +{ + CY_CTB_SW_OA1_POS_AMUXBUSB_MASK = CTBM_OA1_SW_OA1P_A03_Msk, /**< Switch A03: Opamp1 non-inverting input to AMUXBUS B */ + CY_CTB_SW_OA1_POS_PIN5_MASK = CTBM_OA1_SW_OA1P_A13_Msk, /**< Switch A13: Opamp1 non-inverting input to Pin 5 of CTB device port */ + CY_CTB_SW_OA1_POS_PIN7_MASK = CTBM_OA1_SW_OA1P_A43_Msk, /**< Switch A43: Opamp1 non-inverting input to Pin 7 of CTB device port */ + CY_CTB_SW_OA1_POS_AREF_MASK = CTBM_OA1_SW_OA1P_A73_Msk, /**< Switch A73: Opamp1 non-inverting input to device Analog Reference (AREF) */ + CY_CTB_SW_OA1_NEG_PIN4_MASK = CTBM_OA1_SW_OA1M_A22_Msk, /**< Switch A22: Opamp1 inverting input to Pin 4 of CTB device port */ + CY_CTB_SW_OA1_NEG_OUT_MASK = CTBM_OA1_SW_OA1M_A82_Msk, /**< switch A82: Opamp1 inverting input to Opamp1 output */ + CY_CTB_SW_OA1_OUT_SARBUS0_MASK = CTBM_OA1_SW_OA1O_D52_Msk, /**< Switch D52: Opamp1 output to sarbus0 */ + CY_CTB_SW_OA1_OUT_SARBUS1_MASK = CTBM_OA1_SW_OA1O_D62_Msk, /**< Switch D62: Opamp1 output to sarbus1 */ + CY_CTB_SW_OA1_OUT_SHORT_1X_10X_MASK = CTBM_OA1_SW_OA1O_D82_Msk, /**< Switch D82: Short Opamp1 1x with 10x outputs */ +}cy_en_ctb_oa1_switches_t; + +/** +* Switch masks for CTDAC routing to be used in \ref Cy_CTB_SetAnalogSwitch. +* +* Eight of the 10 switches are enabled by the CTDAC IP block. That is, +* \ref Cy_CTDAC_Enable must also be called to close these switches. +* The CTDAC output should be high-z in order to not interfere with the CTB. +* +* The two switches that do not require the CTDAC are: +* - CY_CTB_SW_CTD_CHOLD_OA0_POS_ISOLATE_MASK (switch CIS) +* - CY_CTB_SW_CTD_CHOLD_LEAKAGE_REDUCTION_MASK (switch ILR) +*/ +typedef enum +{ + CY_CTB_SW_CTD_REF_OA1_OUT_MASK = CTBM_CTD_SW_CTDD_CRD_Msk, /**< Switch CRD: Opamp1 output to CTDAC reference. CTDAC must be enabled */ + CY_CTB_SW_CTD_REFSENSE_OA1_NEG_MASK = CTBM_CTD_SW_CTDS_CRS_Msk, /**< Switch CRS: CTDAC reference sense to Opamp1 inverting input. CTDAC must be enabled */ + CY_CTB_SW_CTD_OUT_OA1_NEG_MASK = CTBM_CTD_SW_CTDS_COR_Msk, /**< Switch COR: CTDAC output to Opamp1 inverting input. CTDAC must be enabled */ + CY_CTB_SW_CTD_OUT_PIN6_MASK = CTBM_CTD_SW_CTDO_C6H_Msk, /**< Switch C6H: CTDAC output to P6 of CTB device port. CTDAC must be enabled */ + CY_CTB_SW_CTD_OUT_CHOLD_MASK = CTBM_CTD_SW_CTDO_COS_Msk, /**< Switch COS: CTDAC output to hold cap (deglitch capable). CTDAC must be enabled */ + CY_CTB_SW_CTD_OUT_OA0_1X_OUT_MASK = CTBM_CTD_SW_CTDH_COB_Msk, /**< Switch COB: Drive CTDAC output with opamp0 1x output during hold mode. CTDAC must be enabled */ + CY_CTB_SW_CTD_CHOLD_CONNECT_MASK = CTBM_CTD_SW_CTDH_CHD_Msk, /**< Switch CHD: Hold cap connection. CTDAC must be enabled */ + CY_CTB_SW_CTD_CHOLD_OA0_POS_MASK = CTBM_CTD_SW_CTDH_CA0_Msk, /**< Switch CA0: Hold cap to Opamp0 non-inverting input. CTDAC must be enabled */ + CY_CTB_SW_CTD_CHOLD_OA0_POS_ISOLATE_MASK = CTBM_CTD_SW_CTDH_CIS_Msk, /**< Switch CIS: Opamp0 non-inverting input isolation (for hold cap) */ + CY_CTB_SW_CTD_CHOLD_LEAKAGE_REDUCTION_MASK = CTBM_CTD_SW_CTDH_ILR_Msk, /**< Switch ILR: Hold cap leakage reduction (drives far side of isolation switch CIS) */ +}cy_en_ctb_ctd_switches_t; + +/** +* Each Opamp also has a programmable compensation capacitor block, +* that optimizes the stability of the Opamp performance based on output load. +* The compensation cap will be set by the driver based on the Opamp drive strength (1x or 10x) selection. +*/ +typedef enum +{ + CY_CTB_OPAMP_COMPENSATION_CAP_OFF = 0u, /**< No compensation */ + CY_CTB_OPAMP_COMPENSATION_CAP_MIN = 1u, /**< Minimum compensation - for 1x drive*/ + CY_CTB_OPAMP_COMPENSATION_CAP_MED = 2u, /**< Medium compensation */ + CY_CTB_OPAMP_COMPENSATION_CAP_MAX = 3u, /**< Maximum compensation - for 10x drive */ +}cy_en_ctb_compensation_cap_t; + +/** Enable or disable the gain booster. +* The gain booster will be set by the driver based on the Opamp drive strength (1x or 10x) selection. +*/ +typedef enum +{ + CY_CTB_OPAMP_BOOST_DISABLE = 0u, /**< Disable gain booster - for 10x drive */ + CY_CTB_OPAMP_BOOST_ENABLE = CTBM_OA_RES0_CTRL_OA0_BOOST_EN_Msk, /**< Enable gain booster - for 1x drive */ +}cy_en_ctb_boost_en_t; + +/** Sample and hold modes for firmware sampling of the CTDAC output. +* +* To perform a sample or a hold, a preparation step must first be executed to +* open the required switches. +* +* -# Call \ref Cy_CTB_DACSampleAndHold with CY_CTB_SH_PREPARE_SAMPLE or CY_CTB_SH_PREPARE_HOLD +* -# Enable or disable CTDAC output +* -# Call \ref Cy_CTB_DACSampleAndHold with CY_CTB_SH_SAMPLE or CY_CTB_SH_HOLD +*/ +typedef enum +{ + CY_CTB_SH_DISABLE = 0u, /**< The hold capacitor is not connected - this disables sample and hold */ + CY_CTB_SH_PREPARE_SAMPLE = 1u, /**< Prepares the required switches for a following sample */ + CY_CTB_SH_SAMPLE = 2u, /**< Performs a sample of the voltage */ + CY_CTB_SH_PREPARE_HOLD = 3u, /**< Prepares the required switches for a following hold */ + CY_CTB_SH_HOLD = 4u, /**< Performs a hold of the previously sampled voltage */ +}cy_en_ctb_sample_hold_mode_t; + +/** AREF IPTAT bias current output for the CTB +* +* The CTB bias current can be 1 uA (normal) or 100 nA (low current). +*/ +typedef enum +{ + CY_CTB_IPTAT_NORMAL = 0u, /**< 1 uA bias current to the CTB */ + CY_CTB_IPTAT_LOW = 1u << PASS_AREF_AREF_CTRL_CTB_IPTAT_SCALE_Pos, /**< 100 nA bias current to the CTB */ +}cy_en_ctb_iptat_t; + +/** CTB charge pump clock sources +* +* The CTB pump clock can come from: +* - a dedicated divider clock in the SRSS +* - one of the CLK_PERI dividers +*/ +typedef enum +{ + CY_CTB_CLK_PUMP_SRSS = 0u, /**< Use the dedicated pump clock from SRSSp */ + CY_CTB_CLK_PUMP_PERI = 1u << PASS_AREF_AREF_CTRL_CLOCK_PUMP_PERI_SEL_Pos, /**< Use one of the CLK_PERI dividers */ +}cy_en_ctb_clk_pump_source_t; + +/** High level opamp current modes */ +typedef enum +{ + CY_CTB_CURRENT_HIGH_ACTIVE = 0u, /**< Uses 1 uA reference current with charge pump enabled. Available in Active and Low Power */ + CY_CTB_CURRENT_HIGH_ACTIVE_DEEPSLEEP = 1u, /**< Uses 1 uA reference current with charge pump disabled. Available in all power modes */ + CY_CTB_CURRENT_LOW_ACTIVE_DEEPSLEEP = 2u, /**< Uses 100 nA reference current with charge pump disabled. Available in all power modes */ +}cy_en_ctb_current_mode_t; + +/** Return states for \ref Cy_CTB_Init, \ref Cy_CTB_OpampInit, \ref Cy_CTB_DeInit, and \ref Cy_CTB_FastInit */ +typedef enum { + CY_CTB_SUCCESS = 0x00uL, /**< Initialization completed successfully */ + CY_CTB_BAD_PARAM = CY_CTB_ID | CY_PDL_STATUS_ERROR | 0x01uL, /**< Input pointers were NULL and initialization could not be completed */ +}cy_en_ctb_status_t; + +/** \} group_ctb_enums */ + +/*************************************** +* Configuration Structures +***************************************/ + +/** +* \addtogroup group_ctb_data_structures +* \{ +*/ + +/** +* Configuration structure to set up the entire CTB to be used with \ref Cy_CTB_Init. +*/ +typedef struct { + cy_en_ctb_deep_sleep_t deepSleep; /**< Enable or disable the CTDAC during Deep Sleep */ + bool enable; /**< Enable hardware after initialization. If disabled, call \ref Cy_CTB_Enable after initialization */ + + /* Opamp0 configuration */ + cy_en_ctb_power_t oa0Power; /**< Opamp0 power mode: off, low, medium, or high */ + cy_en_ctb_mode_t oa0Mode; /**< Opamp0 usage mode: 1x drive, 10x drive, or as a comparator */ + cy_en_ctb_pump_t oa0Pump; /**< Opamp0 charge pump: enable to increase input range for rail-to-rail operation */ + cy_en_ctb_comp_edge_t oa0CompEdge; /**< Opamp0 comparator edge detection: disable, rising, falling, or both */ + cy_en_ctb_comp_level_t oa0CompLevel; /**< Opamp0 comparator DSI (trigger) output: pulse or level */ + cy_en_ctb_comp_bypass_t oa0CompBypass; /**< Opamp0 comparator DSI (trigger) output synchronization */ + cy_en_ctb_comp_hyst_t oa0CompHyst; /**< Opamp0 comparator hysteresis: enable for 10 mV hysteresis */ + bool oa0CompIntrEn; /**< Opamp0 comparator interrupt enable */ + + /* Opamp1 configuration */ + cy_en_ctb_power_t oa1Power; /**< Opamp1 power mode: off, low, medium, or high */ + cy_en_ctb_mode_t oa1Mode; /**< Opamp1 usage mode: 1x drive, 10x drive, or as a comparator */ + cy_en_ctb_pump_t oa1Pump; /**< Opamp1 charge pump: enable to increase input range for rail-to-rail operation */ + cy_en_ctb_comp_edge_t oa1CompEdge; /**< Opamp1 comparator edge detection: disable, rising, falling, or both */ + cy_en_ctb_comp_level_t oa1CompLevel; /**< Opamp1 comparator DSI (trigger) output: pulse or level */ + cy_en_ctb_comp_bypass_t oa1CompBypass; /**< Opamp1 comparator DSI (trigger) output synchronization */ + cy_en_ctb_comp_hyst_t oa1CompHyst; /**< Opamp1 comparator hysteresis: enable for 10 mV hysteresis */ + bool oa1CompIntrEn; /**< Opamp1 comparator interrupt enable */ + + /* Switch analog routing configuration */ + bool configRouting; /**< Configure or ignore routing related registers */ + uint32_t oa0SwitchCtrl; /**< Opamp0 routing control */ + uint32_t oa1SwitchCtrl; /**< Opamp1 routing control */ + uint32_t ctdSwitchCtrl; /**< Routing control between the CTDAC and CTB blocks */ +}cy_stc_ctb_config_t; + +/** +* This configuration structure is used to initialize only one Opamp of the CTB +* without impacting analog routing. This structure is used with \ref Cy_CTB_OpampInit. +*/ +typedef struct { + cy_en_ctb_deep_sleep_t deepSleep; /**< Enable or disable the CTDAC during Deep Sleep */ + bool enable; /**< Enable hardware after initialization. If disabled, call \ref Cy_CTB_Enable after initialization */ + + /* Opamp configuration */ + cy_en_ctb_power_t oaPower; /**< Opamp power mode: off, low, medium, or high */ + cy_en_ctb_mode_t oaMode; /**< Opamp usage mode: 1x drive, 10x drive, or as a comparator */ + cy_en_ctb_pump_t oaPump; /**< Opamp charge pump: enable to increase input range for rail-to-rail operation */ + cy_en_ctb_comp_edge_t oaCompEdge; /**< Opamp comparator edge detection: disable, rising, falling, or both */ + cy_en_ctb_comp_level_t oaCompLevel; /**< Opamp comparator DSI (trigger) output: pulse or level */ + cy_en_ctb_comp_bypass_t oaCompBypass; /**< Opamp comparator DSI (trigger) output synchronization */ + cy_en_ctb_comp_hyst_t oaCompHyst; /**< Opamp comparator hysteresis: enable for 10 mV hysteresis */ + bool oaCompIntrEn; /**< Opamp comparator interrupt enable */ +}cy_stc_ctb_opamp_config_t; + +/** This configuration structure is used to quickly initialize Opamp0 for the most commonly used configurations. +* +* Other configuration options are set to: +* - .oa0Pump = CY_CTB_PUMP_ENABLE +* - .oa0CompEdge = CY_CTB_COMP_EDGE_BOTH +* - .oa0CompLevel = CY_CTB_COMP_DSI_TRIGGER_OUT_PULSE +* - .oa0CompBypass = CY_CTB_COMP_BYPASS_SYNC +* - .oa0CompHyst = CY_CTB_COMP_HYST_10MV +* - .oa0CompIntrEn = true +*/ +typedef struct +{ + cy_en_ctb_power_t oa0Power; /**< Opamp0 power mode: off, low, medium, or high */ + cy_en_ctb_mode_t oa0Mode; /**< Opamp0 usage mode: 1x drive, 10x drive, or as a comparator */ + uint32_t oa0SwitchCtrl; /**< Opamp0 routing control */ + uint32_t ctdSwitchCtrl; /**< Routing control between the CTDAC and CTB blocks */ +}cy_stc_ctb_fast_config_oa0_t; + +/** This configuration structure is used to quickly initialize Opamp1 for the most commonly used configurations. +* +* Other configuration options are set to: +* - .oa1Pump = CY_CTB_PUMP_ENABLE +* - .oa1CompEdge = CY_CTB_COMP_EDGE_BOTH +* - .oa1CompLevel = CY_CTB_COMP_DSI_TRIGGER_OUT_PULSE +* - .oa1CompBypass = CY_CTB_COMP_BYPASS_SYNC +* - .oa1CompHyst = CY_CTB_COMP_HYST_10MV +* - .oa1CompIntrEn = true +*/ +typedef struct +{ + cy_en_ctb_power_t oa1Power; /**< Opamp1 power mode: off, low, medium, or high */ + cy_en_ctb_mode_t oa1Mode; /**< Opamp1 usage mode: 1x drive, 10x drive, or as a comparator */ + uint32_t oa1SwitchCtrl; /**< Opamp1 routing control */ + uint32_t ctdSwitchCtrl; /**< Routing control between the CTDAC and CTB blocks */ +}cy_stc_ctb_fast_config_oa1_t; + +/** \} group_ctb_data_structures */ + + +/** \addtogroup group_ctb_globals +* \{ +* The \ref Cy_CTB_FastInit function allows for fast and easy initialization of the CTB +* based on commonly used configurations. Only routing switches required for +* the selected mode are configured, leaving final input and output connections +* to the user. Additional use modes are provided to easily configure the CTB as +* an output buffer or reference buffer for the CTDAC. These modes are used +* along with the CTDAC PDL driver. +*/ +/*************************************** +* Global Variables +***************************************/ + +/** Configure Opamp0 as unused - powered down. See \ref Cy_CTB_FastInit. */ +extern const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Unused; + +/** Configure Opamp0 as a comparator. No routing is configured. +* +* \image html ctb_fast_config_comp.png +* \image latex ctb_fast_config_comp.png width=100px +* +* See \ref Cy_CTB_FastInit. +*/ +extern const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Comp; + +/** Configure Opamp0 as an Opamp with 1x drive. No routing is configured. +* +* \image html ctb_fast_config_opamp1x.png +* \image latex ctb_fast_config_opamp1x.png width=100px +* +* See \ref Cy_CTB_FastInit. +*/ +extern const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Opamp1x; + +/** Configure Opamp0 as an Opamp with 10x drive. No routing is configured. +* +* \image html ctb_fast_config_opamp10x.png +* \image latex ctb_fast_config_opamp10x.png width=100px +* +* See \ref Cy_CTB_FastInit. +*/ +extern const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Opamp10x; + +/** Configure Opamp0 as one stage of a differential amplifier. +* The Opamp is in 10x drive and the switches shown are closed. +* +* \image html ctb_fast_config_oa0_diffamp.png +* \image latex ctb_fast_config_oa0_diffamp.png width=100px +* +* See the device datasheet for the dedicated CTB port. +* +* To be used with \ref Cy_CTB_FastInit and \ref Cy_CTB_Fast_Opamp1_Diffamp. +*/ +extern const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Diffamp; + +/** Configure Opamp0 as a buffer for the CTDAC output. +* The buffer is in 10x drive and the switches shown are closed. +* Configure the CTDAC for output buffer mode by calling \ref Cy_CTDAC_FastInit +* with \ref Cy_CTDAC_Fast_VddaRef_BufferedOut or \ref Cy_CTDAC_Fast_OA1Ref_BufferedOut. +* +* \image html ctb_fast_config_vdac_output.png +* \image latex ctb_fast_config_vdac_output.png +* +* See the device datasheet for the dedicated CTB port. +* +* See \ref Cy_CTB_FastInit. +*/ +extern const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Vdac_Out; + +/** Configure Opamp0 as a buffer for the CTDAC output with the sample and hold capacitor connected. +* The buffer is in 10x drive and the switches shown are closed. +* Configure the CTDAC for output buffer mode by calling \ref Cy_CTDAC_FastInit +* with \ref Cy_CTDAC_Fast_VddaRef_BufferedOut or \ref Cy_CTDAC_Fast_OA1Ref_BufferedOut. + +* \image html ctb_fast_config_vdac_sh.png +* \image latex ctb_fast_config_vdac_sh.png +* +* See the device datasheet for the dedicated CTB port. +* +* See \ref Cy_CTB_FastInit. +*/ +extern const cy_stc_ctb_fast_config_oa0_t Cy_CTB_Fast_Opamp0_Vdac_Out_SH; + +/** Configure Opamp1 as unused - powered down. See \ref Cy_CTB_FastInit.*/ +extern const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Unused; + +/** Configure Opamp1 as a comparator. No routing is configured. +* +* \image html ctb_fast_config_comp.png +* \image latex ctb_fast_config_comp.png width=100px +* +* See \ref Cy_CTB_FastInit. +*/ +extern const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Comp; + +/** Configure Opamp1 as an Opamp with 1x drive. No routing is configured. +* +* \image html ctb_fast_config_opamp1x.png +* \image latex ctb_fast_config_opamp1x.png width=100px +* +* See \ref Cy_CTB_FastInit. +*/ +extern const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Opamp1x; + +/** Configure Opamp1 as an opamp with 10x drive. No routing is configured. +* +* \image html ctb_fast_config_opamp10x.png +* \image latex ctb_fast_config_opamp10x.png width=100px +* +* See \ref Cy_CTB_FastInit. +*/ +extern const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Opamp10x; + +/** Configure Opamp1 as one stage of a differential amplifier. +* The Opamp is in 10x drive and the switches shown are closed. +* +* \image html ctb_fast_config_oa1_diffamp.png +* \image latex ctb_fast_config_oa1_diffamp.png width=100px +* +* See the device datasheet for the dedicated CTB port. +* +* To be used with \ref Cy_CTB_FastInit and \ref Cy_CTB_Fast_Opamp0_Diffamp. +* +*/ +extern const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Diffamp; + +/** Configure Opamp1 as a buffer for the CTDAC reference. The reference comes from the +* internal analog reference block (AREF). +* The buffer is in 1x drive and the switches shown are closed. +* Configure the CTDAC to use the buffered reference by calling \ref Cy_CTDAC_FastInit +* with \ref Cy_CTDAC_Fast_OA1Ref_UnbufferedOut or \ref Cy_CTDAC_Fast_OA1Ref_BufferedOut. +* +* \image html ctb_fast_config_vdac_aref.png +* \image latex ctb_fast_config_vdac_aref.png +* +* See \ref Cy_CTB_FastInit. +* +* Note the AREF block needs to be configured using a separate driver. +*/ +extern const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Vdac_Ref_Aref; + +/** Configure Opamp1 as a buffer for the CTDAC reference. The reference comes from Pin 5. +* The buffer is in 1x drive and the switches shown are closed. +* Configure the CTDAC to use the buffered reference by calling \ref Cy_CTDAC_FastInit +* with \ref Cy_CTDAC_Fast_OA1Ref_UnbufferedOut or \ref Cy_CTDAC_Fast_OA1Ref_BufferedOut. +* +* \image html ctb_fast_config_vdac_pin5.png +* \image latex ctb_fast_config_vdac_pin5.png +* +* See the device datasheet for the dedicated CTB port. +* +* See \ref Cy_CTB_FastInit. +*/ +extern const cy_stc_ctb_fast_config_oa1_t Cy_CTB_Fast_Opamp1_Vdac_Ref_Pin5; + +/** \} group_ctb_globals */ + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_ctb_functions +* \{ +*/ + +/** +* \addtogroup group_ctb_functions_init +* This set of functions are for initializing, enabling, and disabling the CTB. +* \{ +*/ +cy_en_ctb_status_t Cy_CTB_Init(CTBM_Type *base, const cy_stc_ctb_config_t *config); +cy_en_ctb_status_t Cy_CTB_OpampInit(CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum, const cy_stc_ctb_opamp_config_t *config); +cy_en_ctb_status_t Cy_CTB_DeInit(CTBM_Type *base, bool deInitRouting); +cy_en_ctb_status_t Cy_CTB_FastInit(CTBM_Type *base, const cy_stc_ctb_fast_config_oa0_t *config0, const cy_stc_ctb_fast_config_oa1_t *config1); +__STATIC_INLINE void Cy_CTB_Enable(CTBM_Type *base); +__STATIC_INLINE void Cy_CTB_Disable(CTBM_Type *base); +/** \} */ + +/** +* \addtogroup group_ctb_functions_basic +* This set of functions are for configuring basic usage of the CTB. +* \{ +*/ +void Cy_CTB_SetDeepSleepMode(CTBM_Type *base, cy_en_ctb_deep_sleep_t deepSleep); +void Cy_CTB_SetOutputMode(CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum, cy_en_ctb_mode_t mode); +void Cy_CTB_SetPower(CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum, cy_en_ctb_power_t power, cy_en_ctb_pump_t pump); +/** \} */ + +/** +* \addtogroup group_ctb_functions_sample_hold +* This function enables sample and hold of the CTDAC output. +* \{ +*/ +void Cy_CTB_DACSampleAndHold(CTBM_Type *base, cy_en_ctb_sample_hold_mode_t mode); +/** \} */ + +/** +* \addtogroup group_ctb_functions_comparator +* This set of functions are specific to the comparator mode +* \{ +*/ +void Cy_CTB_CompSetConfig(CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum, cy_en_ctb_comp_level_t level, cy_en_ctb_comp_bypass_t bypass, cy_en_ctb_comp_hyst_t hyst); +uint32_t Cy_CTB_CompGetConfig(const CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum); +void Cy_CTB_CompSetInterruptEdgeType(CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum, cy_en_ctb_comp_edge_t edge); +uint32_t Cy_CTB_CompGetStatus(const CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum); +/** \} */ + +/** +* \addtogroup group_ctb_functions_trim +* These are advanced functions for trimming the offset and slope of the Opamps. +* Most users do not need to call these functions and can use the factory trimmed values. +* \{ +*/ +void Cy_CTB_OpampSetOffset(CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum, uint32_t trim); +uint32_t Cy_CTB_OpampGetOffset(const CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum); +void Cy_CTB_OpampSetSlope(CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum, uint32_t trim); +uint32_t Cy_CTB_OpampGetSlope(const CTBM_Type *base, cy_en_ctb_opamp_sel_t opampNum); +/** \} */ + +/** +* \addtogroup group_ctb_functions_switches +* This set of functions is for controlling routing switches. +* \{ +*/ +void Cy_CTB_SetAnalogSwitch(CTBM_Type *base, cy_en_ctb_switch_register_sel_t switchSelect, uint32_t switchMask, cy_en_ctb_switch_state_t state); +uint32_t Cy_CTB_GetAnalogSwitch(const CTBM_Type *base, cy_en_ctb_switch_register_sel_t switchSelect); +void Cy_CTB_OpenAllSwitches(CTBM_Type *base); +/** \} */ + +/** +* \addtogroup group_ctb_functions_interrupts +* This set of functions is related to the comparator interrupts. +* \{ +*/ +__STATIC_INLINE uint32_t Cy_CTB_GetInterruptStatus(const CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum); +__STATIC_INLINE void Cy_CTB_ClearInterrupt(CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum); +__STATIC_INLINE void Cy_CTB_SetSwInterrupt(CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum); +__STATIC_INLINE void Cy_CTB_SetInterruptMask(CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum); +__STATIC_INLINE uint32_t Cy_CTB_GetInterruptMask(const CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum); +__STATIC_INLINE uint32_t Cy_CTB_GetInterruptStatusMasked(const CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum); +/** \} */ + +/** +* \addtogroup group_ctb_functions_aref +* This set of functions impacts all Opamps on the chip. +* Notice how some of these functions do not take a base address input. +* When calling \ref Cy_CTB_SetCurrentMode for a CTB instance on the device, +* it should be called for all other CTB instances as well. This is because +* there is only one IPTAT level (1 uA or 100 nA) chip wide. +* \{ +*/ +void Cy_CTB_SetCurrentMode(CTBM_Type *base, cy_en_ctb_current_mode_t currentMode); +__STATIC_INLINE void Cy_CTB_SetIptatLevel(cy_en_ctb_iptat_t iptat); +__STATIC_INLINE void Cy_CTB_SetClkPumpSource(cy_en_ctb_clk_pump_source_t clkPump); +__STATIC_INLINE void Cy_CTB_EnableRedirect(void); +__STATIC_INLINE void Cy_CTB_DisableRedirect(void); +/** \} */ + +/** +* \addtogroup group_ctb_functions_init +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_CTB_Enable +****************************************************************************//** +* +* Powers up the hardware block necessary for the operation of the CTB. +* +* \param base +* Pointer to structure describing registers +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTB_Enable(CTBM_Type *base) +{ + base->CTB_CTRL |= CTBM_CTB_CTRL_ENABLED_Msk; +} + +/******************************************************************************* +* Function Name: Cy_CTB_Disable +****************************************************************************//** +* +* Powers down the hardware block necessary for the operation of the CTB. +* +* \param base +* Pointer to structure describing registers +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTB_Disable(CTBM_Type *base) +{ + base->CTB_CTRL &= (~CTBM_CTB_CTRL_ENABLED_Msk); +} + +/** \} */ + +/** +* \addtogroup group_ctb_functions_interrupts +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_CTB_GetInterruptStatus +****************************************************************************//** +* +* Returns status of the interrupt that happens when the configured comparator +* edge is detected. +* +* \param base +* Pointer to structure describing registers +* +* \param compNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \return Interrupt status +* 0 - Edge was not detected +* Non-zero - Configured edge type was detected +* +* If compNum is CY_CTB_OPAMP_BOTH, cast the returned status +* to cy_en_ctb_opamp_sel_t to determine which comparator edge (or both) +* was detected. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_CTB_GetInterruptStatus(const CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(compNum)); + + return base->INTR & (uint32_t) compNum; +} + +/******************************************************************************* +* Function Name: Cy_CTB_ClearInterrupt +****************************************************************************//** +* +* Clears the CTB comparator triggered interrupt. +* The interrupt must be cleared with this function so that the hardware +* can set subsequent interrupts and those interrupts can be forwarded +* to the interrupt controller, if enabled. +* +* \param base +* Pointer to structure describing registers +* +* \param compNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTB_ClearInterrupt(CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(compNum)); + + base->INTR = (uint32_t) compNum; +} + +/******************************************************************************* +* Function Name: Cy_CTB_SetSwInterrupt +****************************************************************************//** +* +* Forces the CTB interrupt to trigger using software. +* +* \param base +* Pointer to structure describing registers +* +* \param compNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTB_SetSwInterrupt(CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(compNum)); + + base->INTR_SET = (uint32_t) compNum; +} + +/******************************************************************************* +* Function Name: Cy_CTB_SetInterruptMask +****************************************************************************//** +* +* Configure the CTB comparator edge interrupt to be forwarded to the +* CPU interrupt controller. +* +* \param base +* Pointer to structure describing registers +* +* \param compNum +* CY_CTB_OPAMP_NONE, CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* Calling this function with CY_CTB_OPAMP_NONE will disable all +* interrupt requests. +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTB_SetInterruptMask(CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM_ALL(compNum)); + + base->INTR_MASK = (uint32_t) compNum; +} + +/******************************************************************************* +* Function Name: Cy_CTB_GetInterruptMask +****************************************************************************//** +* +* Returns whether the CTB comparator edge interrupt output is +* forwarded to the CPU interrupt controller as configured by +* \ref Cy_CTB_SetInterruptMask. +* +* \param base +* Pointer to structure describing registers +* +* \param compNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \return Interrupt mask +* 0 - Interrupt output not forwarded to interrupt controller +* Non-zero - Interrupt output forwarded to interrupt controller +* +* If compNum is CY_CTB_OPAMP_BOTH, cast the returned mask +* to cy_en_ctb_opamp_sel_t to determine which comparator interrupt +* output (or both) is forwarded. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_CTB_GetInterruptMask(const CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(compNum)); + + return base->INTR_MASK & (uint32_t) compNum; +} + +/******************************************************************************* +* Function Name: Cy_CTB_GetInterruptStatusMasked +****************************************************************************//** +* +* Returns the CTB comparator edge output interrupt state after being masked. +* This is the bitwise AND of \ref Cy_CTB_GetInterruptStatus and \ref Cy_CTB_GetInterruptMask. +* +* \param base +* Pointer to structure describing registers +* +* \param compNum +* CY_CTB_OPAMP_0, CY_CTB_OPAMP_1, or CY_CTB_OPAMP_BOTH +* +* \return Interrupt masked +* 0 - Edge not detected or not masked +* Non-zero - Configured edge type detected and masked +* +* If compNum is CY_CTB_OPAMP_BOTH, cast the returned value +* to cy_en_ctb_opamp_sel_t to determine which comparator interrupt +* output (or both) is detected and masked. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_CTB_GetInterruptStatusMasked(const CTBM_Type *base, cy_en_ctb_opamp_sel_t compNum) +{ + CY_ASSERT_L3(CY_CTB_OPAMPNUM(compNum)); + + return base->INTR_MASKED & (uint32_t) compNum; +} +/** \} */ + +/** +* \addtogroup group_ctb_functions_aref +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_CTB_SetIptatLevel +****************************************************************************//** +* +* Set the IPTAT level to 1uA or 100nA. The IPTAT generator is used by the CTB +* for slope offset drift. +* +* \param iptat +* Value from enum \ref cy_en_ctb_iptat_t +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTB_SetIptatLevel(cy_en_ctb_iptat_t iptat) +{ + CY_ASSERT_L3(CY_CTB_IPTAT(iptat)); + + PASS_AREF->AREF_CTRL = (PASS_AREF->AREF_CTRL & ~PASS_AREF_AREF_CTRL_CTB_IPTAT_SCALE_Msk) | (uint32_t) iptat; +} + +/******************************************************************************* +* Function Name: Cy_CTB_SetClkPumpSource +****************************************************************************//** +* +* Set the clock source for the CTB charge pump. The clock can come from: +* - a dedicated divider off of one of the CLK_PATH in the SRSS +* Call the following functions to configure the pump clock from the SRSS: +* - \ref Cy_SysClk_ClkPumpSetSource +* - \ref Cy_SysClk_ClkPumpSetDivider +* - \ref Cy_SysClk_ClkPumpEnable +* - one of the Peri Clock dividers +* Call the following functions to configure a Peri Clock divider as the +* pump clock: +* - \ref Cy_SysClk_PeriphAssignDivider with the IP block set to PCLK_PASS_CLOCK_PUMP_PERI +* - \ref Cy_SysClk_PeriphSetDivider +* - \ref Cy_SysClk_PeriphEnableDivider +* +* \param clkPump +* Value from enum \ref cy_en_ctb_clk_pump_source_t +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTB_SetClkPumpSource(cy_en_ctb_clk_pump_source_t clkPump) +{ + CY_ASSERT_L3(CY_CTB_CLKPUMP(clkPump)); + + PASS_AREF->AREF_CTRL = (PASS_AREF->AREF_CTRL & ~PASS_AREF_AREF_CTRL_CLOCK_PUMP_PERI_SEL_Msk) | (uint32_t) clkPump; +} + +/******************************************************************************* +* Function Name: Cy_CTB_EnableRedirect +****************************************************************************//** +* +* Normally, the AREF IZTAT is routed to the CTB IZTAT and the AREF IPTAT +* is routed to the CTB IPTAT: +* +* - CTB.IZTAT = AREF.IZTAT +* - CTB.IPTAT = AREF.IPTAT +* +* However, the AREF IPTAT can be redirected to the CTB IZTAT and the CTB IPTAT +* is off. +* +* - CTB.IZTAT = AREF.IPTAT +* - CTB.IPTAT = HiZ +* +* The redirection applies to all opamps on the device and +* should be used when the IPTAT bias level is set to 100 nA +* (see \ref Cy_CTB_SetIptatLevel). +* +* Without the IPTAT reference, the CTB cannot compensate for the slope of +* the offset across temperature. +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTB_EnableRedirect(void) +{ + PASS_AREF->AREF_CTRL |= PASS_AREF_AREF_CTRL_CTB_IPTAT_REDIRECT_Msk; +} + +/******************************************************************************* +* Function Name: Cy_CTB_DisableRedirect +****************************************************************************//** +* +* Disable the redirection of the AREF IPTAT to the CTB IZTAT for all opamps +* on the device as enabled by \ref Cy_CTB_EnableRedirect. +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTB_DisableRedirect(void) +{ + PASS_AREF->AREF_CTRL &= ~(PASS_AREF_AREF_CTRL_CTB_IPTAT_REDIRECT_Msk); +} + +/** \} */ + +/** \} group_ctb_functions */ + +#if defined(__cplusplus) +} +#endif + +#endif /** !defined(CY_CTB_H) */ + +/** \} group_ctb */ + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctdac/cy_ctdac.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctdac/cy_ctdac.c new file mode 100644 index 0000000000..796094d797 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctdac/cy_ctdac.c @@ -0,0 +1,656 @@ +/***************************************************************************//** +* \file cy_ctdac.c +* \version 1.0 +* +* Provides the public functions for the API for the CTDAC driver. +* +******************************************************************************** +* \copyright +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "ctdac/cy_ctdac.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** Static function to configure the clock */ +static void Cy_CTDAC_ConfigureClock(cy_en_ctdac_update_t updateMode, cy_en_divider_types_t dividerType, + uint32_t dividerNum, uint32_t dividerIntValue, uint32_t dividerFracValue); + +const cy_stc_ctdac_fast_config_t Cy_CTDAC_Fast_VddaRef_UnbufferedOut = +{ + /*.refSource */ CY_CTDAC_REFSOURCE_VDDA, + /*.outputBuffer */ CY_CTDAC_OUTPUT_UNBUFFERED, +}; + +const cy_stc_ctdac_fast_config_t Cy_CTDAC_Fast_VddaRef_BufferedOut = +{ + /*.refSource */ CY_CTDAC_REFSOURCE_VDDA, + /*.outputBuffer */ CY_CTDAC_OUTPUT_BUFFERED, +}; + +const cy_stc_ctdac_fast_config_t Cy_CTDAC_Fast_OA1Ref_UnbufferedOut = +{ + /*.refSource */ CY_CTDAC_REFSOURCE_EXTERNAL, + /*.outputBuffer */ CY_CTDAC_OUTPUT_UNBUFFERED, +}; + +const cy_stc_ctdac_fast_config_t Cy_CTDAC_Fast_OA1Ref_BufferedOut = +{ + /*.refSource */ CY_CTDAC_REFSOURCE_EXTERNAL, + /*.outputBuffer */ CY_CTDAC_OUTPUT_BUFFERED, +}; + +/******************************************************************************* +* Function Name: Cy_CTDAC_Init +****************************************************************************//** +* +* Initialize all CTDAC configuration registers +* +* \param base +* Pointer to structure describing registers +* +* \param config +* Pointer to structure containing configuration data +* +* \return cy_en_ctdac_status_t +* Status of initialization, CY_CTDAC_SUCCESS or CY_CTDAC_BAD_PARAM +* +*******************************************************************************/ +cy_en_ctdac_status_t Cy_CTDAC_Init(CTDAC_Type *base, const cy_stc_ctdac_config_t *config) +{ + CY_ASSERT_L1(NULL != base); + CY_ASSERT_L1(NULL != config); + + cy_en_ctdac_status_t result; + uint32_t ctdacCtrl = CY_CTDAC_DEINIT; + uint32_t setSwitch = CY_CTDAC_DEINIT; + uint32_t clearSwitch = CY_CTDAC_DEINIT; + + if ((NULL == base) || (NULL == config)) + { + result = CY_CTDAC_BAD_PARAM; + } + else + { + + CY_ASSERT_L3(CY_CTDAC_REFSOURCE(config->refSource)); + CY_ASSERT_L3(CY_CTDAC_FORMAT(config->formatMode)); + CY_ASSERT_L3(CY_CTDAC_UPDATE(config->updateMode)); + CY_ASSERT_L3(CY_CTDAC_DEGLITCH(config->deglitchMode)); + CY_ASSERT_L3(CY_CTDAC_OUTPUTMODE(config->outputMode)); + CY_ASSERT_L3(CY_CTDAC_OUTPUTBUFFER(config->outputBuffer)); + CY_ASSERT_L3(CY_CTDAC_DEEPSLEEP(config->deepSleep)); + CY_ASSERT_L2(CY_CTDAC_DEGLITCHCYCLES(config->deglitchCycles)); + + /* Handle the deglitch counts */ + ctdacCtrl |= (config->deglitchCycles << CTDAC_CTDAC_CTRL_DEGLITCH_CNT_Pos) & CTDAC_CTDAC_CTRL_DEGLITCH_CNT_Msk; + + /* Handle the deglitch mode */ + ctdacCtrl |= (uint32_t)config->deglitchMode; + + /* Handle the update mode */ + if ((config->updateMode == CY_CTDAC_UPDATE_STROBE_EDGE_IMMEDIATE) \ + || (config->updateMode == CY_CTDAC_UPDATE_STROBE_EDGE_SYNC) \ + || (config->updateMode == CY_CTDAC_UPDATE_STROBE_LEVEL)) + { + ctdacCtrl |= CTDAC_CTDAC_CTRL_DSI_STROBE_EN_Msk; + } + + if (config->updateMode == CY_CTDAC_UPDATE_STROBE_LEVEL) + { + ctdacCtrl |= CTDAC_CTDAC_CTRL_DSI_STROBE_LEVEL_Msk; + } + + /* Handle the sign format */ + ctdacCtrl |= (uint32_t)config->formatMode; + + /* Handle the Deep Sleep mode */ + ctdacCtrl |= (uint32_t)config->deepSleep; + + /* Handle the output mode */ + ctdacCtrl |= (uint32_t)config->outputMode; + + /* Handle enable bit */ + ctdacCtrl |= ((uint32_t)config->enable) << CTDAC_CTDAC_CTRL_ENABLED_Pos; + + /* Handle the reference source */ + switch(config->refSource) + { + case CY_CTDAC_REFSOURCE_VDDA: + + /* Close the CVD switch to use Vdda as the reference source */ + setSwitch |= CTDAC_CTDAC_SW_CTDD_CVD_Msk; + break; + case CY_CTDAC_REFSOURCE_EXTERNAL: + default: + clearSwitch |= CTDAC_CTDAC_SW_CLEAR_CTDD_CVD_Msk; + break; + } + + /* Handle the output buffer switch CO6 */ + switch(config->outputBuffer) + { + case CY_CTDAC_OUTPUT_UNBUFFERED: + + /* Close the CO6 switch to send output to a direct pin unbuffered */ + setSwitch |= CTDAC_CTDAC_SW_CTDO_CO6_Msk; + break; + case CY_CTDAC_OUTPUT_BUFFERED: + default: + clearSwitch |= CTDAC_CTDAC_SW_CTDO_CO6_Msk; + break; + } + + base->INTR_MASK = (uint32_t)config->enableInterrupt << CTDAC_INTR_VDAC_EMPTY_Pos; + base->CTDAC_SW = setSwitch; + base->CTDAC_SW_CLEAR = clearSwitch; + base->CTDAC_VAL = (((uint32_t)config->value) << CTDAC_CTDAC_VAL_VALUE_Pos) & CTDAC_CTDAC_VAL_VALUE_Msk; + base->CTDAC_VAL_NXT = (((uint32_t)config->nextValue) << CTDAC_CTDAC_VAL_NXT_VALUE_Pos) & CTDAC_CTDAC_VAL_NXT_VALUE_Msk; + + if (config->configClock) + { + Cy_CTDAC_ConfigureClock(config->updateMode, config->dividerType, config->dividerNum, config->dividerIntValue, config->dividerFracValue); + } + + base->CTDAC_CTRL = ctdacCtrl; + result = CY_CTDAC_SUCCESS; + } + + return result; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_DeInit +****************************************************************************//** +* +* Reset CTDAC registers back to power on reset defaults. +* +* Does not disable or configure the clock. Call \ref Cy_CTDAC_Init or \ref Cy_CTDAC_FastInit +* to configure the CTDAC and clock. +* +* \param base +* Pointer to structure describing registers +* +* \param deInitRouting +* If true, all switches are reset to their default state. +* If false, switch registers are untouched. +* +* \return cy_en_ctdac_status_t +* Status of initialization, CY_CTDAC_SUCCESS, or CY_CTDAC_BAD_PARAM +* +*******************************************************************************/ +cy_en_ctdac_status_t Cy_CTDAC_DeInit(CTDAC_Type *base, bool deInitRouting) +{ + CY_ASSERT_L1(NULL != base); + + cy_en_ctdac_status_t result; + + if (NULL == base) + { + result = CY_CTDAC_BAD_PARAM; + } + else + { + base->CTDAC_CTRL = CY_CTDAC_DEINIT; + base->INTR_MASK = CY_CTDAC_DEINIT; + base->CTDAC_VAL = CY_CTDAC_DEINIT; + base->CTDAC_VAL_NXT = CY_CTDAC_DEINIT; + + if (deInitRouting) + { + base->CTDAC_SW_CLEAR = CY_CTDAC_DEINIT; + } + + result = CY_CTDAC_SUCCESS; + } + + return result; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_FastInit +****************************************************************************//** +* +* Initializes the CTDAC to one of the common use modes. +* These provide a quick and easy method of configuring the CTDAC when using +* the PDL driver for device configuration. +* +* The other configuration options are set to: +* - .formatMode = CY_CTDAC_FORMAT_UNSIGNED +* - .updateMode = CY_CTDAC_UPDATE_BUFFERED_WRITE +* - .deglitchMode = CY_CTDAC_DEGLITCHMODE_NONE +* - .outputMode = CY_CTDAC_OUTPUT_VALUE +* - .deepSleep = CY_CTDAC_DEEPSLEEP_DISABLE +* - .deglitchCycles = CY_CTDAC_DEINIT +* - .value = CY_CTDAC_UNSIGNED_MID_CODE_VALUE +* - .nextValue = CY_CTDAC_UNSIGNED_MID_CODE_VALUE +* - .enableInterrupt = true +* - .configClock = true +* - .dividerType = CY_CTDAC_FAST_CLKCFG_TYPE +* - .dividerNum = CY_CTDAC_FAST_CLKCFG_NUM +* - .dividerInitValue = CY_CTDAC_FAST_CLKCFG_DIV +* - .dividerFracValue = CY_CTDAC_DEINIT +* +* \param base +* Pointer to structure describing registers +* +* \param config +* Pointer to structure containing configuration data for quick initialization +* Use one of the provided structures or define your own. +* - \ref Cy_CTDAC_Fast_VddaRef_UnbufferedOut +* - \ref Cy_CTDAC_Fast_VddaRef_BufferedOut +* - \ref Cy_CTDAC_Fast_OA1Ref_UnbufferedOut +* - \ref Cy_CTDAC_Fast_OA1Ref_BufferedOut +* +* \return cy_en_ctdac_status_t +* Status of initialization, CY_CTDAC_SUCCESS or CY_CTDAC_BAD_PARAM +* +*******************************************************************************/ +cy_en_ctdac_status_t Cy_CTDAC_FastInit(CTDAC_Type *base, const cy_stc_ctdac_fast_config_t *config) +{ + CY_ASSERT_L1(NULL != base); + CY_ASSERT_L1(NULL != config); + + cy_en_ctdac_status_t result; + uint32_t ctdacCtrl; + uint32_t setSwitch = CY_CTDAC_DEINIT; + uint32_t clearSwitch = CY_CTDAC_DEINIT; + + if ((NULL == base) || (NULL == config)) + { + result = CY_CTDAC_BAD_PARAM; + } + else + { + CY_ASSERT_L3(CY_CTDAC_REFSOURCE(config->refSource)); + CY_ASSERT_L3(CY_CTDAC_OUTPUTBUFFER(config->outputBuffer)); + + ctdacCtrl = (uint32_t) CY_CTDAC_DEGLITCHMODE_NONE \ + | (uint32_t) CY_CTDAC_UPDATE_BUFFERED_WRITE \ + | (uint32_t) CY_CTDAC_FORMAT_UNSIGNED \ + | (uint32_t) CY_CTDAC_DEEPSLEEP_DISABLE \ + | (uint32_t) CY_CTDAC_OUTPUT_VALUE; + + /* Handle the reference source */ + switch(config->refSource) + { + case CY_CTDAC_REFSOURCE_VDDA: + + /* Close the CVD switch to use Vdda as the reference source */ + setSwitch |= CTDAC_CTDAC_SW_CTDD_CVD_Msk; + break; + case CY_CTDAC_REFSOURCE_EXTERNAL: + default: + clearSwitch |= CTDAC_CTDAC_SW_CLEAR_CTDD_CVD_Msk; + break; + } + + /* Handle the output buffer switch CO6 */ + switch(config->outputBuffer) + { + case CY_CTDAC_OUTPUT_UNBUFFERED: + + /* Close the CO6 switch to send output to a direct pin unbuffered */ + setSwitch |= CTDAC_CTDAC_SW_CTDO_CO6_Msk; + break; + case CY_CTDAC_OUTPUT_BUFFERED: + default: + clearSwitch |= CTDAC_CTDAC_SW_CTDO_CO6_Msk; + break; + } + + base->INTR_MASK = CTDAC_INTR_VDAC_EMPTY_Msk; + base->CTDAC_SW = setSwitch; + base->CTDAC_SW_CLEAR = clearSwitch; + base->CTDAC_VAL = CY_CTDAC_UNSIGNED_MID_CODE_VALUE; + base->CTDAC_VAL_NXT = CY_CTDAC_UNSIGNED_MID_CODE_VALUE; + + /* For fast configuration, the DAC clock is the Peri clock divided by 100 */ + Cy_CTDAC_ConfigureClock(CY_CTDAC_UPDATE_BUFFERED_WRITE, CY_CTDAC_FAST_CLKCFG_TYPE, CY_CTDAC_FAST_CLKCFG_NUM, CY_CTDAC_FAST_CLKCFG_DIV, CY_CTDAC_DEINIT); + + base->CTDAC_CTRL = ctdacCtrl; + result = CY_CTDAC_SUCCESS; + } + + return result; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_ConfigureClock +****************************************************************************//** +* +* Private function for configuring the CTDAC clock based on the desired +* update mode. This function is called by \ref Cy_CTDAC_Init. +* +* \param updateMode +* Update mode value. See \ref cy_en_ctdac_update_t for values. +* +* \return None +* +*******************************************************************************/ +static void Cy_CTDAC_ConfigureClock(cy_en_ctdac_update_t updateMode, cy_en_divider_types_t dividerType, + uint32_t dividerNum, uint32_t dividerIntValue, uint32_t dividerFracValue) +{ + if (updateMode == CY_CTDAC_UPDATE_DIRECT_WRITE) + { /* In direct mode, there is not a clock */ + } + else if(updateMode == CY_CTDAC_UPDATE_STROBE_EDGE_IMMEDIATE) + { + + /* In this mode, the Peri Clock is divided by 1 to give a constant logic high on the CTDAC clock. */ + (void)Cy_SysClk_PeriphDisableDivider(dividerType, dividerNum); + + (void)Cy_SysClk_PeriphAssignDivider(PCLK_PASS_CLOCK_CTDAC, dividerType, dividerNum); + + if ((dividerType == CY_SYSCLK_DIV_8_BIT) || (dividerType == CY_SYSCLK_DIV_16_BIT)) + { + (void)Cy_SysClk_PeriphSetDivider(dividerType, dividerNum, CY_CTDAC_STROBE_EDGE_IMMEDIATE_DIV); + } + else + { + (void)Cy_SysClk_PeriphSetFracDivider(dividerType, dividerNum, CY_CTDAC_STROBE_EDGE_IMMEDIATE_DIV, CY_CTDAC_STROBE_EDGE_IMMEDIATE_DIV_FRAC); + } + + (void)Cy_SysClk_PeriphEnableDivider(dividerType, dividerNum); + } + else + { + + /* All other modes, require a CTDAC clock configured to the desired user frequency */ + (void)Cy_SysClk_PeriphDisableDivider(dividerType, dividerNum); + + (void)Cy_SysClk_PeriphAssignDivider(PCLK_PASS_CLOCK_CTDAC, dividerType, dividerNum); + + if ((dividerType == CY_SYSCLK_DIV_8_BIT) || (dividerType == CY_SYSCLK_DIV_16_BIT)) + { + (void)Cy_SysClk_PeriphSetDivider(dividerType, dividerNum, dividerIntValue); + } + else + { + (void)Cy_SysClk_PeriphSetFracDivider(dividerType, dividerNum, dividerIntValue, dividerFracValue); + } + (void)Cy_SysClk_PeriphEnableDivider(dividerType, dividerNum); + } + +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetSignMode +****************************************************************************//** +* +* Sets whether to interpret the DAC value as signed or unsigned. +* In unsigned mode, the DAC value register is used without any decoding. +* In signed mode, the MSB is inverted by adding 0x800 to the DAC value. +* This converts the lowest signed number, 0x800, to the lowest unsigned +* number, 0x000. +* +* \param base +* Pointer to structure describing registers +* +* \param formatMode +* Mode can be signed or unsigned. See \ref cy_en_ctdac_format_t for values. +* +* \return None +* +*******************************************************************************/ +void Cy_CTDAC_SetSignMode(CTDAC_Type *base, cy_en_ctdac_format_t formatMode) +{ + CY_ASSERT_L3(CY_CTDAC_FORMAT(formatMode)); + + uint32_t ctdacCtrl; + + /* Clear the CTDAC_MODE bits */ + ctdacCtrl = base->CTDAC_CTRL & ~CTDAC_CTDAC_CTRL_CTDAC_MODE_Msk; + + base->CTDAC_CTRL = ctdacCtrl | (uint32_t)formatMode; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetDeepSleepMode +****************************************************************************//** +* +* Sets whether to allow the DAC hardware to continue to stay powered in +* Deep Sleep mode. +* +* \param base +* Pointer to structure describing registers +* +* \param deepSleep +* Enabled or disabled. See \ref cy_en_ctdac_deep_sleep_t for values. +* +* \return None +* +*******************************************************************************/ +void Cy_CTDAC_SetDeepSleepMode(CTDAC_Type *base, cy_en_ctdac_deep_sleep_t deepSleep) +{ + CY_ASSERT_L3(CY_CTDAC_DEEPSLEEP(deepSleep)); + + uint32_t ctdacCtrl; + + ctdacCtrl = base->CTDAC_CTRL & ~CTDAC_CTDAC_CTRL_DEEPSLEEP_ON_Msk; + + base->CTDAC_CTRL = ctdacCtrl | (uint32_t)deepSleep; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetOutputMode +****************************************************************************//** +* +* Set the output mode to one of the supported options. +* +* \param base +* Pointer to structure describing registers +* +* \param outputMode +* Output drive mode. See \ref cy_en_ctdac_output_mode_t for values. +* +* \return None +* +*******************************************************************************/ +void Cy_CTDAC_SetOutputMode(CTDAC_Type *base, cy_en_ctdac_output_mode_t outputMode) +{ + CY_ASSERT_L3(CY_CTDAC_OUTPUTMODE(outputMode)); + + uint32_t ctdacCtrl; + + /* Clear out the three affected bits */ + ctdacCtrl = base->CTDAC_CTRL & ~(CTDAC_CTDAC_CTRL_OUT_EN_Msk | CTDAC_CTDAC_CTRL_DISABLED_MODE_Msk | CTDAC_CTDAC_CTRL_CTDAC_RANGE_Msk); + + base->CTDAC_CTRL = ctdacCtrl | (uint32_t)outputMode; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetDeglitchMode +****************************************************************************//** +* +* Set the deglitch mode or disable deglitching completely. +* +* \param base +* Pointer to structure describing registers +* +* \param deglitchMode +* Deglitching mode selection. See \ref cy_en_ctdac_deglitch_t for values. +* +* \return None +* +*******************************************************************************/ +void Cy_CTDAC_SetDeglitchMode(CTDAC_Type *base, cy_en_ctdac_deglitch_t deglitchMode) +{ + CY_ASSERT_L3(CY_CTDAC_DEGLITCH(deglitchMode)); + + uint32_t ctdacCtrl; + + /* Clear out DEGLITCH_CO6 and DEGLITCH_C0S bits */ + ctdacCtrl = base->CTDAC_CTRL & ~(CTDAC_CTDAC_CTRL_DEGLITCH_COS_Msk | CTDAC_CTDAC_CTRL_DEGLITCH_CO6_Msk); + + base->CTDAC_CTRL = ctdacCtrl | (uint32_t)deglitchMode; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetDeglitchCycles +****************************************************************************//** +* +* Set the number of deglitch cycles (0 to 63) that will be used. +* To calculate the deglitch time, (DEGLITCH_CNT + 1) / PERI_CLOCK_FREQ. +* The optimal deglitch time is 700 ns. +* +* \param base +* Pointer to structure describing registers +* +* \param deglitchCycles +* Number of cycles to deglitch +* +* \return None +* +*******************************************************************************/ +void Cy_CTDAC_SetDeglitchCycles(CTDAC_Type *base, uint32_t deglitchCycles) +{ + CY_ASSERT_L2(CY_CTDAC_DEGLITCHCYCLES(deglitchCycles)); + + uint32_t ctdacCtrl; + + ctdacCtrl = (base->CTDAC_CTRL) & ~CTDAC_CTDAC_CTRL_DEGLITCH_CNT_Msk; + + base->CTDAC_CTRL = ctdacCtrl | ((deglitchCycles << CTDAC_CTDAC_CTRL_DEGLITCH_CNT_Pos) & CTDAC_CTDAC_CTRL_DEGLITCH_CNT_Msk); +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetRef +****************************************************************************//** +* +* Set the CTDAC reference source to Vdda or an external reference. +* The external reference must come from Opamp1 of the CTB. +* +* \param base +* Pointer to structure describing registers +* +* \param refSource +* The reference source. See \ref cy_en_ctdac_ref_source_t for values. +* +* \return None +* +*******************************************************************************/ +void Cy_CTDAC_SetRef(CTDAC_Type *base, cy_en_ctdac_ref_source_t refSource) +{ + CY_ASSERT_L3(CY_CTDAC_REFSOURCE(refSource)); + + switch(refSource) + { + case CY_CTDAC_REFSOURCE_VDDA: + + /* Close the CVD switch to use Vdda as the reference source */ + base->CTDAC_SW |= CTDAC_CTDAC_SW_CTDD_CVD_Msk; + break; + case CY_CTDAC_REFSOURCE_EXTERNAL: + default: + base->CTDAC_SW_CLEAR = CTDAC_CTDAC_SW_CLEAR_CTDD_CVD_Msk; + break; + } +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetAnalogSwitch +****************************************************************************//** +* +* Provides firmware control of the CTDAC switches. Each call to this function +* can open a set of switches or close a set of switches. +* +* This is an advanced function. The switches will be managed by the reference +* source and output mode selections when initializing the hardware. +* +* \param base +* Pointer to structure describing registers +* +* \param switchMask +* The mask of the switches to either open or close. +* The switches can be found in the \ref cy_en_ctdac_switches_t enum. +* +* For example, to close both CVD and CO6 switches: +* switchMask = CY_CTDAC_SWITCH_CVD_MASK | CY_CTDAC_SWITCH_CO6_MASK; +* +* \param state +* Open or close the switches, see enum \ref cy_en_ctdac_switch_state_t. +* +* \return None +* +*******************************************************************************/ +void Cy_CTDAC_SetAnalogSwitch(CTDAC_Type *base, uint32_t switchMask, cy_en_ctdac_switch_state_t state) +{ + CY_ASSERT_L2(CY_CTDAC_SWITCHMASK(switchMask)); + CY_ASSERT_L3(CY_CTDAC_SWITCHSTATE(state)); + + switch(state) + { + case CY_CTDAC_SWITCH_CLOSE: + base->CTDAC_SW |= switchMask; + break; + case CY_CTDAC_SWITCH_OPEN: + default: + + /* Unlike the close case, do not OR the register. Set 1 to clear.*/ + base->CTDAC_SW_CLEAR = switchMask; + break; + } +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_DeepSleepCallback +****************************************************************************//** +* +* Callback to prepare the CTDAC before entering and after exiting Deep Sleep +* mode. If deglitching is used, it is disabled before entering Deep Sleep +* to ensure the deglitch switches are closed. This is needed only +* if the CTDAC will be enabled in DeepSleep. Upon wakeup, deglitching will +* be re-enabled if it was previously used. +* +* \param callbackParams +* Pointer to structure of type \ref cy_stc_syspm_callback_params_t +* +* \return cy_en_syspm_status_t +* See \ref cy_en_syspm_status_t +* +*******************************************************************************/ +cy_en_syspm_status_t Cy_CTDAC_DeepSleepCallback(cy_stc_syspm_callback_params_t *callbackParams) +{ + /** Static variable preserved between function calls. + * Tracks the state of the deglitch mode before sleep so that it can be re-enabled after wakeup */ + static uint32_t deglitchModeBeforeSleep; + + cy_en_syspm_status_t returnValue = CY_SYSPM_SUCCESS; + + CTDAC_Type *ctdacBase = (CTDAC_Type *)callbackParams->base; + + if (CY_SYSPM_BEFORE_TRANSITION == callbackParams->mode) + { /* Actions that should be done before entering the Deep Sleep mode */ + + /* Store the state of the deglitch switches before turning deglitch off */ + deglitchModeBeforeSleep = ctdacBase->CTDAC_CTRL & (CTDAC_CTDAC_CTRL_DEGLITCH_CO6_Msk | CTDAC_CTDAC_CTRL_DEGLITCH_COS_Msk); + + /* Turn deglitch off before entering Deep Sleep */ + ctdacBase->CTDAC_CTRL &= ~(CTDAC_CTDAC_CTRL_DEGLITCH_CO6_Msk | CTDAC_CTDAC_CTRL_DEGLITCH_COS_Msk); + } + else if (CY_SYSPM_AFTER_TRANSITION == callbackParams->mode) + { /* Actions that should be done after exiting the Deep Sleep mode */ + + /* Re-enable the deglitch mode that was configured before Deep Sleep entry */ + ctdacBase->CTDAC_CTRL |= deglitchModeBeforeSleep; + } + else + { /* Does nothing in other modes */ + } + + return returnValue; +} + +#if defined(__cplusplus) +} +#endif + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctdac/cy_ctdac.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctdac/cy_ctdac.h new file mode 100644 index 0000000000..09ad23cc3a --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ctdac/cy_ctdac.h @@ -0,0 +1,891 @@ +/***************************************************************************//** +* \file cy_ctdac.h +* \version 1.0 +* +* Header file for the CTDAC driver +* +******************************************************************************** +* \copyright +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_ctdac Continuous Time Digital to Analog Converter (CTDAC) +* \{ +* The CTDAC driver provides APIs to configure the 12-bit Continuous-Time DAC. +* The CTDAC generates a 12-bit DAC output voltage from the reference. +* The DAC reference can come from VDDA or from any signal buffered through Opamp0 +* of the CTB. This can be an external signal through a GPIO or from the internal +* AREF. The CTDAC is closely integrated with the CTB block, +* which provides easy buffering of the DAC output voltage, +* buffered input reference voltage, and sample and hold for the DAC output. +* The CTDAC control interface provides control of the DAC output through CPU or DMA. +* This includes a double-buffered DAC voltage control register, clock input for programmable +* update rate, interrupt on DAC buffer empty, and trigger to DMA. +* +* \image html ctdac_block_diagram.png +* \image latex ctdac_block_diagram.png +* +* Features +* +* - 12-bit continuous time output +* - 2 us settling time for a 25 pF load +* - Can be enabled in Deep Sleep power mode +* - Selectable voltage reference: +* - VDDA +* - Internal analog reference buffered through Opamp1 of CTB +* - External reference buffered through Opamp1 of CTB +* - Selectable output paths: +* - Direct DAC output to a pin +* - Buffered DAC output through Opamp0 of CTB +* - Sample and hold output path through Opamp0 of CTB +* - Selectable input modes: +* - Unsigned 12-bit mode +* - Virtual signed 12-bit mode +* - Configurable update rate using clock or strobe signal +* - Double buffered DAC voltage control register +* - Interrupt and DMA trigger on DAC buffer empty +* - Configurable as PGA along with Opamp1 of the CTB +* +* The CTDAC has two switches, CO6 for configuring the output path and +* CVD for the reference source. +* +* \image html ctdac_switches.png +* \image latex ctdac_switches.png +* +* \section group_ctdac_init Initialization +* +* Configure the CTDAC hardware block by calling \ref Cy_CTDAC_Init. +* The base address of the CTDAC hardware can be found in the device-specific header file. +* If the buffers in the CTB are used for the reference source or the output, +* initialize the CTB hardware block. After both blocks are initialized, +* enable the CTB block before enabling the CTDAC block. +* +* The driver also provides a \ref Cy_CTDAC_FastInit function for fast and easy initialization of the CTDAC. +* There are four configurations that cover the four combinations of the reference and output buffers. +* +* - \ref Cy_CTDAC_Fast_VddaRef_UnbufferedOut +* - \ref Cy_CTDAC_Fast_VddaRef_BufferedOut +* - \ref Cy_CTDAC_Fast_OA1Ref_UnbufferedOut +* - \ref Cy_CTDAC_Fast_OA1Ref_BufferedOut +* +* \section group_ctdac_updatemode Update Modes +* The CTDAC contains two registers: +* -# CTDAC_VAL +* +* For direct firmware writes to update the current DAC value immediately. +* This register is written with \ref Cy_CTDAC_SetValue. +* -# CTDAC_VAL_NXT +* +* For buffered writes that can be configured to update the DAC at a +* selected periodic rate or with a strobe trigger. +* This register is written with \ref Cy_CTDAC_SetValueBuffered. +* +* The update mode is +* selected during initialization with the \ref cy_stc_ctdac_config_t.updateMode. +* Four of these modes require a dedicated clock resource and the driver +* can configure the clock during initialization (see \ref cy_stc_ctdac_config_t). +* +* Three of these modes use a strobe signal through the digital signal interface (DSI). +* This allows control of the buffered update timing from an external source, for example, by another +* chip peripheral or from an off-chip source. +* +* Direct write +* +* In this mode, this user writes directly into the CTDAC_VAL register +* using \ref Cy_CTDAC_SetValue. The action of writing to this register +* will update the DAC output. This mode does not generate an interrupt +* or trigger signal. +* In this mode, a clock must not be configured. Additionally, calling \ref +* Cy_CTDAC_SetValueBuffered does not update the DAC output. +* +* \image html ctdac_update_mode_direct_write.png +* \image latex ctdac_update_mode_direct_write.png +* +* Buffered write +* +* In this mode, the user writes to the CTDAC_VAL_NXT register using +* \ref Cy_CTDAC_SetValueBuffered. The rising edge of the clock +* will update the DAC output and generate the interrupt and trigger signals. +* +* Whenever data is transferred from the CTDAC_VAL_NXT register, +* an interrupt is asserted the same time as the trigger. But while +* the trigger is automatically cleared after two Peri Clock cycles, the +* user must clear the interrupt with \ref Cy_CTDAC_ClearInterrupt. +* +* \image html ctdac_update_mode_buffered_write.png +* \image latex ctdac_update_mode_buffered_write.png +* +* Strobe edge sync +* +* In this mode, the user writes to the CTDAC_VAL_NXT register using +* \ref Cy_CTDAC_SetValueBuffered. +* Each rising edge of the DSI strobe input enables +* one subsequent update from the next rising edge of the clock. The DSI +* input must remain high for two Peri Clock cycles and go low for +* another two Peri Clock cycles to allow for the next update. +* This restricts the DSI strobe input frequency to the PeriClk frequency divided by four. +* +* \image html ctdac_update_mode_strobe_edge_sync.png +* \image latex ctdac_update_mode_strobe_edge_sync.png +* +* Strobe edge immediate +* +* In this mode, the user writes to the CTDAC_VAL_NXT register using +* \ref Cy_CTDAC_SetValueBuffered. +* The clock resource is used but set to a logic high. +* Therefore, each rising edge of the DSI strobe input immediately +* updates the DAC output. +* +* \image html ctdac_update_mode_strobe_edge_immediate.png +* \image latex ctdac_update_mode_strobe_edge_immediate.png +* +* Strobe level +* +* In this mode, the user writes to the CTDAC_VAL_NXT register using +* \ref Cy_CTDAC_SetValueBuffered. +* The DSI strobe input acts as a hardware enable signal. +* While the DSI strobe input is high, the mode behaves +* like the Buffered write mode. When the DSI strobe input is low, +* updates are disabled. +* +* \image html ctdac_update_mode_strobe_level.png +* \image latex ctdac_update_mode_strobe_level.png +* +* \section group_ctdac_trigger DMA Trigger +* When data is transferred from the CTDAC_VAL_NXT to the CTDAC_VAL register +* an interrupt and an output trigger signal are generated. +* The trigger signal can be routed to DMA using the \ref group_trigmux. +* When making the required \ref Cy_TrigMux_Connect calls, use the pre-defined enums, TRIG14_IN_PASS_TR_CTDAC_EMPTY +* and TRIGGER_TYPE_PASS_TR_CTDAC_EMPTY. For example, +* +* \code +* (void)Cy_TrigMux_Connect(TRIG14_IN_PASS_TR_CTDAC_EMPTY, TRIG14_OUT_TR_GROUP0_INPUT50, CY_TR_MUX_TR_INV_DISABLE, TRIGGER_TYPE_PASS_TR_CTDAC_EMPTY); +* (void)Cy_TrigMux_Connect(TRIG0_IN_TR_GROUP14_OUTPUT7, TRIG0_OUT_CPUSS_DW0_TR_IN1, CY_TR_MUX_TR_INV_DISABLE, TRIGGER_TYPE_TR_GROUP_OUTPUT__LEVEL); +* \endcode +* +* \section group_ctdac_code_example Complete Code Example +* +* The following example code demonstrates how to generate a continuous +* sine wave using the CTDAC. The CTDAC uses both Opamps of the CTB +* to buffer the analog reference and to buffer the output to an external Pin 2. +* +* \image html ctdac_code_example.png +* \image latex ctdac_code_example.png +* +* \code +* #include "ctdac/cy_ctdac.h" +* #include "ctb/cy_ctb.h" +* #include "sysanalog/cy_sysanalog.h" +* #include "sysint/cy_sysint.h" +* \endcode +* +* \snippet ctdac_sut_01.cydsn/main_cm0p.c CTDAC_CODE_EXAMPLE +* +* \section group_ctdac_more_information More Information +* +* Refer to the technical reference manual (TRM) and the device datasheet. +* +* \section group_ctdac_MISRA MISRA-C Compliance] +* +* This driver has the following specific deviations: +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
    11.4AdvisoryA cast should not be performed between a pointer to object type and a different pointer to object type.The cy_syspm driver defines the pointer to void in the \ref cy_stc_syspm_callback_params_t.base field. +* This CTDAC driver implements a Deep Sleep callback conforming to the cy_syspm driver requirements. +* When the callback is called, the base is cast to a pointer to CTDAC_Type. +*
    +* +* \section group_ctdac_changelog Changelog +* +* +* +* +* +* +* +*
    VersionChangesReason for Change
    1.0Initial version
    +* +* \defgroup group_ctdac_macros Macros +* \defgroup group_ctdac_functions Functions +* \{ +* \defgroup group_ctdac_functions_switches Switch Control Functions +* \defgroup group_ctdac_functions_interrupts Interrupt Functions +* \defgroup group_ctdac_functions_syspm_callback SysPm Deep Sleep Callback +* \} +* \defgroup group_ctdac_globals Global Variables +* \defgroup group_ctdac_data_structures Data structures +* \defgroup group_ctdac_enums Enumerated Types +*/ + +#if !defined(CY_CTDAC_H) +#define CY_CTDAC_H + +#include +#include +#include +#include "cy_device_headers.h" +#include "syspm/cy_syspm.h" +#include "syslib/cy_syslib.h" +#include "sysclk/cy_sysclk.h" + +#ifndef CY_IP_MXS40PASS_CTDAC + #error "The CTDAC driver is not supported on this device" +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +/** \addtogroup group_ctdac_macros +* \{ +*/ + +/** Driver major version */ +#define CY_CTDAC_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_CTDAC_DRV_VERSION_MINOR 0 + +/** CTDAC driver identifier */ +#define CY_CTDAC_ID CY_PDL_DRV_ID(0x19u) + +/** \cond INTERNAL */ +#define CY_CTDAC_DEINIT (0uL) /**< De-init value for CTDAC registers */ +#define CY_CTDAC_DEINT_CTDAC_SW (CTDAC_CTDAC_SW_CLEAR_CTDD_CVD_Msk | CTDAC_CTDAC_SW_CLEAR_CTDO_CO6_Msk) /**< Mask for de-initializing the CTDAC switch control register */ +#define CY_CTDAC_STROBE_EDGE_IMMEDIATE_DIV (0uL) /**< Clock divider value for the Strobe Edge Immediate update mode */ +#define CY_CTDAC_STROBE_EDGE_IMMEDIATE_DIV_FRAC (0uL) /**< Clock fractional divider value for the Strobe Edge Immediate update mode */ +#define CY_CTDAC_FAST_CLKCFG_TYPE CY_SYSCLK_DIV_8_BIT /**< Clock divider type for quick clock setup */ +#define CY_CTDAC_FAST_CLKCFG_NUM (0uL) /**< Clock divider number for quick clock setup */ +#define CY_CTDAC_FAST_CLKCFG_DIV (99uL) /**< Clock divider integer value for quick clock setup. Divides PERI clock by 100. */ +#define CY_CTDAC_UNSIGNED_MID_CODE_VALUE (0x800uL) /**< Middle code value for unsigned values */ +#define CY_CTDAC_UNSIGNED_MAX_CODE_VALUE (0xFFFuL) /**< Maximum code value for unsigned values */ +#define CY_CTDAC_DEGLITCH_CYCLES_MAX (63uL) + +/**< Macros for conditions used by CY_ASSERT calls */ +#define CY_CTDAC_REFSOURCE(source) (((source) == CY_CTDAC_REFSOURCE_EXTERNAL) || ((source) == CY_CTDAC_REFSOURCE_VDDA)) +#define CY_CTDAC_FORMAT(mode) (((mode) == CY_CTDAC_FORMAT_UNSIGNED) || ((mode) == CY_CTDAC_FORMAT_SIGNED)) +#define CY_CTDAC_UPDATE(mode) ((mode) <= CY_CTDAC_UPDATE_STROBE_LEVEL) +#define CY_CTDAC_DEGLITCH(mode) (((mode) == CY_CTDAC_DEGLITCHMODE_NONE) \ + || ((mode) == CY_CTDAC_DEGLITCHMODE_UNBUFFERED) \ + || ((mode) == CY_CTDAC_DEGLITCHMODE_BUFFERED) \ + || ((mode) == CY_CTDAC_DEGLITCHMODE_BOTH)) +#define CY_CTDAC_OUTPUTMODE(mode) (((mode) == CY_CTDAC_OUTPUT_HIGHZ) \ + || ((mode) == CY_CTDAC_OUTPUT_VALUE) \ + || ((mode) == CY_CTDAC_OUTPUT_VALUE_PLUS1) \ + || ((mode) == CY_CTDAC_OUTPUT_VSSA) \ + || ((mode) == CY_CTDAC_OUTPUT_VREF)) +#define CY_CTDAC_OUTPUTBUFFER(buffer) (((buffer) == CY_CTDAC_OUTPUT_UNBUFFERED) || ((buffer) == CY_CTDAC_OUTPUT_BUFFERED)) +#define CY_CTDAC_DEEPSLEEP(deepSleep) (((deepSleep) == CY_CTDAC_DEEPSLEEP_DISABLE) || ((deepSleep) == CY_CTDAC_DEEPSLEEP_ENABLE)) +#define CY_CTDAC_DEGLITCHCYCLES(cycles) ((cycles) <= CY_CTDAC_DEGLITCH_CYCLES_MAX) +#define CY_CTDAC_SWITCHMASK(mask) ((mask) <= (uint32_t) (CY_CTDAC_SWITCH_CVD_MASK | CY_CTDAC_SWITCH_CO6_MASK)) +#define CY_CTDAC_SWITCHSTATE(state) (((state) == CY_CTDAC_SWITCH_OPEN) || ((state) == CY_CTDAC_SWITCH_CLOSE)) +#define CY_CTDAC_INTRMASK(mask) (((mask) == 0uL) || ((mask) == 1uL)) +/** \endcond */ + +/** \} group_ctdac_macros */ + +/*************************************** +* Enumerated Types +***************************************/ + +/** +* \addtogroup group_ctdac_enums +* \{ +*/ + +/** +* Configure the mode for how the DAC value is updated. +* All the modes require a CTDAC clock except for CY_CTDAC_UPDATE_DIRECT_WRITE. +*/ +typedef enum { + CY_CTDAC_UPDATE_DIRECT_WRITE = 0uL, /**< DAC value is updated with a direct write by calling to \ref Cy_CTDAC_SetValue */ + CY_CTDAC_UPDATE_BUFFERED_WRITE = 1uL, /**< DAC value stored with \ref Cy_CTDAC_SetValueBuffered is updated on the next CTDAC clock edge */ + CY_CTDAC_UPDATE_STROBE_EDGE_SYNC = 2uL, /**< DAC value stored with \ref Cy_CTDAC_SetValueBuffered is updated on the next CTDAC clock edge after a rising edge of the strobe */ + CY_CTDAC_UPDATE_STROBE_EDGE_IMMEDIATE = 3uL, /**< DAC value stored with \ref Cy_CTDAC_SetValueBuffered is updated on the rising edge of the strobe input */ + CY_CTDAC_UPDATE_STROBE_LEVEL = 4uL /**< DAC value stored with \ref Cy_CTDAC_SetValueBuffered is updated on every CTDAC clock edge while the strobe line is high */ +}cy_en_ctdac_update_t; + +/** +* Configure the format in which the DAC value register is decoded. +*/ +typedef enum { + CY_CTDAC_FORMAT_UNSIGNED = 0uL, /**< Unsigned 12-bit DAC. No value decoding */ + CY_CTDAC_FORMAT_SIGNED = 1uL << CTDAC_CTDAC_CTRL_CTDAC_MODE_Pos /**< Virtual signed. Add 0x800 to the 12-bit DAC value */ +}cy_en_ctdac_format_t; + +/** +* Enable or disable the CTDAC hardware during Deep Sleep. +*/ +typedef enum { + CY_CTDAC_DEEPSLEEP_DISABLE = 0uL, /**< DAC is disabled during Deep Sleep power mode */ + CY_CTDAC_DEEPSLEEP_ENABLE = CTDAC_CTDAC_CTRL_DEEPSLEEP_ON_Msk /**< DAC remains enabled during Deep Sleep power mode */ +}cy_en_ctdac_deep_sleep_t; + +/** +* Configure the output state of the CTDAC. +*/ +typedef enum { + CY_CTDAC_OUTPUT_HIGHZ = 0uL, /**< DAC output is tri-state */ + CY_CTDAC_OUTPUT_VALUE = CTDAC_CTDAC_CTRL_OUT_EN_Msk, /**< DAC Output is enabled and drives the programmed value */ + CY_CTDAC_OUTPUT_VALUE_PLUS1 = CTDAC_CTDAC_CTRL_OUT_EN_Msk \ + | CTDAC_CTDAC_CTRL_CTDAC_RANGE_Msk, /**< DAC Output enabled and drives the programmed value plus 1 */ + CY_CTDAC_OUTPUT_VSSA = CTDAC_CTDAC_CTRL_DISABLED_MODE_Msk, /**< Output is pulled to Vssa through a 1.1 MOhm (typ) resistor */ + CY_CTDAC_OUTPUT_VREF = CTDAC_CTDAC_CTRL_DISABLED_MODE_Msk \ + | CTDAC_CTDAC_CTRL_CTDAC_RANGE_Msk /**< Output is pulled to Vref through a 1.1 MOhm (typ) resistor */ +}cy_en_ctdac_output_mode_t; + +/** +* The CTDAC provides an option to deglitch the output value every time it is updated. +* This prevents small glitches in the DAC output during an update to propagate to +* the pin or Opamp input. When deglitch is enabled, a switch on the output path +* is forced open for a configurable number of Peri Clock cycles. To calculate the deglitch +* time, (DEGLITCH_CNT + 1) / PERI_CLOCK_FREQ. +* +* There are two switches used for deglitching. +* - Switch COS in the CTB between the DAC output and the Opamp0 input +* - Switch CO6 in the CTDAC between the DAC output and external pin +* +* Match the deglitch path with the output buffer selection. +* If the output is buffered through the CTB, select CY_CTDAC_DEGLITCHMODE_BUFFERED. +* If the output is unbuffered to a direct pin, select CY_CTDAC_DEGLITCHMODE_UNBUFFERED. +*/ +typedef enum { + CY_CTDAC_DEGLITCHMODE_NONE = 0uL, /**< Disable deglitch */ + CY_CTDAC_DEGLITCHMODE_UNBUFFERED = CTDAC_CTDAC_CTRL_DEGLITCH_CO6_Msk, /**< Deglitch through the CO6 switch */ + CY_CTDAC_DEGLITCHMODE_BUFFERED = CTDAC_CTDAC_CTRL_DEGLITCH_COS_Msk, /**< Deglitch through the CTB COS switch */ + CY_CTDAC_DEGLITCHMODE_BOTH = CTDAC_CTDAC_CTRL_DEGLITCH_COS_Msk \ + | CTDAC_CTDAC_CTRL_DEGLITCH_CO6_Msk /**< Deglitch through both CO6 and CTB COS switches */ +}cy_en_ctdac_deglitch_t; + +/** +* Configure the reference source for the CTDAC +* +* The CVD switch is closed when Vdda is the reference source. +*/ +typedef enum { + CY_CTDAC_REFSOURCE_EXTERNAL = 0uL, /**< Use an external source as the reference. CVD switch is open. */ + CY_CTDAC_REFSOURCE_VDDA = 1uL /**< Use Vdda as the reference. CVD switch is closed. */ +}cy_en_ctdac_ref_source_t; + +/** Configure the output to be buffered or unbuffered +* +* The CO6 switch is closed when the output is unbuffered to Pin 6 of the CTDAC port. +* See the device datasheet for the CTDAC port. +*/ +typedef enum { + CY_CTDAC_OUTPUT_BUFFERED = 0uL, /**< Buffer the output through the CTB OA0 */ + CY_CTDAC_OUTPUT_UNBUFFERED = 1uL /**< Send output to a direct pin */ +}cy_en_ctdac_output_buffer_t; + +/** Switch state, either open or closed, to be used in \ref Cy_CTDAC_SetAnalogSwitch. */ +typedef enum +{ + CY_CTDAC_SWITCH_OPEN = 0uL, /**< Open the switch */ + CY_CTDAC_SWITCH_CLOSE = 1uL /**< Close the switch */ +}cy_en_ctdac_switch_state_t; + +/** Switch mask to be used in \ref Cy_CTDAC_SetAnalogSwitch */ +typedef enum +{ + CY_CTDAC_SWITCH_CVD_MASK = CTDAC_CTDAC_SW_CTDD_CVD_Msk, /**< Switch for the reference source, Vdda or external */ + CY_CTDAC_SWITCH_CO6_MASK = CTDAC_CTDAC_SW_CTDO_CO6_Msk /**< Switch for the output, buffered or direct */ +}cy_en_ctdac_switches_t; + +/** Return states for \ref Cy_CTDAC_Init, \ref Cy_CTDAC_DeInit, and \ref Cy_CTDAC_FastInit */ +typedef enum { + CY_CTDAC_SUCCESS = 0x00uL, /**< Initialization completed successfully */ + CY_CTDAC_BAD_PARAM = CY_CTDAC_ID | CY_PDL_STATUS_ERROR | 0x01uL /**< Input pointers were NULL and Initialization could not be completed */ +}cy_en_ctdac_status_t; + +/** \} group_ctdac_enums */ + +/*************************************** +* Configuration Structures +***************************************/ + +/** +* \addtogroup group_ctdac_data_structures +* \{ +*/ + +/** Configuration structure to set up the entire CTDAC block to be used with \ref Cy_CTDAC_Init +*/ +typedef struct +{ + cy_en_ctdac_ref_source_t refSource; /**< Reference source: Vdda or externally through Opamp1 of CTB */ + cy_en_ctdac_format_t formatMode; /**< Format of DAC value: signed or unsigned */ + cy_en_ctdac_update_t updateMode; /**< Update mode: direct or buffered writes or hardware, edge or level */ + cy_en_ctdac_deglitch_t deglitchMode; /**< Deglitch mode: disabled, buffered, unbuffered, or both */ + cy_en_ctdac_output_mode_t outputMode; /**< Output mode: enabled (value or value + 1), high-z, Vssa, or Vdda */ + cy_en_ctdac_output_buffer_t outputBuffer; /**< Output path: Buffered through Opamp0 of CTB or connected directly to Pin 6 */ + cy_en_ctdac_deep_sleep_t deepSleep; /**< Enable or disable the CTDAC during Deep Sleep */ + uint32_t deglitchCycles; /**< Number of deglitch cycles from 0 to 63 */ + int32_t value; /**< Current DAC value */ + int32_t nextValue; /**< Next DAC value for double buffering */ + bool enableInterrupt; /**< If true, enable interrupt when next value register is transferred to value register */ + bool enable; /**< Enable or disable hardware after initialization */ + + /* Configuring the clock */ + bool configClock; /**< Configure or ignore clock information */ + cy_en_divider_types_t dividerType; /**< Specifies which type of divider to use. Can be integer or fractional divider. Not used if updateMode is CY_CTDAC_UPDATE_DIRECT_WRITE */ + uint32_t dividerNum; /**< Specifies which divider of the selected type to configure. Not used if updateMode is CY_CTDAC_UPDATE_DIRECT_WRITE */ + uint32_t dividerIntValue; /**< The integer divider value. The divider value causes integer division of (divider value + 1). Not used if updateMode is CY_CTDAC_UPDATE_DIRECT_WRITE or CY_CTDAC_UPDATE_STROBE_EDGE_IMMEDIATE */ + uint32_t dividerFracValue; /**< The fractional divider value if using a fractional clock. Not used if updateMode is CY_CTDAC_UPDATE_DIRECT_WRITE or CY_CTDAC_UPDATE_STROBE_EDGE_IMMEDIATE */ +}cy_stc_ctdac_config_t; + +/** Configuration structure to quickly set up the CTDAC to be used with \ref Cy_CTDAC_FastInit +* This structure provides a selection for the CTDAC reference source and output path. +* +* The other configuration options are set to: +* - .formatMode = CY_CTDAC_FORMAT_UNSIGNED +* - .updateMode = CY_CTDAC_UPDATE_BUFFERED_WRITE +* - .deglitchMode = CY_CTDAC_DEGLITCHMODE_NONE +* - .outputMode = CY_CTDAC_OUTPUT_VALUE +* - .deepSleep = CY_CTDAC_DEEPSLEEP_DISABLE +* - .deglitchCycles = CY_CTDAC_DEINIT +* - .value = CY_CTDAC_UNSIGNED_MID_CODE_VALUE +* - .nextValue = CY_CTDAC_UNSIGNED_MID_CODE_VALUE +* - .enableInterrupt = true +* - .configClock = true +* - .dividerType = CY_CTDAC_FAST_CLKCFG_TYPE +* - .dividerNum = CY_CTDAC_FAST_CLKCFG_NUM +* - .dividerInitValue = CY_CTDAC_FAST_CLKCFG_DIV +* - .dividerFracValue = CY_CTDAC_DEINIT +*/ +typedef struct +{ + cy_en_ctdac_ref_source_t refSource; /**< Reference source: Vdda or externally through Opamp1 of CTB */ + cy_en_ctdac_output_buffer_t outputBuffer; /**< Output path: Buffered through Opamp0 of CTB or connected directly to Pin 6 */ +}cy_stc_ctdac_fast_config_t; + +/** \} group_ctdac_data_structures */ + +/** \addtogroup group_ctdac_globals +* \{ +*/ +/*************************************** +* Global Variables +***************************************/ + +/** Configure CTDAC to use Vdda reference and output unbuffered. See \ref Cy_CTDAC_FastInit. */ +extern const cy_stc_ctdac_fast_config_t Cy_CTDAC_Fast_VddaRef_UnbufferedOut; + +/** Configure CTDAC to use Vdda reference and output buffered through Opamp0 of CTB. See \ref Cy_CTDAC_FastInit. +* +* To quickly configure Opamp0, call with \ref Cy_CTB_FastInit +* with \ref Cy_CTB_Fast_Opamp0_Vdac_Out or \ref Cy_CTB_Fast_Opamp0_Vdac_Out_SH. +*/ +extern const cy_stc_ctdac_fast_config_t Cy_CTDAC_Fast_VddaRef_BufferedOut; + +/** Configure CTDAC to use a buffered reference from Opamp1 of CTB +* and output unbuffered. See \ref Cy_CTDAC_FastInit. +* +* To use the reference from the Analog Reference (AREF), +* call \ref Cy_CTB_FastInit with \ref Cy_CTB_Fast_Opamp1_Vdac_Ref_Aref. +* +* To use an external reference from a GPIO, +* call \ref Cy_CTB_FastInit with \ref Cy_CTB_Fast_Opamp1_Vdac_Ref_Pin5 +* for Pin 5 on the CTB port. +*/ +extern const cy_stc_ctdac_fast_config_t Cy_CTDAC_Fast_OA1Ref_UnbufferedOut; + +/** Configure CTDAC to use a buffered reference from Opamp1 of CTB +* and output buffered through Opamp0 of CTB. See \ref Cy_CTDAC_FastInit. +* +* To quickly configure Opamp0, call with \ref Cy_CTB_FastInit +* with \ref Cy_CTB_Fast_Opamp0_Vdac_Out or \ref Cy_CTB_Fast_Opamp0_Vdac_Out_SH. +* +* To use the reference from the Analog Reference (AREF), +* call \ref Cy_CTB_FastInit with \ref Cy_CTB_Fast_Opamp1_Vdac_Ref_Aref. +* +* To use an external reference from a GPIO, +* call \ref Cy_CTB_FastInit with \ref Cy_CTB_Fast_Opamp1_Vdac_Ref_Pin5 +* for Pins 5 on the CTB port. +*/ +extern const cy_stc_ctdac_fast_config_t Cy_CTDAC_Fast_OA1Ref_BufferedOut; + +/** \} group_ctdac_globals */ + +/*************************************** +* Function Prototypes +***************************************/ + +/** +* \addtogroup group_ctdac_functions +* \{ +*/ +cy_en_ctdac_status_t Cy_CTDAC_Init(CTDAC_Type *base, const cy_stc_ctdac_config_t *config); +cy_en_ctdac_status_t Cy_CTDAC_DeInit(CTDAC_Type *base, bool deInitRouting); +cy_en_ctdac_status_t Cy_CTDAC_FastInit(CTDAC_Type *base, const cy_stc_ctdac_fast_config_t *config); +__STATIC_INLINE void Cy_CTDAC_Enable(CTDAC_Type *base); +__STATIC_INLINE void Cy_CTDAC_Disable(CTDAC_Type *base); +__STATIC_INLINE void Cy_CTDAC_SetValue(CTDAC_Type *base, int32_t value); +__STATIC_INLINE void Cy_CTDAC_SetValueBuffered(CTDAC_Type *base, int32_t value); +void Cy_CTDAC_SetSignMode(CTDAC_Type *base, cy_en_ctdac_format_t formatMode); +void Cy_CTDAC_SetDeepSleepMode(CTDAC_Type *base, cy_en_ctdac_deep_sleep_t deepSleep); +void Cy_CTDAC_SetOutputMode(CTDAC_Type *base, cy_en_ctdac_output_mode_t outputMode); +void Cy_CTDAC_SetDeglitchMode(CTDAC_Type *base, cy_en_ctdac_deglitch_t deglitchMode); +void Cy_CTDAC_SetDeglitchCycles(CTDAC_Type *base, uint32_t deglitchCycles); +void Cy_CTDAC_SetRef(CTDAC_Type *base, cy_en_ctdac_ref_source_t refSource); + +/** \addtogroup group_ctdac_functions_switches +* +* This set of functions is for controlling the two CTDAC analog switches, CVD, and CO6. +* These are advanced functions. The switches will be managed by the reference +* source and output mode selections when initializing the hardware. +* \{ +*/ +void Cy_CTDAC_SetAnalogSwitch(CTDAC_Type *base, uint32_t switchMask, cy_en_ctdac_switch_state_t state); +__STATIC_INLINE uint32_t Cy_CTDAC_GetAnalogSwitch(const CTDAC_Type *base); +__STATIC_INLINE void Cy_CTDAC_SetSwitchCO6(CTDAC_Type *base, cy_en_ctdac_switch_state_t state); +__STATIC_INLINE void Cy_CTDAC_OpenAllSwitches(CTDAC_Type *base); +/** \} */ + +/** \addtogroup group_ctdac_functions_interrupts +* This set of functions is related to the VDAC_EMPTY interrupt +* \{ +*/ +__STATIC_INLINE uint32_t Cy_CTDAC_GetInterruptStatus(const CTDAC_Type *base); +__STATIC_INLINE void Cy_CTDAC_ClearInterrupt(CTDAC_Type *base); +__STATIC_INLINE void Cy_CTDAC_SetSwInterrupt(CTDAC_Type *base); +__STATIC_INLINE void Cy_CTDAC_SetInterruptMask(CTDAC_Type *base, uint32_t mask); +__STATIC_INLINE uint32_t Cy_CTDAC_GetInterruptMask(const CTDAC_Type *base); +__STATIC_INLINE uint32_t Cy_CTDAC_GetInterruptStatusMasked(const CTDAC_Type *base); +/** \} */ + +/** \addtogroup group_ctdac_functions_syspm_callback +* This driver supports one SysPm callback for Deep Sleep transition. +* \{ +*/ +cy_en_syspm_status_t Cy_CTDAC_DeepSleepCallback(cy_stc_syspm_callback_params_t *callbackParams); +/** \} */ + +/******************************************************************************* +* Function Name: Cy_CTDAC_Enable +****************************************************************************//** +* +* Powers up the CTDAC hardware block +* +* \param base +* Pointer to structure describing registers +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTDAC_Enable(CTDAC_Type *base) +{ + base->CTDAC_CTRL |= CTDAC_CTDAC_CTRL_ENABLED_Msk; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_Disable +****************************************************************************//** +* +* Turn off the hardware block. +* +* \param base +* Pointer to structure describing registers +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTDAC_Disable(CTDAC_Type *base) +{ + base->CTDAC_CTRL &= ~CTDAC_CTDAC_CTRL_ENABLED_Msk; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetValue +****************************************************************************//** +* +* Set the CTDAC_VAL register (DAC hardware is +* updated on the next Peri clock cycle). Only the least significant 12 bits +* have an effect. Sign extension of negative values is unnecessary and is +* ignored by the hardware. The way in which the CTDAC interprets the 12-bit +* data is controlled by \ref Cy_CTDAC_SetSignMode. +* +* \param base +* Pointer to structure describing registers +* +* \param value +* Value to write into the CTDAC_VAL register +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTDAC_SetValue(CTDAC_Type *base, int32_t value) +{ + base->CTDAC_VAL = (((uint32_t)value) << CTDAC_CTDAC_VAL_VALUE_Pos) & CTDAC_CTDAC_VAL_VALUE_Msk; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetValueBuffered +****************************************************************************//** +* +* Set the CTDAC_VAL_NEXT register. The value is transferred +* to the CTDAC_VAL register on the next edge of the CTDAC clock. +* Only the least significant 12 bits +* have an effect. Sign extension of negative values is unnecessary and is +* ignored by the hardware. The way in which the CTDAC interprets the 12-bit +* data is controlled by \ref Cy_CTDAC_SetSignMode. +* +* \param base +* Pointer to structure describing registers +* +* \param value +* Value to write into the CTDAC_VAL_NEXT register +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTDAC_SetValueBuffered(CTDAC_Type *base, int32_t value){ + base->CTDAC_VAL_NXT = (((uint32_t)value) << CTDAC_CTDAC_VAL_NXT_VALUE_Pos) & CTDAC_CTDAC_VAL_NXT_VALUE_Msk; +} + +/** +* \addtogroup group_ctdac_functions_switches +* \{ +*/ + +/******************************************************************************* +* Function Name: Cy_CTDAC_GetAnalogSwitch +****************************************************************************//** +* +* Gets the state (open or close) of CTDAC switches as a uint32_t value. +* +* This is an advanced function. The switches will be managed by the reference +* source and output mode selections when initializing the hardware. + +* \param base +* Pointer to structure describing registers +* +* \return uint32_t +* Compare the value to the switch masks found in \ref cy_en_ctdac_switches_t. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_CTDAC_GetAnalogSwitch(const CTDAC_Type *base) +{ + return base->CTDAC_SW; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetSwitchCO6 +****************************************************************************//** +* +* Open or close switch CO6 that controls whether the output gets routed +* directly to a pin or through Opamp0 of the CTB. +* +* Note that this switch will temporarily +* be opened for deglitching if DEGLITCHMODE_UNBUFFERED or DEGLITCHMODE_BOTH +* is set in \ref Cy_CTDAC_SetDeglitchMode. +* +* This is an advanced function. The switches will be managed by the reference +* source and output mode selections when initializing the hardware. +* +* \param base +* Pointer to structure describing registers +* +* \param state +* State of the switch, open or close. +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTDAC_SetSwitchCO6(CTDAC_Type *base, cy_en_ctdac_switch_state_t state) +{ + Cy_CTDAC_SetAnalogSwitch(base, (uint32_t) CY_CTDAC_SWITCH_CO6_MASK, state); +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_OpenAllSwitches +****************************************************************************//** +* +* Open all switches. +* +* This is an advanced function. The switches will be managed by the reference +* source and output mode selections when initializing the hardware. +* +* \param base +* Pointer to structure describing registers +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTDAC_OpenAllSwitches(CTDAC_Type *base) +{ + base->CTDAC_SW_CLEAR = CY_CTDAC_DEINT_CTDAC_SW; +} + +/** \} */ + +/** +* \addtogroup group_ctdac_functions_interrupts +* \{ +*/ +/******************************************************************************* +* Function Name: Cy_CTDAC_GetInterruptStatus +****************************************************************************//** +* +* Returns the interrupt status which gets set by the hardware +* when the CTDAC_VAL_NXT register value is transferred to the CTDAC_VAL register. +* Once set, the CTDAC_VAL_NXT register is ready to accept a new value. +* +* Interrupts are available in all update modes except \ref CY_CTDAC_UPDATE_DIRECT_WRITE. +* +* \param base +* Pointer to structure describing registers +* +* \return +* 0 = Value not moved from CTDAC_VAL_NXT to CTDAC_VAL +* 1 = Value moved from CTDAC_VAL_NXT to CTDAC_VAL +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_CTDAC_GetInterruptStatus(const CTDAC_Type *base) +{ + return (base->INTR & CTDAC_INTR_VDAC_EMPTY_Msk) >> CTDAC_INTR_VDAC_EMPTY_Pos; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_ClearInterrupt +****************************************************************************//** +* +* Clears the interrupt that was set by the hardware when the +* CTDAC_VAL_NXT register value is transferred to the CTDAC_VAL register. +* The interrupt must be cleared with this function so that +* the hardware can set subsequent interrupts and those interrupts +* can be forwarded to the interrupt controller, if enabled. +* +* Interrupts are available in all update modes except \ref CY_CTDAC_UPDATE_DIRECT_WRITE. +* +* \param base +* Pointer to structure describing registers +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTDAC_ClearInterrupt(CTDAC_Type *base) +{ + base->INTR = CTDAC_INTR_VDAC_EMPTY_Msk; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetSwInterrupt +****************************************************************************//** +* +* Forces the CTDAC interrupt to trigger using software. +* +* Interrupts are available in all update modes except \ref CY_CTDAC_UPDATE_DIRECT_WRITE. +* +* \param base +* Pointer to structure describing registers +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTDAC_SetSwInterrupt(CTDAC_Type *base) +{ + base->INTR_SET = CTDAC_INTR_SET_VDAC_EMPTY_SET_Msk; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_SetInterruptMask +****************************************************************************//** +* +* Configure the CTDAC interrupt to be forwarded to the CPU interrupt +* controller. +* +* Interrupts are available in all update modes except \ref CY_CTDAC_UPDATE_DIRECT_WRITE. +* +* \param base +* Pointer to structure describing registers +* +* \param mask +* 0: Disable CTDAC interrupt request (will not be forwarded to CPU interrupt controller) +* 1: Enable CTDAC interrupt request (will be forwarded to CPU interrupt controller) +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_CTDAC_SetInterruptMask(CTDAC_Type *base, uint32_t mask) +{ + CY_ASSERT_L2(CY_CTDAC_INTRMASK(mask)); + + base->INTR_MASK = mask & CTDAC_INTR_MASK_VDAC_EMPTY_MASK_Msk; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_GetInterruptMask +****************************************************************************//** +* +* Returns whether the CTDAC interrupt is +* forwarded to the CPU interrupt controller +* as configured by \ref Cy_CTDAC_SetInterruptMask. +* +* Interrupts are available in all update modes except \ref CY_CTDAC_UPDATE_DIRECT_WRITE. +* +* \param base +* Pointer to structure describing registers +* +* \return +* 0 = Interrupt output not forwarded to CPU interrupt controller +* 1 = Interrupt output forwarded to CPU interrupt controller +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_CTDAC_GetInterruptMask(const CTDAC_Type *base) +{ + return (base->INTR_MASK & CTDAC_INTR_MASK_VDAC_EMPTY_MASK_Msk) >> CTDAC_INTR_MASK_VDAC_EMPTY_MASK_Pos; +} + +/******************************************************************************* +* Function Name: Cy_CTDAC_GetInterruptStatusMasked +****************************************************************************//** +* +* Returns the bitwise AND of \ref Cy_CTDAC_GetInterruptStatus and +* \ref Cy_CTDAC_SetInterruptMask. When high, the DAC interrupt is +* asserted and the interrupt is forwarded to the CPU interrupt +* controller. +* +* Interrupts are available in all update modes except \ref CY_CTDAC_UPDATE_DIRECT_WRITE. +* +* \param base +* Pointer to structure describing registers +* +* \return +* 0 = Value not moved from CTDAC_VAL_NXT to CTDAC_VAL or not masked +* 1 = Value moved from CTDAC_VAL_NXT to CTDAC_VAL and masked +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_CTDAC_GetInterruptStatusMasked(const CTDAC_Type *base){ + return (base->INTR_MASKED & CTDAC_INTR_MASKED_VDAC_EMPTY_MASKED_Msk) >> CTDAC_INTR_MASKED_VDAC_EMPTY_MASKED_Pos; +} + +/** \} */ + +/** \} group_ctdac_functions */ + +#if defined(__cplusplus) +} +#endif + +#endif /** !defined(CY_CTDAC_H) */ + +/** \} group_ctdac */ + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/dma/cy_dma.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/dma/cy_dma.c new file mode 100644 index 0000000000..2b50f08363 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/dma/cy_dma.c @@ -0,0 +1,318 @@ +/***************************************************************************//** +* \file cy_dma.c +* \version 2.0 +* +* \brief +* The source code file for the DMA driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_dma.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_Init +****************************************************************************//** +* +* Initializes descriptor structure in SRAM from a pre-initialized +* configuration structure. +* This function initializes only the descriptor and not the channel. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param config +* This is a configuration structure that has all initialization information for +* the descriptor. +* +* \return +* The status /ref cy_en_dma_status_t. +* +*******************************************************************************/ +cy_en_dma_status_t Cy_DMA_Descriptor_Init(cy_stc_dma_descriptor_t * descriptor, const cy_stc_dma_descriptor_config_t * config) +{ + cy_en_dma_status_t retVal = CY_DMA_BAD_PARAM; + + if ((NULL != descriptor) && (NULL != config)) + { + CY_ASSERT_L3(CY_DMA_IS_RETRIGGER_VALID(config->retrigger)); + CY_ASSERT_L3(CY_DMA_IS_TRIG_TYPE_VALID(config->interruptType)); + CY_ASSERT_L3(CY_DMA_IS_TRIG_TYPE_VALID(config->triggerOutType)); + CY_ASSERT_L3(CY_DMA_IS_TRIG_TYPE_VALID(config->triggerInType)); + CY_ASSERT_L3(CY_DMA_IS_XFER_SIZE_VALID(config->srcTransferSize)); + CY_ASSERT_L3(CY_DMA_IS_XFER_SIZE_VALID(config->dstTransferSize)); + CY_ASSERT_L3(CY_DMA_IS_CHANNEL_STATE_VALID(config->channelState)); + CY_ASSERT_L3(CY_DMA_IS_DATA_SIZE_VALID(config->dataSize)); + CY_ASSERT_L3(CY_DMA_IS_TYPE_VALID(config->descriptorType)); + + descriptor->ctl = + _VAL2FLD(CY_DMA_CTL_RETRIG, config->retrigger) | + _VAL2FLD(CY_DMA_CTL_INTR_TYPE, config->interruptType) | + _VAL2FLD(CY_DMA_CTL_TR_OUT_TYPE, config->triggerOutType) | + _VAL2FLD(CY_DMA_CTL_TR_IN_TYPE, config->triggerInType) | + _VAL2FLD(CY_DMA_CTL_SRC_SIZE, config->srcTransferSize) | + _VAL2FLD(CY_DMA_CTL_DST_SIZE, config->dstTransferSize) | + _VAL2FLD(CY_DMA_CTL_CH_DISABLE, config->channelState) | + _VAL2FLD(CY_DMA_CTL_DATA_SIZE, config->dataSize) | + _VAL2FLD(CY_DMA_CTL_TYPE, config->descriptorType); + + descriptor->src = (uint32_t)config->srcAddress; + + descriptor->dst = (uint32_t)config->dstAddress; + + switch(config->descriptorType) + { + case CY_DMA_SINGLE_TRANSFER: + { + descriptor->xCtl = (uint32_t)config->nextDescriptor; + break; + } + case CY_DMA_1D_TRANSFER: + { + CY_ASSERT_L2(CY_DMA_IS_INCR_VALID(config->srcXincrement)); + CY_ASSERT_L2(CY_DMA_IS_INCR_VALID(config->dstXincrement)); + CY_ASSERT_L2(CY_DMA_IS_COUNT_VALID(config->xCount)); + + descriptor->xCtl = + _VAL2FLD(CY_DMA_CTL_SRC_INCR, config->srcXincrement) | + _VAL2FLD(CY_DMA_CTL_DST_INCR, config->dstXincrement) | + _VAL2FLD(CY_DMA_CTL_COUNT, config->xCount - 1UL); + + descriptor->yCtl = (uint32_t)config->nextDescriptor; + break; + } + case CY_DMA_2D_TRANSFER: + { + CY_ASSERT_L2(CY_DMA_IS_INCR_VALID(config->srcXincrement)); + CY_ASSERT_L2(CY_DMA_IS_INCR_VALID(config->dstXincrement)); + CY_ASSERT_L2(CY_DMA_IS_COUNT_VALID(config->xCount)); + CY_ASSERT_L2(CY_DMA_IS_INCR_VALID(config->srcYincrement)); + CY_ASSERT_L2(CY_DMA_IS_INCR_VALID(config->dstYincrement)); + CY_ASSERT_L2(CY_DMA_IS_COUNT_VALID(config->yCount)); + + descriptor->xCtl = + _VAL2FLD(CY_DMA_CTL_SRC_INCR, config->srcXincrement) | + _VAL2FLD(CY_DMA_CTL_DST_INCR, config->dstXincrement) | + _VAL2FLD(CY_DMA_CTL_COUNT, config->xCount - 1UL); + + descriptor->yCtl = + _VAL2FLD(CY_DMA_CTL_SRC_INCR, config->srcYincrement) | + _VAL2FLD(CY_DMA_CTL_DST_INCR, config->dstYincrement) | + _VAL2FLD(CY_DMA_CTL_COUNT, config->yCount - 1UL); + + descriptor->nextPtr = (uint32_t)config->nextDescriptor; + break; + } + default: + { + /* Unsupported type of descriptor */ + break; + } + } + + retVal = CY_DMA_SUCCESS; + } + + return retVal; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_DeInit +****************************************************************************//** +* +* Clears all the content of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +*******************************************************************************/ +void Cy_DMA_Descriptor_DeInit(cy_stc_dma_descriptor_t * descriptor) +{ + descriptor->ctl = 0UL; + descriptor->src = 0UL; + descriptor->dst = 0UL; + descriptor->xCtl = 0UL; + descriptor->yCtl = 0UL; + descriptor->nextPtr = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_Init +****************************************************************************//** +* +* Initializes the DMA channel with a descriptor and other parameters. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +* \param channelConfig +* A structure that has the initialization information for the +* channel. +* +* \return +* The status /ref cy_en_dma_status_t. +* +*******************************************************************************/ +cy_en_dma_status_t Cy_DMA_Channel_Init(DW_Type * base, uint32_t channel, cy_stc_dma_channel_config_t const * channelConfig) +{ + cy_en_dma_status_t retVal = CY_DMA_BAD_PARAM; + + if (((CY_DMA_IS_DW_CH_NR_VALID(base, channel)) && (NULL != channelConfig) && (NULL != channelConfig->descriptor))) + { + uint32_t regVal; + + CY_ASSERT_L2(CY_DMA_IS_PRIORITY_VALID(channelConfig->priority)); + + /* Set current descriptor */ + base->CH_STRUCT[channel].CH_CURR_PTR = (uint32_t)channelConfig->descriptor; + + /* Set if the channel is preemtable */ + regVal = base->CH_STRUCT[channel].CH_CTL & ((uint32_t) ~(DW_CH_STRUCT_CH_CTL_PREEMPTABLE_Msk | + DW_CH_STRUCT_CH_CTL_PRIO_Msk | + DW_CH_STRUCT_CH_CTL_ENABLED_Msk)); + + base->CH_STRUCT[channel].CH_CTL = regVal | _BOOL2FLD(DW_CH_STRUCT_CH_CTL_PREEMPTABLE, channelConfig->preemptable) | + _VAL2FLD(DW_CH_STRUCT_CH_CTL_PRIO, channelConfig->priority) | + _BOOL2FLD(DW_CH_STRUCT_CH_CTL_ENABLED, channelConfig->enable); + + retVal = CY_DMA_SUCCESS; + } + + return (retVal); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_DeInit +****************************************************************************//** +* +* Clears all the content of registers corresponding to the channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +*******************************************************************************/ +void Cy_DMA_Channel_DeInit(DW_Type * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + base->CH_STRUCT[channel].CH_CTL = 0UL; + base->CH_STRUCT[channel].CH_IDX = 0UL; + base->CH_STRUCT[channel].CH_CURR_PTR = 0UL; + base->CH_STRUCT[channel].INTR_MASK = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetNextDescriptor +****************************************************************************//** +* +* Sets a Next Descriptor parameter for the specified descriptor. +* +* Based on descriptor type the offset of address for the next descriptor may +* vary. For a single transfer descriptor type, this register is at offset 0x0c. +* For a 1D transfer descriptor type, this register is at offset 0x10. For a 2D +* transfer descriptor type, this register is at offset 0x14. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param nextDescriptor +* The pointer to the next descriptor. +* +*******************************************************************************/ +void Cy_DMA_Descriptor_SetNextDescriptor(cy_stc_dma_descriptor_t * descriptor, cy_stc_dma_descriptor_t const * nextDescriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + switch((cy_en_dma_descriptor_type_t) _FLD2VAL(CY_DMA_CTL_TYPE, descriptor->ctl)) + { + case CY_DMA_SINGLE_TRANSFER: + descriptor->xCtl = (uint32_t)nextDescriptor; + break; + + case CY_DMA_1D_TRANSFER: + descriptor->yCtl = (uint32_t)nextDescriptor; + break; + + case CY_DMA_2D_TRANSFER: + descriptor->nextPtr = (uint32_t)nextDescriptor; + break; + + default: + /* Unsupported type of descriptor */ + break; + } +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetNextDescriptor +****************************************************************************//** +* +* Returns a next descriptor address of the specified descriptor. +* +* Based on descriptor type the offset of address for the next descriptor may +* vary. For a single transfer descriptor type, this register is at offset 0x0c. +* For a 1D transfer descriptor type, this register is at offset 0x10. For a 2D +* transfer descriptor type, this register is at offset 0x14. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The pointer to the next descriptor. +* +*******************************************************************************/ +cy_stc_dma_descriptor_t * Cy_DMA_Descriptor_GetNextDescriptor(cy_stc_dma_descriptor_t const * descriptor) +{ + cy_stc_dma_descriptor_t * retVal = NULL; + + CY_ASSERT_L1(NULL != descriptor); + + switch((cy_en_dma_descriptor_type_t) _FLD2VAL(CY_DMA_CTL_TYPE, descriptor->ctl)) + { + case CY_DMA_SINGLE_TRANSFER: + retVal = (cy_stc_dma_descriptor_t*) descriptor->xCtl; + break; + + case CY_DMA_1D_TRANSFER: + retVal = (cy_stc_dma_descriptor_t*) descriptor->yCtl; + break; + + case CY_DMA_2D_TRANSFER: + retVal = (cy_stc_dma_descriptor_t*) descriptor->nextPtr; + break; + + default: + /* Unsupported type of descriptor */ + break; + } + + return (retVal); +} + + +#if defined(__cplusplus) +} +#endif + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/dma/cy_dma.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/dma/cy_dma.h new file mode 100644 index 0000000000..e13a8c6bdc --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/dma/cy_dma.h @@ -0,0 +1,1811 @@ +/***************************************************************************//** +* \file cy_dma.h +* \version 2.0 +* +* \brief +* The header file of the DMA driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_dma Direct Memory Access (DMA) +* \{ +* Configures a DMA channel and its descriptor(s). +* +* The DMA Channel component can be used in any project that needs to transfer data +* without CPU intervention, based on a hardware trigger signal from another component. +* +* A device may support more than one DMA hardware block. Each block has a set of +* registers, and a base hardware address. Each block also supports multiple channels. +* Many API functions for the DMA driver require the base hardware address and the +* channel number. Ensure that you use the correct hardware address for the DMA block in use. +* +* Features: +* * Devices support up to two DMA hardware blocks +* * Each DMA block supports up to 16 DMA channels +* * Supports channel descriptors in SRAM +* * Four Priority Levels for each channel +* * Byte, Half-word (2 byte), and Word (4 byte) transfers +* * Configurable source and destination addresses +* +* \section group_dma_configuration Configuration Considerations +* +* To set up a DMA driver you initialize a descriptor, +* intialize and enable a channel, and enable the DMA block. +* +* To set up the descriptor, provide the configuration parameters for the +* descriptor in the \ref cy_stc_dma_descriptor_config_t structure. Then call the +* \ref Cy_DMA_Descriptor_Init function to initialize the descriptor in SRAM. You can +* modify the source and destination addresses dynamically by calling +* \ref Cy_DMA_Descriptor_SetSrcAddress and \ref Cy_DMA_Descriptor_SetDstAddress. +* +* To set up the DMA channel, provide a filled \ref cy_stc_dma_channel_config_t +* structure. Call the \ref Cy_DMA_Channel_Init function, specifying the channel +* number. Use \ref Cy_DMA_Channel_Enable to enable the configured DMA channel. +* +* Call \ref Cy_DMA_Channel_Enable for each DMA channel in use. +* +* The following is a simplified structure of the DMA driver API interdependences +* in a typical user application: +* \image html dma.png +* +* NOTE: Even if a DMA channel is enabled, it is not operational until +* the DMA block is enabled using function \ref Cy_DMA_Enable.\n +* NOTE: If the DMA descriptor is configured to generate an interrupt, +* the interrupt must be enabled using the \ref Cy_DMA_Channel_SetInterruptMask +* function for each DMA channel. +* +* For example: +* \snippet dma/dma_v2_0_sut_00.cydsn/main_cm4.c Cy_DMA_Snippet +* +* \section group_dma_more_information More Information. +* +* See the DMA Component datasheet. +* See also the DMA chapter of the device technical reference manual (TRM). +* +* \section group_dma_MISRA MISRA-C Compliance +* The DMA driver has the following specific deviations: +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
    10.3RA composite expression of 'essentially unsigned' type is being +* cast to a different type category.The value got from the bitfield physically can't exceed the enumeration +* that describes this bitfield. So the code is safety by design.
    14.2RAll non-null statements shall either: +* a) have at least one side effect however executed +* b) cause control flow to changeA result of a read operation is ignored when this read is just intended + to ensure the previous write operation is flushed out to the hardware.
    +* +* \section group_dma_changelog Changelog +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    VersionChangesReason for Change
    1.0Initial version
    2.0* All the API is refactored to be consistent within itself and with the +* rest of the PDL content. +* * The descriptor API is update in the next manner: +* The \ref Cy_DMA_Descriptor_Init function sets whole the bunch of descriptor +* settings, and all the rest of descriptor API is the get/set interface +* to the each of descriptor settings. +* * There is a bunch of macros to support a backward compatibility with most +* of the driver version 1.0 API, however it is strongly recommended to use +* the new v2.0 interface in new designs (do not just copy-paste from old +* projects). To enable the backward compatibility support the CY_DMA_BWC +* definition should be changed to "true".
    +* + +* \defgroup group_dma_macros Macros +* \defgroup group_dma_functions Functions +* \{ +* \defgroup group_dma_block_functions Block Functions +* \defgroup group_dma_descriptor_functions Descriptor Functions +* \defgroup group_dma_channel_functions Channel Functions +* \} +* \defgroup group_dma_data_structures Data structures +* \defgroup group_dma_enums Enumerated types +*/ + +#if !defined(CY_DMA_H) +#define CY_DMA_H + +#include +#include +#include +#include "syslib/cy_syslib.h" +#include "cy_device_headers.h" + +#ifndef CY_IP_M4CPUSS_DMA + #error "The DMA driver is not supported on this device" +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +/****************************************************************************** + * Macro definitions * + ******************************************************************************/ + +/** +* \addtogroup group_dma_macros +* \{ +*/ + +/** Driver major version */ +#define CY_DMA_DRV_VERSION_MAJOR 2 + +/** Driver minor version */ +#define CY_DMA_DRV_VERSION_MINOR 0 + +/** DMA driver identifier */ +#define CY_DMA_ID (CY_PDL_DRV_ID(0x13U)) + +/** DMA channel interrupt mask */ +#define CY_DMA_INTR_MASK (0x01UL) + +/** Backward compatibility flag. It enables a bunch of macros which provide +* a backward compatibility with most of DMA driver version 1.0 interface. */ +#ifndef CY_DMA_BWC + #define CY_DMA_BWC (false) +#endif + +/** \} group_dma_macros */ + + +/** +* \addtogroup group_dma_enums +* \{ +*/ + +/** Contains the possible interrupt cause values */ +typedef enum +{ + CY_DMA_INTR_CAUSE_NO_INTR = 0U, /**< No interrupt */ + CY_DMA_INTR_CAUSE_COMPLETION = 1U, /**< Completion */ + CY_DMA_INTR_CAUSE_SRC_BUS_ERROR = 2U, /**< Source bus error */ + CY_DMA_INTR_CAUSE_DST_BUS_ERROR = 3U, /**< Destination bus error */ + CY_DMA_INTR_CAUSE_SRC_MISAL = 4U, /**< Source address is not aligned */ + CY_DMA_INTR_CAUSE_DST_MISAL = 5U, /**< Destination address is not aligned */ + CY_DMA_INTR_CAUSE_CURR_PTR_NULL = 6U, /**< Current descripror pointer is NULL */ + CY_DMA_INTR_CAUSE_ACTIVE_CH_DISABLED = 7U, /**< Active channel is disabled */ + CY_DMA_INTR_CAUSE_DESCR_BUS_ERROR = 8U /**< Descriptor bus error */ +} cy_en_dma_intr_cause_t; + +/** Contains the options for the descriptor type */ +typedef enum +{ + CY_DMA_SINGLE_TRANSFER = 0UL, /**< Single transfer. */ + CY_DMA_1D_TRANSFER = 1UL, /**< 1D transfer. */ + CY_DMA_2D_TRANSFER = 2UL /**< 2D transfer. */ +} cy_en_dma_descriptor_type_t; + +/** Contains the options for the interrupt, trig-in and trig-out type parameters of the descriptor */ +typedef enum +{ + CY_DMA_1ELEMENT = 0UL, /**< One element transfer. */ + CY_DMA_X_LOOP = 1UL, /**< One X loop transfer. */ + CY_DMA_DESCR = 2UL, /**< One descriptor transfer. */ + CY_DMA_DESCR_CHAIN = 3UL /**< Entire descriptor chain transfer. */ +} cy_en_dma_trigger_type_t; + +/** This enum has the options for the data size */ +typedef enum +{ + CY_DMA_BYTE = 0UL, /**< One byte */ + CY_DMA_HALFWORD = 1UL, /**< Half word (two bytes) */ + CY_DMA_WORD = 2UL /**< Full word (four bytes) */ +} cy_en_dma_data_size_t; + +/** This enum has the options for descriptor retriggering */ +typedef enum +{ + CY_DMA_RETDIG_IM = 0UL, /**< Retrigger immidiatelly */ + CY_DMA_RETDIG_4CYC = 1UL, /**< Retrigger after 4 SYSCLK */ + CY_DMA_RETDIG_16CYC = 2UL, /**< Retrigger after 16 SYSCLK */ + CY_DMA_WAIT_FOR_REACT = 3UL /**< Wait for trigger reactivation */ +} cy_en_dma_retrigger_t; + +/** This enum has the options for the transfer size */ +typedef enum +{ + CY_DMA_TRANSFER_SIZE_DATA = 0UL, /**< As specified by dataSize. */ + CY_DMA_TRANSFER_SIZE_WORD = 1UL, /**< A full word (four bytes). */ +} cy_en_dma_transfer_size_t; + +/** This enum has the options for the state of the channel when the descriptor is completed */ +typedef enum +{ + CY_DMA_CHANNEL_ENABLED = 0UL, /**< Channel stays enabled */ + CY_DMA_CHANNEL_DISABLED = 1UL /**< Channel is disabled */ +} cy_en_dma_channel_state_t; + +/** This enum has the return values of the DMA driver */ +typedef enum +{ + CY_DMA_SUCCESS = 0x00UL, /**< Success. */ + CY_DMA_BAD_PARAM = CY_DMA_ID | CY_PDL_STATUS_ERROR | 0x01UL /**< Input parameters passed to DMA API are not valid. */ +} cy_en_dma_status_t; + +/** \} group_dma_enums */ + + +/** \cond Macros for conditions used by CY_ASSERT calls */ + +#define CY_DMA_IS_COUNT_VALID(count) (((count) >= 1UL) && ((count) <= 256UL)) +#define CY_DMA_IS_INCR_VALID(incr) (((incr) >= -2048L) && ((incr) <= 2047L)) +#define CY_DMA_IS_PRIORITY_VALID(prio) ((prio) <= 3UL) +#define CY_DMA_IS_INTR_MASK_VALID(interrupt) (0UL == ((interrupt) & ((uint32_t) ~CY_DMA_INTR_MASK))) + +#define CY_DMA_IS_RETRIGGER_VALID(retrigger) ((CY_DMA_RETDIG_IM == (retrigger)) || \ + (CY_DMA_RETDIG_4CYC == (retrigger)) || \ + (CY_DMA_RETDIG_16CYC == (retrigger)) || \ + (CY_DMA_WAIT_FOR_REACT == (retrigger))) + +#define CY_DMA_IS_TRIG_TYPE_VALID(trigType) ((CY_DMA_1ELEMENT == (trigType)) || \ + (CY_DMA_X_LOOP == (trigType)) || \ + (CY_DMA_DESCR == (trigType)) || \ + (CY_DMA_DESCR_CHAIN == (trigType))) + +#define CY_DMA_IS_XFER_SIZE_VALID(xferSize) ((CY_DMA_TRANSFER_SIZE_DATA == (xferSize)) || \ + (CY_DMA_TRANSFER_SIZE_WORD == (xferSize))) + +#define CY_DMA_IS_CHANNEL_STATE_VALID(state) ((CY_DMA_CHANNEL_ENABLED == (state)) || \ + (CY_DMA_CHANNEL_DISABLED == (state))) + +#define CY_DMA_IS_DATA_SIZE_VALID(dataSize) ((CY_DMA_BYTE == (dataSize)) || \ + (CY_DMA_HALFWORD == (dataSize)) || \ + (CY_DMA_WORD == (dataSize))) + +#define CY_DMA_IS_TYPE_VALID(descrType) ((CY_DMA_SINGLE_TRANSFER == (descrType)) || \ + (CY_DMA_1D_TRANSFER == (descrType)) || \ + (CY_DMA_2D_TRANSFER == (descrType))) + +#define CY_DMA_IS_DW_CH_NR_VALID(dwNr, chNr) (((0U != CPUSS_DW0_PRESENT) && (DW0 == (dwNr)) && ((chNr) < CPUSS_DW0_CH_NR)) || \ + ((0U != CPUSS_DW1_PRESENT) && (DW1 == (dwNr)) && ((chNr) < CPUSS_DW1_CH_NR))) + +/* Descriptor structure bitfiled definitions */ +#define CY_DMA_CTL_RETRIG_Pos 0UL +#define CY_DMA_CTL_RETRIG_Msk 0x3UL +#define CY_DMA_CTL_INTR_TYPE_Pos 2UL +#define CY_DMA_CTL_INTR_TYPE_Msk 0xCUL +#define CY_DMA_CTL_TR_OUT_TYPE_Pos 4UL +#define CY_DMA_CTL_TR_OUT_TYPE_Msk 0x30UL +#define CY_DMA_CTL_TR_IN_TYPE_Pos 6UL +#define CY_DMA_CTL_TR_IN_TYPE_Msk 0xC0UL +#define CY_DMA_CTL_CH_DISABLE_Pos 24UL +#define CY_DMA_CTL_CH_DISABLE_Msk 0x1000000UL +#define CY_DMA_CTL_SRC_SIZE_Pos 26UL +#define CY_DMA_CTL_SRC_SIZE_Msk 0x4000000UL +#define CY_DMA_CTL_DST_SIZE_Pos 27UL +#define CY_DMA_CTL_DST_SIZE_Msk 0x8000000UL +#define CY_DMA_CTL_DATA_SIZE_Pos 28UL +#define CY_DMA_CTL_DATA_SIZE_Msk 0x30000000UL +#define CY_DMA_CTL_TYPE_Pos 30UL +#define CY_DMA_CTL_TYPE_Msk 0xC0000000UL + +#define CY_DMA_CTL_SRC_INCR_Pos 0UL +#define CY_DMA_CTL_SRC_INCR_Msk 0xFFFUL +#define CY_DMA_CTL_DST_INCR_Pos 12UL +#define CY_DMA_CTL_DST_INCR_Msk 0xFFF000UL +#define CY_DMA_CTL_COUNT_Pos 24UL +#define CY_DMA_CTL_COUNT_Msk 0xFF000000UL + +/** \endcond */ + + +/** +* \addtogroup group_dma_data_structures +* \{ +*/ + +/** +* DMA descriptor structure type. It is a user/component-declared structure which is +* allocated in RAM and just a pointer to which is needed for DMA HW to work with it. +* +* For advanced users: the descriptor can be allocated even in Flash, but in this +* case user should manually predefine all the structure items with constants, +* bacause most of driver's API (especially those functions which are modifying +* descriptors, including \ref Cy_DMA_Descriptor_Init()) can't work with +* read-only descriptors. +*/ +typedef struct +{ + uint32_t ctl; /*!< 0x00000000 Descriptor control */ + uint32_t src; /*!< 0x00000004 Descriptor source */ + uint32_t dst; /*!< 0x00000008 Descriptor destination */ + uint32_t xCtl; /*!< 0x0000000C Descriptor X loop control */ + uint32_t yCtl; /*!< 0x00000010 Descriptor Y loop control */ + uint32_t nextPtr; /*!< 0x00000014 Descriptor next pointer */ +} cy_stc_dma_descriptor_t; + +/** +* This structure is a configuration structure pre-initialized by the user and +* passed as a parameter to the \ref Cy_DMA_Descriptor_Init(). +* It can be allocated in RAM/Flash (on user's choice). +* In case of RAM allocation there is a possibility to reinitialize a descriptor in runtime. +* This structure has all the parameters of the descriptor as separate parameters. +* Most of these parameters are represented in the \ref cy_stc_dma_descriptor_t structure as bit fields. +*/ +typedef struct +{ + cy_en_dma_retrigger_t retrigger; /**< Specifies whether the DW controller should wait for the input trigger to be deactivated. */ + cy_en_dma_trigger_type_t interruptType; /**< Sets the event that triggers an interrupt, see \ref cy_en_dma_trigger_type_t. */ + cy_en_dma_trigger_type_t triggerOutType; /**< Sets the event that triggers an output, see \ref cy_en_dma_trigger_type_t. */ + cy_en_dma_channel_state_t channelState; /**< Specifies if the channel is enabled or disabled on completion of descriptor see \ref cy_en_dma_channel_state_t. */ + cy_en_dma_trigger_type_t triggerInType; /**< Sets what type of transfer is triggered, see \ref cy_en_dma_trigger_type_t. */ + cy_en_dma_data_size_t dataSize; /**< The size of the data bus for transfer, see \ref cy_en_dma_data_size_t. */ + cy_en_dma_transfer_size_t srcTransferSize; /**< The source transfer size. */ + cy_en_dma_transfer_size_t dstTransferSize; /**< The destination transfer size. */ + cy_en_dma_descriptor_type_t descriptorType; /**< The type of the descriptor see \ref cy_en_dma_descriptor_type_t. */ + void * srcAddress; /**< The source address of the transfer. */ + void * dstAddress; /**< The destination address of the transfer. */ + int32_t srcXincrement; /**< The address increment of the source after each X-loop transfer. Valid range is -2048...2047. */ + int32_t dstXincrement; /**< The address increment of the destination after each X-loop transfer. Valid range is -2048...2047. */ + uint32_t xCount; /**< The number of transfers in an X-loop. Valid range is 1...256. */ + int32_t srcYincrement; /**< The address increment of the source after each Y-loop transfer. Valid range is -2048...2047. */ + int32_t dstYincrement; /**< The address increment of the destination after each Y-loop transfer. Valid range is -2048...2047. */ + uint32_t yCount; /**< The number of X-loops in the Y-loop. Valid range is 1...256. */ + cy_stc_dma_descriptor_t * nextDescriptor; /**< The next descriptor to chain after completion, a NULL value will signify no chaining. */ +} cy_stc_dma_descriptor_config_t; + +/** This structure holds the initialization values for the DMA channel */ +typedef struct +{ + cy_stc_dma_descriptor_t * descriptor; /**< The DMA descriptor associated with the channel being initialized */ + bool preemptable; /**< Specifies if the channel is preemptable by another higher-priority channel */ + uint32_t priority; /**< This parameter specifies the channel's priority */ + bool enable; /**< This parameter specifies if the channel is enabled after initializing */ +} cy_stc_dma_channel_config_t; + +/** \} group_dma_data_structures */ + + +/** +* \addtogroup group_dma_functions +* \{ +*/ + +__STATIC_INLINE void Cy_DMA_Enable (DW_Type * base); +__STATIC_INLINE void Cy_DMA_Disable (DW_Type * base); +__STATIC_INLINE uint32_t Cy_DMA_GetActiveChannel (DW_Type const * base); +__STATIC_INLINE void * Cy_DMA_GetActiveSrcAddress(DW_Type const * base); +__STATIC_INLINE void * Cy_DMA_GetActiveDstAddress(DW_Type const * base); + + +/** +* \addtogroup group_dma_descriptor_functions +* \{ +*/ + + cy_en_dma_status_t Cy_DMA_Descriptor_Init (cy_stc_dma_descriptor_t * descriptor, cy_stc_dma_descriptor_config_t const * config); + void Cy_DMA_Descriptor_DeInit(cy_stc_dma_descriptor_t * descriptor); + + void Cy_DMA_Descriptor_SetNextDescriptor (cy_stc_dma_descriptor_t * descriptor, cy_stc_dma_descriptor_t const * nextDescriptor); +__STATIC_INLINE void Cy_DMA_Descriptor_SetSrcAddress (cy_stc_dma_descriptor_t * descriptor, void const * srcAddress); +__STATIC_INLINE void Cy_DMA_Descriptor_SetDstAddress (cy_stc_dma_descriptor_t * descriptor, void const * dstAddress); +__STATIC_INLINE void Cy_DMA_Descriptor_SetXloopDataCount (cy_stc_dma_descriptor_t * descriptor, uint32_t xCount); +__STATIC_INLINE void Cy_DMA_Descriptor_SetYloopDataCount (cy_stc_dma_descriptor_t * descriptor, uint32_t yCount); +__STATIC_INLINE void Cy_DMA_Descriptor_SetXloopSrcIncrement(cy_stc_dma_descriptor_t * descriptor, int32_t srcXincrement); +__STATIC_INLINE void Cy_DMA_Descriptor_SetXloopDstIncrement(cy_stc_dma_descriptor_t * descriptor, int32_t dstXincrement); +__STATIC_INLINE void Cy_DMA_Descriptor_SetYloopSrcIncrement(cy_stc_dma_descriptor_t * descriptor, int32_t srcYincrement); +__STATIC_INLINE void Cy_DMA_Descriptor_SetYloopDstIncrement(cy_stc_dma_descriptor_t * descriptor, int32_t dstYincrement); +__STATIC_INLINE void Cy_DMA_Descriptor_SetInterruptType (cy_stc_dma_descriptor_t * descriptor, cy_en_dma_trigger_type_t interruptType); +__STATIC_INLINE void Cy_DMA_Descriptor_SetTriggerInType (cy_stc_dma_descriptor_t * descriptor, cy_en_dma_trigger_type_t triggerInType); +__STATIC_INLINE void Cy_DMA_Descriptor_SetTriggerOutType (cy_stc_dma_descriptor_t * descriptor, cy_en_dma_trigger_type_t triggerOutType); +__STATIC_INLINE void Cy_DMA_Descriptor_SetDataSize (cy_stc_dma_descriptor_t * descriptor, cy_en_dma_data_size_t dataSize); +__STATIC_INLINE void Cy_DMA_Descriptor_SetSrcTransferSize (cy_stc_dma_descriptor_t * descriptor, cy_en_dma_transfer_size_t srcTransferSize); +__STATIC_INLINE void Cy_DMA_Descriptor_SetDstTransferSize (cy_stc_dma_descriptor_t * descriptor, cy_en_dma_transfer_size_t dstTransferSize); +__STATIC_INLINE void Cy_DMA_Descriptor_SetRetrigger (cy_stc_dma_descriptor_t * descriptor, cy_en_dma_retrigger_t retrigger); +__STATIC_INLINE void Cy_DMA_Descriptor_SetDescriptorType (cy_stc_dma_descriptor_t * descriptor, cy_en_dma_descriptor_type_t descriptorType); +__STATIC_INLINE void Cy_DMA_Descriptor_SetChannelState (cy_stc_dma_descriptor_t * descriptor, cy_en_dma_channel_state_t channelState); + + cy_stc_dma_descriptor_t * Cy_DMA_Descriptor_GetNextDescriptor (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE void * Cy_DMA_Descriptor_GetSrcAddress (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE void * Cy_DMA_Descriptor_GetDstAddress (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE uint32_t Cy_DMA_Descriptor_GetXloopDataCount (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE uint32_t Cy_DMA_Descriptor_GetYloopDataCount (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE int32_t Cy_DMA_Descriptor_GetXloopSrcIncrement(cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE int32_t Cy_DMA_Descriptor_GetXloopDstIncrement(cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE int32_t Cy_DMA_Descriptor_GetYloopSrcIncrement(cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE int32_t Cy_DMA_Descriptor_GetYloopDstIncrement(cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE cy_en_dma_trigger_type_t Cy_DMA_Descriptor_GetInterruptType (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE cy_en_dma_trigger_type_t Cy_DMA_Descriptor_GetTriggerInType (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE cy_en_dma_trigger_type_t Cy_DMA_Descriptor_GetTriggerOutType (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE cy_en_dma_data_size_t Cy_DMA_Descriptor_GetDataSize (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE cy_en_dma_transfer_size_t Cy_DMA_Descriptor_GetSrcTransferSize (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE cy_en_dma_transfer_size_t Cy_DMA_Descriptor_GetDstTransferSize (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE cy_en_dma_retrigger_t Cy_DMA_Descriptor_GetRetrigger (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE cy_en_dma_descriptor_type_t Cy_DMA_Descriptor_GetDescriptorType (cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE cy_en_dma_channel_state_t Cy_DMA_Descriptor_GetChannelState (cy_stc_dma_descriptor_t const * descriptor); + +/** \} group_dma_descriptor_functions */ + + +/** +* \addtogroup group_dma_channel_functions +* \{ +*/ + + cy_en_dma_status_t Cy_DMA_Channel_Init (DW_Type * base, uint32_t channel, cy_stc_dma_channel_config_t const * channelConfig); + void Cy_DMA_Channel_DeInit (DW_Type * base, uint32_t channel); +__STATIC_INLINE void Cy_DMA_Channel_SetDescriptor(DW_Type * base, uint32_t channel, cy_stc_dma_descriptor_t const * descriptor); +__STATIC_INLINE void Cy_DMA_Channel_Enable (DW_Type * base, uint32_t channel); +__STATIC_INLINE void Cy_DMA_Channel_Disable (DW_Type * base, uint32_t channel); +__STATIC_INLINE void Cy_DMA_Channel_SetPriority (DW_Type * base, uint32_t channel, uint32_t priority); +__STATIC_INLINE uint32_t Cy_DMA_Channel_GetPriority (DW_Type const * base, uint32_t channel); +__STATIC_INLINE cy_en_dma_intr_cause_t Cy_DMA_Channel_GetStatus(DW_Type const * base, uint32_t channel); +__STATIC_INLINE cy_stc_dma_descriptor_t * Cy_DMA_Channel_GetCurrentDescriptor(DW_Type const * base, uint32_t channel); + +__STATIC_INLINE uint32_t Cy_DMA_Channel_GetInterruptStatus (DW_Type const * base, uint32_t channel); +__STATIC_INLINE void Cy_DMA_Channel_ClearInterrupt (DW_Type * base, uint32_t channel); +__STATIC_INLINE void Cy_DMA_Channel_SetInterrupt (DW_Type * base, uint32_t channel); +__STATIC_INLINE uint32_t Cy_DMA_Channel_GetInterruptMask (DW_Type const * base, uint32_t channel); +__STATIC_INLINE void Cy_DMA_Channel_SetInterruptMask (DW_Type * base, uint32_t channel, uint32_t interrupt); +__STATIC_INLINE uint32_t Cy_DMA_Channel_GetInterruptStatusMasked(DW_Type const * base, uint32_t channel); + +/** \} group_dma_channel_functions */ + + +/*************************************** +* In-line Function Implementation +***************************************/ + + +/** +* \addtogroup group_dma_block_functions +* \{ +*/ + + +/******************************************************************************* +* Function Name: Cy_DMA_Enable +****************************************************************************//** +* +* Enables the DMA block. +* +* \param base +* A pointer to the hardware DMA block. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Enable(DW_Type * base) +{ + base->CTL |= DW_CTL_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Disable +****************************************************************************//** +* +* Disables the DMA block. +* +* \param base +* A pointer to the hardware DMA block. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Disable(DW_Type * base) +{ + base->CTL &= (uint32_t) ~DW_CTL_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_GetActiveChannel +****************************************************************************//** +* +* Returns the status of the active/pending channels. +* the DMA block. +* +* \param base +* A pointer to the hardware DMA block. +* +* \return +* Returns a bit-field with all of the currently active/pending channels in the +* DMA block. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_DMA_GetActiveChannel(DW_Type const * base) +{ + return(_FLD2VAL(DW_STATUS_CH_IDX, base->STATUS)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_GetActiveSrcAddress +****************************************************************************//** +* +* Returns the source address that is being used for current transfer. +* +* \param base +* A pointer to the hardware DMA block. +* +* \return +* Returns a pointer to the source of transfer. +* +*******************************************************************************/ +__STATIC_INLINE void * Cy_DMA_GetActiveSrcAddress(DW_Type const * base) +{ + return ((void *)base->ACT_DESCR_SRC); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_GetActiveDstAddress +****************************************************************************//** +* +* Returns the destination address that is being used for the current transfer. +* +* \param base +* A pointer to the hardware DMA block. +* +* \return +* Returns a pointer to the destination of transfer. +* +*******************************************************************************/ +__STATIC_INLINE void * Cy_DMA_GetActiveDstAddress(DW_Type const * base) +{ + return ((void *) base->ACT_DESCR_DST); +} + +/** \} group_dma_block_functions */ + + +/** +* \addtogroup group_dma_descriptor_functions +* \{ +*/ + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetSrcAddress +****************************************************************************//** +* +* Sets the source address parameter for the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param srcAddress +* The source address value for the descriptor. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetSrcAddress(cy_stc_dma_descriptor_t * descriptor, void const * srcAddress) +{ + descriptor->src = (uint32_t) srcAddress; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetSrcAddress +****************************************************************************//** +* +* Returns the source address parameter of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The source address value of the descriptor. +* +*******************************************************************************/ +__STATIC_INLINE void * Cy_DMA_Descriptor_GetSrcAddress(cy_stc_dma_descriptor_t const * descriptor) +{ + return ((void *) descriptor->src); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetDstAddress +****************************************************************************//** +* +* Sets the destination address parameter for the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param dstAddress +* The destination address value for the descriptor. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetDstAddress(cy_stc_dma_descriptor_t * descriptor, void const * dstAddress) +{ + descriptor->dst = (uint32_t) dstAddress; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetDstAddress +****************************************************************************//** +* +* Returns the destination address parameter of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The destination address value of the descriptor. +* +*******************************************************************************/ +__STATIC_INLINE void * Cy_DMA_Descriptor_GetDstAddress(cy_stc_dma_descriptor_t const * descriptor) +{ + return ((void *) descriptor->dst); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetInterruptType +****************************************************************************//** +* +* Sets the interrupt type parameter for the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param interruptType +* The interrupt type set for the descriptor. \ref cy_en_dma_trigger_type_t +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetInterruptType(cy_stc_dma_descriptor_t * descriptor, cy_en_dma_trigger_type_t interruptType) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L3(CY_DMA_IS_TRIG_TYPE_VALID(interruptType)); + + descriptor->ctl = _CLR_SET_FLD32U(descriptor->ctl, CY_DMA_CTL_INTR_TYPE, interruptType); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetInterruptType +****************************************************************************//** +* +* Returns the Interrupt Type of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The Interrupt Type \ref cy_en_dma_trigger_type_t. +* +*******************************************************************************/ +__STATIC_INLINE cy_en_dma_trigger_type_t Cy_DMA_Descriptor_GetInterruptType(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return((cy_en_dma_trigger_type_t) _FLD2VAL(CY_DMA_CTL_INTR_TYPE, descriptor->ctl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetTriggerInType +****************************************************************************//** +* +* Sets the Trigger In Type parameter for the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param triggerInType +* The Trigger In Type parameter \ref cy_en_dma_trigger_type_t +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetTriggerInType(cy_stc_dma_descriptor_t * descriptor, cy_en_dma_trigger_type_t triggerInType) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L3(CY_DMA_IS_TRIG_TYPE_VALID(triggerInType)); + + descriptor->ctl = _CLR_SET_FLD32U(descriptor->ctl, CY_DMA_CTL_TR_IN_TYPE, triggerInType); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetTriggerInType +****************************************************************************//** +* +* Returns the Trigger In Type of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The Trigger In Type \ref cy_en_dma_trigger_type_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_dma_trigger_type_t Cy_DMA_Descriptor_GetTriggerInType(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return((cy_en_dma_trigger_type_t) _FLD2VAL(CY_DMA_CTL_TR_IN_TYPE, descriptor->ctl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetTriggerOutType +****************************************************************************//** +* +* Sets the trigger-out-type parameter for the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param triggerOutType +* The trigger-out-type set for the descriptor. \ref cy_en_dma_trigger_type_t +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetTriggerOutType(cy_stc_dma_descriptor_t * descriptor, cy_en_dma_trigger_type_t triggerOutType) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L3(CY_DMA_IS_TRIG_TYPE_VALID(triggerOutType)); + + descriptor->ctl = _CLR_SET_FLD32U(descriptor->ctl, CY_DMA_CTL_TR_OUT_TYPE, triggerOutType); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetTriggerOutType +****************************************************************************//** +* +* Returns the Trigger Out Type parameter of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The Trigger Out Type parameter \ref cy_en_dma_trigger_type_t. +* +*******************************************************************************/ +__STATIC_INLINE cy_en_dma_trigger_type_t Cy_DMA_Descriptor_GetTriggerOutType(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return((cy_en_dma_trigger_type_t) _FLD2VAL(CY_DMA_CTL_TR_OUT_TYPE, descriptor->ctl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetDataSize +****************************************************************************//** +* +* Sets the data element size for the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param dataSize +* Data element size \ref cy_en_dma_data_size_t +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetDataSize(cy_stc_dma_descriptor_t * descriptor, cy_en_dma_data_size_t dataSize) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L3(CY_DMA_IS_DATA_SIZE_VALID(dataSize)); + + descriptor->ctl = _CLR_SET_FLD32U(descriptor->ctl, CY_DMA_CTL_DATA_SIZE, dataSize); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetDataSize +****************************************************************************//** +* +* Returns the data element size of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* Data element size \ref cy_en_dma_data_size_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_dma_data_size_t Cy_DMA_Descriptor_GetDataSize(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return((cy_en_dma_data_size_t) _FLD2VAL(CY_DMA_CTL_DATA_SIZE, descriptor->ctl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetSrcTransferSize +****************************************************************************//** +* +* Sets the source transfer size for the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param srcTransferSize +* This parameter provides the source transfer size parameters of the descriptor. +* \ref cy_en_dma_transfer_size_t +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetSrcTransferSize(cy_stc_dma_descriptor_t * descriptor, cy_en_dma_transfer_size_t srcTransferSize) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L3(CY_DMA_IS_XFER_SIZE_VALID(srcTransferSize)); + + descriptor->ctl = _CLR_SET_FLD32U(descriptor->ctl, CY_DMA_CTL_SRC_SIZE, srcTransferSize); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetSrcTransferSize +****************************************************************************//** +* +* Returns the source transfer size of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* Source Transfer Size \ref cy_en_dma_transfer_size_t. +* +*******************************************************************************/ +__STATIC_INLINE cy_en_dma_transfer_size_t Cy_DMA_Descriptor_GetSrcTransferSize(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return((cy_en_dma_transfer_size_t) _FLD2VAL(CY_DMA_CTL_SRC_SIZE, descriptor->ctl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetDstTransferSize +****************************************************************************//** +* +* Sets the Destination Transfer Size for the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param dstTransferSize +* A Destination Transfer Size \ref cy_en_dma_transfer_size_t. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetDstTransferSize(cy_stc_dma_descriptor_t * descriptor, cy_en_dma_transfer_size_t dstTransferSize) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L3(CY_DMA_IS_XFER_SIZE_VALID(dstTransferSize)); + + descriptor->ctl = _CLR_SET_FLD32U(descriptor->ctl, CY_DMA_CTL_DST_SIZE, dstTransferSize); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetDstTransferSize +****************************************************************************//** +* +* Returns the Destination Transfer Size of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The Destination Transfer Size \ref cy_en_dma_transfer_size_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_dma_transfer_size_t Cy_DMA_Descriptor_GetDstTransferSize(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return((cy_en_dma_transfer_size_t) _FLD2VAL(CY_DMA_CTL_DST_SIZE, descriptor->ctl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetRetrigger +****************************************************************************//** +* +* Sets the retrigger value which specifies whether the controller should +* wait for the input trigger to be deactivated. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param retrigger +* A \ref cy_en_dma_retrigger_t parameter specifies whether the controller +* should wait for the input trigger to be deactivated. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetRetrigger(cy_stc_dma_descriptor_t * descriptor, cy_en_dma_retrigger_t retrigger) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L3(CY_DMA_IS_RETRIGGER_VALID(retrigger)); + + descriptor->ctl = _CLR_SET_FLD32U(descriptor->ctl, CY_DMA_CTL_RETRIG, retrigger); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetRetrigger +****************************************************************************//** +* +* Returns a value which specifies whether the controller should +* wait for the input trigger to be deactivated. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The Retrigger setting \ref cy_en_dma_retrigger_t. +* +*******************************************************************************/ +__STATIC_INLINE cy_en_dma_retrigger_t Cy_DMA_Descriptor_GetRetrigger(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return((cy_en_dma_retrigger_t) _FLD2VAL(CY_DMA_CTL_RETRIG, descriptor->ctl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetDescriptorType +****************************************************************************//** +* +* Sets the descriptor's type for the specified descriptor. +* During the descriptor's type changing the Next Descriptor parameter should be +* properly replaced by \ref Cy_DMA_Descriptor_GetNextDescriptor +* (before reconfiguration) and \ref Cy_DMA_Descriptor_SetNextDescriptor (before +* reconfiguration) API functions. +* +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param descriptorType +* A Descriptor Type \ref cy_en_dma_descriptor_type_t. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetDescriptorType(cy_stc_dma_descriptor_t * descriptor, cy_en_dma_descriptor_type_t descriptorType) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L3(CY_DMA_IS_TYPE_VALID(descriptorType)); + + descriptor->ctl = _CLR_SET_FLD32U(descriptor->ctl, CY_DMA_CTL_TYPE, descriptorType); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetDescriptorType +****************************************************************************//** +* +* Returns the descriptor's type of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The descriptor type \ref cy_en_dma_descriptor_type_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_dma_descriptor_type_t Cy_DMA_Descriptor_GetDescriptorType(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return((cy_en_dma_descriptor_type_t) _FLD2VAL(CY_DMA_CTL_TYPE, descriptor->ctl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetChannelState +****************************************************************************//** +* +* Sets the channel state on completion of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param channelState +* The Channel State \ref cy_en_dma_channel_state_t. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetChannelState(cy_stc_dma_descriptor_t * descriptor, cy_en_dma_channel_state_t channelState) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L3(CY_DMA_IS_CHANNEL_STATE_VALID(channelState)); + + descriptor->ctl = _CLR_SET_FLD32U(descriptor->ctl, CY_DMA_CTL_CH_DISABLE, channelState); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetChannelState +****************************************************************************//** +* +* Returns the channel state on completion of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The Channel State setting \ref cy_en_dma_channel_state_t +* +*******************************************************************************/ +__STATIC_INLINE cy_en_dma_channel_state_t Cy_DMA_Descriptor_GetChannelState(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return((cy_en_dma_channel_state_t) _FLD2VAL(CY_DMA_CTL_CH_DISABLE, descriptor->ctl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetXloopDataCount +****************************************************************************//** +* +* Sets the number of data elements to transfer in the X loop +* for the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param xCount +* A number of data elements to transfer in the X loop. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetXloopDataCount(cy_stc_dma_descriptor_t * descriptor, uint32_t xCount) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L2(CY_DMA_IS_COUNT_VALID(xCount)); + + descriptor->xCtl = _CLR_SET_FLD32U(descriptor->xCtl, CY_DMA_CTL_COUNT, xCount - 1UL); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetXloopDataCount +****************************************************************************//** +* +* Returns the number of data elements for the X loop of the specified +* descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The number of data elements to transfer in the X loop. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_DMA_Descriptor_GetXloopDataCount(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return (_FLD2VAL(CY_DMA_CTL_COUNT, descriptor->xCtl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetXloopSrcIncrement +****************************************************************************//** +* +* Sets the source increment parameter for the X loop of the specified +* descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param srcXincrement +* A value of source increment. Valid range is -2048 ... 2047. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetXloopSrcIncrement(cy_stc_dma_descriptor_t * descriptor, int32_t srcXincrement) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L2(CY_DMA_IS_INCR_VALID(srcXincrement)); + + descriptor->xCtl = _CLR_SET_FLD32U(descriptor->xCtl, CY_DMA_CTL_SRC_INCR, srcXincrement); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetXloopSrcIncrement +****************************************************************************//** +* +* Returns the source increment parameter for the X loop of the specified +* descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The value of source increment. +* +*******************************************************************************/ +__STATIC_INLINE int32_t Cy_DMA_Descriptor_GetXloopSrcIncrement(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return ((int32_t) _FLD2VAL(CY_DMA_CTL_SRC_INCR, descriptor->xCtl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetXloopDstIncrement +****************************************************************************//** +* +* Sets the destination increment parameter for the X loop for the specified +* descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param dstXincrement +* A value of destination increment. Valid range is -2048 ... 2047. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetXloopDstIncrement(cy_stc_dma_descriptor_t * descriptor, int32_t dstXincrement) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L2(CY_DMA_IS_INCR_VALID(dstXincrement)); + + descriptor->xCtl = _CLR_SET_FLD32U(descriptor->xCtl, CY_DMA_CTL_DST_INCR, dstXincrement); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetXloopDstIncrement +****************************************************************************//** +* +* Returns the destination increment parameter for the X loop of the specified +* descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The value of destination increment. +* +*******************************************************************************/ +__STATIC_INLINE int32_t Cy_DMA_Descriptor_GetXloopDstIncrement(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return ((int32_t) _FLD2VAL(CY_DMA_CTL_DST_INCR, descriptor->xCtl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetYloopDataCount +****************************************************************************//** +* +* Sets the number of data elements for the Y loop of the specified descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param yCount +* A number of X loops to execute in the Y loop. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetYloopDataCount(cy_stc_dma_descriptor_t * descriptor, uint32_t yCount) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L2(CY_DMA_IS_COUNT_VALID(yCount)); + + descriptor->yCtl = _CLR_SET_FLD32U(descriptor->yCtl, CY_DMA_CTL_COUNT, yCount - 1UL); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetYloopDataCount +****************************************************************************//** +* +* Returns the number of X loops to execute in the Y loop of the specified +* descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The number of X loops to execute in the Y loop. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_DMA_Descriptor_GetYloopDataCount(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return (_FLD2VAL(CY_DMA_CTL_COUNT, descriptor->yCtl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetYloopSrcIncrement +****************************************************************************//** +* +* Sets the source increment parameter for the Y loop for the specified +* descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param srcYincrement +* A value of source increment. Valid range is -2048 ... 2047. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetYloopSrcIncrement(cy_stc_dma_descriptor_t * descriptor, int32_t srcYincrement) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L2(CY_DMA_IS_INCR_VALID(srcYincrement)); + + descriptor->yCtl = _CLR_SET_FLD32U(descriptor->yCtl, CY_DMA_CTL_SRC_INCR, srcYincrement); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetYloopSrcIncrement +****************************************************************************//** +* +* Returns the source increment parameter for the outer Y of the specified +* descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The value of source increment. +* +*******************************************************************************/ +__STATIC_INLINE int32_t Cy_DMA_Descriptor_GetYloopSrcIncrement(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return ((int32_t) _FLD2VAL(CY_DMA_CTL_SRC_INCR, descriptor->yCtl)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_SetYloopDstIncrement +****************************************************************************//** +* +* Sets the destination increment parameter for the Y loop of the specified +* descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \param dstYincrement +* A value of destination increment. Valid range is -2048 ... 2047. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Descriptor_SetYloopDstIncrement(cy_stc_dma_descriptor_t * descriptor, int32_t dstYincrement) +{ + CY_ASSERT_L1(NULL != descriptor); + CY_ASSERT_L2(CY_DMA_IS_INCR_VALID(dstYincrement)); + + descriptor->yCtl = _CLR_SET_FLD32U(descriptor->yCtl, CY_DMA_CTL_DST_INCR, dstYincrement); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Descriptor_GetYloopDstIncrement +****************************************************************************//** +* +* Returns the destination increment parameter for the Y loop of the specified +* descriptor. +* +* \param descriptor +* A descriptor structure instance declared by user/component. +* +* \return +* The value of destination increment. +* +*******************************************************************************/ +__STATIC_INLINE int32_t Cy_DMA_Descriptor_GetYloopDstIncrement(cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(NULL != descriptor); + + return ((int32_t) _FLD2VAL(CY_DMA_CTL_DST_INCR, descriptor->yCtl)); +} + + +/** \} group_dma_descriptor_functions */ + + +/** +* \addtogroup group_dma_channel_functions +* \{ +*/ + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_SetDescriptor +****************************************************************************//** +* +* Sets a descriptor as current for specified DMA channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +* \param descriptor +* This is the descriptor which will be associated with the channel. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Channel_SetDescriptor(DW_Type * base, uint32_t channel, cy_stc_dma_descriptor_t const * descriptor) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + CY_ASSERT_L1(NULL != descriptor); + + base->CH_STRUCT[channel].CH_CURR_PTR = (uint32_t)descriptor; + base->CH_STRUCT[channel].CH_IDX &= (uint32_t) ~(DW_CH_STRUCT_CH_IDX_X_IDX_Msk | DW_CH_STRUCT_CH_IDX_Y_IDX_Msk); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_Enable +****************************************************************************//** +* +* The function is used to enable a DMA channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Channel_Enable(DW_Type * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + base->CH_STRUCT[channel].CH_CTL |= DW_CH_STRUCT_CH_CTL_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_Disable +****************************************************************************//** +* +* The function is used to disable a DMA channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Channel_Disable(DW_Type * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + base->CH_STRUCT[channel].CH_CTL &= (uint32_t) ~DW_CH_STRUCT_CH_CTL_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_SetPriority +****************************************************************************//** +* +* The function is used to set a priority for the DMA channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +* \param priority +* The priority to be set for the DMA channel. The allowed values are 0,1,2,3. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Channel_SetPriority(DW_Type * base, uint32_t channel, uint32_t priority) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + CY_ASSERT_L2(CY_DMA_IS_PRIORITY_VALID(priority)); + + base->CH_STRUCT[channel].CH_CTL = _CLR_SET_FLD32U(base->CH_STRUCT[channel].CH_CTL, DW_CH_STRUCT_CH_CTL_PRIO, priority); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_GetPriority +****************************************************************************//** +* +* Returns the priority of DMA channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +* \return +* The priority of the channel. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_DMA_Channel_GetPriority(DW_Type const * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + return ((uint32_t) _FLD2VAL(DW_CH_STRUCT_CH_CTL_PRIO, base->CH_STRUCT[channel].CH_CTL)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_GetCurrentDescriptor +****************************************************************************//** +* +* Returns the descriptor that is active in the channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +* \return +* The pointer to the descriptor that assocaited with the channel. +* +*******************************************************************************/ +__STATIC_INLINE cy_stc_dma_descriptor_t * Cy_DMA_Channel_GetCurrentDescriptor(DW_Type const * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + return ((cy_stc_dma_descriptor_t*)(base->CH_STRUCT[channel].CH_CURR_PTR)); +} + + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_GetInterruptStatus +****************************************************************************//** +* +* Returns the interrupt status of the specified channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +* \return +* The status of an interrupt for specified channel. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_DMA_Channel_GetInterruptStatus(DW_Type const * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + return (base->CH_STRUCT[channel].INTR); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_GetStatus +****************************************************************************//** +* +* Returns the interrupt reason of the specified channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +* \return +* A cause \ref cy_en_dma_intr_cause_t of an interrupt. +* +*******************************************************************************/ +__STATIC_INLINE cy_en_dma_intr_cause_t Cy_DMA_Channel_GetStatus(DW_Type const * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + return ((cy_en_dma_intr_cause_t) _FLD2VAL(DW_CH_STRUCT_CH_STATUS_INTR_CAUSE, base->CH_STRUCT[channel].CH_STATUS)); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_ClearInterrupt +****************************************************************************//** +* +* Clears the interrupt status of the specified channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Channel_ClearInterrupt(DW_Type * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + base->CH_STRUCT[channel].INTR = CY_DMA_INTR_MASK; + (void) base->CH_STRUCT[channel].INTR; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_SetInterrupt +****************************************************************************//** +* +* Sets the interrupt for the specified channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Channel_SetInterrupt(DW_Type * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + base->CH_STRUCT[channel].INTR_SET = CY_DMA_INTR_MASK; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_GetInterruptMask +****************************************************************************//** +* +* Returns interrupt mask value of the specified channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +* \return +* The interrupt mask value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_DMA_Channel_GetInterruptMask(DW_Type const * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + return (base->CH_STRUCT[channel].INTR_MASK); +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_SetInterruptMask +****************************************************************************//** +* +* Sets interrupt mask value for the specified channel. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +* \param interrupt +* An interrupt mask: +* CY_DMA_INTR_MASK to enable interrupt or 0UL to disable interrupt. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_DMA_Channel_SetInterruptMask(DW_Type * base, uint32_t channel, uint32_t interrupt) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + CY_ASSERT_L2(CY_DMA_IS_INTR_MASK_VALID(interrupt)); + base->CH_STRUCT[channel].INTR_MASK = interrupt; +} + + +/******************************************************************************* +* Function Name: Cy_DMA_Channel_GetInterruptStatusMasked +****************************************************************************//** +* +* Returns logical AND of corresponding INTR and INTR_MASK fields +* in a single load operation. +* +* \param base +* A pointer to the hardware DMA block. +* +* \param channel +* A channel number. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_DMA_Channel_GetInterruptStatusMasked(DW_Type const * base, uint32_t channel) +{ + CY_ASSERT_L1(CY_DMA_IS_DW_CH_NR_VALID(base, channel)); + + return (base->CH_STRUCT[channel].INTR_MASKED); +} + +/** \} group_dma_channel_functions */ + +/** \} group_dma_functions */ + + +/** \cond Definitions to support backward compatibility, they are strongly not recommended to use in new designs */ + +#if(CY_DMA_BWC) + + /* typedefs */ + #define cy_stc_dma_chnl_config_t cy_stc_dma_channel_config_t + #define cy_stc_dma_descr_t cy_stc_dma_descriptor_t + #define cy_stc_dma_descr_config_t cy_stc_dma_descriptor_config_t + #define cy_en_dma_trig_type_t cy_en_dma_trigger_type_t + + /* structure items */ + #define DMA_Descriptor descriptor + #define deact retrigger + #define intrType interruptType + #define chStateAtCmplt channelState + #define srcTxfrSize srcTransferSize + #define destTxfrSize dstTransferSize + #define trigoutType triggerOutType + #define triginType triggerInType + #define descrType descriptorType + #define srcAddr srcAddress + #define destAddr dstAddress + #define srcXincr srcXincrement + #define srcYincr srcYincrement + #define destXincr dstXincrement + #define destYincr dstYincrement + #define descrNext nextDescriptor + + /* constants */ + #define CY_DMA_CH_DISABLED (CY_DMA_CHANNEL_DISABLED) + #define CY_DMA_CH_ENABLED (CY_DMA_CHANNEL_ENABLED) + + #define CY_DMA_TXFR_SIZE_DATA_SIZE (CY_DMA_TRANSFER_SIZE_DATA) + #define CY_DMA_TXFR_SIZE_WORD (CY_DMA_TRANSFER_SIZE_WORD) + + #define CY_DMA_INTR_1ELEMENT_CMPLT (CY_DMA_1ELEMENT) + #define CY_DMA_INTR_X_LOOP_CMPLT (CY_DMA_X_LOOP) + #define CY_DMA_INTR_DESCR_CMPLT (CY_DMA_DESCR) + #define CY_DMA_INTR_DESCRCHAIN_CMPLT (CY_DMA_DESCR_CHAIN) + + #define CY_DMA_TRIGOUT_1ELEMENT_CMPLT (CY_DMA_1ELEMENT) + #define CY_DMA_TRIGOUT_X_LOOP_CMPLT (CY_DMA_X_LOOP) + #define CY_DMA_TRIGOUT_DESCR_CMPLT (CY_DMA_DESCR) + #define CY_DMA_TRIGOUT_DESCRCHAIN_CMPLT (CY_DMA_DESCR_CHAIN) + + #define CY_DMA_TRIGIN_1ELEMENT (CY_DMA_1ELEMENT) + #define CY_DMA_TRIGIN_XLOOP (CY_DMA_X_LOOP) + #define CY_DMA_TRIGIN_DESCR (CY_DMA_DESCR) + #define CY_DMA_TRIGIN_DESCRCHAIN (CY_DMA_DESCR_CHAIN) + + #define CY_DMA_INVALID_INPUT_PARAMETERS (CY_DMA_BAD_PARAM) + + /* descr struct items */ + #define DESCR_CTL ctl + #define DESCR_SRC src + #define DESCR_DST dst + #define DESCR_X_CTL xCtl + #define DESCR_Y_CTL yCtl + #define DESCR_NEXT_PTR nextPtr + + /* descr struct bitfields */ + #define DW_DESCR_STRUCT_DESCR_CTL_WAIT_FOR_DEACT_Pos 0UL + #define DW_DESCR_STRUCT_DESCR_CTL_WAIT_FOR_DEACT_Msk 0x3UL + #define DW_DESCR_STRUCT_DESCR_CTL_INTR_TYPE_Pos 2UL + #define DW_DESCR_STRUCT_DESCR_CTL_INTR_TYPE_Msk 0xCUL + #define DW_DESCR_STRUCT_DESCR_CTL_TR_OUT_TYPE_Pos 4UL + #define DW_DESCR_STRUCT_DESCR_CTL_TR_OUT_TYPE_Msk 0x30UL + #define DW_DESCR_STRUCT_DESCR_CTL_TR_IN_TYPE_Pos 6UL + #define DW_DESCR_STRUCT_DESCR_CTL_TR_IN_TYPE_Msk 0xC0UL + #define DW_DESCR_STRUCT_DESCR_CTL_CH_DISABLE_Pos 24UL + #define DW_DESCR_STRUCT_DESCR_CTL_CH_DISABLE_Msk 0x1000000UL + #define DW_DESCR_STRUCT_DESCR_CTL_SRC_TRANSFER_SIZE_Pos 26UL + #define DW_DESCR_STRUCT_DESCR_CTL_SRC_TRANSFER_SIZE_Msk 0x4000000UL + #define DW_DESCR_STRUCT_DESCR_CTL_DST_TRANSFER_SIZE_Pos 27UL + #define DW_DESCR_STRUCT_DESCR_CTL_DST_TRANSFER_SIZE_Msk 0x8000000UL + #define DW_DESCR_STRUCT_DESCR_CTL_DATA_SIZE_Pos 28UL + #define DW_DESCR_STRUCT_DESCR_CTL_DATA_SIZE_Msk 0x30000000UL + #define DW_DESCR_STRUCT_DESCR_CTL_DESCR_TYPE_Pos 30UL + #define DW_DESCR_STRUCT_DESCR_CTL_DESCR_TYPE_Msk 0xC0000000UL + #define DW_DESCR_STRUCT_DESCR_SRC_SRC_ADDR_Pos 0UL + #define DW_DESCR_STRUCT_DESCR_SRC_SRC_ADDR_Msk 0xFFFFFFFFUL + #define DW_DESCR_STRUCT_DESCR_DST_DST_ADDR_Pos 0UL + #define DW_DESCR_STRUCT_DESCR_DST_DST_ADDR_Msk 0xFFFFFFFFUL + #define DW_DESCR_STRUCT_DESCR_X_CTL_SRC_X_INCR_Pos 0UL + #define DW_DESCR_STRUCT_DESCR_X_CTL_SRC_X_INCR_Msk 0xFFFUL + #define DW_DESCR_STRUCT_DESCR_X_CTL_DST_X_INCR_Pos 12UL + #define DW_DESCR_STRUCT_DESCR_X_CTL_DST_X_INCR_Msk 0xFFF000UL + #define DW_DESCR_STRUCT_DESCR_X_CTL_X_COUNT_Pos 24UL + #define DW_DESCR_STRUCT_DESCR_X_CTL_X_COUNT_Msk 0xFF000000UL + #define DW_DESCR_STRUCT_DESCR_Y_CTL_SRC_Y_INCR_Pos 0UL + #define DW_DESCR_STRUCT_DESCR_Y_CTL_SRC_Y_INCR_Msk 0xFFFUL + #define DW_DESCR_STRUCT_DESCR_Y_CTL_DST_Y_INCR_Pos 12UL + #define DW_DESCR_STRUCT_DESCR_Y_CTL_DST_Y_INCR_Msk 0xFFF000UL + #define DW_DESCR_STRUCT_DESCR_Y_CTL_Y_COUNT_Pos 24UL + #define DW_DESCR_STRUCT_DESCR_Y_CTL_Y_COUNT_Msk 0xFF000000UL + #define DW_DESCR_STRUCT_DESCR_NEXT_PTR_ADDR_Pos 2UL + #define DW_DESCR_STRUCT_DESCR_NEXT_PTR_ADDR_Msk 0xFFFFFFFCUL + + /* functions */ + #define Cy_DMA_GetActiveChnl Cy_DMA_GetActiveChannel + #define Cy_DMA_GetActiveSrcAddr Cy_DMA_GetActiveSrcAddress + #define Cy_DMA_GetActiveDstAddr Cy_DMA_GetActiveDstAddress + #define Cy_DMA_Descr_Init Cy_DMA_Descriptor_Init + #define Cy_DMA_Descr_DeInit Cy_DMA_Descriptor_DeInit + #define Cy_DMA_Descr_SetSrcAddr Cy_DMA_Descriptor_SetSrcAddress + #define Cy_DMA_Descr_SetDestAddr Cy_DMA_Descriptor_SetDstAddress + #define Cy_DMA_Descr_SetNxtDescr Cy_DMA_Descriptor_SetNextDescriptor + #define Cy_DMA_Descr_SetIntrType Cy_DMA_Descriptor_SetInterruptType + #define Cy_DMA_Descr_SetTrigInType Cy_DMA_Descriptor_SetTriggerInType + #define Cy_DMA_Descr_SetTrigOutType Cy_DMA_Descriptor_SetTriggerOutType + #define Cy_DMA_Chnl_Init Cy_DMA_Channel_Init + #define Cy_DMA_Chnl_DeInit Cy_DMA_Channel_DeInit + #define Cy_DMA_Chnl_SetDescr Cy_DMA_Channel_SetDescriptor + #define Cy_DMA_Chnl_Enable Cy_DMA_Channel_Enable + #define Cy_DMA_Chnl_Disable Cy_DMA_Channel_Disable + #define Cy_DMA_Chnl_GetCurrentDescr Cy_DMA_Channel_GetCurrentDescriptor + #define Cy_DMA_Chnl_SetPriority Cy_DMA_Channel_SetPriority + #define Cy_DMA_Chnl_GetPriority Cy_DMA_Channel_GetPriority + #define Cy_DMA_Chnl_GetInterruptStatus Cy_DMA_Channel_GetInterruptStatus + #define Cy_DMA_Chnl_GetInterruptCause Cy_DMA_Channel_GetStatus + #define Cy_DMA_Chnl_ClearInterrupt Cy_DMA_Channel_ClearInterrupt + #define Cy_DMA_Chnl_SetInterrupt Cy_DMA_Channel_SetInterrupt + #define Cy_DMA_Chnl_GetInterruptMask Cy_DMA_Channel_GetInterruptMask + #define Cy_DMA_Chnl_GetInterruptStatusMasked Cy_DMA_Channel_GetInterruptStatusMasked + #define Cy_DMA_Chnl_SetInterruptMask(base, channel) (Cy_DMA_Channel_SetInterruptMask(base, channel, CY_DMA_INTR_MASK)) + + +/******************************************************************************* +* Function Name: Cy_DMA_Descr_SetTxfrWidth +****************************************************************************//** +* This is a legacy API function, it is left here just for backward compatibility +* It is strongly not recommended to use in new designs. +*******************************************************************************/ + __STATIC_INLINE void Cy_DMA_Descr_SetTxfrWidth(cy_stc_dma_descr_t * descriptor, + uint32_t dataElementSize, + uint32_t srcTxfrWidth, + uint32_t dstTxfrWidth) + { + uint32_t regValue; + regValue = descriptor->ctl & ((uint32_t)(~(DW_DESCR_STRUCT_DESCR_CTL_DATA_SIZE_Msk | + DW_DESCR_STRUCT_DESCR_CTL_SRC_TRANSFER_SIZE_Msk | + DW_DESCR_STRUCT_DESCR_CTL_DST_TRANSFER_SIZE_Msk))); + + descriptor->ctl = regValue | + _VAL2FLD(DW_DESCR_STRUCT_DESCR_CTL_DATA_SIZE, dataElementSize) | + _VAL2FLD(DW_DESCR_STRUCT_DESCR_CTL_SRC_TRANSFER_SIZE, srcTxfrWidth) | + _VAL2FLD(DW_DESCR_STRUCT_DESCR_CTL_DST_TRANSFER_SIZE, dstTxfrWidth); + } + +#endif /* CY_DMA_BWC */ + +/** \endcond */ + + +#if defined(__cplusplus) +} +#endif + +#endif /* (CY_DMA_H) */ + +/** \} group_dma */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/flash/cy_flash.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/flash/cy_flash.c new file mode 100644 index 0000000000..3dc80147a8 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/flash/cy_flash.c @@ -0,0 +1,886 @@ +/***************************************************************************//** +* \file cy_flash.c +* \version 2.0 +* +* \brief +* Provides the public functions for the API for the PSoC 6 Flash Driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_flash.h" + + +/** \cond INTERNAL */ +/** Slow control register */ +#define CY_FLASH_TST_DDFT_SLOW_CTL_REG (*(reg32 *) 0x40260108U) +/** Slow control register */ +#define CY_FLASH_TST_DDFT_FAST_CTL_REG (*(reg32 *) 0x40260104U) +/** Slow output register */ +#define CY_FLASH_CLK_OUTPUT_SLOW_REG (*(reg32 *) 0x40260518U) +/** Slow clock calibration register */ +#define CY_FLASH_CLK_CAL_CNT1_REG (*(reg32 *) 0x4026051CU) +/** Define to set the IMO to perform a delay after the flash operation started */ +#define CY_FLASH_TST_DDFT_SLOW_CTL_MASK (0x40001F1EU) +/** Slow output register */ +#define CY_FLASH_CLK_OUTPUT_SLOW_MASK (0x06U) +/** Define to indicate that clock is finished counting */ +#define CY_FLASH_CLK_CAL_CNT1_DONE ((uint32_t) ((uint32_t) 1U << CY_FLASH_CLK_CAL_CNT1_DONE_POS)) +/** Define to indicate that clock is finished counting */ +#define CY_FLASH_CLK_CAL_CNT1_DONE_POS (31U) +/* Calculates the time in microseconds to wait for the number of the CM0P ticks */ +#define CY_FLASH_DEL_CORRECTIVE(ticks) ((((uint32)Cy_SysClk_ClkPeriGetDivider() + 1UL) * (Cy_SysClk_ClkSlowGetDivider() + 1UL) * (ticks) * 1000UL)\ + / ((uint32_t)cy_Hfclk0FreqHz / 1000UL)) +/* Number of the CM0P ticks for StartWrite function delay corrective time */ +#define CY_FLASH_START_WRITE_DEL_TICKS (19000UL) +/* Number of the CM0P ticks for StartProgram function delay corrective time */ +#define CY_FLASH_START_PROGRAM_DEL_TICKS (5250UL) +/* Number of the CM0P ticks for StartErase function delay corrective time */ +#define CY_FLASH_START_ERASE_DEL_TICKS (8500UL) +/* Delay time for StartWrite function in us */ +#define CY_FLASH_START_WRITE_DEL_TIME (9800UL) +/* Delay time for StartProgram function in us */ +#define CY_FLASH_START_PROGRAM_DEL_TIME (120UL) +/* Delay time for StartErase function in us */ +#define CY_FLASH_START_ERASE_DEL_TIME (1000UL) +/** Delay time for Start Write function in us with corrective time */ +#define CY_FLASH_START_WRITE_DELAY (uint32_t)(CY_FLASH_START_WRITE_DEL_TIME +\ + CY_FLASH_DEL_CORRECTIVE(CY_FLASH_START_WRITE_DEL_TICKS)) +/** Delay time for Start Program function in us with corrective time */ +#define CY_FLASH_START_PROGRAM_DELAY (uint32_t)(CY_FLASH_START_PROGRAM_DEL_TIME +\ + CY_FLASH_DEL_CORRECTIVE(CY_FLASH_START_PROGRAM_DEL_TICKS)) +/** Delay time fot Start Erase function in uS with corrective time */ +#define CY_FLASH_START_ERASE_DELAY (uint32_t)(CY_FLASH_START_ERASE_DEL_TIME +\ + CY_FLASH_DEL_CORRECTIVE(CY_FLASH_START_ERASE_DEL_TICKS)) +/** Number of ticks to wait 1 uS */ +#define CY_FLASH_TICKS_FOR_1US (8U) +/** Disable delay */ +#define CY_FLASH_NO_DELAY (0U) +/** Slow control register */ +#define CY_FLASH_TST_DDFT_FAST_CTL_MASK (62U) +/** Command completed with no errors */ +#define CY_FLASH_ROMCODE_SUCCESS (0xA0000000UL) +/** Invalid device protection state */ +#define CY_FLASH_ROMCODE_INVALID_PROTECTION (0xF0000001UL) +/** Invalid flash page latch address */ +#define CY_FLASH_ROMCODE_INVALID_FM_PL (0xF0000003UL) +/** Invalid flash address */ +#define CY_FLASH_ROMCODE_INVALID_FLASH_ADDR (0xF0000004UL) +/** Row is write protected */ +#define CY_FLASH_ROMCODE_ROW_PROTECTED (0xF0000005UL) +/** Comparison between Page Latches and FM row failed */ +#define CY_FLASH_ROMCODE_PL_ROW_COMP_FA (0xF0000022UL) +/** Command in progress; no error */ +#define CY_FLASH_ROMCODE_IN_PROGRESS_NO_ERROR (0xA0000009UL) +/** Flash operation is successfully initiated */ +#define CY_FLASH_IS_OPERATION_STARTED (0x00000010UL) +/** Flash is under operation */ +#define CY_FLASH_IS_BUSY (0x00000040UL) +/** IPC structure is already locked by another process */ +#define CY_FLASH_IS_IPC_BUSY (0x00000080UL) +/** Input parameters passed to Flash API are not valid */ +#define CY_FLASH_IS_INVALID_INPUT_PARAMETERS (0x00000100UL) +/** Result mask */ +#define CY_FLASH_RESULT_MASK (0xFFFFFFFUL) +/** Error shift */ +#define CY_FLASH_ERROR_SHIFT (28UL) +/** No error */ +#define CY_FLASH_ERROR_NO_ERROR (0xAUL) +/** CM4 Flash Proxy address */ +#define CY_FLASH_CM4_FLASH_PROXY_ADDR (0x00007001UL) + +#if (CY_CPU_CORTEX_M0P) +#define IS_CY_PIPE_FREE(...) (!Cy_IPC_Drv_IsLockAcquired(Cy_IPC_Drv_GetIpcBaseAddress(CY_IPC_INTR_CYPIPE_EP1))) +#define NOTIFY_PEER_CORE(a) Cy_IPC_Pipe_SendMessage(CY_IPC_EP_CYPIPE_CM4_ADDR, CY_IPC_EP_CYPIPE_CM0_ADDR, a, NULL) +#else +#define IS_CY_PIPE_FREE(...) (!Cy_IPC_Drv_IsLockAcquired(Cy_IPC_Drv_GetIpcBaseAddress(CY_IPC_INTR_CYPIPE_EP0))) +#define NOTIFY_PEER_CORE(a) Cy_IPC_Pipe_SendMessage(CY_IPC_EP_CYPIPE_CM0_ADDR, CY_IPC_EP_CYPIPE_CM4_ADDR, a, NULL) +#endif +/** \endcond */ + +/* Static functions */ +static bool Cy_Flash_BoundsCheck(uint32_t flashAddr); +static uint32_t Cy_Flash_PrepareContext(uint32_t rowAddr, const uint32_t *data, uint32_t blocking); +static cy_en_flashdrv_status_t Cy_Flash_ProcessOpcode(uint32_t opcode); +static cy_en_flashdrv_status_t Cy_Flash_OperationStatus(void); +static cy_en_flashdrv_status_t Cy_Flash_SendCmd(uint32_t mode, uint32_t microseconds); +static void Cy_Flash_RAMDelay(uint32_t microseconds); +static cy_stc_flash_context_t context; + +/** \cond INTERNAL */ +CY_ALIGN(4) static IPC_MSG ipcWaitMessage = +{ + /* .clientID */ CY_FLASH_IPC_CLIENT_ID, + /* .pktType */ CY_FLASH_ENTER_WAIT_LOOP, + /* .intrRelMask */ 0 +}; +/** \endcond */ + +/******************************************************************************* +* Function Name: Cy_Flash_SendCmd +****************************************************************************//** +* +* Sends a command to the SROM via the IPC channel. The function is placed to the +* SRAM memory to guarantee successful operation. After an IPC message is sent, +* the function waits for a defined time before exiting the function. +* +* \param mode Sets the blocking or non-blocking Flash operation. +* +* \param microseconds The number of microseconds to wait before exiting the functions. +* +* \return Returns the status of the Flash operation, +* see \ref cy_en_flashdrv_status_t. +* +*******************************************************************************/ +#if defined (__ICCARM__) + __ramfunc +#else + CY_SECTION(".cy_ramfunc") +#endif +static cy_en_flashdrv_status_t Cy_Flash_SendCmd(uint32_t mode, uint32_t microseconds) +{ + uint32_t intr; + cy_en_flashdrv_status_t result = CY_FLASH_DRV_IPC_BUSY; + + if (IS_CY_PIPE_FREE()) + { + if (CY_IPC_SEMA_STATUS_LOCKED != Cy_IPC_Sema_Status(CY_FLASH_WAIT_SEMA)) + { + if (CY_IPC_PIPE_SUCCESS == NOTIFY_PEER_CORE(&ipcWaitMessage)) + { + /* Wait for SEMA lock by peer core */ + while(CY_IPC_SEMA_STATUS_LOCKED != Cy_IPC_Sema_Status(CY_FLASH_WAIT_SEMA)) + { + } + + intr = Cy_SysLib_EnterCriticalSection(); + + /* Tries to acquire the IPC structure and pass the arguments to SROM API */ + if (Cy_IPC_Drv_SendMsgPtr(CY_FLASH_IPC_STRUCT, CY_FLASH_IPC_NOTIFY_STRUCT0, (void*)&context) == CY_IPC_DRV_SUCCESS) + { + if (mode == CY_FLASH_NON_BLOCKING_MODE) + { + Cy_Flash_RAMDelay(microseconds); + + /* The Flash operation is successfully initiated */ + result = CY_FLASH_DRV_OPERATION_STARTED; + } + else + { + /* Polls whether the IPC is released and the Flash operation is performed */ + do + { + result = Cy_Flash_IsWriteComplete(); + } + while (result == CY_FLASH_DRV_OPCODE_BUSY); + } + } + else + { + /* The IPC structure is already locked by another process */ + result = CY_FLASH_DRV_IPC_BUSY; + } + + while ( CY_IPC_SEMA_SUCCESS != Cy_IPC_Sema_Clear(CY_FLASH_WAIT_SEMA, false)) + { + } + + Cy_SysLib_ExitCriticalSection(intr); + } + } + } + + return (result); +} + +/******************************************************************************* +* Function Name: Cy_Flash_EraseRow +****************************************************************************//** +* +* This function erases a single row of flash. Reports success or +* a reason for failure. Does not return until the Write operation is +* complete. Returns immediately and reports a \ref CY_FLASH_DRV_IPC_BUSY error in +* the case when another process is writing to flash or erasing the row. +* User firmware should not enter the hibernate mode until flash erase is +* complete. The Flash operation is allowed in Sleep and Deep-sleep modes. +* During the Flash operation, the device should not be reset, including the +* XRES pin, a software reset, and watchdog reset sources. Also, low-voltage +* detect circuits should be configured to generate an interrupt instead of a +* reset. Otherwise, portions of flash may undergo unexpected changes. +* +* \param rowAddr Address of the flash row number. The number of the flash rows +* is defined by the \ref CY_FLASH_NUMBER_ROWS macro for the selected device. +* The Read-while-Write violation occurs when the flash read operation is +* initiated in the same flash sector where the flash write operation is +* performing. Refer to the device datasheet for the details. +* Address must match row start address. +* +* \return Returns the status of the Flash operation, +* see \ref cy_en_flashdrv_status_t. +* +* \sideeffect If this function is called by the CM4 the user code on CM0P and +* the user code on CM4 are blocked until erase flash row operation is finished. +* If this function is called by the CM0P the user code on CM4 is not blocked and +* the user code on CM0P is blocked until erase flash row operation is finished. +* Plan your task allocation accordingly. +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_EraseRow(uint32_t rowAddr) +{ + cy_en_flashdrv_status_t result; + + /* Prepares arguments to be passed to SROM API */ + if (Cy_Flash_BoundsCheck(rowAddr) != false) + { + context.opcode = CY_FLASH_OPCODE_ERASE_ROW | CY_FLASH_BLOCKING_MODE; + context.arg1 = rowAddr; + context.arg2 = 0UL; + context.arg3 = 0UL; + +#if (CY_CPU_CORTEX_M0P) + result = Cy_Flash_SendCmd(CY_FLASH_BLOCKING_MODE, CY_FLASH_NO_DELAY); +#else + Cy_Flash_Proxy Cy_Flash_Cm4Proxy; + Cy_Flash_Cm4Proxy = (Cy_Flash_Proxy)CY_FLASH_CM4_FLASH_PROXY_ADDR; + result = Cy_Flash_Cm4Proxy(&context); + result = Cy_Flash_ProcessOpcode((uint32_t)result); + +#endif /* (CY_CPU_CORTEX_M0P) */ + } + else + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_WriteRow +****************************************************************************//** +* +* This function writes an array of data to a single row of flash. +* Reports success or a reason for failure. Does not return until the Write +* operation is complete. +* Returns immediately and reports a \ref CY_FLASH_DRV_IPC_BUSY error in the case +* when another process is writing to flash. User firmware should not enter the +* hibernate mode until flash Write is complete. The Flash operation is allowed +* in Sleep and Deep-sleep modes. During the Flash operation, the device should +* not be reset, including the XRES pin, a software reset, and watchdog reset +* sources. Also, low-voltage detect circuits should be configured to generate +* an interrupt instead of a reset. Otherwise, portions of flash may undergo +* unexpected changes. +* +* \param rowAddr Address of the flash row number. The number of the flash rows +* is defined by the \ref CY_FLASH_NUMBER_ROWS macro for the selected device. +* The Read-while-Write violation occurs when the flash read operation is +* initiated in the same flash sector where the flash write operation is +* performing. Refer to the device datasheet for the details. +* Address must match row start address. +* +* \param data The pointer to the data which has to be written to flash. The size +* of the data array must be equal to the flash row size. The flash row size for +* the selected device is defined by the \ref CY_FLASH_SIZEOF_ROW macro. Refer to +* the device datasheet for the details. +* +* \return Returns the status of the Flash operation, +* see \ref cy_en_flashdrv_status_t. +* +* \sideeffect If this function is called by the CM4 the user code on CM0P and +* the user code on CM4 are blocked until erase flash row operation is finished. +* If this function is called by the CM0P the user code on CM4 is not blocked and +* the user code on CM0P is blocked until erase flash row operation is finished. +* Plan your task allocation accordingly. +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_WriteRow(uint32_t rowAddr, const uint32_t* data) +{ + cy_en_flashdrv_status_t result; + +#if (CY_CPU_CORTEX_M0P) + /* Checks whether the input parameters are valid */ + if (Cy_Flash_PrepareContext(rowAddr, data, CY_FLASH_BLOCKING_MODE) != (uint32_t)CY_FLASH_DRV_INVALID_INPUT_PARAMETERS) + { + result = Cy_Flash_SendCmd(CY_FLASH_BLOCKING_MODE, CY_FLASH_NO_DELAY); + } + else + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + +#else + if (Cy_Flash_PrepareContext(rowAddr, data, CY_FLASH_BLOCKING_MODE) != (uint32_t)CY_FLASH_DRV_INVALID_INPUT_PARAMETERS) + { + Cy_Flash_Proxy Cy_Flash_Cm4Proxy; + Cy_Flash_Cm4Proxy = (Cy_Flash_Proxy)CY_FLASH_CM4_FLASH_PROXY_ADDR; + result = Cy_Flash_Cm4Proxy(&context); + result = Cy_Flash_ProcessOpcode((uint32_t)result); + } + else + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } +#endif /* (CY_CPU_CORTEX_M0P) */ + + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_StartWrite +****************************************************************************//** +* +* Starts writing an array of data to a single row of flash. Returns immediately +* and reports a successful start or reason for failure. Returns immediately and +* reports a \ref CY_FLASH_DRV_IPC_BUSY error in the case when another process is writing +* to flash. User firmware should not enter the hibernate mode until flash Write +* is complete. The Flash operation is allowed in Sleep and Deep-sleep modes. +* During the flash operation, the device should not be reset, including the +* XRES pin, a software reset, and watchdog reset sources. Also, the low-voltage +* detect circuits should be configured to generate an interrupt instead of a reset. +* Otherwise, portions of flash may undergo unexpected changes. +* \note Before reading data from previously programmed/erased flash rows, the +* user must clear the flash cache with the Cy_SysLib_ClearFlashCacheAndBuffer() +* function. +* +* \param rowAddr Address of the flash row number. The number of the flash rows +* is defined by the \ref CY_FLASH_NUMBER_ROWS macro for the selected device. +* The Read-while-Write violation occurs when the flash read operation is +* initiated in the same flash sector where the flash write operation is +* performing. Refer to the device datasheet for the details. +* Address must match row start address. +* +* \param data The pointer to the data to be written to flash. The size +* of the data array must be equal to the flash row size. The flash row size for +* the selected device is defined by the \ref CY_FLASH_SIZEOF_ROW macro. Refer to +* the device datasheet for the details. +* +* \return Returns the status of the Flash operation, +* see \ref cy_en_flashdrv_status_t. +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_StartWrite(uint32_t rowAddr, const uint32_t* data) +{ + cy_en_flashdrv_status_t result; + + /* Checks whether the input parameters are valid */ + if (Cy_Flash_PrepareContext(rowAddr, data, CY_FLASH_NON_BLOCKING_MODE) != (uint32_t)CY_FLASH_DRV_INVALID_INPUT_PARAMETERS) + { + result = Cy_Flash_SendCmd(CY_FLASH_NON_BLOCKING_MODE, CY_FLASH_START_WRITE_DELAY); + } + else + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_IsWriteComplete +****************************************************************************//** +* +* Reports a successful Write, reason of failure or busy status +* ( \ref CY_FLASH_DRV_OPCODE_BUSY ). +* +* \return Returns the status of the Flash operation (see \ref cy_en_flashdrv_status_t). +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_IsWriteComplete(void) +{ + return (Cy_Flash_OperationStatus()); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_StartErase +****************************************************************************//** +* +* Starts erasing a single row of flash. Returns immediately +* and reports a successful start or reason for failure. Returns immediately and +* reports a \ref CY_FLASH_DRV_IPC_BUSY error in the case when IPC structure is locked +* by another process. User firmware should not enter the hibernate mode until +* flash Erase is complete. The Flash operation is allowed in Sleep and Deep-sleep modes. +* During the flash operation, the device should not be reset, including the +* XRES pin, a software reset, and watchdog reset sources. Also, the low-voltage +* detect circuits should be configured to generate an interrupt instead of a reset. +* Otherwise, portions of flash may undergo unexpected changes. +* \note Before reading data from previously programmed/erased flash rows, the +* user must clear the flash cache with the Cy_SysLib_ClearFlashCacheAndBuffer() +* function. +* +* \param rowAddr Address of the flash row number. The number of the flash rows +* is defined by the \ref CY_FLASH_NUMBER_ROWS macro for the selected device. +* The Read-while-Write violation occurs when the flash read operation is +* initiated in the same flash sector where the flash erase operation is +* performing. Refer to the device datasheet for the details. +* Address must match row start address. +* +* \return Returns the status of the Flash operation, +* see \ref cy_en_flashdrv_status_t. +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_StartErase(uint32_t rowAddr) +{ + cy_en_flashdrv_status_t retVal; + + /* Prepares arguments to be passed to SROM API */ + if (Cy_Flash_BoundsCheck(rowAddr) != false) + { + context.opcode = CY_FLASH_OPCODE_ERASE_ROW; + context.arg1 = rowAddr; + context.arg2 = 0UL; + context.arg3 = 0UL; + retVal = Cy_Flash_SendCmd(CY_FLASH_NON_BLOCKING_MODE, CY_FLASH_START_ERASE_DELAY); + } + else + { + retVal = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + + return (retVal); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_IsEraseComplete +****************************************************************************//** +* +* Reports a successful Erase, reason of failure or busy status +* ( \ref CY_FLASH_DRV_OPCODE_BUSY ). +* +* \return Returns the status of the Flash operation (see \ref cy_en_flashdrv_status_t). +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_IsEraseComplete(void) +{ + return (Cy_Flash_OperationStatus()); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_StartProgram +****************************************************************************//** +* Starts writing an array of data to a single row of flash. Returns immediately +* and reports a successful start or reason for failure. Returns immediately and +* reports a \ref CY_FLASH_DRV_IPC_BUSY error if another process is writing +* to flash. The user firmware should not enter Hibernate mode until flash Write +* is complete. The Flash operation is allowed in Sleep and Deep-Sleep modes. +* During the Flash operation, the device should not be reset, including the +* XRES pin, a software reset, and watchdog reset sources. Also, the low-voltage +* detect circuits should be configured to generate an interrupt instead of a reset. +* Otherwise, portions of flash may undergo unexpected changes.\n +* Before calling this function, the target flash region must be erased by +* the StartErase/EraseRow function.\n +* Data to be programmed must be located in the SRAM memory region. +* \note Before reading data from previously programmed/erased flash rows, the +* user must clear the flash cache with the Cy_SysLib_ClearFlashCacheAndBuffer() +* function. +* +* \param rowAddr The address of the flash row number. The number of the flash rows +* is defined by the \ref CY_FLASH_NUMBER_ROWS macro for the selected device. +* The Read-while-Write violation occurs when the Flash Write operation is +* performing. Refer to the device datasheet for the details. +* The address must match the row start address. +* +* \param data The pointer to the data to be written to flash. The size +* of the data array must be equal to the flash row size. The flash row size for +* the selected device is defined by the \ref CY_FLASH_SIZEOF_ROW macro. Refer to +* the device datasheet for the details. +* +* \return Returns the status of the Flash operation, +* see \ref cy_en_flashdrv_status_t. +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_StartProgram(uint32_t rowAddr, const uint32_t* data) +{ + cy_en_flashdrv_status_t result; + + /* Prepares arguments to be passed to SROM API */ + if (Cy_Flash_BoundsCheck(rowAddr) != false) + { + context.opcode = CY_FLASH_OPCODE_PROGRAM_ROW | CY_FLASH_NON_BLOCKING_MODE; + context.arg1 = CY_FLASH_CONFIG_DATASIZE | CY_FLASH_DATA_LOC_SRAM; + context.arg2 = rowAddr; + context.arg3 = (uint32_t)data; + + result = Cy_Flash_SendCmd(CY_FLASH_NON_BLOCKING_MODE, CY_FLASH_START_PROGRAM_DELAY); + } + else + { + result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_IsProgramComplete +****************************************************************************//** +* +* Reports a successful program operation, failure or busy status +* ( \ref CY_FLASH_DRV_OPCODE_BUSY ). +* +* \return Returns the status of the Flash operation (see \ref cy_en_flashdrv_status_t). +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_IsProgramComplete(void) +{ + return (Cy_Flash_OperationStatus()); +} + +/******************************************************************************* +* Function Name: Cy_Flash_RowChecksum +****************************************************************************//** +* +* Returns a checksum value of the specified flash row. +* +* \param rowNum The Checksum is calculated to the flash row. +* +* \param checksumPtr The pointer to the address where checksum is to be stored +* +* \return Returns the status of the Flash operation. +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_RowChecksum (uint32_t rowNum, uint32_t* checksumPtr) +{ + cy_en_flashdrv_status_t result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + uint32_t resTmp; + + /* Checks whether the input parameters are valid */ + if (rowNum < CY_FLASH_NUMBER_ROWS) + { + /* Prepares arguments to be passed to SROM API */ + context.opcode = CY_FLASH_OPCODE_CHECKSUM | (rowNum << CY_FLASH_OPCODE_CHECKSUM_ROW_SHIFT); + + /* Tries to acquire the IPC structure and pass the arguments to SROM API */ + if (Cy_IPC_Drv_SendMsgPtr(CY_FLASH_IPC_STRUCT, CY_FLASH_IPC_NOTIFY_STRUCT0, (void*)&context) == CY_IPC_DRV_SUCCESS) + { + /* Polls whether IPC is released and the Flash operation is performed */ + while (Cy_IPC_Drv_IsLockAcquired(CY_FLASH_IPC_STRUCT) != false) + { + /* Wait till IPC is released */ + } + + resTmp = context.opcode; + + if((resTmp >> CY_FLASH_ERROR_SHIFT) == CY_FLASH_ERROR_NO_ERROR) + { + result = CY_FLASH_DRV_SUCCESS; + *checksumPtr = context.opcode & CY_FLASH_RESULT_MASK; + } + } + else + { + /* The IPC structure is already locked by another process */ + result = CY_FLASH_DRV_IPC_BUSY; + } + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_CalculateHash +****************************************************************************//** +* +* Returns a hash value of the specified region of flash. +* +* \param data Start the data address. +* +* \param numberOfBytes The hash value is calculated for the number of bytes after the +* start data address (0 - 1 byte, 1- 2 bytes etc). +* +* \param hashPtr The pointer to the address where hash is to be stored +* +* \return Returns the status of the Flash operation. +* +*******************************************************************************/ +cy_en_flashdrv_status_t Cy_Flash_CalculateHash (const uint32_t* data, uint32_t numberOfBytes, uint32_t* hashPtr) +{ + cy_en_flashdrv_status_t result = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + volatile uint32_t resTmp; + + /* Checks whether the input parameters are valid */ + if (data != NULL) + { + /* Prepares arguments to be passed to SROM API */ + context.opcode = CY_FLASH_OPCODE_HASH; + context.arg1 = (uint32_t)data; + context.arg2 = numberOfBytes; + + /* Tries to acquire the IPC structure and pass the arguments to SROM API */ + if (Cy_IPC_Drv_SendMsgPtr(CY_FLASH_IPC_STRUCT, CY_FLASH_IPC_NOTIFY_STRUCT0, (void*)&context) == CY_IPC_DRV_SUCCESS) + { + /* Polls whether IPC is released and the Flash operation is performed */ + while (Cy_IPC_Drv_IsLockAcquired(CY_FLASH_IPC_STRUCT) != false) + { + /* Wait till IPC is released */ + } + + resTmp = context.opcode; + + if((resTmp >> CY_FLASH_ERROR_SHIFT) == CY_FLASH_ERROR_NO_ERROR) + { + result = CY_FLASH_DRV_SUCCESS; + *hashPtr = context.opcode & CY_FLASH_RESULT_MASK; + } + } + else + { + /* The IPC structure is already locked by another process */ + result = CY_FLASH_DRV_IPC_BUSY; + } + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_BoundsCheck +****************************************************************************//** +* +* Returns false if Flash address is out of boundary, otherwise returns true. +* +* \param flashAddr Address to be checked +* +* \return false - out of bound, true - in flash bounds +* +*******************************************************************************/ +static bool Cy_Flash_BoundsCheck(uint32_t flashAddr) +{ + bool result = true; + + if ((flashAddr < CY_FLASH_BASE) || (flashAddr >= (CY_FLASH_BASE + CY_FLASH_SIZE))) + { + if ((flashAddr < CY_WFLASH_BASE) || (flashAddr >= (CY_WFLASH_BASE + CY_WFLASH_SIZE))) + { + if ((flashAddr < SFLASH_BASE) || (flashAddr >= (SFLASH_BASE + SFLASH_SECTION_SIZE))) + { + result = false; + } + } + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_PrepareContext +****************************************************************************//** +* +* Returns 1 if parameters are correct and initialises context, otherwise returns +* CY_FLASH_DRV_INVALID_INPUT_PARAMETERS. +* +* \param rowAddr Address of the flash row number. The number of the flash rows +* is defined by the \ref CY_FLASH_NUMBER_ROWS macro for the selected device. +* The Read-while-Write violation occurs when the flash read operation is +* initiated in the same flash sector where the flash write operation is +* performing. Refer to the device datasheet for the details. +* Address must match row start address. +* +* \param data The pointer to the data which has to be written to flash. The size +* of the data array must be equal to the flash row size. The flash row size for +* the selected device is defined by the \ref CY_FLASH_SIZEOF_ROW macro. Refer to +* the device datasheet for the details. +* +* \param blocking The parameter of how the context will be executed. +* * 1 - blocking, If this function is called by the CM4 the user code on CM0P +* and the user code on CM4 are blocked until flash write operation is finished. +* If this function is called by the CM0P the user code on CM4 is not blocked +* and the user code on CM0P is blocked until flash write operation is finished. +* * 0 - non-blocking, the user code is not blocked while flash write operation +* is executed. +* +* \return 1 - Context ready, CY_FLASH_DRV_INVALID_INPUT_PARAMETERS - Wrong +* arguments +* +*******************************************************************************/ +static uint32_t Cy_Flash_PrepareContext(uint32_t rowAddr, const uint32_t* data, uint32_t blocking) +{ + uint32_t result; + + if ((Cy_Flash_BoundsCheck(rowAddr) == false) || (NULL == data)) + { + result = (uint32_t)CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + else + { + if ((rowAddr%CY_FLASH_SIZEOF_ROW) != 0UL) + { + result = (uint32_t)CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + } + else + { + /* Prepares arguments to be passed to SROM API */ + context.opcode = CY_FLASH_OPCODE_WRITE_ROW | blocking; + context.arg1 = CY_FLASH_CONFIG_DATASIZE; + context.arg2 = rowAddr; + context.arg3 = (uint32_t)data; + + result = 1UL; + } + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_ProcessOpcode +****************************************************************************//** +* +* Converts System Call returns to the Flash driver return defines. +* +* \param opcode The value returned by the System Call. +* +* \return Flash driver return. +* +*******************************************************************************/ +static cy_en_flashdrv_status_t Cy_Flash_ProcessOpcode(uint32_t opcode) +{ + cy_en_flashdrv_status_t retVal; + + switch (opcode) + { + case 0UL: + { + retVal = CY_FLASH_DRV_SUCCESS; + break; + } + case CY_FLASH_ROMCODE_SUCCESS: + { + retVal = CY_FLASH_DRV_SUCCESS; + break; + } + case CY_FLASH_ROMCODE_INVALID_PROTECTION: + { + retVal = CY_FLASH_DRV_INV_PROT; + break; + } + case CY_FLASH_ROMCODE_INVALID_FM_PL: + { + retVal = CY_FLASH_DRV_INVALID_FM_PL; + break; + } + case CY_FLASH_ROMCODE_INVALID_FLASH_ADDR: + { + retVal = CY_FLASH_DRV_INVALID_FLASH_ADDR; + break; + } + case CY_FLASH_ROMCODE_ROW_PROTECTED: + { + retVal = CY_FLASH_DRV_ROW_PROTECTED; + break; + } + case CY_FLASH_ROMCODE_IN_PROGRESS_NO_ERROR: + { + retVal = CY_FLASH_DRV_PROGRESS_NO_ERROR; + break; + } + case (uint32_t)CY_FLASH_DRV_INVALID_INPUT_PARAMETERS: + { + retVal = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + break; + } + case CY_FLASH_IS_OPERATION_STARTED : + { + retVal = CY_FLASH_DRV_OPERATION_STARTED; + break; + } + case CY_FLASH_IS_BUSY : + { + retVal = CY_FLASH_DRV_OPCODE_BUSY; + break; + } + case CY_FLASH_IS_IPC_BUSY : + { + retVal = CY_FLASH_DRV_IPC_BUSY; + break; + } + case CY_FLASH_IS_INVALID_INPUT_PARAMETERS : + { + retVal = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; + break; + } + default: + { + retVal = CY_FLASH_DRV_ERR_UNC; + break; + } + } + + return (retVal); +} + + +/******************************************************************************* +* Function Name: Cy_Flash_OperationStatus +****************************************************************************//** +* +* Checks the status of the Flash Operation, and returns it. +* +* \return Returns the status of the Flash operation +* (see \ref cy_en_flashdrv_status_t). +* +*******************************************************************************/ +static cy_en_flashdrv_status_t Cy_Flash_OperationStatus(void) +{ + cy_en_flashdrv_status_t retVal = CY_FLASH_DRV_OPCODE_BUSY; + + /* Checks if the IPC structure is not locked */ + if (Cy_IPC_Drv_IsLockAcquired(CY_FLASH_IPC_STRUCT) == false) + { + /* The result of SROM API calling is returned to the driver context */ + retVal = Cy_Flash_ProcessOpcode(context.opcode); + } + + return (retVal); +} + +/******************************************************************************* +* Function Name: Cy_Flash_RAMDelay +****************************************************************************//** +* +* Wait for a defined time in the SRAM memory region. +* +*******************************************************************************/ +#if defined (__ICCARM__) + __ramfunc +#else + CY_SECTION(".cy_ramfunc") +#endif +static void Cy_Flash_RAMDelay(uint32_t microseconds) +{ + uint32_t ticks = microseconds * CY_FLASH_TICKS_FOR_1US; + if (ticks != CY_FLASH_NO_DELAY) + { + CY_FLASH_TST_DDFT_SLOW_CTL_REG = CY_FLASH_TST_DDFT_SLOW_CTL_MASK; + CY_FLASH_CLK_OUTPUT_SLOW_REG = CY_FLASH_CLK_OUTPUT_SLOW_MASK; + CY_FLASH_TST_DDFT_FAST_CTL_REG = CY_FLASH_TST_DDFT_FAST_CTL_MASK; + + /* Load the down-counter */ + CY_FLASH_CLK_CAL_CNT1_REG = ticks; + + /* Make sure that the counter is started */ + (void) CY_FLASH_CLK_CAL_CNT1_REG; + + while(0U == (CY_FLASH_CLK_CAL_CNT1_REG & CY_FLASH_CLK_CAL_CNT1_DONE)) + { + /* Wait until the counter stops counting */ + } + } +} + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/flash/cy_flash.h similarity index 57% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.h rename to targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/flash/cy_flash.h index c9cb738718..a200f8dcef 100644 --- a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/flash/cy_flash.h +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/flash/cy_flash.h @@ -1,6 +1,6 @@ /***************************************************************************//** * \file cy_flash.h -* \version 1.0 +* \version 2.0 * * Provides the API declarations of the Flash driver. * @@ -45,10 +45,19 @@ * Use different flash sectors for code and data storage. The flash is divided * into four equal sectors. * +* \warning If the CM0 core triggers the Flash operation, another core must be in +* Active mode and interrupts must be enabled in both cores. +* +* \note "Warning[Ta023]: Call to a non __ramfunc function." - The warning may +* appear during the build process while using IAR IDE. The reason - some +* functions in RAM memory that use the __ramfunc keyword, may invoke +* functions located in the ROM memory. You can ignore this warning or +* disable it by adding the --diag_suppress=Ta023 option to the compiler. +* * \section group_flash_configuration Configuration Considerations * -* There are no specific configuration parameters for the flash operations -* outside the driver API input parameters. +* Note that to be able to perform FLASH writes, the VCCD should be more than 0.99 V. +* For more information see the technical reference manual (TRM). * * \section group_flash_more_information More Information * @@ -56,20 +65,28 @@ * * \section group_flash_MISRA MISRA-C Compliance * -* The Flash driver has the following specific deviations: -* * * * * * -* +* * * -* -* -* -* +* +* +* +* +* +* +* +* +* +* * *
    MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)Description of Deviation(s)
    19.7AA function shall be used in preference to a function-like macroMacro is used because of performance reasons5.6RNo identifier in one name space can have the same spelling as an identifier in another name space, with the +* exception of structure member and union member names.The "context" is used as a structure/union member; they are a label, tag or ordinary +* identifier.
    8.7RObjects shall be defined at block scope if they are only accessed +* from within a single function.The driver defines an internal variable that can be accessed by +* any core through the IPC hardware.
    * @@ -82,120 +99,97 @@ * Initial version * * +* +* 2.0 +* Added non-blocking erase functions ( Cy_Flash_StartErase() and +* Cy_Flash_IsEraseComplete() ). Removed the clear cache function +* call. +* The clear cache operation is removed from the blocking Write/Erase +* function because in this case it is performed by the hardware. +* Otherwise it is documented that it is the user's responsibility to +* clear the cache after executing the non-blocking Write/Erase flash +* operation. +* * * -* \defgroup group_flash_macro Macro +* \defgroup group_flash_macros Macros * \defgroup group_flash_functions Functions * \defgroup group_flash_data_structure Data Structures +* \defgroup group_flash_enumerated_types Enumerated Types */ #include -#include #include +#include +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif /*************************************** * Macro definitions ***************************************/ /** -* \addtogroup group_flash_macro +* \addtogroup group_flash_macros * \{ */ /** Driver major version */ -#define CY_FLASH_DRV_VERSION_MAJOR 1 +#define CY_FLASH_DRV_VERSION_MAJOR 2 /** Driver minor version */ #define CY_FLASH_DRV_VERSION_MINOR 0 -/** -* \defgroup group_flash_returns Flash return values -* \{ -* Specifies return values meaning -*/ -#define CY_FLASH_ID (CY_PDL_DRV_ID(0x14u)) /**< FLASH PDL ID */ +#define CY_FLASH_ID (CY_PDL_DRV_ID(0x14UL)) /**< FLASH PDL ID */ #define CY_FLASH_ID_INFO (uint32_t)( CY_FLASH_ID | CY_PDL_STATUS_INFO ) /**< Return prefix for FLASH driver function status codes */ #define CY_FLASH_ID_WARNING (uint32_t)( CY_FLASH_ID | CY_PDL_STATUS_WARNING) /**< Return prefix for FLASH driver function warning return values */ #define CY_FLASH_ID_ERROR (uint32_t)( CY_FLASH_ID | CY_PDL_STATUS_ERROR) /**< Return prefix for FLASH driver function error return values */ -/** This enum has the return values of the Flash driver */ -typedef enum -{ - CY_FLASH_DRV_SUCCESS = 0x00ul, /**< Success */ - CY_FLASH_DRV_INV_PROT = ( CY_FLASH_ID_ERROR + 0ul), /**< Invalid device protection state */ - CY_FLASH_DRV_INVALID_FM_PL = ( CY_FLASH_ID_ERROR + 1ul), /**< Invalid flash page latch address */ - CY_FLASH_DRV_INVALID_FLASH_ADDR = ( CY_FLASH_ID_ERROR + 2ul), /**< Invalid flash address */ - CY_FLASH_DRV_ROW_PROTECTED = ( CY_FLASH_ID_ERROR + 3ul), /**< Row is write protected */ - CY_FLASH_DRV_IPC_BUSY = ( CY_FLASH_ID_ERROR + 5ul), /**< IPC structure is already locked by another process */ - CY_FLASH_DRV_INVALID_INPUT_PARAMETERS = ( CY_FLASH_ID_ERROR + 6ul), /**< Input parameters passed to Flash API are not valid */ - CY_FLASH_DRV_ERR_UNC = ( CY_FLASH_ID_ERROR + 0xFul),/**< Unknown error */ - CY_FLASH_DRV_PROGRESS_NO_ERROR = ( CY_FLASH_ID_INFO + 0ul), /**< Command in progress; no error */ - CY_FLASH_DRV_OPERATION_STARTED = ( CY_FLASH_ID_INFO + 1ul), /**< Flash operation is successfully initiated */ - CY_FLASH_DRV_OPCODE_BUSY = ( CY_FLASH_ID_INFO + 2ul), /**< Flash is under operation */ -} cy_en_flashdrv_status_t; - -/** \} group_flash_returns */ - /** \cond INTERNAL */ -/** Command completed with no errors */ -#define CY_FLASH_ROMCODE_SUCCESS (0xA0000000UL) -/** Invalid device protection state */ -#define CY_FLASH_ROMCODE_INVALID_PROTECTION (0xF0000001UL) -/** Invalid flash page latch address */ -#define CY_FLASH_ROMCODE_INVALID_FM_PL (0xF0000003UL) -/** Invalid flash address */ -#define CY_FLASH_ROMCODE_INVALID_FLASH_ADDR (0xF0000004UL) -/** Row is write protected */ -#define CY_FLASH_ROMCODE_ROW_PROTECTED (0xF0000005UL) -/** Command in progress; no error */ -#define CY_FLASH_ROMCODE_IN_PROGRESS_NO_ERROR (0xA0000009UL) -/** Flash operation is successfully initiated */ -#define CY_FLASH_IS_OPERATION_STARTED (0x00000010UL) -/** Flash is under operation */ -#define CY_FLASH_IS_BUSY (0x00000040UL) -/** IPC structure is already locked by another process */ -#define CY_FLASH_IS_IPC_BUSY (0x00000080UL) -/** Input parameters passed to Flash API are not valid */ -#define CY_FLASH_IS_INVALID_INPUT_PARAMETERS (0x00000100UL) - -/** Result mask */ -#define CY_FLASH_RESULT_MASK (0xFFFFFFFUL) -/** Error shift */ -#define CY_FLASH_ERROR_SHIFT (28UL) -/** No error */ -#define CY_FLASH_ERROR_NO_ERROR (0xAUL) +#define CY_FLASH_ENTER_WAIT_LOOP 0xFFU +#define CY_FLASH_IPC_CLIENT_ID 2U +/** Semaphore number reserved for flash driver */ +#define CY_FLASH_WAIT_SEMA 0UL /** \endcond */ - /** -* \addtogroup group_flash_config_macro Flash configuration +* \addtogroup group_flash_config_macros Flash configuration * \{ * Specifies the parameter values passed to SROM API */ -/** SROM API opcode for flash write operation */ -#if (CY_CPU_CORTEX_M0P) && (!defined(CY8C622PSVP) && !defined(CY8C622PSVP_DUAL)) - #define CY_FLASH_OPCODE_WRITE_ROW (((0x05UL) << 24u) | ((0x01UL) << 8UL)) -#else - #define CY_FLASH_OPCODE_WRITE_ROW ((0x05UL) << 24u) -#endif +/** Set SROM API in blocking mode */ +#define CY_FLASH_BLOCKING_MODE ((0x01UL) << 8UL) +/** Set SROM API in non blocking mode */ +#define CY_FLASH_NON_BLOCKING_MODE (0UL) +/** SROM API opcode for flash write operation */ +#define CY_FLASH_OPCODE_WRITE_ROW ((0x05UL) << 24UL) +/** SROM API opcode for flash program operation */ +#define CY_FLASH_OPCODE_PROGRAM_ROW ((0x06UL) << 24UL) +/** SROM API opcode for row erase operation */ +#define CY_FLASH_OPCODE_ERASE_ROW ((0x1CUL) << 24UL) /** SROM API opcode for flash checksum operation */ -#define CY_FLASH_OPCODE_CHECKSUM ((0x0BUL) << 24u) +#define CY_FLASH_OPCODE_CHECKSUM ((0x0BUL) << 24UL) /** SROM API opcode for flash hash operation */ -#define CY_FLASH_OPCODE_HASH ((0x0DUL) << 24u) +#define CY_FLASH_OPCODE_HASH ((0x0DUL) << 24UL) /** SROM API flash row shift for flash checksum operation */ -#define CY_FLASH_OPCODE_CHECKSUM_ROW_SHIFT (8u) +#define CY_FLASH_OPCODE_CHECKSUM_ROW_SHIFT (8UL) /** SROM API flash data size parameter for flash write operation */ #define CY_FLASH_CONFIG_DATASIZE (0x06UL) +/** Data to be programmed to flash is located in SRAM memory region */ +#define CY_FLASH_DATA_LOC_SRAM (0x100UL) /** SROM API flash verification option for flash write operation */ #define CY_FLASH_CONFIG_VERIFICATION_EN ((0x01UL) << 16u) -/** \} group_flash_config_macro */ +/** \} group_flash_config_macros */ /** -* \addtogroup group_flash_general_macro Flash general parameters +* \addtogroup group_flash_general_macros Flash general parameters * \{ * Provides general information about flash and IPC */ @@ -206,23 +200,40 @@ typedef enum #define CY_FLASH_NUMBER_ROWS (CY_FLASH_SIZE / CY_FLASH_SIZEOF_ROW) /** Long words flash row size */ #define CY_FLASH_SIZEOF_ROW_LONG_UNITS (CY_FLASH_SIZEOF_ROW / sizeof(uint32_t)) -/** Calculates the flash address for a given row of flash */ -#define CY_CALCULATE_FLASH_ADDRESS(rowNum) (CY_FLASH_BASE + ((rowNum) * CY_FLASH_SIZEOF_ROW)) /** IPC channel to be used */ #define CY_FLASH_IPC_STRUCT ((IPC_STRUCT_Type*) &IPC->STRUCT[CY_IPC_CHAN_SYSCALL]) /** IPC notify bit for IPC_STRUCT0 (dedicated to flash operation) */ -#define CY_FLASH_IPC_NOTIFY_STRUCT0 (0x1UL) -/** \cond INTERNAL */ -#define CY_FLASH_CM4_FLASH_PROXY_ADDR (0x16001101UL) -/** \endcond */ +#define CY_FLASH_IPC_NOTIFY_STRUCT0 (0x1UL << CY_IPC_INTR_SYSCALL1) +/** IPC notify interrupt structure number */ +#define CY_FLASH_IPC_INTR_CM0_NOTIFY (0x1UL << CY_IPC_INTR_FLASH_NOTIFY) -/** \} group_flash_general_macro */ +/** \} group_flash_general_macros */ -/** \} group_flash_macro */ +/** \} group_flash_macros */ -#if defined(__cplusplus) -extern "C" { -#endif +/** +* \addtogroup group_flash_enumerated_types +* \{ +*/ + +/** This enum has the return values of the Flash driver */ +typedef enum +{ + CY_FLASH_DRV_SUCCESS = 0x00UL, /**< Success */ + CY_FLASH_DRV_INV_PROT = ( CY_FLASH_ID_ERROR + 0x0UL), /**< Invalid device protection state */ + CY_FLASH_DRV_INVALID_FM_PL = ( CY_FLASH_ID_ERROR + 0x1UL), /**< Invalid flash page latch address */ + CY_FLASH_DRV_INVALID_FLASH_ADDR = ( CY_FLASH_ID_ERROR + 0x2UL), /**< Invalid flash address */ + CY_FLASH_DRV_ROW_PROTECTED = ( CY_FLASH_ID_ERROR + 0x3UL), /**< Row is write protected */ + CY_FLASH_DRV_IPC_BUSY = ( CY_FLASH_ID_ERROR + 0x5UL), /**< IPC structure is already locked by another process */ + CY_FLASH_DRV_INVALID_INPUT_PARAMETERS = ( CY_FLASH_ID_ERROR + 0x6UL), /**< Input parameters passed to Flash API are not valid */ + CY_FLASH_DRV_PL_ROW_COMP_FA = ( CY_FLASH_ID_ERROR + 0x22UL), /**< Comparison between Page Latches and FM row failed */ + CY_FLASH_DRV_ERR_UNC = ( CY_FLASH_ID_ERROR + 0xFFUL), /**< Unknown error */ + CY_FLASH_DRV_PROGRESS_NO_ERROR = ( CY_FLASH_ID_INFO + 0x0UL), /**< Command in progress; no error */ + CY_FLASH_DRV_OPERATION_STARTED = ( CY_FLASH_ID_INFO + 0x1UL), /**< Flash operation is successfully initiated */ + CY_FLASH_DRV_OPCODE_BUSY = ( CY_FLASH_ID_INFO + 0x2UL) /**< Flash is under operation */ +} cy_en_flashdrv_status_t; + +/** \} group_flash_enumerated_types */ /*************************************** * Data Structure definitions @@ -253,17 +264,25 @@ typedef struct * \addtogroup group_flash_functions * \{ */ -cy_en_flashdrv_status_t Cy_Flash_WriteRow(uint32_t rowAddr, const uint32_t* data, cy_stc_flash_context_t* contextPtr); -cy_en_flashdrv_status_t Cy_Flash_StartWrite(uint32_t rowAddr, const uint32_t* data, cy_stc_flash_context_t* contextPtr); -cy_en_flashdrv_status_t Cy_Flash_IsWriteComplete(const cy_stc_flash_context_t* contextPtr); -cy_en_flashdrv_status_t Cy_Flash_RowChecksum (uint32_t rowNum, cy_stc_flash_context_t* contextPtr, uint32_t* cheksumPtr); -cy_en_flashdrv_status_t Cy_Flash_CalculateHash (const uint32_t* data, uint32 numberOfBytes, cy_stc_flash_context_t* contextPtr, uint32_t* hashPtr); +cy_en_flashdrv_status_t Cy_Flash_EraseRow(uint32_t rowAddr); +cy_en_flashdrv_status_t Cy_Flash_WriteRow(uint32_t rowAddr, const uint32_t* data); +cy_en_flashdrv_status_t Cy_Flash_StartWrite(uint32_t rowAddr, const uint32_t* data); +cy_en_flashdrv_status_t Cy_Flash_IsWriteComplete(void); +cy_en_flashdrv_status_t Cy_Flash_StartProgram(uint32_t rowAddr, const uint32_t* data); +cy_en_flashdrv_status_t Cy_Flash_IsProgramComplete(void); +cy_en_flashdrv_status_t Cy_Flash_StartErase(uint32_t rowAddr); +cy_en_flashdrv_status_t Cy_Flash_IsEraseComplete(void); +cy_en_flashdrv_status_t Cy_Flash_RowChecksum(uint32_t rowNum, uint32_t* checksumPtr); +cy_en_flashdrv_status_t Cy_Flash_CalculateHash(const uint32_t* data, uint32_t numberOfBytes, uint32_t* hashPtr); /** \cond INTERNAL */ -uint32_t Cy_Flash_BoundsCheck(uint32_t flashAddr); -uint32_t Cy_Flash_PrepeareContext(uint32_t rowAddr, const uint32_t* data, cy_stc_flash_context_t *contextPtr); -cy_en_flashdrv_status_t Cy_Flash_ProcessOpcode(uint32_t opcode); +typedef cy_en_flashdrv_status_t (*Cy_Flash_Proxy)(cy_stc_flash_context_t *context); -typedef cy_en_flashdrv_status_t (*Cy_Flash_Proxy)(cy_stc_flash_context_t *contextPtr); +typedef struct _IPC_MSG +{ + uint8_t clientID; + uint8_t pktType; + uint16_t intrRelMask; +} IPC_MSG; /** \endcond */ /** \} group_flash_functions */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/gpio/cy_gpio.c similarity index 98% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.c rename to targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/gpio/cy_gpio.c index 43c939f4da..95dcb3e33f 100644 --- a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.c +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/gpio/cy_gpio.c @@ -36,9 +36,9 @@ extern "C" { * Pointer to the pin config structure base address * * \return -* void +* Initialization status * -* \note +* \note * This function modifies port registers in read-modify-write operations. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -78,7 +78,7 @@ cy_en_gpio_status_t Cy_GPIO_Pin_Init(GPIO_PRT_Type *base, uint32_t pinNum, const { status = CY_GPIO_BAD_PARAM; } - + return(status); } @@ -96,7 +96,7 @@ cy_en_gpio_status_t Cy_GPIO_Pin_Init(GPIO_PRT_Type *base, uint32_t pinNum, const * Pointer to the pin config structure base address * * \return -* void +* Initialization status * *******************************************************************************/ cy_en_gpio_status_t Cy_GPIO_Port_Init(GPIO_PRT_Type* base, const cy_stc_gpio_prt_config_t *config) @@ -124,7 +124,7 @@ cy_en_gpio_status_t Cy_GPIO_Port_Init(GPIO_PRT_Type* base, const cy_stc_gpio_prt { status = CY_GPIO_BAD_PARAM; } - + return(status); } diff --git a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/gpio/cy_gpio.h similarity index 97% rename from targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.h rename to targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/gpio/cy_gpio.h index f25c54beeb..e806024627 100644 --- a/targets/TARGET_Cypress/TARGET_PSoC6_CY8C/device/driver_periph/gpio/cy_gpio.h +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/gpio/cy_gpio.h @@ -22,21 +22,21 @@ * * Initialization can be performed either at the port level or by configuring the * individual pins. For efficient use of code space, port -* configuration should be used in the field. Refer to the product device header files +* configuration should be used in the field. Refer to the product device header files * for the list of supported ports and pins. -* -* - Single pin configuration is performed by using \ref Cy_GPIO_Pin_FastInit +* +* - Single pin configuration is performed by using \ref Cy_GPIO_Pin_FastInit * (provide specific values) or \ref Cy_GPIO_Pin_Init (provide a filled * cy_stc_gpio_pin_config_t structure). -* - An entire port can be configured using \ref Cy_GPIO_Port_Init. Provide a filled -* cy_stc_gpio_prt_config_t structure. The values in the structure are +* - An entire port can be configured using \ref Cy_GPIO_Port_Init. Provide a filled +* cy_stc_gpio_prt_config_t structure. The values in the structure are * bitfields representing the desired value for each pin in the port. * - Pin configuration and management is based on the port address and pin number. * \ref Cy_GPIO_PortToAddr function can optionally be used to calculate the port * address from the port number at run-time. * -* Once the pin/port initialization is complete, each pin can be accessed by -* specifying the port (GPIO_PRT_Type) and the pin (0-7) in the provided API +* Once the pin/port initialization is complete, each pin can be accessed by +* specifying the port (GPIO_PRT_Type) and the pin (0-7) in the provided API * functions. * * \section group_gpio_configuration Configuration Considerations @@ -50,32 +50,21 @@ * registers. These functions are not thread safe and care must be taken when * called by the application. * +* The whole gpio port can be updated using the port mask by direct port +* register writing. The code example below shows the different ways of +* manipulating Port#1 using the Port output data register, +* the Port output data set register, and the Port output data clear register: +* +* \snippet gpio_sut_01.cydsn/main_cm4.c Cy_GPIO_Snippet +* +* * \section group_gpio_more_information More Information * * Refer to the technical reference manual (TRM) and the device datasheet. * * \section group_gpio_MISRA MISRA-C Compliance] -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
    MISRA ruleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
    14.1RStatic Function '' is not used within this translation unit.
    16.7RThe object addressed by the pointer parameter 'base' is not modified -* and so the pointer could be of type 'pointer to const'.
    +* +* The gpio driver does not have any specific deviations. * * \section group_gpio_changelog Changelog * @@ -87,7 +76,7 @@ * *
    * -* \defgroup group_gpio_macro Macro +* \defgroup group_gpio_macros Macros * \defgroup group_gpio_functions Functions * \{ * \defgroup group_gpio_functions_init Initialization Functions @@ -110,7 +99,7 @@ extern "C" { #endif -/** \addtogroup group_gpio_macro +/** \addtogroup group_gpio_macros * \{ */ @@ -123,7 +112,7 @@ extern "C" { /** GPIO driver ID */ #define CY_GPIO_ID CY_PDL_DRV_ID(0x16u) -/** \} group_gpio_macro */ +/** \} group_gpio_macros */ /*************************************** @@ -137,7 +126,7 @@ extern "C" { /** * GPIO Driver error codes */ -typedef enum +typedef enum { CY_GPIO_SUCCESS = 0x00u, /**< Returned successful */ CY_GPIO_BAD_PARAM = CY_GPIO_ID | CY_PDL_STATUS_ERROR | 0x01u, /**< Bad parameter was passed */ @@ -246,7 +235,7 @@ typedef struct { ***************************************/ /** -* \addtogroup group_gpio_macro +* \addtogroup group_gpio_macros * \{ */ @@ -366,7 +355,7 @@ typedef struct { #define CY_SIO_VOH_4_16 (0x07UL) /**< \brief Voh = 4.16 x Reference */ /** \} */ -/** \} group_gpio_macro */ +/** \} group_gpio_macros */ /*************************************** * Function Prototypes @@ -449,25 +438,30 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetInterruptEdge(GPIO_PRT_Type* base, uint32_t __STATIC_INLINE void Cy_GPIO_SetFilter(GPIO_PRT_Type* base, uint32_t value); __STATIC_INLINE uint32_t Cy_GPIO_GetFilter(GPIO_PRT_Type* base); -#if (IOSS_GPIO_GPIO_PORT_NR_0_31 != 0) +#if (IOSS_GPIO_GPIO_PORT_NR_0_31 != 0) || defined (CY_DOXYGEN) __STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause0(void); #endif /* (IOSS_GPIO_GPIO_PORT_NR_0_31 != 0) */ -#if (IOSS_GPIO_GPIO_PORT_NR_32_63 != 0) +#if (IOSS_GPIO_GPIO_PORT_NR_32_63 != 0) || defined (CY_DOXYGEN) __STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause1(void); #endif /* (IOSS_GPIO_GPIO_PORT_NR_32_63 != 0) */ -#if (IOSS_GPIO_GPIO_PORT_NR_64_95 != 0) +#if (IOSS_GPIO_GPIO_PORT_NR_64_95 != 0) || defined (CY_DOXYGEN) __STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause2(void); #endif /* (IOSS_GPIO_GPIO_PORT_NR_64_95 != 0) */ -#if (IOSS_GPIO_GPIO_PORT_NR_96_127 != 0) +#if (IOSS_GPIO_GPIO_PORT_NR_96_127 != 0) || defined (CY_DOXYGEN) __STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause3(void); #endif /* (IOSS_GPIO_GPIO_PORT_NR_96_127 != 0) */ /** \} group_gpio_functions_interrupt */ +/** +* \addtogroup group_gpio_functions_init +* \{ +*/ + /******************************************************************************* * Function Name: Cy_GPIO_Pin_FastInit ****************************************************************************//** @@ -494,7 +488,7 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause3(void); * \return * void * -* \note +* \note * This function modifies port registers in read-modify-write operations. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -583,7 +577,7 @@ __STATIC_INLINE void Cy_GPIO_Port_Deinit(GPIO_PRT_Type* base) * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -683,6 +677,12 @@ __STATIC_INLINE GPIO_PRT_Type* Cy_GPIO_PortToAddr(uint32_t portNum) return (base); } +/** \} group_gpio_functions_init */ + +/** +* \addtogroup group_gpio_functions_gpio +* \{ +*/ /******************************************************************************* * Function Name: Cy_GPIO_Read @@ -863,7 +863,7 @@ __STATIC_INLINE void Cy_GPIO_Inv(GPIO_PRT_Type* base, uint32_t pinNum) * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -919,7 +919,7 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetDrivemode(GPIO_PRT_Type* base, uint32_t pinN * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -973,7 +973,7 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetVtrip(GPIO_PRT_Type* base, uint32_t pinNum) * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -1027,7 +1027,7 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetSlewRate(GPIO_PRT_Type* base, uint32_t pinNu * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -1064,6 +1064,12 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetDriveSel(GPIO_PRT_Type* base, uint32_t pinNu return (base->CFG_OUT >> (pinNum + CY_GPIO_CFG_OUT_DRIVE_OFFSET)) & CY_GPIO_CFG_OUT_DRIVE_SEL_MASK; } +/** \} group_gpio_functions_gpio */ + +/** +* \addtogroup group_gpio_functions_sio +* \{ +*/ /******************************************************************************* * Function Name: Cy_GPIO_SetVregEn @@ -1085,7 +1091,7 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetDriveSel(GPIO_PRT_Type* base, uint32_t pinNu * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -1145,7 +1151,7 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetVregEn(GPIO_PRT_Type* base, uint32_t pinNum) * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -1205,7 +1211,7 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetIbufMode(GPIO_PRT_Type* base, uint32_t pinNu * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -1265,7 +1271,7 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetVtripSel(GPIO_PRT_Type* base, uint32_t pinNu * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -1328,7 +1334,7 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetVrefSel(GPIO_PRT_Type* base, uint32_t pinNum * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -1367,6 +1373,12 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetVohSel(GPIO_PRT_Type* base, uint32_t pinNum) return (base->CFG_SIO >> (((pinNum & CY_GPIO_SIO_ODD_PIN_MASK) << CY_GPIO_CFG_SIO_OFFSET) + CY_GPIO_VOH_SEL_SHIFT)) & CY_GPIO_VOH_SEL_MASK; } +/** \} group_gpio_functions_sio */ + +/** +* \addtogroup group_gpio_functions_interrupt +* \{ +*/ /******************************************************************************* * Function Name: Cy_GPIO_GetInterruptStatus @@ -1438,7 +1450,7 @@ __STATIC_INLINE void Cy_GPIO_ClearInterrupt(GPIO_PRT_Type* base, uint32_t pinNum * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -1539,7 +1551,7 @@ __STATIC_INLINE void Cy_GPIO_SetSwInterrupt(GPIO_PRT_Type* base, uint32_t pinNum * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -1592,7 +1604,7 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetInterruptEdge(GPIO_PRT_Type* base, uint32_t * \return * void * -* \note +* \note * This function modifies a port register in a read-modify-write operation. It is * not thread safe as the resource is shared among multiple pins on a port. * @@ -1705,8 +1717,9 @@ __STATIC_INLINE uint32_t Cy_GPIO_GetInterruptCause3(void) #endif -/** \} group_gpio_functions */ +/** \} group_gpio_functions_interrupt */ +/** \} group_gpio_functions */ #if defined(__cplusplus) } diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/i2s/cy_i2s.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/i2s/cy_i2s.c new file mode 100644 index 0000000000..0c58856dc7 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/i2s/cy_i2s.c @@ -0,0 +1,275 @@ +/***************************************************************************//** +* \file cy_i2s.c +* \version 2.0 +* +* The source code file for the I2S driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_i2s.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/******************************************************************************* +* Function Name: Cy_I2S_Init +****************************************************************************//** +* +* Initializes the I2S module in accordance with a configuration structure. +* +* \pre If the I2S module is initialized previously, the \ref Cy_I2S_DeInit() +* must be called before calling this function. +* +* \param base The pointer to the I2S instance address. +* \param config The pointer to a configuration structure. +* \return error / status code. See \ref cy_en_i2s_status_t. +* +*******************************************************************************/ +cy_en_i2s_status_t Cy_I2S_Init(I2S_Type * base, cy_stc_i2s_config_t const * config) +{ + cy_en_i2s_status_t ret = CY_I2S_BAD_PARAM; + cy_en_i2s_ws_pw_t wsPulseWidth; + uint32_t channels, clockDiv; + cy_en_i2s_len_t channelLength; + + if((NULL != base) && (NULL != config)) + { + ret = CY_I2S_SUCCESS; + + /* Clock setting */ + clockDiv = (uint32_t)config->clkDiv - 1U; + + CY_ASSERT_L2(CY_I2S_IS_CLK_DIV_VALID(clockDiv)); + + base->CLOCK_CTL = _VAL2FLD(I2S_CLOCK_CTL_CLOCK_DIV, clockDiv) | + _BOOL2FLD(I2S_CLOCK_CTL_CLOCK_SEL, config->extClk); + + /* Tx setting */ + if(config->txEnabled) + { + CY_ASSERT_L3(CY_I2S_IS_ALIGNMENT_VALID(config->txAlignment)); + CY_ASSERT_L3(CY_I2S_IS_OVHDATA_VALID(config->txOverheadValue)); + + if((CY_I2S_TDM_MODE_A == config->txAlignment) || (CY_I2S_TDM_MODE_B == config->txAlignment)) + { + channels = (uint32_t)config->txChannels - 1UL; + wsPulseWidth = CY_I2S_WS_ONE_CHANNEL_LENGTH; + channelLength = CY_I2S_LEN32; + + CY_ASSERT_L2(CY_I2S_IS_CHANNELS_VALID(channels)); + CY_ASSERT_L3(CY_I2S_IS_LEN_VALID(config->txWordLength)); + } + else + { + channels = 1UL; + wsPulseWidth = config->txWsPulseWidth; + channelLength = config->txChannelLength; + + CY_ASSERT_L3(CY_I2S_IS_WSPULSE_VALID(wsPulseWidth)); + CY_ASSERT_L3(CY_I2S_IS_CHAN_WORD_VALID(channelLength, config->txWordLength)); + } + + CY_ASSERT_L2(CY_I2S_IS_TRIG_LEVEL_VALID(config->txFifoTriggerLevel, channels)); + + base->TX_WATCHDOG = config->txWatchdogValue; + + base->TX_CTL = _VAL2FLD(I2S_TX_CTL_I2S_MODE, config->txAlignment) | + _BOOL2FLD(I2S_TX_CTL_B_CLOCK_INV, config->txSdoLatchingTime) | + _VAL2FLD(I2S_TX_CTL_CH_NR, channels) | + _BOOL2FLD(I2S_TX_CTL_MS, config->txMasterMode) | + _VAL2FLD(I2S_TX_CTL_WS_PULSE, wsPulseWidth) | + _BOOL2FLD(I2S_TX_CTL_WD_EN, config->txWatchdogEnable) | + _BOOL2FLD(I2S_TX_CTL_SCKO_POL, config->txSckoInversion) | + _BOOL2FLD(I2S_TX_CTL_SCKI_POL, config->txSckiInversion) | + _VAL2FLD(I2S_TX_CTL_CH_LEN, channelLength) | + _VAL2FLD(I2S_TX_CTL_WORD_LEN, config->txWordLength) | + _VAL2FLD(I2S_TX_CTL_OVHDATA, config->txOverheadValue); + } + + /* Rx setting */ + if(config->rxEnabled) + { + CY_ASSERT_L3(CY_I2S_IS_ALIGNMENT_VALID(config->rxAlignment)); + + if((CY_I2S_TDM_MODE_A == config->rxAlignment) || (CY_I2S_TDM_MODE_B == config->rxAlignment)) + { + channels = (uint32_t)config->rxChannels - 1UL; + wsPulseWidth = CY_I2S_WS_ONE_CHANNEL_LENGTH; + channelLength = CY_I2S_LEN32; + + CY_ASSERT_L2(CY_I2S_IS_CHANNELS_VALID(channels)); + CY_ASSERT_L3(CY_I2S_IS_LEN_VALID(config->rxWordLength)); + } + else + { + channels = 1UL; + wsPulseWidth = config->rxWsPulseWidth; + channelLength = config->rxChannelLength; + + CY_ASSERT_L3(CY_I2S_IS_WSPULSE_VALID(wsPulseWidth)); + CY_ASSERT_L3(CY_I2S_IS_CHAN_WORD_VALID(channelLength, config->rxWordLength)); + } + + CY_ASSERT_L2(CY_I2S_IS_TRIG_LEVEL_VALID(config->rxFifoTriggerLevel, channels)); + + base->RX_WATCHDOG = config->rxWatchdogValue; + + base->RX_CTL = _VAL2FLD(I2S_RX_CTL_I2S_MODE, config->rxAlignment) | + _BOOL2FLD(I2S_RX_CTL_B_CLOCK_INV, config->rxSdiLatchingTime) | + _VAL2FLD(I2S_RX_CTL_CH_NR, channels) | + _BOOL2FLD(I2S_RX_CTL_MS, config->rxMasterMode) | + _VAL2FLD(I2S_RX_CTL_WS_PULSE, wsPulseWidth) | + _BOOL2FLD(I2S_RX_CTL_WD_EN, config->rxWatchdogEnable) | + _BOOL2FLD(I2S_RX_CTL_SCKO_POL, config->rxSckoInversion) | + _BOOL2FLD(I2S_RX_CTL_SCKI_POL, config->rxSckiInversion) | + _VAL2FLD(I2S_RX_CTL_CH_LEN, channelLength) | + _VAL2FLD(I2S_RX_CTL_WORD_LEN, config->rxWordLength) | + _BOOL2FLD(I2S_RX_CTL_BIT_EXTENSION, config->rxSignExtension); + } + + /* I2S enable setting */ + if(config->txEnabled) + { + base->CTL |= I2S_CTL_TX_ENABLED_Msk; + } + + if(config->rxEnabled) + { + base->CTL |= I2S_CTL_RX_ENABLED_Msk; + } + + /* FIFO setting */ + if(config->txEnabled) + { + base->TX_FIFO_CTL = _VAL2FLD(I2S_TX_FIFO_CTL_TRIGGER_LEVEL, config->txFifoTriggerLevel); + + base->TR_CTL |= _BOOL2FLD(I2S_TR_CTL_TX_REQ_EN, config->txDmaTrigger); + } + + if(config->rxEnabled) + { + base->RX_FIFO_CTL = _VAL2FLD(I2S_RX_FIFO_CTL_TRIGGER_LEVEL, config->rxFifoTriggerLevel); + + base->TR_CTL |= _BOOL2FLD(I2S_TR_CTL_RX_REQ_EN, config->rxDmaTrigger); + } + } + + return (ret); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_DeInit +****************************************************************************//** +* +* Uninitializes the I2S module (reverts default register values). +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +void Cy_I2S_DeInit(I2S_Type * base) +{ + base->INTR_MASK = 0UL; /* Disable interrupts prior to stopping the operation */ + base->CMD = 0UL; + base->TR_CTL = 0UL; + base->TX_FIFO_CTL = 0UL; + base->RX_FIFO_CTL = 0UL; + base->CTL = 0UL; + base->TX_CTL = CY_I2S_TX_CTL_DEFAULT; + base->RX_CTL = CY_I2S_RX_CTL_DEFAULT; + base->TX_WATCHDOG = 0UL; + base->RX_WATCHDOG = 0UL; + base->CLOCK_CTL = 0UL; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_DeepSleepCallback +****************************************************************************//** +* +* This is a callback function that can be used at the application layer to +* manage an I2S operation before entering into/after exiting from the Deep Sleep +* mode. +* +* \param +* callbackParams - A pointer to the callback parameters structure, +* see \ref cy_stc_syspm_callback_params_t. +* +* \return the SysPm callback status \ref cy_en_syspm_status_t. +* +* \note Use the \ref cy_stc_i2s_context_t data type for definition of the +* *context element of the \ref cy_stc_syspm_callback_params_t strusture. +* +*******************************************************************************/ +cy_en_syspm_status_t Cy_I2S_DeepSleepCallback(cy_stc_syspm_callback_params_t * callbackParams) +{ + cy_en_syspm_status_t ret = CY_SYSPM_SUCCESS; + CY_ASSERT_L1(NULL != callbackParams->context); + I2S_Type * locBase = (I2S_Type*) callbackParams->base; + uint32_t * locInterruptMask = (uint32_t*) &(((cy_stc_i2s_context_t*)(callbackParams->context))->interruptMask); + uint32_t * locState = (uint32_t*) &(((cy_stc_i2s_context_t*)(callbackParams->context))->enableState); + + switch(callbackParams->mode) + { + case CY_SYSPM_CHECK_READY: + case CY_SYSPM_CHECK_FAIL: + break; + + case CY_SYSPM_BEFORE_TRANSITION: + *locInterruptMask = Cy_I2S_GetInterruptMask(locBase); /* Store I2S interrupts */ + Cy_I2S_SetInterruptMask(locBase, 0UL); /* Disable I2S interrupts */ + *locState = Cy_I2S_GetCurrentState(locBase); /* Store I2S state */ + if(0UL != (*locState & I2S_CMD_TX_START_Msk)) + { + Cy_I2S_DisableTx(locBase); /* Stop TX operation */ + } + if(0UL != (*locState & I2S_CMD_RX_START_Msk)) + { + Cy_I2S_DisableRx(locBase); /* Stop RX operation */ + } + /* Unload FIFOs to do not lost any data (if needed) */ + break; + + case CY_SYSPM_AFTER_TRANSITION: + if(0UL != (*locState & I2S_CMD_RX_START_Msk)) + { + Cy_I2S_ClearRxFifo (locBase); /* Clear RX FIFO */ + Cy_I2S_EnableRx (locBase); /* Start RX operation */ + } + if(0UL != (*locState & I2S_CMD_TX_START_Msk)) + { + Cy_I2S_ClearTxFifo (locBase); /* Clear TX FIFO */ + Cy_I2S_WriteTxData (locBase, 0UL); /* Fill first TX frame */ + Cy_I2S_WriteTxData (locBase, 0UL); + if(0UL != (*locState & I2S_CMD_TX_PAUSE_Msk)) + { + Cy_I2S_PauseTx(locBase); /* Restore TX paused state */ + } + Cy_I2S_EnableTx(locBase); /* Start TX operation */ + } + Cy_I2S_SetInterruptMask (locBase, *locInterruptMask); /* Restore I2S interrupts */ + break; + + default: + ret = CY_SYSPM_FAIL; + break; + } + + return(ret); +} + + +#ifdef __cplusplus +} +#endif + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/i2s/cy_i2s.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/i2s/cy_i2s.h new file mode 100644 index 0000000000..a124832a33 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/i2s/cy_i2s.h @@ -0,0 +1,974 @@ +/***************************************************************************//** +* \file cy_i2s.h +* \version 2.0 +* +* The header file of the I2S driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_i2s Inter-IC Sound (I2S) +* \{ +* The I2S driver provides a function API to manage Inter-IC Sound. I2S is used +* to send digital audio streaming data to external I2S devices, such as audio +* codecs or simple DACs. It can also receive digital audio streaming data. +* +* Features: +* * An industry-standard NXP I2S interface +* * Supports master/slave TX/RX operation +* * Programmable Channel/Word Lengths +* * Supports External Clock operation +* +* The I2S bus is an industry standard. The hardware interface was +* developed by Philips Semiconductors (now NXP Semiconductors). +* +* \section group_i2s_configuration_considerations Configuration Considerations +* +* To set up an I2S, provide the configuration parameters in the +* \ref cy_stc_i2s_config_t structure. +* +* For example, for TX configuration, set txEnabled to true, configure +* txDmaTrigger (depending on whether DMA is going to be used or not), set +* extClk (if an external clock is used), provide clkDiv, txMasterMode, +* txAlignment, txChannels (only 2 is supported in I2S and Left Justified modes) +* txSdoLatchingTime (for slave mode only), txChannelLength, txWordLength, +* txWsPulseWidth (for TMD modes only), txWatchdogEnable and txWatchdogValue +* (both for slave mode only, and when the watchdog interrupt will be used), +* either txSckoInversion or txSckiInversion (based on txMasterMode setting), +* txFifoTriggerLevel (when the Trig interrupt will be used) and txOverheadValue +* (only when word length is less than channel length). +* The similar setup is for RX configuration. +* +* To initialize the I2S block, call the \ref Cy_I2S_Init function, providing the +* filled \ref cy_stc_i2s_config_t structure. +* Before starting the transmission, clear the FIFO \ref Cy_I2S_ClearTxFifo, then +* fill the first TX data frame by calling \ref Cy_I2S_WriteTxData once for each +* channel (e.g. twice for I2S mode with only two channels) with zero data. Then +* call the \ref Cy_I2S_EnableTx itself. +* For the reception the sequence is the same except of filling the first data +* frame, just RX FIFO clearing is enough. +* +* For example: +* \snippet i2s/i2s_v2_0_sut_00.cydsn/main_cm4.c Cy_I2S_Snippet +* +* If you use DMA, the DMA channel should be previously configured. I2S interrupts +* (if applicable) can be enabled by calling \ref Cy_I2S_SetInterruptMask. +* +* For example, if the trigger interrupt is used, during operation the ISR +* should call the \ref Cy_I2S_WriteTxData as many times as required for your +* FIFO payload, but not more than FIFO size. Then call \ref Cy_I2S_ClearInterrupt +* with appropriate parameters. +* +* The I2S/Left Justified data formats always contains two data channels. +* They are ordered one-by-one in the FIFOs, left always goes first. +* So in case of mono audio stream transmission, each sample can be put twice +* into the TX FIFO (in this case both channels will sound the same), +* or combined with zeroes: sample1-zero-sample2-zero (in this case only the +* left channel will finally sound, for right-only case zero should go first). +* The TDM frame word order in FIFOs is similar, one-by-one. +* +* If DMA is used and a DMA channel is properly configured - no CPU activity +* (or any application code) is needed for I2S operation. +* +* The I2S frame looks like the next: +* \image html i2s_frame.png +* This is an example for channel length = 32. The similar is for all the rest +* channel lengths, with only limitation: the word length could be less or equal +* to the channel length. See the device Technical Reference Manual (TRM) +* for more details. +* +* \section group_i2s_more_information More Information +* See the the I2S chapter of the device technical reference manual (TRM). +* Also, see I2S_PDL Component datasheet. +* +* \section group_i2s_MISRA MISRA-C Compliance +* The I2S driver has the following specific deviations: +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
    11.4AA cast should not be performed between a pointer to object type and +* a different pointer to object type.The function \ref Cy_I2S_DeepSleepCallback is a callback of +* \ref cy_en_syspm_status_t type. The cast operation safety in this +* function becomes the user responsibility because pointer are +* initialized when callback is registered in SysPm driver.
    +* +* \section group_i2s_changelog Changelog +* +* +* +* +* +* +* +* +* +* +* +* +*
    VersionChangesReason for Change
    1.0Initial version
    2.0The slave operation is added, Left Justified and TDM modes are added
    +* +* \defgroup group_i2s_macros Macros +* \defgroup group_i2s_functions Functions +* \defgroup group_i2s_data_structures Data Structures +* \defgroup group_i2s_enums Enumerated types +*/ + + +#if !defined CY_I2S_H +#define CY_I2S_H + +#include +#include +#include "syslib/cy_syslib.h" +#include "syspm/cy_syspm.h" + +#ifndef CY_IP_MXAUDIOSS + #error "The I2S driver is not supported on this device" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** \addtogroup group_i2s_macros +* \{ +*/ + +/** Driver major version */ +#define CY_I2S_DRV_VERSION_MAJOR 2 + +/** Driver minor version */ +#define CY_I2S_DRV_VERSION_MINOR 0 + +/** I2S driver identifier */ +#define CY_I2S_ID (CY_PDL_DRV_ID(0x20U)) + +/** +* \defgroup group_i2s_macros_intrerrupt_masks Interrupt Masks +* \{ +*/ + +/** Bit 0: Less entries in the TX FIFO than specified by Trigger Level. */ +#define CY_I2S_INTR_TX_TRIGGER (I2S_INTR_TX_TRIGGER_Msk) +/** Bit 1: TX FIFO is not full. */ +#define CY_I2S_INTR_TX_NOT_FULL (I2S_INTR_TX_NOT_FULL_Msk) +/** Bit 4: TX FIFO is empty, i.e. it has 0 entries. */ +#define CY_I2S_INTR_TX_EMPTY (I2S_INTR_TX_EMPTY_Msk) +/** Bit 5: Attempt to write to a full TX FIFO. */ +#define CY_I2S_INTR_TX_OVERFLOW (I2S_INTR_TX_OVERFLOW_Msk) +/** Bit 6: Attempt to read from an empty TX FIFO. +* This happens when the IP is ready to transfer data and TX_EMPTY is '1'. */ +#define CY_I2S_INTR_TX_UNDERFLOW (I2S_INTR_TX_UNDERFLOW_Msk) +/** Bit 8: Tx watchdog event occurs. */ +#define CY_I2S_INTR_TX_WD (I2S_INTR_TX_WD_Msk) +/** Bit 16: More entries in the RX FIFO than specified by Trigger Level. */ +#define CY_I2S_INTR_RX_TRIGGER (I2S_INTR_RX_TRIGGER_Msk) +/** Bit 18: RX FIFO is not empty. */ +#define CY_I2S_INTR_RX_NOT_EMPTY (I2S_INTR_RX_NOT_EMPTY_Msk) +/** Bit 19: RX FIFO is full. */ +#define CY_I2S_INTR_RX_FULL (I2S_INTR_RX_FULL_Msk) +/** Bit 21: Attempt to write to a full RX FIFO. */ +#define CY_I2S_INTR_RX_OVERFLOW (I2S_INTR_RX_OVERFLOW_Msk) +/** Bit 22: Attempt to read from an empty RX FIFO. */ +#define CY_I2S_INTR_RX_UNDERFLOW (I2S_INTR_RX_UNDERFLOW_Msk) +/** Bit 24: Rx watchdog event occurs. */ +#define CY_I2S_INTR_RX_WD (I2S_INTR_RX_WD_Msk) + +/** \} group_i2s_macros_intrerrupt_masks */ + + +/** +* \defgroup group_i2s_macros_current_state Current State +* \{ +*/ + +/** Transmission is active */ +#define CY_I2S_TX_START (I2S_CMD_TX_START_Msk) +/** Transmission is paused */ +#define CY_I2S_TX_PAUSE (I2S_CMD_TX_PAUSE_Msk) +/** Reception is active */ +#define CY_I2S_RX_START (I2S_CMD_RX_START_Msk) + +/** \} group_i2s_macros_current_state */ + +/** \} group_i2s_macros */ + +/** +* \addtogroup group_i2s_enums +* \{ +*/ + +/** +* I2S status definitions. +*/ + +typedef enum +{ + CY_I2S_SUCCESS = 0x00UL, /**< Successful. */ + CY_I2S_BAD_PARAM = CY_I2S_ID | CY_PDL_STATUS_ERROR | 0x01UL /**< One or more invalid parameters. */ +} cy_en_i2s_status_t; + + +/** +* I2S data alignment. +*/ +typedef enum +{ + CY_I2S_LEFT_JUSTIFIED = 0U, /**< Left justified. */ + CY_I2S_I2S_MODE = 1U, /**< I2S mode. */ + CY_I2S_TDM_MODE_A = 2U, /**< TDM mode A. */ + CY_I2S_TDM_MODE_B = 3U /**< TDM mode B. */ +} cy_en_i2s_alignment_t; + +/** +* I2S channel/word length. +*/ +typedef enum +{ + CY_I2S_LEN8 = 0U, /**< Channel/word length: 8 bit. */ + CY_I2S_LEN16 = 1U, /**< Channel/Word length: 16 bit. */ + CY_I2S_LEN18 = 2U, /**< Channel/Word length: 18 bit. */ + CY_I2S_LEN20 = 3U, /**< Channel/Word length: 20 bit. */ + CY_I2S_LEN24 = 4U, /**< Channel/Word length: 24 bit. */ + CY_I2S_LEN32 = 5U /**< Channel/Word length: 32 bit. */ +} cy_en_i2s_len_t; + +/** +* I2S TX overhead value. +*/ +typedef enum +{ + CY_I2S_OVHDATA_ZERO = 0U, /**< Fill overhead bits by zeroes. */ + CY_I2S_OVHDATA_ONE = 1U, /**< Fill overhead bits by ones. */ +} cy_en_i2s_overhead_t; + +/** +* I2S WS pulse width. +*/ +typedef enum +{ + CY_I2S_WS_ONE_SCK_CYCLE = 0U, /**< WS pulse width is one SCK cycle. */ + CY_I2S_WS_ONE_CHANNEL_LENGTH = 1U, /**< WS pulse width is one channel length. */ +} cy_en_i2s_ws_pw_t; + +/** \} group_i2s_enums */ + +/** +* \addtogroup group_i2s_data_structures +* \{ +*/ + +/** +* I2S initialization configuration. +*/ +typedef struct +{ + bool txEnabled; /**< Enables the I2S TX component: 'false': disabled. 'true': enabled. */ + bool rxEnabled; /**< Enables the I2S RX component: 'false': disabled. 'true': enabled. */ + bool txDmaTrigger; /**< 'false': TX DMA trigger disable, 'true': TX DMA trigger enable. */ + bool rxDmaTrigger; /**< 'false': RX DMA trigger disable, 'true': RX DMA trigger enable. */ + uint8_t clkDiv; /**< CLK_SEL divider: 1: Bypass, 2: 1/2, 3: 1/3, ..., 64: 1/64. */ + bool extClk; /**< 'false': internal clock, 'true': external clock. */ + bool txMasterMode; /**< 'false': TX in slave mode, 'true': TX in master mode. */ + cy_en_i2s_alignment_t txAlignment; /**< TX data alignment, see: #cy_en_i2s_alignment_t. */ + cy_en_i2s_ws_pw_t txWsPulseWidth; /**< TX Word Select pulse width. + The value of this parameter is ignored in TDM modes - the WS pulse + width is always "one channel length" is these modes. */ + bool txWatchdogEnable; /**< 'false': TX watchdog disabled, 'true': TX watchdog enabled. */ + uint32_t txWatchdogValue; /**< TX watchdog counter value (32 bit). */ + bool txSdoLatchingTime; /**< 'false': SDO bit starts at falling edge (accordingly to the I2S + Standard, if txSckoInversion is false), + 'true': SDO bit starts at rising edge which goes before the above + mentioned falling edge, i.e. the SDO signal is advanced by 0.5 SCK + period (if txSckoInversion is false). + If txSckoInversion is true - the rising/falling edges just swaps + in above explanations. + Effective only in slave mode, must be false in master mode.*/ + bool txSckoInversion; /**< TX SCKO polarity: + 'false': When transmitter is in master mode, serial data is + transmitted off the falling bit clock edge (accordingly to + the I2S Standard); + 'true': When transmitter is in master mode, serial data is + transmitted off the rising bit clock edge. + Effective only in master mode. */ + bool txSckiInversion; /**< TX SCKI polarity: + 'false': When transmitter is in slave mode, serial data is + transmitted off the falling bit clock edge (accordingly to + the I2S Standard); + 'true': When transmitter is in slave mode, serial data is + transmitted off the rising bit clock edge. + Effective only in slave mode. */ + uint8_t txChannels; /**< Number of TX channels, valid range is 1...8 for TDM modes. + In the I2S and Left Justified modes the value of this parameter is + ignored - the real number of channels is always 2 in these modes. */ + cy_en_i2s_len_t txChannelLength; /**< TX channel length, see #cy_en_i2s_len_t, + the value of this parameter is ignored in TDM modes, the real + channel length is 32 bit in these modes. */ + cy_en_i2s_len_t txWordLength; /**< TX word length, see #cy_en_i2s_len_t, + must be less or equal to txChannelLength. */ + cy_en_i2s_overhead_t txOverheadValue; /**< TX overhead bits value + when the word length is less than the channel length. */ + uint8_t txFifoTriggerLevel; /**< TX FIFO interrupt trigger level (0, 1, ..., 255). */ + bool rxMasterMode; /**< 'false': RX in slave mode, 'true': RX in master mode. */ + cy_en_i2s_alignment_t rxAlignment; /**< RX data alignment, see: #cy_en_i2s_alignment_t. */ + cy_en_i2s_ws_pw_t rxWsPulseWidth; /**< RX Word Select pulse width. + The value of this parameter is ignored in TDM modes - the WS pulse + width is always "one channel length" is these modes. */ + bool rxWatchdogEnable; /**< 'false': RX watchdog disabled, 'true': RX watchdog enabled. */ + uint32_t rxWatchdogValue; /**< RX watchdog counter value (32 bit). */ + bool rxSdiLatchingTime; /**< 'false': SDI bit starts at falling edge (accordingly to the I2S + Standard if rxSckoInversion is false), + 'true': SDI bit starts at rising edge which goes after the above + mentioned falling edge, i.e. the SDI signal is delayed by 0.5 SCK + period (if rxSckoInversion is false). + If rxSckoInversion is true - the rising/falling edges just swaps + in above explanations. + Effective only in master mode, must be false in slave mode. */ + bool rxSckoInversion; /**< RX SCKO polarity: + 'false': When receiver is in master mode, serial data is + captured by the rising bit clock edge (accordingly to the + I2S Standard); + 'true': When receiver is in master mode, serial data is + captured by the falling bit clock edge. + Effective only in master mode. */ + bool rxSckiInversion; /**< RX SCKI polarity: + 'false': When receiver is in slave mode, serial data is + captured by the rising bit clock edge (accordingly to the + I2S Standard); + 'true': When receiver is in slave mode, serial data is + captured by the falling bit clock edge. + Effective only in slave mode. */ + uint8_t rxChannels; /**< Number of RX channels, valid range is 1...8 for TDM modes. + In the I2S and Left Justified modes the value of this parameter is + ignored - the real number of channels is always 2 in these modes. */ + cy_en_i2s_len_t rxChannelLength; /**< RX channel length, see #cy_en_i2s_len_t, + the value of this parameter is ignored in TDM modes, the real + channel length is 32 bit in these modes. */ + cy_en_i2s_len_t rxWordLength; /**< RX word length, see #cy_en_i2s_len_t, + must be less or equal to rxChannelLength. */ + bool rxSignExtension; /**< RX value sign extension (when the word length is less than 32 bits), + 'false': all MSB are filled by zeroes, + 'true': all MSB are filled by the original sign bit value. */ + uint8_t rxFifoTriggerLevel; /**< RX FIFO interrupt trigger level + (0, 1, ..., (255 - (number of channels))). */ +} cy_stc_i2s_config_t; + + +/** + * I2S backup structure type to be used for SysPm callback + * \ref Cy_I2S_DeepSleepCallback context definition. + * + * \cond Also can be used for another purposes to store the current TX/RX + * operation state and interrupt settings - the factors that are usually + * being changed on the fly. \endcond + */ +typedef struct +{ + uint32_t enableState; /**< Stores I2S state */ + uint32_t interruptMask; /**< Stores I2S interrupt mask */ +} cy_stc_i2s_context_t; + +/** \} group_i2s_data_structures */ + +/** \cond INTERNAL */ +/****************************************************************************** + * Local definitions +*******************************************************************************/ + +#define CY_I2S_INTR_MASK (CY_I2S_INTR_TX_TRIGGER | \ + CY_I2S_INTR_TX_NOT_FULL | \ + CY_I2S_INTR_TX_EMPTY | \ + CY_I2S_INTR_TX_OVERFLOW | \ + CY_I2S_INTR_TX_UNDERFLOW | \ + CY_I2S_INTR_TX_WD | \ + CY_I2S_INTR_RX_TRIGGER | \ + CY_I2S_INTR_RX_NOT_EMPTY | \ + CY_I2S_INTR_RX_FULL | \ + CY_I2S_INTR_RX_OVERFLOW | \ + CY_I2S_INTR_RX_UNDERFLOW | \ + CY_I2S_INTR_RX_WD) + +/* Non-zero default values */ +#define CY_I2S_TX_CTL_CH_NR_DEFAULT (0x1U) +#define CY_I2S_TX_CTL_I2S_MODE_DEFAULT (0x2U) +#define CY_I2S_TX_CTL_WS_PULSE_DEFAULT (0x1U) +#define CY_I2S_TX_CTL_CH_LEN_DEFAULT (0x4U) +#define CY_I2S_TX_CTL_WORD_LEN_DEFAULT (0x4U) + +#define CY_I2S_TX_CTL_DEFAULT (_VAL2FLD(I2S_TX_CTL_CH_NR, CY_I2S_TX_CTL_CH_NR_DEFAULT) | \ + _VAL2FLD(I2S_TX_CTL_I2S_MODE, CY_I2S_TX_CTL_I2S_MODE_DEFAULT) | \ + _VAL2FLD(I2S_TX_CTL_WS_PULSE, CY_I2S_TX_CTL_WS_PULSE_DEFAULT) | \ + _VAL2FLD(I2S_TX_CTL_CH_LEN, CY_I2S_TX_CTL_CH_LEN_DEFAULT) | \ + _VAL2FLD(I2S_TX_CTL_WORD_LEN, CY_I2S_TX_CTL_WORD_LEN_DEFAULT)) + +#define CY_I2S_RX_CTL_CH_NR_DEFAULT (0x1U) +#define CY_I2S_RX_CTL_I2S_MODE_DEFAULT (0x2U) +#define CY_I2S_RX_CTL_WS_PULSE_DEFAULT (0x1U) +#define CY_I2S_RX_CTL_CH_LEN_DEFAULT (0x4U) +#define CY_I2S_RX_CTL_WORD_LEN_DEFAULT (0x4U) + +#define CY_I2S_RX_CTL_DEFAULT (_VAL2FLD(I2S_RX_CTL_CH_NR, CY_I2S_RX_CTL_CH_NR_DEFAULT) | \ + _VAL2FLD(I2S_RX_CTL_I2S_MODE, CY_I2S_RX_CTL_I2S_MODE_DEFAULT) | \ + _VAL2FLD(I2S_RX_CTL_WS_PULSE, CY_I2S_RX_CTL_WS_PULSE_DEFAULT) | \ + _VAL2FLD(I2S_RX_CTL_CH_LEN, CY_I2S_RX_CTL_CH_LEN_DEFAULT) | \ + _VAL2FLD(I2S_RX_CTL_WORD_LEN, CY_I2S_RX_CTL_WORD_LEN_DEFAULT)) + +/* Macros for conditions used by CY_ASSERT calls */ +#define CY_I2S_IS_ALIGNMENT_VALID(alignment) ((CY_I2S_LEFT_JUSTIFIED == (alignment)) || \ + (CY_I2S_I2S_MODE == (alignment)) || \ + (CY_I2S_TDM_MODE_A == (alignment)) || \ + (CY_I2S_TDM_MODE_B == (alignment))) + +#define CY_I2S_IS_LEN_VALID(length) ((CY_I2S_LEN8 == (length)) || \ + (CY_I2S_LEN16 == (length)) || \ + (CY_I2S_LEN18 == (length)) || \ + (CY_I2S_LEN20 == (length)) || \ + (CY_I2S_LEN24 == (length)) || \ + (CY_I2S_LEN32 == (length))) + +#define CY_I2S_IS_OVHDATA_VALID(overhead) ((CY_I2S_OVHDATA_ZERO == (overhead)) || \ + (CY_I2S_OVHDATA_ONE == (overhead))) + +#define CY_I2S_IS_WSPULSE_VALID(wsPulse) ((CY_I2S_WS_ONE_SCK_CYCLE == (wsPulse)) || \ + (CY_I2S_WS_ONE_CHANNEL_LENGTH == (wsPulse))) + +#define CY_I2S_IS_CLK_DIV_VALID(clkDiv) ((clkDiv) <= 63U) +#define CY_I2S_IS_CHANNELS_VALID(channels) ((channels) <= 7UL) +#define CY_I2S_IS_INTR_MASK_VALID(interrupt) (0UL == ((interrupt) & ((uint32_t) ~CY_I2S_INTR_MASK))) + +#define CY_I2S_IS_CHAN_WORD_VALID(channel, word) ((CY_I2S_IS_LEN_VALID(channel)) && \ + (CY_I2S_IS_LEN_VALID(word)) && \ + ((channel) >= (word))) +#define CY_I2S_IS_TRIG_LEVEL_VALID(trigLevel, channels) ((trigLevel) <= (255U - (channels))) + +/** \endcond */ + + +/** +* \addtogroup group_i2s_functions +* \{ +*/ + + cy_en_i2s_status_t Cy_I2S_Init(I2S_Type * base, cy_stc_i2s_config_t const * config); + void Cy_I2S_DeInit(I2S_Type * base); +cy_en_syspm_status_t Cy_I2S_DeepSleepCallback(cy_stc_syspm_callback_params_t * callbackParams); + +__STATIC_INLINE void Cy_I2S_EnableTx(I2S_Type * base); +__STATIC_INLINE void Cy_I2S_PauseTx(I2S_Type * base); +__STATIC_INLINE void Cy_I2S_ResumeTx(I2S_Type * base); +__STATIC_INLINE void Cy_I2S_DisableTx(I2S_Type * base); +__STATIC_INLINE void Cy_I2S_EnableRx(I2S_Type * base); +__STATIC_INLINE void Cy_I2S_DisableRx(I2S_Type * base); +__STATIC_INLINE uint32_t Cy_I2S_GetCurrentState(I2S_Type const * base); + +__STATIC_INLINE void Cy_I2S_ClearTxFifo(I2S_Type * base); +__STATIC_INLINE uint32_t Cy_I2S_GetNumInTxFifo(I2S_Type const * base); +__STATIC_INLINE void Cy_I2S_WriteTxData(I2S_Type * base, uint32_t data); +__STATIC_INLINE uint8_t Cy_I2S_GetTxReadPointer(I2S_Type const * base); +__STATIC_INLINE uint8_t Cy_I2S_GetTxWritePointer(I2S_Type const * base); +__STATIC_INLINE void Cy_I2S_FreezeTxFifo(I2S_Type * base); +__STATIC_INLINE void Cy_I2S_UnfreezeTxFifo(I2S_Type * base); + +__STATIC_INLINE void Cy_I2S_ClearRxFifo(I2S_Type * base); +__STATIC_INLINE uint32_t Cy_I2S_GetNumInRxFifo(I2S_Type const * base); +__STATIC_INLINE uint32_t Cy_I2S_ReadRxData(I2S_Type const * base); +__STATIC_INLINE uint32_t Cy_I2S_ReadRxDataSilent(I2S_Type const * base); +__STATIC_INLINE uint8_t Cy_I2S_GetRxReadPointer(I2S_Type const * base); +__STATIC_INLINE uint8_t Cy_I2S_GetRxWritePointer(I2S_Type const * base); +__STATIC_INLINE void Cy_I2S_FreezeRxFifo(I2S_Type * base); +__STATIC_INLINE void Cy_I2S_UnfreezeRxFifo(I2S_Type * base); + +__STATIC_INLINE uint32_t Cy_I2S_GetInterruptStatus(I2S_Type const * base); +__STATIC_INLINE void Cy_I2S_ClearInterrupt(I2S_Type * base, uint32_t interrupt); +__STATIC_INLINE void Cy_I2S_SetInterrupt(I2S_Type * base, uint32_t interrupt); +__STATIC_INLINE uint32_t Cy_I2S_GetInterruptMask(I2S_Type const * base); +__STATIC_INLINE void Cy_I2S_SetInterruptMask(I2S_Type * base, uint32_t interrupt); +__STATIC_INLINE uint32_t Cy_I2S_GetInterruptStatusMasked(I2S_Type const * base); + +/******************************************************************************* +* Function Name: Cy_I2S_EnableTx +****************************************************************************//** +* +* Starts an I2S transmission. Interrupts enabling (by the +* \ref Cy_I2S_SetInterruptMask) is required after this function call, in case +* if any I2S interrupts are used in the application. +* +* \pre Cy_I2S_Init() must be called before. +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_EnableTx(I2S_Type * base) +{ + base->CMD |= I2S_CMD_TX_START_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_PauseTx +****************************************************************************//** +* +* Pauses an I2S transmission. +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_PauseTx(I2S_Type * base) +{ + base->CMD |= I2S_CMD_TX_PAUSE_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_ResumeTx +****************************************************************************//** +* +* Resumes an I2S transmission. +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_ResumeTx(I2S_Type * base) +{ + base->CMD &= (uint32_t) ~I2S_CMD_TX_PAUSE_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_DisableTx +****************************************************************************//** +* +* Stops an I2S transmission. +* +* \pre TX interrupts disabling (by the \ref Cy_I2S_SetInterruptMask) is required +* prior to this function call, in case if any TX I2S interrupts are used. +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_DisableTx(I2S_Type * base) +{ + base->CMD &= (uint32_t) ~I2S_CMD_TX_START_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_EnableRx +****************************************************************************//** +* +* Starts an I2S reception. Interrupts enabling (by the +* \ref Cy_I2S_SetInterruptMask) is required after this function call, in case +* if any I2S interrupts are used in the application. +* +* \pre \ref Cy_I2S_Init() must be called before. +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_EnableRx(I2S_Type * base) +{ + base->CMD |= I2S_CMD_RX_START_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_DisableRx +****************************************************************************//** +* +* Stops an I2S reception. +* +* \pre RX interrupts disabling (by the \ref Cy_I2S_SetInterruptMask) is required +* prior to this function call, in case if any RX I2S interrupts are used. +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_DisableRx(I2S_Type * base) +{ + base->CMD &= (uint32_t) ~I2S_CMD_RX_START_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_GetCurrentState +****************************************************************************//** +* +* Returns the current I2S state (TX/RX running/paused/stopped). +* +* \param base The pointer to the I2S instance address. +* \return The current state \ref group_i2s_macros_current_state. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_I2S_GetCurrentState(I2S_Type const * base) +{ + return (base->CMD & (I2S_CMD_TX_START_Msk | I2S_CMD_TX_PAUSE_Msk | I2S_CMD_RX_START_Msk)); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_ClearTxFifo +****************************************************************************//** +* +* Clears TX FIFO (resets the Read/Write FIFO pointers). +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_ClearTxFifo(I2S_Type * base) +{ + base->TX_FIFO_CTL |= I2S_TX_FIFO_CTL_CLEAR_Msk; + base->TX_FIFO_CTL &= (uint32_t) ~I2S_TX_FIFO_CTL_CLEAR_Msk; + (void) base->TX_FIFO_CTL; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_GetNumInTxFifo +****************************************************************************//** +* +* Gets the number of used words in the TX FIFO. +* +* \param base The pointer to the I2S instance address. +* \return The current number of used words in rge TX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_I2S_GetNumInTxFifo(I2S_Type const * base) +{ + return (_FLD2VAL(I2S_TX_FIFO_STATUS_USED, base->TX_FIFO_STATUS)); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_WriteTxData +****************************************************************************//** +* +* Writes data to the TX FIFO. Increases the TX FIFO level. +* +* \param base The pointer to the I2S instance address. +* \param data Data to be written to the TX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_WriteTxData(I2S_Type * base, uint32_t data) +{ + base->TX_FIFO_WR = data; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_GetTxReadPointer +****************************************************************************//** +* +* Gets the TX FIFO Read pointer. This function is rather for debug purposes. +* +* \param base The pointer to the I2S instance address. +* \return The current TX Read pointer value. +* +*******************************************************************************/ +__STATIC_INLINE uint8_t Cy_I2S_GetTxReadPointer(I2S_Type const * base) +{ + return ((uint8_t) _FLD2VAL(I2S_TX_FIFO_STATUS_RD_PTR, base->TX_FIFO_STATUS)); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_GetTxWritePointer +****************************************************************************//** +* +* Gets the TX FIFO Write pointer. This function is rather for debug purposes. +* +* \param base The pointer to the I2S instance address. +* \return The current TX Write pointer value. +* +*******************************************************************************/ +__STATIC_INLINE uint8_t Cy_I2S_GetTxWritePointer(I2S_Type const * base) +{ + return ((uint8_t) _FLD2VAL(I2S_TX_FIFO_STATUS_WR_PTR, base->TX_FIFO_STATUS)); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_FreezeTxFifo +****************************************************************************//** +* +* Freezes the TX FIFO. This function is rather for debug purposes. +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_FreezeTxFifo(I2S_Type * base) +{ + base->TX_FIFO_CTL |= I2S_TX_FIFO_CTL_FREEZE_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_UnfreezeTxFifo +****************************************************************************//** +* +* Unfreezes the TX FIFO. This function is rather for debug purposes. +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_UnfreezeTxFifo(I2S_Type * base) +{ + base->TX_FIFO_CTL &= (uint32_t) ~I2S_TX_FIFO_CTL_FREEZE_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_ClearRxFifo +****************************************************************************//** +* +* Clears the RX FIFO (resets the Read/Write FIFO pointers). +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_ClearRxFifo(I2S_Type * base) +{ + base->RX_FIFO_CTL |= I2S_RX_FIFO_CTL_CLEAR_Msk; + base->RX_FIFO_CTL &= (uint32_t) ~I2S_RX_FIFO_CTL_CLEAR_Msk; + (void) base->RX_FIFO_CTL; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_GetNumInRxFifo +****************************************************************************//** +* +* Gets the number of used words in the RX FIFO. +* +* \param base The pointer to the I2S instance address. +* \return The current number of used words in rge RX FIFO. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_I2S_GetNumInRxFifo(I2S_Type const * base) +{ + return (_FLD2VAL(I2S_RX_FIFO_STATUS_USED, base->RX_FIFO_STATUS)); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_ReadRxData +****************************************************************************//** +* +* Reads data from the RX FIFO. Decreases the TX FIFO level. +* +* \param base The pointer to the I2S instance address. +* \return The read data. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_I2S_ReadRxData(I2S_Type const * base) +{ + return (base->RX_FIFO_RD); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_ReadRxDataSilent +****************************************************************************//** +* +* Reads data from the RX FIFO without updating the RX FIFO read pointer. +* This function is rather for debug purposes. +* +* \param base The pointer to the I2S instance address. +* \return The read data. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_I2S_ReadRxDataSilent(I2S_Type const * base) +{ + return (base->RX_FIFO_RD_SILENT); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_GetRxReadPointer +****************************************************************************//** +* +* Gets the RX FIFO Read pointer. This function is rather for debug purposes. +* +* \param base The pointer to the I2S instance address. +* \return The current RX Read pointer value. +* +*******************************************************************************/ +__STATIC_INLINE uint8_t Cy_I2S_GetRxReadPointer(I2S_Type const * base) +{ + return ((uint8_t) _FLD2VAL(I2S_RX_FIFO_STATUS_RD_PTR, base->RX_FIFO_STATUS)); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_GetRxWritePointer +****************************************************************************//** +* +* Gets the RX FIFO Write pointer. This function is rather for debug purposes. +* +* \param base The pointer to the I2S instance address. +* \return The current RX Write pointer value. +* +*******************************************************************************/ +__STATIC_INLINE uint8_t Cy_I2S_GetRxWritePointer(I2S_Type const * base) +{ + return ((uint8_t) _FLD2VAL(I2S_RX_FIFO_STATUS_WR_PTR, base->RX_FIFO_STATUS)); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_FreezeRxFifo +****************************************************************************//** +* +* Freezes the RX FIFO. This function is rather for debug purposes. +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_FreezeRxFifo(I2S_Type * base) +{ + base->RX_FIFO_CTL |= I2S_RX_FIFO_CTL_FREEZE_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_UnfreezeRxFifo +****************************************************************************//** +* +* Unfreezes the RX FIFO. This function is rather for debug purposes. +* +* \param base The pointer to the I2S instance address. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_UnfreezeRxFifo(I2S_Type * base) +{ + base->RX_FIFO_CTL &= (uint32_t) ~I2S_RX_FIFO_CTL_FREEZE_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_GetInterruptStatus +****************************************************************************//** +* +* Gets an interrupt status (returns a content of the INTR register). +* +* \param base The pointer to the I2S instance address. +* \return The interrupt bit mask \ref group_i2s_macros_intrerrupt_masks. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_I2S_GetInterruptStatus(I2S_Type const * base) +{ + return (base->INTR); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_ClearInterrupt +****************************************************************************//** +* +* Clears one or more interrupt factors (sets the INTR register). +* +* \param base The pointer to the I2S instance address. +* \param interrupt Interrupt bit mask \ref group_i2s_macros_intrerrupt_masks. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_ClearInterrupt(I2S_Type * base, uint32_t interrupt) +{ + CY_ASSERT_L2(CY_I2S_IS_INTR_MASK_VALID(interrupt)); + base->INTR = interrupt; + (void) base->INTR; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_SetInterrupt +****************************************************************************//** +* +* Sets one or more interrupt factors (sets the INTR_SET register). +* +* \param base The pointer to the I2S instance address. +* \param interrupt Interrupt bit mask \ref group_i2s_macros_intrerrupt_masks. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_SetInterrupt(I2S_Type * base, uint32_t interrupt) +{ + CY_ASSERT_L2(CY_I2S_IS_INTR_MASK_VALID(interrupt)); + base->INTR_SET = interrupt; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_GetInterruptMask +****************************************************************************//** +* +* Returns the interrupt mask (a content of the INTR_MASK register). +* +* \param base The pointer to the I2S instance address. +* \return The interrupt bit mask \ref group_i2s_macros_intrerrupt_masks. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_I2S_GetInterruptMask(I2S_Type const * base) +{ + return (base->INTR_MASK); +} + + +/******************************************************************************* +* Function Name: Cy_I2S_SetInterruptMask +****************************************************************************//** +* +* Sets one or more interrupt factor masks (the INTR_MASK register). +* +* \param base The pointer to the I2S instance address. +* \param interrupt Interrupt bit mask \ref group_i2s_macros_intrerrupt_masks. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_I2S_SetInterruptMask(I2S_Type * base, uint32_t interrupt) +{ + CY_ASSERT_L2(CY_I2S_IS_INTR_MASK_VALID(interrupt)); + base->INTR_MASK = interrupt; +} + + +/******************************************************************************* +* Function Name: Cy_I2S_GetInterruptStatusMasked +****************************************************************************//** +* +* Returns the interrupt status masked (a content of the INTR_MASKED register). +* +* \param base The pointer to the I2S instance address. +* \return The interrupt bit mask(s) \ref group_i2s_macros_intrerrupt_masks. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_I2S_GetInterruptStatusMasked(I2S_Type const * base) +{ + return (base->INTR_MASKED); +} + +/** \} group_i2s_functions */ + +#ifdef __cplusplus +} +#endif + +#endif /* CY_I2S_H */ + + +/** \} group_i2s */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_config.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_config.c new file mode 100644 index 0000000000..d2ebdd9a52 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_config.c @@ -0,0 +1,143 @@ +/***************************************************************************//** +* \file cy_ipc_config.c +* \version 1.10 +* +* Description: +* This C file is not intended to be part of the IPC driver. It is the code +* required to configure the device specific IPC channels for semaphores +* and pipes. +* +******************************************************************************** +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "flash/cy_flash.h" +#include "ipc/cy_ipc_drv.h" +#include "ipc/cy_ipc_pipe.h" +#include "ipc/cy_ipc_sema.h" +#include "sysint/cy_sysint.h" + +#include "cy_ipc_config.h" + +static void Cy_Flash_NotifyHandler(uint32_t * msgPtr); + +/* Create an array of endpoint structures */ +static cy_stc_ipc_pipe_ep_t cy_ipc_pipe_sysEpArray[CY_IPC_MAX_ENDPOINTS]; + +#define CY_CYPIPE_DEFAULT_CONFIG \ +{\ + /* .ep0ConfigData */ {\ + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP0,\ + /* .ipcNotifierPriority */ CY_IPC_INTR_CYPIPE_PRIOR_EP0,\ + /* .ipcNotifierMuxNumber */ CY_IPC_INTR_CYPIPE_MUX_EP0,\ + /* .epAddress */ CY_IPC_EP_CYPIPE_CM0_ADDR,\ + /* .epConfig */ CY_IPC_CYPIPE_CONFIG_EP0\ + },\ + /* .ep1ConfigData */ {\ + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP1,\ + /* .ipcNotifierPriority */ CY_IPC_INTR_CYPIPE_PRIOR_EP1,\ + /* .ipcNotifierMuxNumber */ 0u,\ + /* .epAddress */ CY_IPC_EP_CYPIPE_CM4_ADDR,\ + /* .epConfig */ CY_IPC_CYPIPE_CONFIG_EP1\ + },\ + /* .endpointClientsCount */ CY_IPC_CYPIPE_CLIENT_CNT,\ + /* .endpointsCallbacksArray */ cy_ipc_pipe_sysCbArray,\ + /* .userPipeIsrHandler */ &Cy_IPC_SystemPipeIsr\ +} + +/******************************************************************************* +* Function Name: Cy_IPC_SystemSemaInit +****************************************************************************//** +* +* Initializes the system semaphores. +* +*******************************************************************************/ +void Cy_IPC_SystemSemaInit(void) +{ +/* Create array used for semaphores */ +#if !(CY_CPU_CORTEX_M0P) + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, 0ul, NULL); +#else + static uint32_t ipcSemaArray[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD]; + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, CY_IPC_SEMA_COUNT, ipcSemaArray); +#endif +} + +/******************************************************************************* +* Function Name: Cy_IPC_SystemPipeInit +****************************************************************************//** +* +* Initializes the system pipes. The system pipes are used by BLE. +* \note The function should be called on all CPUs. +* +*******************************************************************************/ +void Cy_IPC_SystemPipeInit(void) +{ + uint32_t intr; + + intr = Cy_SysLib_EnterCriticalSection(); + + static cy_ipc_pipe_callback_ptr_t cy_ipc_pipe_sysCbArray[CY_IPC_CYPIPE_CLIENT_CNT]; + + static const cy_stc_ipc_pipe_config_t systemPipeConfig = CY_CYPIPE_DEFAULT_CONFIG; + + Cy_IPC_Pipe_Config(cy_ipc_pipe_sysEpArray); + + Cy_IPC_Pipe_Init(&systemPipeConfig); + + (void)Cy_IPC_Pipe_RegisterCallback(CY_IPC_EP_CYPIPE_ADDR, &Cy_Flash_NotifyHandler, (uint32_t)CY_FLASH_IPC_CLIENT_ID); + + Cy_SysLib_ExitCriticalSection(intr); +} + +/******************************************************************************* +* Function Name: Cy_IPC_SystemPipeIsr +****************************************************************************//** +* +* This is the interrupt service routine for the system pipe. +* +*******************************************************************************/ +void Cy_IPC_SystemPipeIsr(void) +{ + Cy_IPC_Pipe_ExecCallback(&cy_ipc_pipe_sysEpArray[CY_IPC_EP_CYPIPE_ADDR]); +} + +/******************************************************************************* +* Function Name: Cy_Flash_NotifyHandler +****************************************************************************//** +* +* This is the interrupt service routine for the pipe notifications. +* +*******************************************************************************/ +#if defined (__ICCARM__) + __ramfunc +#else + CY_SECTION(".cy_ramfunc") +#endif +static void Cy_Flash_NotifyHandler(uint32_t * msgPtr) +{ + uint32_t intr; + + IPC_MSG *ipcMsgPtr = (IPC_MSG *)msgPtr; + + if (CY_FLASH_ENTER_WAIT_LOOP == ipcMsgPtr->pktType) + { + intr = Cy_SysLib_EnterCriticalSection(); + + /* Notification to the Flash driver to start the current operation */ + (void) Cy_IPC_Sema_Set(CY_FLASH_WAIT_SEMA, true); + + /* Notification to me about the end of the operation */ + while (CY_IPC_SEMA_STATUS_LOCKED == Cy_IPC_Sema_Status(CY_FLASH_WAIT_SEMA)) + { + } + + Cy_SysLib_ExitCriticalSection(intr); + } +} + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_config.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_config.h new file mode 100644 index 0000000000..97be5db9ee --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_config.h @@ -0,0 +1,137 @@ +/***************************************************************************//** +* \file cy_ipc_config.h +* \version 1.10 +* +* \brief +* This header file is not intended to be part of the IPC driver since it defines +* a device specific configuration for the IPC channels and pipes. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef CY_IPC_CONFIG_H +#define CY_IPC_CONFIG_H + +/* IPC Resources */ +#define CY_IPC_CHANNELS (uint32_t)(CPUSS_IPC_IPC_NR) +#define CY_IPC_INTERRUPTS (uint32_t)(CPUSS_IPC_IPC_IRQ_NR) + +/* IPC channel definitions */ +#define CY_IPC_CHAN_SYSCALL_CM0 (0u) /* System calls for the CM0 processor */ +#define CY_IPC_CHAN_SYSCALL_CM4 (1u) /* System calls for the 1st non-CM0 processor */ +#if (CY_CPU_CORTEX_M0P) + #define CY_IPC_CHAN_SYSCALL CY_IPC_CHAN_SYSCALL_CM0 + #define Cy_IPC_SystemPipeIsr NvicMux1_IRQHandler +#else + #define CY_IPC_CHAN_SYSCALL CY_IPC_CHAN_SYSCALL_CM4 + #define Cy_IPC_SystemPipeIsr cpuss_interrupts_ipc_4_IRQHandler +#endif /* (CY_CPU_CORTEX_M0P) */ + +#define CY_IPC_CHAN_SYSCALL_DAP (uint32_t)(2u) /**< System calls for the DAP */ +#define CY_IPC_CHAN_CRYPTO (uint32_t)(3u) /**< IPC data channel for the Crypto */ +#define CY_IPC_CHAN_SEMA (uint32_t)(4u) /**< IPC data channel for the Semaphores */ + +#define CY_IPC_CHAN_CYPIPE_EP0 (uint32_t)(5u) /**< IPC data channel for CYPIPE EP0 */ +#define CY_IPC_CHAN_CYPIPE_EP1 (uint32_t)(6u) /**< IPC data channel for CYPIPE EP1 */ + +/* IPC Notify interrupts definitions */ +#define CY_IPC_INTR_SYSCALL1 (uint32_t)(0u) + +#define CY_IPC_INTR_CRYPTO_SRV (uint32_t)(1u) /**< IPC interrupt structure for the Crypto server */ +#define CY_IPC_INTR_CRYPTO_CLI (uint32_t)(2u) /**< IPC interrupt structure for the Crypto client */ + +#define CY_IPC_INTR_SPARE (uint32_t)(7u) + +/* IPC Semaphores allocation + This will allow 128 (4*32) semaphores */ +#define CY_IPC_SEMA_COUNT (uint32_t)(128u) + +/* System IPC Notify Masks */ +#define CY_IPC_SEMA_NOTIFY_MASK (uint32_t)(0x0001ul << CY_IPC_CHAN_SEMA) + +/* System IPC channel release Masks */ +#define CY_IPC_SEM_RELEASE_MASK (uint32_t)(0x0001ul << CY_IPC_CHAN_SEMA) + +/* IPC Pipe definitions */ +#define CY_IPC_MAX_ENDPOINTS (uint32_t)(8u) + +/******************************************************************************* +** CY_PIPE default configuration +*******************************************************************************/ +#define CY_IPC_CYPIPE_CLIENT_CNT (uint32_t)(8u) +#define CY_IPC_USRPIPE_CLIENT_CNT (uint32_t)(8u) + +#if (CY_CPU_CORTEX_M0P) + #define CY_IPC_EP_CYPIPE_ADDR CY_IPC_EP_CYPIPE_CM0_ADDR +#else + #define CY_IPC_EP_CYPIPE_ADDR CY_IPC_EP_CYPIPE_CM4_ADDR +#endif /* (CY_CPU_CORTEX_M0P) */ + +#define CY_IPC_INTR_CYPIPE_MUX_EP0 (uint32_t)(1u) /* IPC CYPRESS PIPE */ +#define CY_IPC_INTR_CYPIPE_EP0 (uint32_t)(3u) /* Notifier EP0 */ +#define CY_IPC_INTR_CYPIPE_PRIOR_EP0 (uint32_t)(1u) /* Notifier Priority */ + +#define CY_IPC_INTR_CYPIPE_EP1 (uint32_t)(4u) /* Notifier EP1 */ +#define CY_IPC_INTR_CYPIPE_PRIOR_EP1 (uint32_t)(1u) /* Notifier Priority */ + +#define CY_IPC_CYPIPE_CHAN_MASK_EP0 (uint32_t)(0x0001ul << CY_IPC_CHAN_CYPIPE_EP0) +#define CY_IPC_CYPIPE_CHAN_MASK_EP1 (uint32_t)(0x0001ul << CY_IPC_CHAN_CYPIPE_EP1) + +/* Endpoint indexes in the pipe array */ +#define CY_IPC_EP_CYPIPE_CM0_ADDR (uint32_t)(0u) +#define CY_IPC_EP_CYPIPE_CM4_ADDR (uint32_t)(1u) + +/******************************************************************************/ + +/* + * The System pipe configuration defines the IPC channel number, interrupt + * number, and the pipe interrupt mask for the endpoint. + * + * The format of the endPoint configuration + * Bits[31:16] Interrupt Mask + * Bits[15:8 ] IPC interrupt + * Bits[ 7:0 ] IPC channel + */ + +/* System Pipe addresses */ +/* CyPipe defines */ + +#define CY_IPC_CYPIPE_CONFIG_EP0 (uint32_t)( (CY_IPC_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \ + | (CY_IPC_INTR_CYPIPE_EP0 << CY_IPC_PIPE_CFG_INTR_Pos) \ + | CY_IPC_CHAN_CYPIPE_EP0) +#define CY_IPC_CYPIPE_CONFIG_EP1 (uint32_t)( (CY_IPC_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \ + | (CY_IPC_INTR_CYPIPE_EP1 << CY_IPC_PIPE_CFG_INTR_Pos) \ + | CY_IPC_CHAN_CYPIPE_EP1) +#define CY_IPC_CYPIPE_INTR_MASK (uint32_t)( CY_IPC_CYPIPE_CHAN_MASK_EP0 | CY_IPC_CYPIPE_CHAN_MASK_EP1 ) + +/******************************************************************************/ +#define CY_IPC_CHAN_USRPIPE_CM0 (uint32_t)(8u) +#define CY_IPC_CHAN_USRPIPE_CM4 (uint32_t)(9u) + +#define CY_IPC_INTR_USRPIPE_CM0 (uint32_t)(8u) +#define CY_IPC_INTR_USRPIPE_CM4 (uint32_t)(9u) + +#define CY_IPC_EP_USRPIPE_ADDR_EP0 (uint32_t)(2u) +#define CY_IPC_EP_USRPIPE_ADDR_EP1 (uint32_t)(3u) + +#ifdef __cplusplus +extern "C" { +#endif + +void Cy_IPC_SystemSemaInit(void); +void Cy_IPC_SystemPipeInit(void); +void Cy_IPC_SystemPipeIsr(void); + +#ifdef __cplusplus +} +#endif + +#endif /* CY_IPC_CONFIG_H */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_drv.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_drv.c new file mode 100644 index 0000000000..b1d73a4778 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_drv.c @@ -0,0 +1,172 @@ +/***************************************************************************//** +* \file cy_ipc_drv.c +* \version 1.10 +* +* \breif +* IPC Driver - This source file contains the low-level driver code for +* the IPC hardware. +* +******************************************************************************** +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_ipc_drv.h" + + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_LockRelease +****************************************************************************//** +* +* The function is used to release an IPC channel from the locked state. +* The function also has a way to specify through a parameter which IPC +* interrupts must be notified during the release event. +* +* This function is internal and should not be called directly by user software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \param releaseEventIntr +* Bit encoded list of IPC interrupt lines that are triggered by a release event. +* +* \return Status of the operation +* \retval CY_IPC_DRV_SUCCESS: The function executed successfully and the IPC channel +* was released. +* \retval CY_IPC_DRV_ERROR: The IPC channel was not acquired before the +* function call. +* +*******************************************************************************/ +#if defined (__ICCARM__) + __ramfunc +#else + CY_SECTION(".cy_ramfunc") +#endif +cy_en_ipcdrv_status_t Cy_IPC_Drv_LockRelease (IPC_STRUCT_Type* base, uint32_t releaseEventIntr) +{ + cy_en_ipcdrv_status_t retStatus; + + /* Check to make sure the IPC is Acquired */ + if( Cy_IPC_Drv_IsLockAcquired(base) ) + { + /* The IPC was acquired, release the IPC channel */ + Cy_IPC_Drv_ReleaseNotify(base, releaseEventIntr); + + retStatus = CY_IPC_DRV_SUCCESS; + } + else /* The IPC channel was already released (not acquired) */ + { + retStatus = CY_IPC_DRV_ERROR; + } + + return (retStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_SendMsgWord +****************************************************************************//** +* +* This function is used to send a 32-bit word message through an IPC channel. +* The function also has an associated notification field that will let the +* message notify one or multiple IPC interrupts. The IPC channel is locked and +* remains locked after the function returns. The receiver of the message should +* release the channel. +* +* This function is internal and should not be called directly by user software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \param notifyEventIntr +* Bit encoded list of IPC interrupt lines that are triggered by a notification. +* +* \param message +* The message word that is the data placed in the IPC data register. +* +* \return Status of the operation: +* \retval CY_IPC_DRV_SUCCESS: The send operation was successful. +* \retval CY_IPC_DRV_ERROR: The IPC channel is unavailable because it is already locked. +* +*******************************************************************************/ +cy_en_ipcdrv_status_t Cy_IPC_Drv_SendMsgWord (IPC_STRUCT_Type* base, uint32_t notifyEventIntr, uint32_t message) +{ + cy_en_ipcdrv_status_t retStatus; + + if( CY_IPC_DRV_SUCCESS == Cy_IPC_Drv_LockAcquire(base) ) + { + /* If the channel was acquired, send the message. */ + Cy_IPC_Drv_WriteDataValue(base, message); + + Cy_IPC_Drv_AcquireNotify(base, notifyEventIntr); + + retStatus = CY_IPC_DRV_SUCCESS; + } + else + { + /* Channel was already acquired, return Error */ + retStatus = CY_IPC_DRV_ERROR; + } + return (retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_ReadMsgWord +****************************************************************************//** +* +* This function is used to read a 32-bit word message through an IPC channel. +* This function assumes that the channel is locked (for a valid message). +* If the channel is not locked, the message is invalid. The user must call +* Cy_IPC_Drv_Release() function after reading the message to release the +* IPC channel. +* +* This function is internal and should not be called directly by user software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \param message +* A variable where the read data is copied. +* +* \return Status of the operation +* \retval CY_IPC_DRV_SUCCESS: The function executed successfully and the IPC +* was acquired. +* \retval CY_IPC_DRV_ERROR: The function encountered an error because the IPC +* channel was already in a released state, meaning the data +* may be invalid. +* +*******************************************************************************/ +cy_en_ipcdrv_status_t Cy_IPC_Drv_ReadMsgWord (IPC_STRUCT_Type const * base, uint32_t * message) +{ + cy_en_ipcdrv_status_t retStatus; + + CY_ASSERT_L1(NULL != message); + + if ( Cy_IPC_Drv_IsLockAcquired(base) ) + { + /* The channel is locked; message is valid. */ + *message = Cy_IPC_Drv_ReadDataValue(base); + + retStatus = CY_IPC_DRV_SUCCESS; + } + else + { + /* The channel is not locked so channel is invalid. */ + retStatus = CY_IPC_DRV_ERROR; + } + return(retStatus); +} + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_drv.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_drv.h new file mode 100644 index 0000000000..9c41d9f626 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_drv.h @@ -0,0 +1,900 @@ +/***************************************************************************//** +* \file cy_ipc_drv.h +* \version 1.10 +* +* Provides an API declaration of the IPC driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef CY_IPC_DRV_H +#define CY_IPC_DRV_H + + +/** +* \defgroup group_ipc Inter Process Communication (IPC) +* \{ +* The inter-processor communication (IPC) driver provides a safe and reliable +* method to transfer data between CPUs. Hardware locking ensures that only one +* device can acquire and transfer data at a time so no data is lost or +* overwritten by asynchronous processes or CPUs. +* +* There are three parts to the API: +* - Driver-level (DRV) API - used internally by Semaphore and Pipe levels +* - Pipe-level (PIPE) API - establishes a communication channel between +* processors +* - Semaphore-level (SEMA) API - enables users to set and clear flags to +* synchronize operations. +* +* Firmware does not need to use the DRV API. It can implement IPC functionality +* entirely with the PIPE and SEMA APIs. +* +* \note "Warning[Ta023]: Call to a non __ramfunc function." - The warning may +* appear during the build process while using IAR IDE. The reason - some +* functions in RAM memory that use the __ramfunc keyword, may invoke +* functions located in the ROM memory. You can ignore this warning or +* disable it by adding the --diag_suppress=Ta023 option to the compiler. +* +* \section group_ipc_background Background +* +* IPC is implemented in hardware as a collection of individual communication +* channels, each with a set of 32-bit registers. The IPC design implements a set +* of interrupts that enable each processor to notify the other that data is +* available, or has been processed. There is also a locking mechanism that +* allows only one CPU to gain access at a time. +* +* The Driver-level API manages each channel's registers to implement IPC +* functionality. For information on the IPC registers, see the IPC chapter of +* the Technical Reference Manual (TRM). +* +* At the hardware level, communication is a five-step process. +* -# The sending processor acquires a channel +* -# It puts data into the channel +* -# The sender generates a notify event (interrupt) +* -# The receiving processor identifies the sender and retrieves the data +* -# The receiving processor generates a release event (interrupt) +* +* \image html ipc_driver.png +* +* These transactions are handled transparently by the DRV-level API. Use the +* PIPE and SEMA layers of the API to implement communication in your application. +* The data transferred is limited to a single 32-bit value. As implemented by +* the PIPE API, that value is a pointer to a data structure of arbitrary size +* and complexity. +* +* \section group_ipc_overview Overview +* +* The Pipe is the key element in the PDL design. A pipe is typically a +* full-duplex communication channel between CPU cores. A pipe allows a single +* conduit to transfer messages or data to and from multiple processes or CPUs. +* +* A pipe has two endpoints, one on each core. Each endpoint contains a dedicated +* IPC channel and an interrupt. IPC channels 0-7 and IPC interrupts 0-7 are +* reserved for system use. +* +* The pipe also contains the number of clients it supports, and for each client +* a callback function. So the pipe can service a number of clients, each with a +* separate callback function, on either endpoint. The number of clients a pipe +* supports is the sum of each endpoint's clients. +* +* This design enables any number of processes on the sending core to put +* arbitrary data into a single pipe. The first element of that data is the +* client ID of the client that should handle the data. +* +* An interrupt notifies the receiving core that data is available. The receiving +* core parses the data to identify the client, and then dispatches the event to +* the appropriate client via the client callback function. An interrupt notifies +* the sending core that the receiver is finished. In this way a single pipe can +* manage arbitrary data transfers between cores with data flowing in either +* direction. +* +* \image html ipc_ints.png +* +* The application can use semaphores to control access to shared resources, as +* required by the application's logic. +* +* The PDL provides two specific files that set up default IPC functionality. +* They are cy_ipc_config.h and cy_ipc_config.c. You can modify these files based +* on the requirements of your design. If you use PSoC Creator as a development +* environment, it will not overwrite your changes when you generate the +* application or build your code. +* +* \section group_ipc_pipe_layer PIPE layer +* +* A pipe is a communication channel between two endpoints. PSoC 6 devices support +* 16 IPC channels, and 16 IPC interrupts, each numbered 0-15. IPC Channels 0-7 +* and IPC interrupts 0-7 are reserved for system use. Channels 8-15 and +* interrupts 8-15 are available for application use. +* +* A full duplex pipe uses two IPC channels, one per endpoint. Each endpoint +* specifies all the information required to process a message (either sent or +* received). Each endpoint is configured to use an IPC channel, and an IPC +* interrupt. Common practice is to use the interrupt with the same number as +* the IPC channel. However, IPC Interrupts are not directly associated with the +* IPC channels, so any channel can use any interrupt. Any IPC channel can +* trigger 0, 1 or all the IPC interrupts at once, depending on the Notify or +* Release masks used. +* +* It is also possible to set up a one-directional pipe, using a single IPC +* channel. In this design one processor is always the sender, and the other is +* always the receiver. However, there are still two endpoints. +* +* A pipe supports an arbitrary number of clients with an array of callback +* functions, one per client. The client ID is the index number into the array +* for the client. After a pipe is configured and initialized, the application +* calls Cy_IPC_Pipe_RegisterCallback() once per client to register each client's +* callback function. Multiple clients can use the same callback function. The +* endpoints in a pipe share the callback array. +* +* Use Cy_IPC_Pipe_SendMessage() to send data. You specify both the "to" and +* "from" endpoints, and a callback function to be used when the data transfer is +* complete. The data is a 32-bit void pointer. The data pointed to is arbitrary, +* and can be an array, a structure, or a location in memory. The only limitation +* is that the first element of the data must be a 32-bit unsigned word containing +* a client ID number. The ID number is the index into the callback array. +* +* When a message is sent, the receiving endpoint's interrupt handler is called. +* The ISR can perform any task required by the design. However, as part of its +* function it calls \ref Cy_IPC_Pipe_ExecCallback. This function retrieves the +* client ID from the data and calls the associated callback function. +* The user-supplied callback function handles the data in whatever way is +* appropriate based on the application logic. +* +* After the callback function is returned by the receiver, it invokes the release +* callback function defined by the sender of the message. +* +* \section group_ipc_sema_layer SEMA Layer +* +* A semaphore is a flag the application uses to control access to a shared +* resource. The SEMA-level API uses an IPC channel to implement +* semaphores. Startup code sets up a default semaphore system. The +* default system creates an array of 128 semaphores (four 32-bit values). +* Semaphores 0-15 are reserved for system use. See +* Configuration Considerations - SEMA. +* +* Functions are available to initialize the semaphore system, to set or +* clear a semaphore, or to get the semaphore's current status. Application +* logic uses SEMA functions to relate a particular semaphore to a particular +* shared resource, and set, clear, or check the flag when accessing the +* shared resource. +* +* \section group_ipc_configuration_cypipe Configuration Considerations - CYPIPE +* +* There are none. The cy_ipc_config files set up the required CYPIPE for system +* use. Do not modify the CYPIPE. It uses IPC channels 5 and 6 to implement full +* duplex communication between cores. On the CM0+ the notify interrupt is +* assigned to NVIC IRQn 27. See System Interrupt (SysInt) for background. +* +* \section group_ipc_configuration_sema Configuration Considerations - SEMA +* +* Startup code calls Cy_IPC_SystemSemaInit (in cy_ipc_config.c) to set up +* semaphore functionality. This function calls the PDL init function +* Cy_IPC_Sema_Init() with default values. By default the semaphore system +* uses IPC channel 4, and creates 128 semaphores. Do not change the IPC +* channel. You can change the number of semaphores. +* +* To change the number of semaphores, modify this line of code in cy_ipc_config.h. +* +* \code +* #define CY_IPC_SEMA_COUNT (uint32_t)(128u) +* \endcode +* +* The file cy_ipc_config.c declares array ipcSemaArray to hold the semaphore +* flags based on the size defined for this symbol. Use increments of 32. You +* must have at least 32 semaphores. Semaphores 0-15 are reserved for +* system use. Your application can use semaphores greater than 15. +* +* \section group_ipc_more_information More Information +* +* See the technical reference manual(TRM) for more information on the IPC. +* +* \section group_ipc_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
    10.3RThe value of a complex expression of integer type shall be cast +* only to a type of the same signedness that is no wider than the underlying +* type of the expression.The cast from integer to enumeration value is used to calculate +* the interrupt vector source from the integer number of the IPC interrupt +* structure, so there is no way to avoid this cast.
    11.4AA cast should not be performed between a pointer to the void to a +* pointer to the object type.The cast from the void to pointer and vice versa is used to transmit +* data via the \ref group_ipc channel by exchanging the pointer. We +* exchange only one pointer, so there is no way to avoid this cast.
    +* +* \defgroup group_ipc_drv IPC driver layer (IPC_DRV) +* \{ +* The functions of this layer are used in the higher IPC levels +* (Semaphores and Pipes). +* Users should not call any of these IPC functions directly. +* +* \defgroup group_ipc_macros Macros +* Macro definitions are used in the driver +* +* \defgroup group_ipc_functions Functions +* Functions are used in the driver +* +* \defgroup group_ipc_data_structures Data Structures +* Data structures are used in the driver +* +* \defgroup group_ipc_enums Enumerated Types +* Enumerations are used in the driver +* \} +* +* \defgroup group_ipc_sema IPC semaphores layer (IPC_SEMA) +* \defgroup group_ipc_pipe IPC pipes layer (IPC_PIPE) +* +*/ + +/******************************************************************************/ +/* Include files */ +/******************************************************************************/ +#include "syslib/cy_syslib.h" +#include "cy_device_headers.h" +#include "cy_ipc_config.h" +#include + +/** +* \addtogroup group_ipc_macros +* \{ +*/ + +/** Driver major version */ +#define CY_IPC_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_IPC_DRV_VERSION_MINOR 10 + +/** Defines a value to indicate that no notification events are needed */ +#define CY_IPC_NO_NOTIFICATION (uint32_t)(0x00000000ul) + +/* Error Code constants */ +#define CY_IPC_ID CY_PDL_DRV_ID(0x22u) /**< Software PDL driver ID for IPC */ + +/** Return prefix for IPC driver function status codes */ +#define CY_IPC_ID_INFO (uint32_t)( CY_IPC_ID | CY_PDL_STATUS_INFO ) +/** Return prefix for IPC driver function warning return values */ +#define CY_IPC_ID_WARNING (uint32_t)( CY_IPC_ID | CY_PDL_STATUS_WARNING) +/** Return prefix for IPC driver function error return values */ +#define CY_IPC_ID_ERROR (uint32_t)( CY_IPC_ID | CY_PDL_STATUS_ERROR) + +/** Converts the IPC interrupt channel number to interrupt vector */ +#define CY_IPC_INTR_NUM_TO_VECT(x) ((int32_t)cpuss_interrupts_ipc_0_IRQn + (x)) + +/** \} group_ipc_macros */ + +/* end of definition in device.h */ + + +/** +* \addtogroup group_ipc_enums +* \{ +*/ + +/** +* This is a list of ENUMs used for function return status. +*/ +typedef enum +{ + /** Function was successfully executed */ + CY_IPC_DRV_SUCCESS = (0x00u), + /** Function was not executed due to an error. + Typical conditions for the error explained + in the function description */ + CY_IPC_DRV_ERROR = ( CY_IPC_ID_ERROR + 1ul), +} cy_en_ipcdrv_status_t; + +/** \} group_ipc_enums */ + + +#ifdef __cplusplus +extern "C" { +#endif + +/** \cond INTERNAL */ + +__STATIC_INLINE void Cy_IPC_Drv_WriteDataValue (IPC_STRUCT_Type* base, uint32_t dataValue); +__STATIC_INLINE uint32_t Cy_IPC_Drv_ReadDataValue (IPC_STRUCT_Type const * base); +__STATIC_INLINE void Cy_IPC_Drv_ReleaseNotify (IPC_STRUCT_Type* base, uint32_t notifyEventIntr); + +__STATIC_INLINE uint32_t Cy_IPC_Drv_ExtractAcquireMask (uint32_t intMask); +__STATIC_INLINE uint32_t Cy_IPC_Drv_ExtractReleaseMask (uint32_t intMask); + +/** \endcond */ + +/** +* \addtogroup group_ipc_functions +* \{ +*/ + +__STATIC_INLINE IPC_STRUCT_Type* Cy_IPC_Drv_GetIpcBaseAddress (uint32_t ipcIndex); +__STATIC_INLINE IPC_INTR_STRUCT_Type* Cy_IPC_Drv_GetIntrBaseAddr (uint32_t ipcIntrIndex); + +__STATIC_INLINE void Cy_IPC_Drv_AcquireNotify (IPC_STRUCT_Type * base, uint32_t notifyEventIntr); + +__STATIC_INLINE cy_en_ipcdrv_status_t Cy_IPC_Drv_LockAcquire (IPC_STRUCT_Type const * base); +cy_en_ipcdrv_status_t Cy_IPC_Drv_LockRelease (IPC_STRUCT_Type * base, uint32_t releaseEventIntr); +__STATIC_INLINE bool Cy_IPC_Drv_IsLockAcquired (IPC_STRUCT_Type const * base); +__STATIC_INLINE uint32_t Cy_IPC_Drv_GetLockStatus (IPC_STRUCT_Type const * base); + +cy_en_ipcdrv_status_t Cy_IPC_Drv_SendMsgWord (IPC_STRUCT_Type * base, uint32_t notifyEventIntr, uint32_t message); +cy_en_ipcdrv_status_t Cy_IPC_Drv_ReadMsgWord (IPC_STRUCT_Type const * base, uint32_t * message); +__STATIC_INLINE cy_en_ipcdrv_status_t Cy_IPC_Drv_SendMsgPtr (IPC_STRUCT_Type* base, uint32_t notifyEventIntr, void const * msgPtr); +__STATIC_INLINE cy_en_ipcdrv_status_t Cy_IPC_Drv_ReadMsgPtr (IPC_STRUCT_Type const * base, void ** msgPtr); + +__STATIC_INLINE void Cy_IPC_Drv_SetInterruptMask (IPC_INTR_STRUCT_Type * base, + uint32_t ipcReleaseMask, uint32_t ipcNotifyMask); +__STATIC_INLINE uint32_t Cy_IPC_Drv_GetInterruptMask (IPC_INTR_STRUCT_Type const * base); +__STATIC_INLINE uint32_t Cy_IPC_Drv_GetInterruptStatusMasked (IPC_INTR_STRUCT_Type const * base); +__STATIC_INLINE uint32_t Cy_IPC_Drv_GetInterruptStatus (IPC_INTR_STRUCT_Type const * base); +__STATIC_INLINE void Cy_IPC_Drv_SetInterrupt (IPC_INTR_STRUCT_Type * base, + uint32_t ipcReleaseMask, uint32_t ipcNotifyMask); +__STATIC_INLINE void Cy_IPC_Drv_ClearInterrupt (IPC_INTR_STRUCT_Type * base, + uint32_t ipcReleaseMask, uint32_t ipcNotifyMask); + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_GetIpcBaseAddress +****************************************************************************//** +* +* This function takes an IPC channel index as a parameter and returns the base +* address the IPC registers corresponding to the IPC channel. +* +* This function is internal and should not be called directly by user +* software. +* +* \note The user is responsible for ensuring that ipcIndex does not exceed the +* limits. +* +* \param ipcIndex +* Represents the number of IPC structure. This is converted to the base address of +* the IPC channel registers. +* +* \return +* Returns a pointer to the base of the IPC registers. +* +*******************************************************************************/ +__STATIC_INLINE IPC_STRUCT_Type* Cy_IPC_Drv_GetIpcBaseAddress (uint32_t ipcIndex) +{ + CY_ASSERT_L1((uint32_t)CY_IPC_CHANNELS > ipcIndex); + return ( (IPC_STRUCT_Type*) ( &IPC->STRUCT[ipcIndex] ) ); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_GetIntrBaseAddr +****************************************************************************//** +* +* This function takes an IPC interrupt structure index and returns the base +* address of the IPC interrupt registers corresponding to the IPC Interrupt. +* +* This function is internal and should not be called directly by user +* software. +* +* \note The user is responsible for ensuring that ipcIntrIndex does not exceed the +* limits. +* +* \param ipcIntrIndex +* Represents the number of IPC interrupt structure. This is converted to the +* base address of the IPC interrupt registers. +* +* \return +* Returns a pointer to the base of the IPC interrupt registers. +* +*******************************************************************************/ +__STATIC_INLINE IPC_INTR_STRUCT_Type* Cy_IPC_Drv_GetIntrBaseAddr (uint32_t ipcIntrIndex) +{ + CY_ASSERT_L1((uint32_t)CY_IPC_INTERRUPTS > ipcIntrIndex); + return ( (IPC_INTR_STRUCT_Type*) ( &IPC->INTR_STRUCT[ipcIntrIndex] ) ); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_SetInterruptMask +****************************************************************************//** +* +* This function is used to set the interrupt mask for an IPC Interrupt. +* The mask sets release or acquire notification events for all IPC channels. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This is a handle to the IPC interrupt. This handle can be calculated from the +* IPC interrupt number using \ref Cy_IPC_Drv_GetIntrBaseAddr. +* +* \param ipcReleaseMask +* An encoded list of all IPC channels that can trigger the interrupt on a +* release event. +* +* \param ipcNotifyMask +* An encoded list of all IPC channels that can trigger the interrupt on a +* notify event. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_IPC_Drv_SetInterruptMask (IPC_INTR_STRUCT_Type* base, + uint32_t ipcReleaseMask, uint32_t ipcNotifyMask) +{ + CY_ASSERT_L1(0ul == (ipcNotifyMask & ~(uint32_t)(IPC_STRUCT_NOTIFY_INTR_NOTIFY_Msk))); + CY_ASSERT_L1(0ul == (ipcReleaseMask & ~(uint32_t)(IPC_STRUCT_RELEASE_INTR_RELEASE_Msk))); + base->INTR_MASK = _VAL2FLD( IPC_INTR_STRUCT_INTR_MASK_NOTIFY, ipcNotifyMask) | + _VAL2FLD( IPC_INTR_STRUCT_INTR_MASK_RELEASE, ipcReleaseMask); +} + + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_GetInterruptMask +****************************************************************************//** +* +* This function is used to read the interrupt mask. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This is a handle to the IPC interrupt. This handle can be calculated from +* the IPC interrupt number using \ref Cy_IPC_Drv_GetIntrBaseAddr. +* +* \return +* The return value is encoded as follows +* +*
    Interrupt sources Value +*
    Ipc_PORTX_RELEASE Xth bit set +*
    Ipc_PORTX_NOTIFY X+16th bit set +*
    +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_IPC_Drv_GetInterruptMask(IPC_INTR_STRUCT_Type const * base) +{ + return (base->INTR_MASK); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_GetInterruptStatusMasked +****************************************************************************//** +* +* This function is used to read the active unmasked interrupt. This function +* can be used in the interrupt service routine to find which source triggered +* the interrupt. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This is a handle to the IPC interrupt. This handle can be calculated from the +* IPC interrupt number using \ref Cy_IPC_Drv_GetIntrBaseAddr. +* +* \return +* The return value is encoded as follows +* +*
    Interrupt sources Value +*
    Ipc_PORTX_RELEASE Xth bit set +*
    Ipc_PORTX_NOTIFY X+16th bit set +*
    +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_IPC_Drv_GetInterruptStatusMasked (IPC_INTR_STRUCT_Type const * base) +{ + return (base->INTR_MASKED); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_GetInterruptStatus +****************************************************************************//** +* +* This function is used to read the pending interrupts. Note that this read is +* an unmasked read of the interrupt status. Interrupt sources read as active by +* this function would generate interrupts only if they were not masked. + +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This is a handle to the IPC interrupt. This handle can be calculated from the +* IPC interrupt number using \ref Cy_IPC_Drv_GetIntrBaseAddr. +* +* \return +* The return value is encoded as follows +* +*
    Interrupt sources Value +*
    Ipc_PORTX_RELEASE Xth bit set +*
    Ipc_PORTX_NOTIFY X+16th bit set +*
    +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_IPC_Drv_GetInterruptStatus(IPC_INTR_STRUCT_Type const * base) +{ + return (base->INTR); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_SetInterrupt +****************************************************************************//** +* +* This function is used to set the interrupt source. This function can be used +* to activate interrupts through software. +* \note That interrupt sources set using this interrupt would generate interrupts +* only if they are not masked. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This is a handle to the IPC interrupt. This handle can be calculated from the +* IPC interrupt number using \ref Cy_IPC_Drv_GetIntrBaseAddr. +* +* \param ipcReleaseMask +* An encoded list of all IPC channels that can trigger the interrupt on a +* release event. +* +* \param ipcNotifyMask +* An encoded list of all IPC channels that can trigger the interrupt on a +* notify event. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_IPC_Drv_SetInterrupt(IPC_INTR_STRUCT_Type* base, uint32_t ipcReleaseMask, uint32_t ipcNotifyMask) +{ + CY_ASSERT_L1(0ul == (ipcNotifyMask & ~(uint32_t)(IPC_STRUCT_NOTIFY_INTR_NOTIFY_Msk))); + CY_ASSERT_L1(0ul == (ipcReleaseMask & ~(uint32_t)(IPC_STRUCT_RELEASE_INTR_RELEASE_Msk))); + base->INTR_SET = _VAL2FLD( IPC_INTR_STRUCT_INTR_NOTIFY, ipcNotifyMask ) | + _VAL2FLD( IPC_INTR_STRUCT_INTR_RELEASE, ipcReleaseMask ); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_ClearInterrupt +****************************************************************************//** +* +* This function is used to clear the interrupt source. Use this function to clear +* a pending interrupt source in the interrupt status. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This is a handle to the IPC interrupt. This handle can be calculated from the +* IPC interrupt number using \ref Cy_IPC_Drv_GetIntrBaseAddr. +* +* \param ipcReleaseMask +* An encoded list of all IPC channels that can trigger the interrupt on a +* release event. +* +* \param ipcNotifyMask +* An encoded list of all IPC channels that can trigger the interrupt on a +* notify event. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_IPC_Drv_ClearInterrupt(IPC_INTR_STRUCT_Type* base, uint32_t ipcReleaseMask, uint32_t ipcNotifyMask) +{ + CY_ASSERT_L1(0ul == (ipcNotifyMask & ~(uint32_t)(IPC_STRUCT_NOTIFY_INTR_NOTIFY_Msk))); + CY_ASSERT_L1(0ul == (ipcReleaseMask & ~(uint32_t)(IPC_STRUCT_RELEASE_INTR_RELEASE_Msk))); + base->INTR = _VAL2FLD(IPC_INTR_STRUCT_INTR_NOTIFY, ipcNotifyMask) | + _VAL2FLD(IPC_INTR_STRUCT_INTR_RELEASE, ipcReleaseMask); + (void)base->INTR; /* Read the register to flush the cache */ +} + +/** \} group_ipc_functions */ + +/** \} group_ipc */ + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_AcquireNotify +****************************************************************************//** +* +* The function generates a notify event by IPC interrupt structures. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \param notifyEventIntr +* Bit encoded list of IPC interrupt structures that are triggered +* by a notification. Bit number correspond to number of the IPC interrupt +* structure. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_IPC_Drv_AcquireNotify (IPC_STRUCT_Type* base, uint32_t notifyEventIntr) +{ + CY_ASSERT_L1(0ul == (notifyEventIntr & ~(uint32_t)(IPC_STRUCT_NOTIFY_INTR_NOTIFY_Msk))); + base->NOTIFY = _VAL2FLD(IPC_STRUCT_NOTIFY_INTR_NOTIFY, notifyEventIntr); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_ReleaseNotify +****************************************************************************//** +* +* The function generates a notify event to an IPC interrupt structure. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \param notifyEventIntr +* Bit encoded list of IPC interrupt lines that are triggered by a notification. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_IPC_Drv_ReleaseNotify (IPC_STRUCT_Type* base, uint32_t notifyEventIntr) +{ + CY_ASSERT_L1(0ul == (notifyEventIntr & ~(uint32_t)(IPC_STRUCT_NOTIFY_INTR_NOTIFY_Msk))); + base->RELEASE = _VAL2FLD(IPC_INTR_STRUCT_INTR_RELEASE, notifyEventIntr); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_WriteDataValue +****************************************************************************//** +* +* The function writes a value to the DATA register of the IPC channel. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \param dataValue +* Value to be written. +* +*******************************************************************************/ +__STATIC_INLINE void Cy_IPC_Drv_WriteDataValue (IPC_STRUCT_Type* base, uint32_t dataValue) +{ + base->DATA = dataValue; +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_ReadDataValue +****************************************************************************//** +* +* The function reads a value from the DATA register of the IPC channel. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \return +* Value from DATA register. +* +*******************************************************************************/ +#if defined (__ICCARM__) + __ramfunc +#else + CY_SECTION(".cy_ramfunc") +#endif +__STATIC_INLINE uint32_t Cy_IPC_Drv_ReadDataValue (IPC_STRUCT_Type const * base) +{ + return (base->DATA); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_IsLockAcquired +****************************************************************************//** +* +* The function is used to test the status of an IPC channel. The function +* tells the reader if the IPC channel was in the locked or released state. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \return +* Status for the function: +* true: The IPC channel is in the Locked state. +* false: The IPC channel is in the Released state. +* +*******************************************************************************/ +__STATIC_INLINE bool Cy_IPC_Drv_IsLockAcquired (IPC_STRUCT_Type const * base) +{ + return ( 0u != _FLD2VAL(IPC_STRUCT_ACQUIRE_SUCCESS, base->LOCK_STATUS) ); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_GetLockStatus +****************************************************************************//** +* +* The function is used to get the status of an IPC channel. +* +* This function is internal and should not be called directly by user +* software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \return +* Value from LOCK_STATUS register. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_IPC_Drv_GetLockStatus (IPC_STRUCT_Type const * base) +{ + return (base->LOCK_STATUS); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_ExtractAcquireMask +****************************************************************************//** +* +* The function extracts an Acquire mask part from full interrupt mask value. +* +* This function is internal and should not be called directly by user +* software. +* +* \param intMask +* Interrupt mask value to be processed. +* +* \return +* Acquire mask value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_IPC_Drv_ExtractAcquireMask (uint32_t intMask) +{ + return _FLD2VAL(IPC_INTR_STRUCT_INTR_MASK_NOTIFY, intMask); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_ExtractReleaseMask +****************************************************************************//** +* +* The function extracts a Release mask part from full interrupt mask value. +* +* This function is internal and should not be called directly by user +* software. +* +* \param intMask +* Interrupt mask value to be processed. +* +* \return +* Release mask value. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_IPC_Drv_ExtractReleaseMask (uint32_t intMask) +{ + return _FLD2VAL(IPC_INTR_STRUCT_INTR_MASK_RELEASE, intMask); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_SendMsgPtr +****************************************************************************//** +* +* This function is used to send a message pointer through an IPC channel. +* The message structure may hold a generic pointer that may contain the address +* of any user data type or structure. This parameter could be a pointer to a 32-bit +* integer, an array, or even a data structure defined in the user code. This +* function acts as a transfer engine for sending the pointer. Any memory +* management of the pointer allocation and deallocation is up to the application +* code. +* The function also has an associated notification field that will let the +* message notify one or multiple interrupts. +* +* This function is internal and should not be called directly by user software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \param notifyEventIntr +* Bit encoded list of IPC interrupt lines that are triggered during the release +* action. +* +* \param msgPtr +* The message pointer that is being sent over the IPC channel. +* +* \return Status of the operation: +* \retval CY_IPC_DRV_SUCCESS: The send operation was successful. +* \retval CY_IPC_DRV_ERROR: The IPC channel is unavailable because +* it is already locked. +* +*******************************************************************************/ +__STATIC_INLINE cy_en_ipcdrv_status_t Cy_IPC_Drv_SendMsgPtr(IPC_STRUCT_Type* base, uint32_t notifyEventIntr, void const * msgPtr) +{ + CY_ASSERT_L1(NULL != msgPtr); + return Cy_IPC_Drv_SendMsgWord(base, notifyEventIntr, (uint32_t)msgPtr); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_ReadMsgPtr +****************************************************************************//** +* +* This function is used to read a 32-bit pointer message through an IPC channel. +* +* This function is internal and should not be called directly by user software. +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress. +* +* \param msgPtr +* Pointer variable to hold the data pointer that is being read from the IPC +* channel. +* +* +* \return Status of the operation +* \retval CY_IPC_DRV_SUCCESS: The function executed successfully and the IPC +* was acquired. +* \retval CY_IPC_DRV_ERROR: The function encountered an error because the IPC +* channel was already in a released state meaning the data +* in it is invalid. +* +*******************************************************************************/ +__STATIC_INLINE cy_en_ipcdrv_status_t Cy_IPC_Drv_ReadMsgPtr (IPC_STRUCT_Type const * base, void ** msgPtr) +{ + CY_ASSERT_L1(NULL != msgPtr); + return Cy_IPC_Drv_ReadMsgWord(base, (uint32_t *)msgPtr); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Drv_LockAcquire +****************************************************************************//** +* +* This function is used to acquire the IPC channel. +* +* This function is internal and should not be called directly by user software +* +* \param base +* This parameter is a handle that represents the base address of the registers +* of the IPC channel. +* The parameter is generally returned from a call to the \ref +* Cy_IPC_Drv_GetIpcBaseAddress +* +* \return Status of the operation +* \retval CY_IPC_DRV_SUCCESS: The IPC was successfully acquired +* \retval CY_IPC_DRV_ERROR: The IPC was not acquired because it was already acquired +* by another master +* +*******************************************************************************/ +__STATIC_INLINE cy_en_ipcdrv_status_t Cy_IPC_Drv_LockAcquire (IPC_STRUCT_Type const * base) +{ + return ( 0ul != _FLD2VAL(IPC_STRUCT_ACQUIRE_SUCCESS, base->ACQUIRE)) ? CY_IPC_DRV_SUCCESS : CY_IPC_DRV_ERROR; +} + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(CY_IPC_DRV_H) */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_pipe.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_pipe.c new file mode 100644 index 0000000000..96617a3db1 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_pipe.c @@ -0,0 +1,515 @@ +/***************************************************************************//** +* \file cy_ipc_pipe.c +* \version 1.10 +* +* Description: +* IPC Pipe Driver - This source file includes code for the Pipe layer on top +* of the IPC driver. +* +******************************************************************************** +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_ipc_pipe.h" + +/* Define a pointer to array of endPoints. */ +static cy_stc_ipc_pipe_ep_t * cy_ipc_pipe_epArray = NULL; + +/******************************************************************************* +* Function Name: Cy_IPC_Pipe_Config +****************************************************************************//** +* +* This function stores a copy of a pointer to the array of endpoints. All +* access to endpoints will be via the index of the endpoint in this array. +* +* \param theEpArray +* This is the pointer to an array of endpoint structures that the designer +* created and will be used to reference all endpoints. +* +*******************************************************************************/ +void Cy_IPC_Pipe_Config(cy_stc_ipc_pipe_ep_t * theEpArray) +{ + /* Keep copy of this endpoint */ + if (cy_ipc_pipe_epArray == NULL) + { + cy_ipc_pipe_epArray = theEpArray; + } +} + +/******************************************************************************* +* Function Name: Cy_IPC_Pipe_Init +****************************************************************************//** +* +* Initializes the system pipes. The system pipes are used by BLE. +* \note The function should be called on all CPUs. +* +* \param config +* This is the pointer to the pipe configuration structure +* +*******************************************************************************/ +void Cy_IPC_Pipe_Init(cy_stc_ipc_pipe_config_t const *config) +{ + /* Create the interrupt structures and arrays needed */ + + cy_stc_sysint_t ipc_intr_cypipeConfig; + + cy_stc_ipc_pipe_ep_config_t epConfigDataA; + cy_stc_ipc_pipe_ep_config_t epConfigDataB; + + /* Parameters checking begin */ + CY_ASSERT_L1(NULL != config); + #if (CY_CPU_CORTEX_M0P) + CY_ASSERT_L2((uint32_t)(1UL << __NVIC_PRIO_BITS) > config->ep0ConfigData.ipcNotifierPriority); + #else + CY_ASSERT_L2((uint32_t)(1UL << __NVIC_PRIO_BITS) > config->ep1ConfigData.ipcNotifierPriority); + #endif + CY_ASSERT_L1(NULL != config->endpointsCallbacksArray); + CY_ASSERT_L2(CY_IPC_MAX_ENDPOINTS > config->ep0ConfigData.epAddress); + CY_ASSERT_L2(CY_IPC_MAX_ENDPOINTS > config->ep1ConfigData.epAddress); + CY_ASSERT_L1(NULL != config->userPipeIsrHandler); + /* Parameters checking end */ + +#if (CY_CPU_CORTEX_M0P) + + /* Receiver endpoint = EP0, Sender endpoint = EP1 */ + epConfigDataA = config->ep0ConfigData; + epConfigDataB = config->ep1ConfigData; + + /* Configure CM0 interrupts */ + ipc_intr_cypipeConfig.intrSrc = (IRQn_Type)epConfigDataA.ipcNotifierMuxNumber; + ipc_intr_cypipeConfig.cm0pSrc = (cy_en_intr_t)((int32_t)cpuss_interrupts_ipc_0_IRQn + (int32_t)epConfigDataA.ipcNotifierNumber); + ipc_intr_cypipeConfig.intrPriority = epConfigDataA.ipcNotifierPriority; + +#else + + /* Receiver endpoint = EP1, Sender endpoint = EP0 */ + epConfigDataA = config->ep1ConfigData; + epConfigDataB = config->ep0ConfigData; + + /* Configure interrupts */ + ipc_intr_cypipeConfig.intrSrc = (IRQn_Type)(cpuss_interrupts_ipc_0_IRQn + epConfigDataA.ipcNotifierNumber); + ipc_intr_cypipeConfig.intrPriority = epConfigDataA.ipcNotifierPriority; + +#endif + + /* Initialize the pipe endpoints */ + Cy_IPC_Pipe_EndpointInit(epConfigDataA.epAddress, + config->endpointsCallbacksArray, + config->endpointClientsCount, + epConfigDataA.epConfig, + &ipc_intr_cypipeConfig); + + /* Create the endpoints for the CM4 just for reference */ + Cy_IPC_Pipe_EndpointInit(epConfigDataB.epAddress, NULL, 0ul, epConfigDataB.epConfig, NULL); + + (void)Cy_SysInt_Init(&ipc_intr_cypipeConfig, config->userPipeIsrHandler); + + /* Enable the interrupts */ + NVIC_EnableIRQ(ipc_intr_cypipeConfig.intrSrc); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Pipe_EndpointInit +****************************************************************************//** +* +* This function initializes the endpoint of a pipe for the current CPU. The +* current CPU is the CPU that is executing the code. An endpoint of a pipe +* is for the IPC channel that receives a message for the current CPU. +* +* After this function is called, the callbackArray needs to be populated +* with the callback functions for that endpoint using the +* Cy_IPC_Pipe_RegisterCallback() function. +* +* \param epAddr +* This parameter is the address (or index in the array of endpoint structures) +* that designates the endpoint you want to initialize. +* +* \param cbArray +* This is a pointer to the callback function array. Based on the client ID, one +* of the functions in this array is called to process the message. +* +* \param cbCnt +* This is the size of the callback array, or the number of defined clients. +* +* \param epConfig +* This value defines the IPC channel, IPC interrupt number, and the interrupt +* mask for the entire pipe. +* The format of the endpoint configuration +* Bits[31:16] Interrupt Mask +* Bits[15:8 ] IPC interrupt +* Bits[ 7:0 ] IPC channel +* +* \param epInterrupt +* This is a pointer to the endpoint interrupt description structure. +* +*******************************************************************************/ +void Cy_IPC_Pipe_EndpointInit(uint32_t epAddr, cy_ipc_pipe_callback_array_ptr_t cbArray, + uint32_t cbCnt, uint32_t epConfig, cy_stc_sysint_t const *epInterrupt) +{ + cy_stc_ipc_pipe_ep_t * endpoint; + + CY_ASSERT_L2(CY_IPC_MAX_ENDPOINTS > epAddr); + + endpoint = &cy_ipc_pipe_epArray[epAddr]; + + /* Extract the channel, interrupt and interrupt mask */ + endpoint->ipcChan = _FLD2VAL(CY_IPC_PIPE_CFG_CHAN, epConfig); + endpoint->intrChan = _FLD2VAL(CY_IPC_PIPE_CFG_INTR, epConfig); + endpoint->pipeIntMask = _FLD2VAL(CY_IPC_PIPE_CFG_IMASK, epConfig); + + /* Assign IPC channel to this endpoint */ + endpoint->ipcPtr = Cy_IPC_Drv_GetIpcBaseAddress (endpoint->ipcChan); + + /* Assign interrupt structure to endpoint and Initialize the interrupt mask for this endpoint */ + endpoint->ipcIntrPtr = Cy_IPC_Drv_GetIntrBaseAddr(endpoint->intrChan); + + /* Only allow notify and release interrupts from endpoints in this pipe. */ + Cy_IPC_Drv_SetInterruptMask(endpoint->ipcIntrPtr, endpoint->pipeIntMask, endpoint->pipeIntMask); + + /* Save the Client count and the callback array pointer */ + endpoint->clientCount = cbCnt; + endpoint->callbackArray = cbArray; + endpoint->busy = CY_IPC_PIPE_ENDPOINT_NOTBUSY; + + if (NULL != epInterrupt) + { + endpoint->pipeIntrSrc = epInterrupt->intrSrc; + } +} + + +/******************************************************************************* +* Function Name: Cy_IPC_Pipe_SendMessage +****************************************************************************//** +* +* This function is used to send a message from one endpoint to another. It +* generates an interrupt on the endpoint that receives the message and a +* release interrupt to the sender to acknowledge the message has been processed. +* +* \param toAddr +* This parameter is the address (or index in the array of endpoint structures) +* of the endpoint to which you are sending the message. +* +* \param fromAddr +* This parameter is the address (or index in the array of endpoint structures) +* of the endpoint from which the message is being sent. +* +* \param msgPtr +* Pointer to the message structure to be sent. +* +* \param callBackPtr +* Pointer to the Release callback function. +* +* \return +* CY_IPC_PIPE_SUCCESS: Message was sent to the other end of the pipe +* CY_IPC_PIPE_ERROR_BAD_HANDLE: The handle provided for the pipe was not valid +* CY_IPC_PIPE_ERROR_SEND_BUSY: The pipe is already busy sending a message +* +*******************************************************************************/ +cy_en_ipc_pipe_status_t Cy_IPC_Pipe_SendMessage(uint32_t toAddr, uint32_t fromAddr, + void * msgPtr, cy_ipc_pipe_relcallback_ptr_t callBackPtr) +{ + cy_en_ipc_pipe_status_t returnStatus; + uint32_t releaseMask; + uint32_t notifyMask; + + cy_stc_ipc_pipe_ep_t * fromEp; + cy_stc_ipc_pipe_ep_t * toEp; + + CY_ASSERT_L1(NULL != msgPtr); + CY_ASSERT_L2(CY_IPC_MAX_ENDPOINTS > toAddr); + CY_ASSERT_L2(CY_IPC_MAX_ENDPOINTS > fromAddr); + + toEp = &(cy_ipc_pipe_epArray[toAddr]); + fromEp = &cy_ipc_pipe_epArray[fromAddr]; + + /* Create the release mask for the "fromAddr" channel's interrupt channel */ + releaseMask = (uint32_t)(1ul << (fromEp->intrChan)); + + /* Shift into position */ + releaseMask = _VAL2FLD(CY_IPC_PIPE_MSG_RELEASE, releaseMask); + + /* Create the notify mask for the "toAddr" channel's interrupt channel */ + notifyMask = (uint32_t)(1ul << (toEp->intrChan)); + + /* Check if IPC channel valid */ + if( toEp->ipcPtr != NULL) + { + if(fromEp->busy == CY_IPC_PIPE_ENDPOINT_NOTBUSY) + { + /* Attempt to acquire the channel */ + if( CY_IPC_DRV_SUCCESS == Cy_IPC_Drv_LockAcquire(toEp->ipcPtr) ) + { + /* Mask out the release mask area */ + * (uint32_t *) msgPtr &= ~(CY_IPC_PIPE_MSG_RELEASE_Msk); + + * (uint32_t *) msgPtr |= releaseMask; + + /* If the channel was acquired, write the message. */ + Cy_IPC_Drv_WriteDataValue(toEp->ipcPtr, (uint32_t) msgPtr); + + /* Set the busy flag. The ISR clears this after the release */ + fromEp->busy = CY_IPC_PIPE_ENDPOINT_BUSY; + + /* Setup release callback function */ + fromEp->releaseCallbackPtr = callBackPtr; + + /* Cause notify event/interrupt */ + Cy_IPC_Drv_AcquireNotify(toEp->ipcPtr, notifyMask); + + returnStatus = CY_IPC_PIPE_SUCCESS; + } + else + { + /* Channel was already acquired, return Error */ + returnStatus = CY_IPC_PIPE_ERROR_SEND_BUSY; + } + } + else + { + /* Channel may not be acquired, but the release interrupt has not executed yet */ + returnStatus = CY_IPC_PIPE_ERROR_SEND_BUSY; + } + } + else + { + /* Null pipe handle. */ + returnStatus = CY_IPC_PIPE_ERROR_BAD_HANDLE; + } + return (returnStatus); +} + + + +/******************************************************************************* +* Function Name: Cy_IPC_Pipe_RegisterCallback +****************************************************************************//** +* +* This function registers a callback that is called when a message is received +* on a pipe. +* The client_ID is the same as the index of the callback function array. +* The callback may be a real function pointer or NULL if no callback is required. +* +* \param epAddr +* This parameter is the address (or index in the array of endpoint structures) +* that designates the endpoint to which you want to add callback functions. +* +* \param callBackPtr +* Pointer to the callback function called when the endpoint has received a message. +* +* \param clientId +* The index in the callback array (Client ID) where the function pointer is saved. +* +* \return +* CY_IPC_PIPE_SUCCESS: Callback registered successfully +* CY_IPC_PIPE_ERROR_BAD_CLIENT: Client ID out of range, callback not registered. +*******************************************************************************/ +cy_en_ipc_pipe_status_t Cy_IPC_Pipe_RegisterCallback(uint32_t epAddr, cy_ipc_pipe_callback_ptr_t callBackPtr, uint32_t clientId) +{ + cy_en_ipc_pipe_status_t returnStatus; + cy_stc_ipc_pipe_ep_t * thisEp; + + CY_ASSERT_L1(NULL != callBackPtr); + CY_ASSERT_L2(CY_IPC_MAX_ENDPOINTS > epAddr); + + thisEp = &cy_ipc_pipe_epArray[epAddr]; + + /* Check if clientId is between 0 and less than client count */ + if (clientId < thisEp->clientCount) + { + /* Copy callback function into callback function pointer array */ + thisEp->callbackArray[clientId] = callBackPtr; + + returnStatus = CY_IPC_PIPE_SUCCESS; + } + else + { + returnStatus = CY_IPC_PIPE_ERROR_BAD_CLIENT; + } + return (returnStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Pipe_RegisterCallbackRel +****************************************************************************//** +* +* This function registers a default callback if a release interrupt +* is generated but the current release callback function is null. +* +* +* \param epAddr +* This parameter is the address (or index in the array of endpoint structures) +* that designates the endpoint to which you want to add a release callback function. +* +* \param callBackPtr +* Pointer to the callback executed when the endpoint has received a message. +* +* \return +* None +*******************************************************************************/ +void Cy_IPC_Pipe_RegisterCallbackRel(uint32_t epAddr, cy_ipc_pipe_relcallback_ptr_t callBackPtr) +{ + cy_stc_ipc_pipe_ep_t * endpoint; + + CY_ASSERT_L1(NULL != callBackPtr); + CY_ASSERT_L2(CY_IPC_MAX_ENDPOINTS > epAddr); + + endpoint = &cy_ipc_pipe_epArray[epAddr]; + + /* Copy callback function into callback function pointer array */ + endpoint->defaultReleaseCallbackPtr = callBackPtr; +} + +/******************************************************************************* +* Function Name: Cy_IPC_Pipe_ExecCallback +****************************************************************************//** +* +* This function is called by the ISR for a given pipe endpoint to dispatch +* the appropriate callback function based on the client ID for that endpoint. +* +* \param endpoint +* Pointer to endpoint structure. +* +* \return +* None +*******************************************************************************/ +void Cy_IPC_Pipe_ExecCallback(cy_stc_ipc_pipe_ep_t * endpoint) +{ + uint32_t *msgPtr = NULL; + uint32_t clientID; + uint32_t shadowIntr; + uint32_t releaseMask = (uint32_t)0; + + cy_ipc_pipe_callback_ptr_t callbackPtr; + + /* Parameters checking begin */ + CY_ASSERT_L1(NULL != endpoint); + CY_ASSERT_L1(NULL != endpoint->ipcPtr); + CY_ASSERT_L1(NULL != endpoint->ipcIntrPtr); + CY_ASSERT_L1(NULL != endpoint->callbackArray); + /* Parameters checking end */ + + shadowIntr = Cy_IPC_Drv_GetInterruptStatusMasked(endpoint->ipcIntrPtr); + + /* Check to make sure the interrupt was a notify interrupt */ + if (0ul != Cy_IPC_Drv_ExtractAcquireMask(shadowIntr)) + { + /* Clear the notify interrupt. */ + Cy_IPC_Drv_ClearInterrupt(endpoint->ipcIntrPtr, CY_IPC_NO_NOTIFICATION, Cy_IPC_Drv_ExtractAcquireMask(shadowIntr)); + + if ( Cy_IPC_Drv_IsLockAcquired (endpoint->ipcPtr) ) + { + /* Extract Client ID */ + if( CY_IPC_DRV_SUCCESS == Cy_IPC_Drv_ReadMsgPtr (endpoint->ipcPtr, (void **)&msgPtr)) + { + /* Get release mask */ + releaseMask = _FLD2VAL(CY_IPC_PIPE_MSG_RELEASE, *msgPtr); + clientID = _FLD2VAL(CY_IPC_PIPE_MSG_CLIENT, *msgPtr); + + /* Make sure client ID is within valid range */ + if (endpoint->clientCount > clientID) + { + callbackPtr = endpoint->callbackArray[clientID]; /* Get the callback function */ + + if (callbackPtr != NULL) + { + callbackPtr(msgPtr); /* Call the function pointer for "clientID" */ + } + } + } + + /* Must always release the IPC channel */ + (void)Cy_IPC_Drv_LockRelease (endpoint->ipcPtr, releaseMask); + } + } + + /* Check to make sure the interrupt was a release interrupt */ + if (0ul != Cy_IPC_Drv_ExtractReleaseMask(shadowIntr)) /* Check for a Release interrupt */ + { + /* Clear the release interrupt */ + Cy_IPC_Drv_ClearInterrupt(endpoint->ipcIntrPtr, Cy_IPC_Drv_ExtractReleaseMask(shadowIntr), CY_IPC_NO_NOTIFICATION); + + if (endpoint->releaseCallbackPtr != NULL) + { + endpoint->releaseCallbackPtr(); + + /* Clear the pointer after it was called */ + endpoint->releaseCallbackPtr = NULL; + } + else + { + if (endpoint->defaultReleaseCallbackPtr != NULL) + { + endpoint->defaultReleaseCallbackPtr(); + } + } + + /* Clear the busy flag when release is detected */ + endpoint->busy = CY_IPC_PIPE_ENDPOINT_NOTBUSY; + } + + (void)Cy_IPC_Drv_GetInterruptStatus(endpoint->ipcIntrPtr); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Pipe_EndpointPause +****************************************************************************//** +* +* This function sets the receiver endpoint to paused state. +* +* \param epAddr +* This parameter is the address (or index in the array of endpoint structures) +* that designates the endpoint to pause. +* +* \return +* CY_IPC_PIPE_SUCCESS: Callback registered successfully +* +*******************************************************************************/ +cy_en_ipc_pipe_status_t Cy_IPC_Pipe_EndpointPause(uint32_t epAddr) +{ + cy_stc_ipc_pipe_ep_t * endpoint; + + CY_ASSERT_L2(CY_IPC_MAX_ENDPOINTS > epAddr); + + endpoint = &cy_ipc_pipe_epArray[epAddr]; + + /* Disable the interrupts */ + NVIC_DisableIRQ(endpoint->pipeIntrSrc); + + return (CY_IPC_PIPE_SUCCESS); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Pipe_EndpointResume +****************************************************************************//** +* +* This function sets the receiver endpoint to active state. +* +* \param epAddr +* This parameter is the address (or index in the array of endpoint structures) +* that designates the endpoint to resume. +* +* \return +* CY_IPC_PIPE_SUCCESS: Callback registered successfully +* +*******************************************************************************/ +cy_en_ipc_pipe_status_t Cy_IPC_Pipe_EndpointResume(uint32_t epAddr) +{ + cy_stc_ipc_pipe_ep_t * endpoint; + + CY_ASSERT_L2(CY_IPC_MAX_ENDPOINTS > epAddr); + + endpoint = &cy_ipc_pipe_epArray[epAddr]; + + /* Enable the interrupts */ + NVIC_EnableIRQ(endpoint->pipeIntrSrc); + + return (CY_IPC_PIPE_SUCCESS); +} + + +/* [] END OF FILE */ + diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_pipe.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_pipe.h new file mode 100644 index 0000000000..5656d357f0 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_pipe.h @@ -0,0 +1,266 @@ +/***************************************************************************//** +* \file cy_ipc_pipe.h +* \version 1.10 +* +* Description: +* IPC Pipe Driver - This header file contains all the function prototypes, +* structure definitions, pipe constants, and pipe endpoint address definitions. +* +******************************************************************************** +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ +#ifndef CY_IPC_PIPE_H +#define CY_IPC_PIPE_H + +/******************************************************************************/ +/* Include files */ +/******************************************************************************/ +#include "ipc/cy_ipc_drv.h" +#include "syslib/cy_syslib.h" +#include "sysint/cy_sysint.h" + +/** +* \addtogroup group_ipc_pipe IPC pipes layer (IPC_PIPE) +* \{ +* The Pipe functions provide a method to transfer one or more words of data +* between CPUs or tasks. The data can be defined as a single 32-bit unsigned +* word, an array of data, or a user-defined structure. The only limitation is +* that the first word in the array or structure must be a 32-bit unsigned word +* in which a client ID number is passed. The client ID dictates the callback +* function that will be called by the receiver of the message. After the +* callback function returns by the receiver, it will invoke a release callback +* function defined by the sender of the message. +* +* A User Pipe is provided for the user to transfer data between CPUs and +* tasks. +* +* \defgroup group_ipc_pipe_macros Macros +* Macro definitions are used in the driver +* +* \defgroup group_ipc_pipe_functions Functions +* Functions are used in the driver +* +* \defgroup group_ipc_pipe_data_structures Data Structures +* Data structures are used in the driver +* +* \defgroup group_ipc_pipe_enums Enumerated Types +* Enumerations are used in the driver +* \} +* +*/ + +/* + * This section defines the system level constants required to define + * callback arrays for the Cypress pipe and the user pipe. These defines + * are used for both the max callback count and maximum clients. +*/ + +/** Typedef for pipe callback function pointer */ +typedef void (* cy_ipc_pipe_callback_ptr_t)(uint32_t * msgPtr); + +/** Typedef for a pipe release callback function pointer */ +typedef void (* cy_ipc_pipe_relcallback_ptr_t)(void); + +/** Typedef for array of callback function pointers */ +typedef cy_ipc_pipe_callback_ptr_t *cy_ipc_pipe_callback_array_ptr_t; + + +/** +* \addtogroup group_ipc_pipe_macros +* \{ +*/ + +/* + * The System pipe address is what is used to send a message to one of the + * endpoints of a pipe. Currently the Cypress pipe and the User pipe + * are supported. For parts with extra IPC channels users may create + * their own custom pipes and create their own pipe addresses. + * + * The format of the endpoint configuration + * Bits[31:16] Interrupt Mask + * Bits[15:8 ] IPC interrupt + * Bits[ 7:0 ] IPC channel + */ +#define CY_IPC_PIPE_CFG_IMASK_Pos (16UL) /**< Interrupts shift value for endpoint address */ +#define CY_IPC_PIPE_CFG_IMASK_Msk (0xFFFF0000UL) /**< Interrupts mask for endpoint address */ +#define CY_IPC_PIPE_CFG_INTR_Pos (8UL) /**< IPC Interrupt shift value for endpoint address */ +#define CY_IPC_PIPE_CFG_INTR_Msk (0x0000FF00UL) /**< IPC Interrupt mask for endpoint address */ +#define CY_IPC_PIPE_CFG_CHAN_Pos (0UL) /**< IPC Channel shift value for endpoint address */ +#define CY_IPC_PIPE_CFG_CHAN_Msk (0x000000FFUL) /**< IPC Channel mask for endpoint address */ + + + +#define CY_IPC_PIPE_MSG_CLIENT_Msk (0x000000FFul) /**< Client mask for first word of Pipe message */ +#define CY_IPC_PIPE_MSG_CLIENT_Pos (0ul) /**< Client shift for first word of Pipe message */ +#define CY_IPC_PIPE_MSG_USR_Msk (0x0000FF00ul) /**< User data mask for first word of Pipe message */ +#define CY_IPC_PIPE_MSG_USR_Pos (8ul) /**< User data shift for first word of Pipe message */ +#define CY_IPC_PIPE_MSG_RELEASE_Msk (0xFFFF0000ul) /**< Mask for message release mask */ +#define CY_IPC_PIPE_MSG_RELEASE_Pos (16UL) /**< Shift require to line up mask to LSb */ + +/** Use to set the busy flag when waiting for a release interrupt */ +#define CY_IPC_PIPE_ENDPOINT_BUSY (1UL) +/** Denotes that a release interrupt is not pending */ +#define CY_IPC_PIPE_ENDPOINT_NOTBUSY (0UL) + +/** \} group_ipc_pipe_macros */ + +/** +* \addtogroup group_ipc_pipe_data_structures +* \{ +*/ + +/** +* This is the definition of a pipe endpoint. There is one endpoint structure +* for each CPU in a pipe. It contains all the information to process a message +* send to other CPUs in the pipe. +*/ +typedef struct +{ + uint32_t ipcChan; /**< IPC channel number used for this endpoint to receive messages */ + uint32_t intrChan; /**< IPC interrupt channel number used for this endpoint to receive interrupts */ + uint32_t pipeIntMask; /**< Release/Notify interrupt mask that includes all endpoints on pipe */ + IRQn_Type pipeIntrSrc; /**< Interrupt vector number that includes all endpoints on pipe */ + + IPC_STRUCT_Type *ipcPtr; /**< Pointer to receive IPC channel ( If ipcPtr == NULL, cannot receive ) */ + IPC_INTR_STRUCT_Type *ipcIntrPtr; /**< Pointer to IPC interrupt, needed to clear the interrupt */ + uint32_t busy; /**< Endpoint busy flag. If sent no messages can be sent from this endpoint */ + uint32_t clientCount; /**< Client count and size of MsgCallback array */ + + cy_ipc_pipe_callback_array_ptr_t callbackArray; /**< Pointer to array of callback functions, one for each Client */ + cy_ipc_pipe_relcallback_ptr_t releaseCallbackPtr; /**< Pointer to release callback function */ + cy_ipc_pipe_relcallback_ptr_t defaultReleaseCallbackPtr; /**< Pointer to default release callback function */ +} cy_stc_ipc_pipe_ep_t; + +/** The Pipe endpoint configuration structure. */ +typedef struct +{ + uint32_t ipcNotifierNumber; /**< Notifier */ + uint32_t ipcNotifierPriority; /**< Notifier Priority */ + uint32_t ipcNotifierMuxNumber; /**< CM0+ interrupt multiplexer number */ + + uint32_t epAddress; /**< Index in the array of endpoint structure */ + uint32_t epConfig; /**< Configuration mask, contains IPC channel, IPC interrupt number, + and the interrupt mask */ +} cy_stc_ipc_pipe_ep_config_t; + +/** The Pipe channel configuration structure. */ +typedef struct +{ + /** Specifies the notify interrupt number for the first endpoint */ + cy_stc_ipc_pipe_ep_config_t ep0ConfigData; + + /** Specifies the notify interrupt number for the second endpoint */ + cy_stc_ipc_pipe_ep_config_t ep1ConfigData; + + /** Client count and size of MsgCallback array */ + uint32_t endpointClientsCount; + + /** Pipes callback function array. */ + cy_ipc_pipe_callback_array_ptr_t endpointsCallbacksArray; + + /** User IRQ handler function that is called when IPC receive data to process (interrupt was raised). */ + cy_israddress userPipeIsrHandler; +} cy_stc_ipc_pipe_config_t; + +/** \} goup_ipc_pipe_data_structures */ + +/** +* \addtogroup group_ipc_pipe_macros +* \{ +*/ +/* Status and error types */ +#define CY_IPC_PIPE_RTN (0x0200ul) /**< Software PDL driver ID for IPC pipe functions */ +#define CY_IPC_PIPE_ID_INFO (uint32_t)( CY_IPC_ID_INFO | CY_IPC_PIPE_RTN) /**< Return prefix for IPC pipe function status codes */ +#define CY_IPC_PIPE_ID_WARNING (uint32_t)( CY_IPC_ID_WARNING | CY_IPC_PIPE_RTN) /**< Return prefix for IPC pipe function warning return values */ +#define CY_IPC_PIPE_ID_ERROR (uint32_t)( CY_IPC_ID_ERROR | CY_IPC_PIPE_RTN) /**< Return prefix for IPC pipe function error return values */ + +/** \} group_ipc_pipe_macros */ + +/** +* \addtogroup group_ipc_pipe_enums +* \{ +*/ + +/** Return constants for IPC pipe functions. */ +typedef enum +{ + CY_IPC_PIPE_SUCCESS =(uint32_t)(0x00u), /**< Pipe API return for no error */ + CY_IPC_PIPE_ERROR_NO_IPC =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 1ul), /**< Pipe API return for no valid IPC channel */ + CY_IPC_PIPE_ERROR_NO_INTR =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 2ul), /**< Pipe API return for no valid interrupt */ + CY_IPC_PIPE_ERROR_BAD_PRIORITY =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 3ul), /**< Pipe API return for bad priority parameter */ + CY_IPC_PIPE_ERROR_BAD_HANDLE =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 4ul), /**< Pipe API return for bad pipe handle */ + CY_IPC_PIPE_ERROR_BAD_ID =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 5ul), /**< Pipe API return for bad pipe ID */ + CY_IPC_PIPE_ERROR_DIR_ERROR =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 6ul), /**< Pipe API return for invalid direction (Not used at this time) */ + CY_IPC_PIPE_ERROR_SEND_BUSY =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 7ul), /**< Pipe API return for pipe is currently busy */ + CY_IPC_PIPE_ERROR_NO_MESSAGE =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 8ul), /**< Pipe API return for no message indicated */ + CY_IPC_PIPE_ERROR_BAD_CPU =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 9ul), /**< Pipe API return for invalid CPU value */ + CY_IPC_PIPE_ERROR_BAD_CLIENT =(uint32_t)(CY_IPC_PIPE_ID_ERROR | 10ul) /**< Pipe API return for client out of range */ +} cy_en_ipc_pipe_status_t; + +/** \} group_ipc_pipe_enums */ + +/** +* \addtogroup group_ipc_pipe_data_structures +* \{ +*/ + +/** \cond +* NOTE: This doxygen comment must be placed before some code entity, or else +* it will belong to a random entity that follows it, e.g. group_ipc_functions +* +* Client identifier for a message. +* For a given pipe, traffic across the pipe can be multiplexed with multiple +* senders on one end and multiple receivers on the other end. +* +* The first 32-bit word of the message is used to identify the client that owns +* the message. +* +* The upper 16 bits are the client ID. +* +* The lower 16 bits are for use by the client in any way desired. +* +* The lower 16 bits are preserved (not modified) and not interpreted in any way. +* \endcond +*/ + +/** \} group_ipc_pipe_data_structures */ + +/******************************************************************************/ +/* Global function prototypes (definition in C source) */ +/******************************************************************************/ + +/** +* \addtogroup group_ipc_pipe_functions +* \{ +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +void Cy_IPC_Pipe_EndpointInit(uint32_t epAddr, cy_ipc_pipe_callback_array_ptr_t cbArray, + uint32_t cbCnt, uint32_t epConfig, cy_stc_sysint_t const *epInterrupt); +cy_en_ipc_pipe_status_t Cy_IPC_Pipe_SendMessage(uint32_t toAddr, uint32_t fromAddr, void *msgPtr, + cy_ipc_pipe_relcallback_ptr_t callBackPtr); +cy_en_ipc_pipe_status_t Cy_IPC_Pipe_RegisterCallback(uint32_t epAddr, + cy_ipc_pipe_callback_ptr_t callBackPtr, uint32_t clientId); +void Cy_IPC_Pipe_ExecCallback(cy_stc_ipc_pipe_ep_t * endpoint); +void Cy_IPC_Pipe_RegisterCallbackRel(uint32_t epAddr, cy_ipc_pipe_relcallback_ptr_t callBackPtr); +void Cy_IPC_Pipe_Config(cy_stc_ipc_pipe_ep_t * theEpArray); +void Cy_IPC_Pipe_Init(cy_stc_ipc_pipe_config_t const *config); + +cy_en_ipc_pipe_status_t Cy_IPC_Pipe_EndpointPause(uint32_t epAddr); +cy_en_ipc_pipe_status_t Cy_IPC_Pipe_EndpointResume(uint32_t epAddr); + +#ifdef __cplusplus +} +#endif + +/** \} group_ipc_pipe_functions */ + +#endif /* CY_IPC_PIPE_H */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_sema.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_sema.c new file mode 100644 index 0000000000..a7a1e036e3 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_sema.c @@ -0,0 +1,369 @@ +/***************************************************************************//** +* \file cy_ipc_sema.c +* \version 1.10 +* +* Description: +* IPC Semaphore Driver - This source file contains the source code for the +* semaphore level APIs for the IPC interface. +* +******************************************************************************** +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "ipc/cy_ipc_drv.h" +#include "ipc/cy_ipc_sema.h" +#include "syslib/cy_syslib.h" +#include /* The memset() definition */ + +/* Defines a mask to Check if semaphore count is a multiple of 32 */ +#define CY_IPC_SEMA_PER_WORD_MASK (CY_IPC_SEMA_PER_WORD - 1ul) + +/* Pointer to IPC structure used for semaphores */ +static IPC_STRUCT_Type* cy_semaIpcStruct; + +/* +* Internal IPC semaphore control data structure. +*/ +typedef struct { + uint32_t maxSema; /* Maximum semaphores in system */ + uint32_t *arrayPtr; /* Pointer to semaphores array */ +} cy_stc_ipc_sema_t; + +/******************************************************************************* +* Function Name: Cy_IPC_Sema_Init +****************************************************************************//** +* +* This function initializes the semaphores subsystem. The user must create an +* array of unsigned 32-bit words to hold the semaphore bits. The number +* of semaphores will be the size of the array * 32. The total semaphores count +* will always be a multiple of 32. +* +* \note In a multi-CPU system this init function should be called with all +* initialized parameters on one CPU only to provide a pointer to SRAM that can +* be shared between all the CPUs in the system that will use semaphores. +* On other CPUs user must specify the IPC semaphores channel and pass 0 / NULL +* to count and memPtr parameters correspondingly. +* +* \param ipcChannel +* The IPC channel number used for semaphores +* +* \param count +* The maximum number of semaphores to be supported (multiple of 32). +* +* \param memPtr +* This points to the array of (count/32) words that contain the semaphore data. +* +* \return +* \retval CY_IPC_SEMA_SUCCESS: Successfully initialized +* \retval CY_IPC_SEMA_BAD_PARAM: Memory pointer is NULL and count is not zero, +* or count not multiple of 32 +* \retval CY_IPC_SEMA_ERROR_LOCKED: Could not acquire semaphores IPC channel +* +*******************************************************************************/ +cy_en_ipcsema_status_t Cy_IPC_Sema_Init(uint32_t ipcChannel, + uint32_t count, uint32_t memPtr[]) +{ + /* Structure containing semaphores control data */ + static cy_stc_ipc_sema_t cy_semaData; + + cy_en_ipcsema_status_t retStatus = CY_IPC_SEMA_BAD_PARAM; + + if (ipcChannel >= CY_IPC_CHANNELS) + { + retStatus = CY_IPC_SEMA_BAD_PARAM; + } + else + { + if( (NULL == memPtr) && (0u == count)) + { + cy_semaIpcStruct = Cy_IPC_Drv_GetIpcBaseAddress(ipcChannel); + + retStatus = CY_IPC_SEMA_SUCCESS; + } + + /* Check for non Null pointers and count value */ + else if ((NULL != memPtr) && (0u != count)) + { + /* Check if semaphore count is a multiple of 32 */ + if( 0ul == (count & CY_IPC_SEMA_PER_WORD_MASK)) + { + cy_semaIpcStruct = Cy_IPC_Drv_GetIpcBaseAddress(ipcChannel); + + cy_semaData.maxSema = count; + cy_semaData.arrayPtr = memPtr; + + /* Initialize all semaphores to released */ + (void)memset(cy_semaData.arrayPtr, 0, (count /8u)); + + /* Make sure semaphores start out released. */ + /* Ignore the return value since it is OK if it was already released. */ + (void) Cy_IPC_Drv_LockRelease (cy_semaIpcStruct, CY_IPC_NO_NOTIFICATION); + + /* Set the IPC Data with the pointer to the array. */ + if( CY_IPC_DRV_SUCCESS == Cy_IPC_Drv_SendMsgPtr (cy_semaIpcStruct, CY_IPC_NO_NOTIFICATION, &cy_semaData)) + { + if(CY_IPC_DRV_SUCCESS == Cy_IPC_Drv_LockRelease (cy_semaIpcStruct, CY_IPC_NO_NOTIFICATION)) + { + retStatus = CY_IPC_SEMA_SUCCESS; + } + else + { + /* IPC channel not released, still semaphored */ + retStatus = CY_IPC_SEMA_ERROR_LOCKED; + } + } + else + { + /* Could not acquire semaphore channel */ + retStatus = CY_IPC_SEMA_ERROR_LOCKED; + } + } + else + { + retStatus = CY_IPC_SEMA_BAD_PARAM; + } + } + else + { + retStatus = CY_IPC_SEMA_BAD_PARAM; + } + } + + return(retStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Sema_Set +****************************************************************************//** +* +* This function tries to acquire a semaphore. If the +* semaphore is not available, this function returns immediately with +* CY_IPC_SEMA_LOCKED. +* +* It first acquires the IPC channel that is used for all the semaphores, sets +* the semaphore if it is cleared, then releases the IPC channel used for the semaphore. +* +* \param semaNumber +* The semaphore number to acquire. +* +* \param preemptable +* When this parameter is enabled the function can be preempted by another +* task or other forms of context switching in an RTOS environment. +* +* \return +* \retval CY_IPC_SEMA_SUCCESS: The semaphore was set successfully +* \retval CY_IPC_SEMA_LOCKED: The semaphore channel is busy or locked +* by another process +* \retval CY_IPC_SEMA_NOT_ACQUIRED: Semaphore was already set +* \retval CY_IPC_SEMA_OUT_OF_RANGE: The semaphore number is not valid +* +* +*******************************************************************************/ +cy_en_ipcsema_status_t Cy_IPC_Sema_Set(uint32_t semaNumber, bool preemptable) +{ + uint32_t semaIndex; + uint32_t semaMask; + uint32_t interruptState = 0ul; + + cy_stc_ipc_sema_t *semaStruct; + cy_en_ipcsema_status_t retStatus = CY_IPC_SEMA_LOCKED; + + /* Get pointer to structure */ + semaStruct = (cy_stc_ipc_sema_t *)Cy_IPC_Drv_ReadDataValue(cy_semaIpcStruct); + + if (semaNumber < semaStruct->maxSema) + { + semaIndex = semaNumber / CY_IPC_SEMA_PER_WORD; + semaMask = (uint32_t)(1ul << (semaNumber - (semaIndex * CY_IPC_SEMA_PER_WORD) )); + + if (!preemptable) + { + interruptState = Cy_SysLib_EnterCriticalSection(); + } + + /* Check to make sure the IPC channel is released + If so, check if specific channel can be locked. */ + if(CY_IPC_DRV_SUCCESS == Cy_IPC_Drv_LockAcquire (cy_semaIpcStruct)) + { + if((semaStruct->arrayPtr[semaIndex] & semaMask) == 0ul) + { + semaStruct->arrayPtr[semaIndex] |= semaMask; + retStatus = CY_IPC_SEMA_SUCCESS; + } + else + { + retStatus = CY_IPC_SEMA_NOT_ACQUIRED; + } + + /* Release, but do not trigger a release event */ + (void) Cy_IPC_Drv_LockRelease (cy_semaIpcStruct, CY_IPC_NO_NOTIFICATION); + } + + if (!preemptable) + { + Cy_SysLib_ExitCriticalSection(interruptState); + } + } + else + { + retStatus = CY_IPC_SEMA_OUT_OF_RANGE; + } + + return(retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_IPC_Sema_Clear +****************************************************************************//** +* +* This functions tries to releases a semaphore. +* +* It first acquires the IPC channel that is used for all the semaphores, clears +* the semaphore if it is set, then releases the IPC channel used for the semaphores. +* +* \param semaNumber +* The index of the semaphore to release. +* +* \param preemptable +* When this parameter is enabled the function can be preempted by another +* task or other forms of context switching in an RTOS environment. +* +* \return +* \retval CY_IPC_SEMA_SUCCESS: The semaphore was cleared successfully +* \retval CY_IPC_SEMA_NOT_ACQUIRED: The semaphore was already cleared +* \retval CY_IPC_SEMA_LOCKED: The semaphore channel was semaphored or busy +* \retval CY_IPC_SEMA_OUT_OF_RANGE: The semaphore number is not valid +* +* +*******************************************************************************/ +cy_en_ipcsema_status_t Cy_IPC_Sema_Clear(uint32_t semaNumber, bool preemptable) +{ + uint32_t semaIndex; + uint32_t semaMask; + uint32_t interruptState = 0ul; + + cy_stc_ipc_sema_t *semaStruct; + cy_en_ipcsema_status_t retStatus = CY_IPC_SEMA_LOCKED; + + /* Get pointer to structure */ + semaStruct = (cy_stc_ipc_sema_t *)Cy_IPC_Drv_ReadDataValue(cy_semaIpcStruct); + + if (semaNumber < semaStruct->maxSema) + { + semaIndex = semaNumber / CY_IPC_SEMA_PER_WORD; + semaMask = (uint32_t)(1ul << (semaNumber - (semaIndex * CY_IPC_SEMA_PER_WORD) )); + + if (!preemptable) + { + interruptState = Cy_SysLib_EnterCriticalSection(); + } + + /* Check to make sure the IPC channel is released + If so, check if specific channel can be locked. */ + if(CY_IPC_DRV_SUCCESS == Cy_IPC_Drv_LockAcquire (cy_semaIpcStruct)) + { + if((semaStruct->arrayPtr[semaIndex] & semaMask) != 0ul) + { + semaStruct->arrayPtr[semaIndex] &= ~semaMask; + retStatus = CY_IPC_SEMA_SUCCESS; + } + else + { + retStatus = CY_IPC_SEMA_NOT_ACQUIRED; + } + + /* Release, but do not trigger a release event */ + (void) Cy_IPC_Drv_LockRelease (cy_semaIpcStruct, CY_IPC_NO_NOTIFICATION); + } + + if (!preemptable) + { + Cy_SysLib_ExitCriticalSection(interruptState); + } + } + else + { + retStatus = CY_IPC_SEMA_OUT_OF_RANGE; + } + return(retStatus); +} + +/******************************************************************************* +* Function Name: Cy_IPC_Sema_Status +****************************************************************************//** +* +* This function returns the status of the semaphore. +* +* \param semaNumber +* The index of the semaphore to return status. +* +* \return +* \retval CY_IPC_SEMA_STATUS_LOCKED: The semaphore is in the set state. +* \retval CY_IPC_SEMA_STATUS_UNLOCKED: The semaphore is in the cleared state. +* \retval CY_IPC_SEMA_OUT_OF_RANGE: The semaphore number is not valid +* +* +*******************************************************************************/ +#if defined (__ICCARM__) + __ramfunc +#else + CY_SECTION(".cy_ramfunc") +#endif +cy_en_ipcsema_status_t Cy_IPC_Sema_Status(uint32_t semaNumber) +{ + cy_en_ipcsema_status_t retStatus; + uint32_t semaIndex; + uint32_t semaMask; + cy_stc_ipc_sema_t *semaStruct; + + /* Get pointer to structure */ + semaStruct = (cy_stc_ipc_sema_t *)Cy_IPC_Drv_ReadDataValue(cy_semaIpcStruct); + + if (semaNumber < semaStruct->maxSema) + { + /* Get the index into the semaphore array and calculate the mask */ + semaIndex = semaNumber / CY_IPC_SEMA_PER_WORD; + semaMask = (uint32_t)(1ul << (semaNumber - (semaIndex * CY_IPC_SEMA_PER_WORD) )); + + if((semaStruct->arrayPtr[semaIndex] & semaMask) != 0ul) + { + retStatus = CY_IPC_SEMA_STATUS_LOCKED; + } + else + { + retStatus = CY_IPC_SEMA_STATUS_UNLOCKED; + } + } + else + { + retStatus = CY_IPC_SEMA_OUT_OF_RANGE; + } + return(retStatus); +} + + +/******************************************************************************* +* Function Name: Cy_IPC_Sema_GetMaxSems +****************************************************************************//** +* +* This function returns the number of semaphores in the semaphores subsystem. +* +* \return +* Returns the semaphores quantity. +* +*******************************************************************************/ +uint32_t Cy_IPC_Sema_GetMaxSems(void) +{ + cy_stc_ipc_sema_t *semaStruct; + + /* Get pointer to structure */ + semaStruct = (cy_stc_ipc_sema_t *)Cy_IPC_Drv_ReadDataValue(cy_semaIpcStruct); + + return (semaStruct->maxSema); +} + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_sema.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_sema.h new file mode 100644 index 0000000000..f2a202d1d2 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/ipc/cy_ipc_sema.h @@ -0,0 +1,116 @@ +/***************************************************************************//** +* \file cy_ipc_sema.h +* \version 1.10 +* +* \brief +* Header file for IPC SEM functions +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef CY_IPC_SEMA_H +#define CY_IPC_SEMA_H + +/******************************************************************************/ +/* Include files */ +/******************************************************************************/ +#include "cy_ipc_drv.h" +#include + +/** +* \addtogroup group_ipc_sema IPC semaphores layer (IPC_SEMA) +* \{ +* The semaphores layer functions made use of a single IPC channel to allow +* multiple semaphores that can be used by system or user function calls. +* By default there are 128 semaphores provided, although the user may modify +* the default value to any number, limited only by SRAM. +* +* \defgroup group_ipc_sema_macros Macros +* Macro definitions are used in the driver +* +* \defgroup group_ipc_sema_functions Functions +* Functions are used in the driver +* +* \defgroup group_ipc_sema_enums Enumerated Types +* Enumerations are used in the driver +* \} +* +* \addtogroup group_ipc_sema_macros +* \{ +*/ + +/** Software PDL driver ID for IPC semaphore functions */ +#define CY_IPC_SEMA_RTN (0x0100ul) +/** Return prefix for IPC semaphore function status codes */ +#define CY_IPC_SEMA_ID_INFO (uint32_t)( CY_IPC_ID_INFO | CY_IPC_SEMA_RTN) +/** Return prefix for IPC semaphore function warning return values */ +#define CY_IPC_SEMA_ID_WARNING (uint32_t)( CY_IPC_ID_WARNING | CY_IPC_SEMA_RTN) +/** Return prefix for IPC semaphore function error return values */ +#define CY_IPC_SEMA_ID_ERROR (uint32_t)( CY_IPC_ID_ERROR | CY_IPC_SEMA_RTN) + +#define CY_IPC_SEMA_PER_WORD (uint32_t)32u /**< 32 semaphores per word */ + +/** \} group_ipc_sema_macros */ + +/** +* \addtogroup group_ipc_sema_enums +* \{ +*/ + +/** Return constants for IPC semaphores functions. */ +typedef enum +{ + /** No error has occurred */ + CY_IPC_SEMA_SUCCESS = (uint32_t)(0ul), + /** Semaphores IPC channel has already been locked */ + CY_IPC_SEMA_ERROR_LOCKED = (uint32_t)(CY_IPC_SEMA_ID_ERROR | 1ul), + /** Semaphores IPC channel is unlocked */ + CY_IPC_SEMA_ERROR_UNLOCKED = (uint32_t)(CY_IPC_SEMA_ID_ERROR | 2ul), + /** Semaphore API bad parameter */ + CY_IPC_SEMA_BAD_PARAM = (uint32_t)(CY_IPC_SEMA_ID_ERROR | 3ul), + /** Semaphore API return when semaphore number is out of the range */ + CY_IPC_SEMA_OUT_OF_RANGE = (uint32_t)(CY_IPC_SEMA_ID_ERROR | 4ul), + + /** Semaphore API return when IPC channel was not acquired */ + CY_IPC_SEMA_NOT_ACQUIRED = (uint32_t)(CY_IPC_SEMA_ID_INFO | 2ul), + /** Semaphore API return status when semaphore channel is busy or locked +* by another process */ + CY_IPC_SEMA_LOCKED = (uint32_t)(CY_IPC_SEMA_ID_INFO | 3ul), + /** Semaphore status return that the semaphore is set */ + CY_IPC_SEMA_STATUS_LOCKED = (uint32_t)(CY_IPC_SEMA_ID_INFO | 1ul), + /** Semaphore status return that the semaphore is cleared */ + CY_IPC_SEMA_STATUS_UNLOCKED = (uint32_t)(CY_IPC_SEMA_ID_INFO | 0ul) +} cy_en_ipcsema_status_t; + +/** \} group_ipc_sema_enums */ + +/** +* \addtogroup group_ipc_sema_functions +* \{ +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +cy_en_ipcsema_status_t Cy_IPC_Sema_Init (uint32_t ipcChannel, uint32_t count, uint32_t memPtr[]); +cy_en_ipcsema_status_t Cy_IPC_Sema_Set (uint32_t semaNumber, bool preemptable); +cy_en_ipcsema_status_t Cy_IPC_Sema_Clear (uint32_t semaNumber, bool preemptable); +cy_en_ipcsema_status_t Cy_IPC_Sema_Status (uint32_t semaNumber); +uint32_t Cy_IPC_Sema_GetMaxSems(void); + +#ifdef __cplusplus +} +#endif + +/** \} group_ipc_sema_functions */ + +#endif /* CY_IPC_SEMA_H */ + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lpcomp/cy_lpcomp.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lpcomp/cy_lpcomp.c new file mode 100644 index 0000000000..655f83c97d --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lpcomp/cy_lpcomp.c @@ -0,0 +1,545 @@ +/******************************************************************************* +* \file cy_lpcomp.c +* \version 1.10 +* +* \brief +* This file provides the driver code to the API for the Low Power Comparator +* component. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ +#include "cy_lpcomp.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************************* +* Function Name: Cy_LPComp_Init +****************************************************************************//** +* +* Initializes LPCOMP and returns the LPCOMP register address. +* +* \param *base +* LPCOMP registers structure pointer. +* +* \param *config +* The pointer to the configuration structure for PDL. +* +* \param channel +* The LPCOMP channel index. +* +* \return cy_en_lpcomp_status_t +* *base checking result. If the pointer is NULL, returns error. +* +*******************************************************************************/ +cy_en_lpcomp_status_t Cy_LPComp_Init(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, const cy_stc_lpcomp_config_t* config) +{ + cy_en_lpcomp_status_t ret = CY_LPCOMP_BAD_PARAM; + + CY_ASSERT_L3(CY_LPCOMP_IS_CHANNEL_VALID(channel)); + CY_ASSERT_L3(CY_LPCOMP_IS_OUT_MODE_VALID(config->outputMode)); + CY_ASSERT_L3(CY_LPCOMP_IS_HYSTERESIS_VALID(config->hysteresis)); + + if ((base != NULL) && (config != NULL)) + { + Cy_LPComp_GlobalEnable(base); + + if (CY_LPCOMP_CHANNEL_0 == channel) + { + base->CMP0_CTRL = _VAL2FLD(LPCOMP_CMP0_CTRL_HYST0, (uint32_t)config->hysteresis) | + _VAL2FLD(LPCOMP_CMP0_CTRL_DSI_BYPASS0, (uint32_t)config->outputMode) | + _VAL2FLD(LPCOMP_CMP0_CTRL_DSI_LEVEL0, (uint32_t)config->outputMode >> 1u); + } + else + { + base->CMP1_CTRL = _VAL2FLD(LPCOMP_CMP1_CTRL_HYST1, (uint32_t)config->hysteresis) | + _VAL2FLD(LPCOMP_CMP1_CTRL_DSI_BYPASS1, (uint32_t)config->outputMode) | + _VAL2FLD(LPCOMP_CMP1_CTRL_DSI_LEVEL1, (uint32_t)config->outputMode >> 1u); + } + + ret = CY_LPCOMP_SUCCESS; + } + + return (ret); +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_SetInterruptTriggerMode +****************************************************************************//** +* +* Sets the interrupt edge-detect mode. +* This also controls the value provided on the output. +* Note: Interrupts can be enabled after the block is enabled and the appropriate +* start-up time has elapsed: +* 3 us for the normal power mode; +* 6 us for the LP mode; +* 50 us for the ULP mode. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \param channel +* The LPCOMP channel index. +* +* \param intType +* Interrupt edge trigger selection +* CY_LPCOMP_INTR_DISABLE (=0) - Disabled, no interrupt will be detected +* CY_LPCOMP_INTR_RISING (=1) - Rising edge +* CY_LPCOMP_INTR_FALLING (=2) - Falling edge +* CY_LPCOMP_INTR_BOTH (=3) - Both rising and falling edges. +* +* \return None +* +*******************************************************************************/ +void Cy_LPComp_SetInterruptTriggerMode(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, cy_en_lpcomp_int_t intType) +{ + CY_ASSERT_L3(CY_LPCOMP_IS_CHANNEL_VALID(channel)); + CY_ASSERT_L3(CY_LPCOMP_IS_INTR_MODE_VALID(intType)); + + if (CY_LPCOMP_CHANNEL_0 == channel) + { + base->CMP0_CTRL = _CLR_SET_FLD32U(base->CMP0_CTRL, LPCOMP_CMP0_CTRL_INTTYPE0, (uint32_t)intType); + } + else + { + base->CMP1_CTRL = _CLR_SET_FLD32U(base->CMP1_CTRL, LPCOMP_CMP1_CTRL_INTTYPE1, (uint32_t)intType); + } +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_SetPower +****************************************************************************//** +* +* Sets the drive power and speeds to one of the four settings. +* Note: The comparator interrupt should be enabled after enabling of the +* comparator itself. Otherwise, unexpected interrupts events can occur. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \param channel +* The LPCOMP channel index. +* +* \param power +* The power setting sets an operation mode of the component: +* CY_LPCOMP_OFF_POWER (=0) - Off power +* CY_LPCOMP_MODE_ULP (=1) - Slow/ultra low power +* CY_LPCOMP_MODE_LP (=2) - Medium/low power +* CY_LPCOMP_MODE_NORMAL(=3) - Fast/normal power +* +* \return None +* +*******************************************************************************/ +void Cy_LPComp_SetPower(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, cy_en_lpcomp_pwr_t power) +{ + CY_ASSERT_L3(CY_LPCOMP_IS_CHANNEL_VALID(channel)); + CY_ASSERT_L3(CY_LPCOMP_IS_POWER_VALID(power)); + + if (CY_LPCOMP_CHANNEL_0 == channel) + { + base->CMP0_CTRL = _CLR_SET_FLD32U(base->CMP0_CTRL, LPCOMP_CMP0_CTRL_MODE0, (uint32_t)power); + } + else + { + base->CMP1_CTRL = _CLR_SET_FLD32U(base->CMP1_CTRL, LPCOMP_CMP1_CTRL_MODE1, (uint32_t)power); + } +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_SetHysteresis +****************************************************************************//** +* +* Adds the 30mV hysteresis to the comparator. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \param channel +* The LPCOMP channel index. +* +* \param hysteresis +* Sets an operation mode of the component +* CY_LPCOMP_HYST_ENABLE (=1) - Enables HYST +* CY_LPCOMP_HYST_DISABLE(=0) - Disable HYST. +* +* \return None +* +*******************************************************************************/ +void Cy_LPComp_SetHysteresis(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, cy_en_lpcomp_hyst_t hysteresis) +{ + CY_ASSERT_L3(CY_LPCOMP_IS_CHANNEL_VALID(channel)); + CY_ASSERT_L3(CY_LPCOMP_IS_HYSTERESIS_VALID(hysteresis)); + + if (CY_LPCOMP_CHANNEL_0 == channel) + { + base->CMP0_CTRL = _CLR_SET_FLD32U(base->CMP0_CTRL, LPCOMP_CMP0_CTRL_HYST0, (uint32_t)hysteresis); + } + else + { + base->CMP1_CTRL = _CLR_SET_FLD32U(base->CMP1_CTRL , LPCOMP_CMP1_CTRL_HYST1, (uint32_t)hysteresis); + } +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_SetInputs +****************************************************************************//** +* +* Sets the comparator input sources. The comparator inputs can be connected +* to the dedicated GPIO pins or AMUXBUSA/AMUXBUSB. Additionally, the negative +* comparator input can be connected to the local VREF. +* At least one unconnected input causes a comparator undefined output. +* +* Note: Connection to AMUXBUSA/AMUXBUSB requires closing the additional +* switches which are a part of the IO system. These switches can be configured +* using the HSIOM->AMUX_SPLIT_CTL[3] register. +* Refer to the appropriate Technical Reference Manual (TRM) of a device +* for a detailed description. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \param channel +* The LPCOMP channel index. +* +* \param inputP +* Positive input selection +* CY_LPCOMP_SW_GPIO (0x01u) +* CY_LPCOMP_SW_AMUXBUSA (0x02u) - Hi-Z in hibernate mode +* CY_LPCOMP_SW_AMUXBUSB (0x04u) - Hi-Z in the hibernate mode. +* +* \param inputN +* Negative input selection +* CY_LPCOMP_SW_GPIO (0x01u) +* CY_LPCOMP_SW_AMUXBUSA (0x02u) - Hi-Z in hibernate mode +* CY_LPCOMP_SW_AMUXBUSB (0x04u) - Hi-Z in hibernate mode +* CY_LPCOMP_SW_LOCAL_VREF (0x08u) - the negative input only for a crude REF. +* +* \return None +* +*******************************************************************************/ +void Cy_LPComp_SetInputs(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, cy_en_lpcomp_inputs_t inputP, cy_en_lpcomp_inputs_t inputN) +{ + uint32_t input; + + CY_ASSERT_L3(CY_LPCOMP_IS_CHANNEL_VALID(channel)); + CY_ASSERT_L3(CY_LPCOMP_IS_INPUT_P_VALID(inputP)); + CY_ASSERT_L3(CY_LPCOMP_IS_INPUT_N_VALID(inputN)); + + switch(inputP) + { + case CY_LPCOMP_SW_AMUXBUSA: + { + input = (channel == CY_LPCOMP_CHANNEL_0) ? LPCOMP_CMP0_SW_CMP0_AP0_Msk : LPCOMP_CMP1_SW_CMP1_AP1_Msk; + HSIOM->AMUX_SPLIT_CTL[3] = _CLR_SET_FLD32U(HSIOM->AMUX_SPLIT_CTL[3], CY_HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SL_SR, 3u); + break; + } + case CY_LPCOMP_SW_AMUXBUSB: + { + input = (channel == CY_LPCOMP_CHANNEL_0) ? LPCOMP_CMP0_SW_CMP0_BP0_Msk : LPCOMP_CMP1_SW_CMP1_BP1_Msk; + HSIOM->AMUX_SPLIT_CTL[3] = _CLR_SET_FLD32U(HSIOM->AMUX_SPLIT_CTL[3], CY_HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SL_SR, 3u); + break; + } + default: + { + input = (channel == CY_LPCOMP_CHANNEL_0) ? LPCOMP_CMP0_SW_CMP0_IP0_Msk : LPCOMP_CMP1_SW_CMP1_IP1_Msk; + break; + } + } + + switch(inputN) + { + case CY_LPCOMP_SW_AMUXBUSA: + { + input |= (channel == CY_LPCOMP_CHANNEL_0) ? LPCOMP_CMP0_SW_CMP0_AN0_Msk : LPCOMP_CMP1_SW_CMP1_AN1_Msk; + HSIOM->AMUX_SPLIT_CTL[3] = _CLR_SET_FLD32U(HSIOM->AMUX_SPLIT_CTL[3], CY_HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SL_SR, 3u); + break; + } + case CY_LPCOMP_SW_AMUXBUSB: + { + input |= (channel == CY_LPCOMP_CHANNEL_0) ? LPCOMP_CMP0_SW_CMP0_BN0_Msk : LPCOMP_CMP1_SW_CMP1_BN1_Msk; + HSIOM->AMUX_SPLIT_CTL[3] = _CLR_SET_FLD32U(HSIOM->AMUX_SPLIT_CTL[3], CY_HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SL_SR, 3u); + break; + } + case CY_LPCOMP_SW_LOCAL_VREF: + { + input |= (channel == CY_LPCOMP_CHANNEL_0) ? LPCOMP_CMP0_SW_CMP0_VN0_Msk : LPCOMP_CMP1_SW_CMP1_VN1_Msk; + break; + } + default: + { + input |= (channel == CY_LPCOMP_CHANNEL_0) ? LPCOMP_CMP0_SW_CMP0_IN0_Msk : LPCOMP_CMP1_SW_CMP1_IN1_Msk; + break; + } + } + + if (CY_LPCOMP_CHANNEL_0 == channel) + { + base->CMP0_SW_CLEAR = CY_LPCOMP_CMP0_SW_POS_Msk | CY_LPCOMP_CMP0_SW_NEG_Msk; + base->CMP0_SW = input; + } + else + { + base->CMP1_SW_CLEAR = CY_LPCOMP_CMP1_SW_POS_Msk | CY_LPCOMP_CMP1_SW_NEG_Msk; + base->CMP1_SW = input; + } +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_SetOutputMode +****************************************************************************//** +* +* Sets the type of the comparator DSI output. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \param channel +* The LPCOMP channel index. +* +* \param outType +* Interrupt edge trigger selection +* CY_LPCOMP_OUT_PULSE (=0) - the DSI output with the pulse option, no bypass +* CY_LPCOMP_OUT_DIRECT (=1) - the bypass mode, the direct output of the comparator +* CY_LPCOMP_OUT_SYNC (=2) - DSI output with the level option, it is similar to the +* bypass mode but it is 1 cycle slow than the bypass. +* [DSI_LEVELx : DSI_BYPASSx] = [Bit11 : Bit10] +* 0 : 0 = 0x00 -> Pulse (PULSE) +* 1 : 0 = 0x02 -> Level (SYNC) +* x : 1 = 0x01 -> Bypass (Direct). +* +* \return None +* +*******************************************************************************/ +void Cy_LPComp_SetOutputMode(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, cy_en_lpcomp_out_t outType) +{ + CY_ASSERT_L3(CY_LPCOMP_IS_CHANNEL_VALID(channel)); + CY_ASSERT_L3(CY_LPCOMP_IS_OUT_MODE_VALID(outType)); + + if (CY_LPCOMP_CHANNEL_0 == channel) + { + base->CMP0_CTRL = _CLR_SET_FLD32U(base->CMP0_CTRL, CY_LPCOMP_CMP0_OUTPUT_CONFIG, (uint32_t)outType); + } + else + { + base->CMP1_CTRL = _CLR_SET_FLD32U(base->CMP1_CTRL, CY_LPCOMP_CMP1_OUTPUT_CONFIG, (uint32_t)outType); + } +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_DeepSleepCallback +****************************************************************************//** +* +* This function checks the current power mode of LPComp and then disables the +* LPComp block if there is no wake-up source from LPComp in the deep-sleep mode. +* It stores the state of the LPComp enable and then disables the LPComp block +* before going to the low power modes, and recovers the LPComp power state after +* wake-up using the stored value. +* The function attribution has a weak linkage, so the user can override this +* function for a custom lower-power callback. +* +* \param *callbackParams +* The \ref cy_stc_syspm_callback_params_t structure with the callback +* parameters which consists of mode, base and context fields: +* *base - LPComp register structure pointer; +* *context - Context for the call-back function; +* mode +* CY_SYSPM_CHECK_READY - No action for this state. +* CY_SYSPM_CHECK_FAIL - No action for this state. +* CY_SYSPM_BEFORE_TRANSITION - Checks the LPComp interrupt mask and the power +* mode, and then disables or enables the LPComp block +* according to the condition. +* Stores the LPComp state to recover the state after +* wake up. +* CY_SYSPM_AFTER_TRANSITION - Enables the LPComp block, if it was disabled +* before the sleep mode. +* +* \return +* \ref cy_en_syspm_status_t +* +*******************************************************************************/ +cy_en_syspm_status_t Cy_LPComp_DeepSleepCallback(cy_stc_syspm_callback_params_t *callbackParams) +{ + cy_en_syspm_status_t ret = CY_SYSPM_FAIL; + LPCOMP_Type *locBase = (LPCOMP_Type *) (callbackParams->base); + static uint32_t enabled_status; + + switch(callbackParams->mode) + { + case CY_SYSPM_CHECK_READY: + { + ret = CY_SYSPM_SUCCESS; + } + break; + + case CY_SYSPM_CHECK_FAIL: + { + ret = CY_SYSPM_SUCCESS; + } + break; + + case CY_SYSPM_BEFORE_TRANSITION: + { + /* Save the LPComp the enabled/disabled status. */ + enabled_status = _FLD2VAL(LPCOMP_CONFIG_ENABLED, locBase->CONFIG); + + if (0u != enabled_status) + { + /* Disable the LPComp block when there is no wake-up source from any channel. */ + if( !(((_FLD2VAL(LPCOMP_CMP0_CTRL_MODE0, locBase->CMP0_CTRL) == (uint32_t)CY_LPCOMP_MODE_ULP) && + _FLD2BOOL(LPCOMP_INTR_MASK_COMP0_MASK, locBase->INTR_MASK)) || + ((_FLD2VAL(LPCOMP_CMP1_CTRL_MODE1, locBase->CMP1_CTRL) == (uint32_t)CY_LPCOMP_MODE_ULP) && + _FLD2BOOL(LPCOMP_INTR_MASK_COMP1_MASK, locBase->INTR_MASK))) ) + + { + /* Disable the LPComp block to avoid leakage. */ + Cy_LPComp_GlobalDisable(locBase); + } + else + { + /* Set LPComp the status to the not changed state. */ + enabled_status = 0u; + } + } + else + { + /* The LPComp block was already disabled and + * the system is allowed to go to the low power mode. + */ + } + + ret = CY_SYSPM_SUCCESS; + } + break; + + case CY_SYSPM_AFTER_TRANSITION: + { + /* Enable LPComp to operate if it was enabled + * before entering to the low power mode. + */ + if (0u != enabled_status) + { + Cy_LPComp_GlobalEnable(locBase); + } + else + { + /* The LPComp block was disabled before calling this API + * with mode = CY_SYSPM_CHECK_READY. + */ + } + + ret = CY_SYSPM_SUCCESS; + } + break; + + default: + break; + } + + return (ret); +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_HibernateCallback +****************************************************************************//** +* +* This function checks the current power mode of LPComp and then disable the +* LPComp block, if there is no wake-up source from LPComp in the hibernate mode. +* The function attribution has a weak linkage, so the user can override this +* function for a custom lower-power callback. +* +* \param *callbackParams +* The \ref cy_stc_syspm_callback_params_t structure with the callback +* parameters which consists of mode, base and context fields: +* *base - LPComp register structure pointer; +* *context - Context for the call-back function; +* mode +* CY_SYSPM_CHECK_READY - No action for this state. +* CY_SYSPM_CHECK_FAIL - No action for this state. +* CY_SYSPM_BEFORE_TRANSITION - Checks the wake-up source from the hibernate mode +* of the LPComp block, and then disables or enables +* the LPComp block according to the condition. +* +* \return +* \ref cy_en_syspm_status_t +* +*******************************************************************************/ +cy_en_syspm_status_t Cy_LPComp_HibernateCallback(cy_stc_syspm_callback_params_t *callbackParams) +{ + cy_en_syspm_status_t ret = CY_SYSPM_FAIL; + LPCOMP_Type *locBase = (LPCOMP_Type *) (callbackParams->base); + static uint32_t enabled_status; + + switch(callbackParams->mode) + { + case CY_SYSPM_CHECK_READY: + { + ret = CY_SYSPM_SUCCESS; + } + break; + + case CY_SYSPM_CHECK_FAIL: + { + ret = CY_SYSPM_SUCCESS; + } + break; + + case CY_SYSPM_BEFORE_TRANSITION: + { + /* Save the LPComp the enabled/disabled status. */ + enabled_status = _FLD2VAL(LPCOMP_CONFIG_ENABLED, locBase->CONFIG); + + if (0u != enabled_status) + { + /* Disable the LPComp block when there is no wake-up source from any channel. */ + if( !(((_FLD2VAL(LPCOMP_CMP0_CTRL_MODE0, locBase->CMP0_CTRL) == (uint32_t)CY_LPCOMP_MODE_ULP) && + _FLD2BOOL(CY_LPCOMP_WAKEUP_PIN0, SRSS->PWR_HIBERNATE)) || + ((_FLD2VAL(LPCOMP_CMP1_CTRL_MODE1, locBase->CMP1_CTRL) == (uint32_t)CY_LPCOMP_MODE_ULP) && + _FLD2BOOL(CY_LPCOMP_WAKEUP_PIN1, SRSS->PWR_HIBERNATE))) ) + + { + /* Disable the LPComp block to avoid leakage. */ + Cy_LPComp_GlobalDisable(locBase); + } + else + { + /* Set LPComp the status to the not changed state. */ + enabled_status = 0u; + } + } + else + { + /* The LPComp block was already disabled and + * the system is allowed to go to the low power mode. + */ + } + + ret = CY_SYSPM_SUCCESS; + } + break; + + default: + break; + } + + return (ret); +} + +#if defined(__cplusplus) +} +#endif + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lpcomp/cy_lpcomp.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lpcomp/cy_lpcomp.h new file mode 100644 index 0000000000..4d781123aa --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lpcomp/cy_lpcomp.h @@ -0,0 +1,687 @@ +/***************************************************************************//** +* \file cy_lpcomp.h +* \version 1.10 +* +* This file provides constants and parameter values for the Low Power Comparator driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \defgroup group_lpcomp Low Power Comparator (LPComp) +* \{ +* Provides access to the low-power comparators implemented using the fixed-function +* LP comparator block that is present in PSoC 6. +* +* These comparators can perform fast analog signal comparison of internal +* and external analog signals in all system power modes. Low-power comparator +* output can be inspected by the CPU, used as an interrupt/wakeup source to the +* CPU when in low-power mode (Sleep, Low-Power Sleep, or Deep-Sleep), used as +* a wakeup source to system resources when in Hibernate mode, or fed to DSI as +* an asynchronous or synchronous signal (level or pulse). +* +* \section group_lpcomp_section_Configuration_Considerations Configuration Considerations +* To set up an LPComp, the inputs, the output, the mode, the interrupts and +* other configuration parameters should be configured. Power the LPComp to operate. +* +* The sequence recommended for the LPComp operation: +* +* 1) To initialize the driver, call the Cy_LPComp_Init() function providing +* the filled cy_stc_lpcomp_config_t structure, the LPComp channel number, +* and the LPCOMP registers structure pointer. +* +* 2) Optionally, configure the interrupt requests if the interrupt event +* triggering is needed. Use the Cy_LPComp_SetInterruptMask() function with +* the parameter for the mask available in the configuration file. +* Additionally, enable the Global interrupts and initialize the referenced +* interrupt by setting the priority and the interrupt vector using +* the \ref Cy_SysInt_Init() function of the sysint driver. +* +* 3) Configure the inputs and the output using the \ref Cy_GPIO_Pin_Init() +* functions of the GPIO driver. +* The High Impedance Analog drive mode is for the inputs and +* the Strong drive mode is for the output. +* Use the Cy_LPComp_SetInputs() function to connect the comparator inputs +* to the dedicated IO pins, AMUXBUSA/AMUXBUSB or Vref: +* \image html lpcomp_inputs.png +* +* 4) Power on the comparator using the Cy_LPComp_SetPower() function. +* +* 5) Optionally, enable the comparator interrupt using +* Cy_LPComp_SetInterruptTriggerMode() with the corresponding parameter +* for the interrupt mode (Rising edge, Falling edge, or Both edges). +* +* 6) The comparator output can be monitored using +* the Cy_LPComp_GetCompare() function or using the LPComp interrupt +* (if the interrupt is enabled). +* +* NOTE 1: To prevent false triggering, a delay before enabling +* the comparator interrupt is required. The recommended delay is +* 10 us for the Normal power mode and 50 us for the Ultra low-power mode. +* +* NOTE 2: The interrupt is not cleared automatically. +* It is the user's responsibility to do that. +* The interrupt is cleared by writing a 1 in the corresponding interrupt +* register bit position. The preferred way to clear interrupt sources +* is using the Cy_LPComp_ClearInterrupt() function. +* +* NOTE 3: Individual comparator interrupt outputs are ORed together +* as a single asynchronous interrupt source before it is sent out and +* used to wake up the system in the low-power mode. +* For PSoC 6 devices, the individual comparator interrupt is masked +* by the INTR_MASK register. The masked result is captured in +* the INTR_MASKED register. +* Writing a 1 to the INTR register bit will clear the interrupt. +* +* \section group_lpcomp_more_information More Information +* +* Refer to the appropriate device technical reference manual (TRM) for +* a detailed description of the registers. +* +* \section group_lpcomp_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
    11.4AA cast should not be performed between a pointer to object type and +* a different pointer to object type. +* The pointer to the buffer memory is void to allow handling different +* different data types: uint8_t (4-8 bits) or uint16_t (9-16 bits). +* The cast operation is safe because the configuration is verified +* before operation is performed. +* The function \ref Cy_LPComp_DeepSleepCallback is a callback of +* the \ref cy_en_syspm_status_t type. The cast operation safety in this +* function becomes the user's responsibility because the pointers are +* initialized when a callback is registered in the SysPm driver.
    +* +* \section group_lpcomp_Changelog Changelog +* +* +* +* +* +* +* +* +* +* +* +* +*
    VersionChangesReason for Change
    1.0Initial version
    1.10The CY_WEAK keyword is removed from Cy_LPComp_DeepSleepCallback() +* and Cy_LPComp_HibernateCallback() functions
    +* Added input parameter validation to the API functions.
    +* +* \defgroup group_lpcomp_macros Macros +* \defgroup group_lpcomp_functions Functions +* \defgroup group_lpcomp_data_structures Data structures +* \defgroup group_lpcomp_enums Enumerated Types +*/ + +#ifndef CY_LPCOMP_PDL_H +#define CY_LPCOMP_PDL_H + +/******************************************************************************/ +/* Include files */ +/******************************************************************************/ + +#include +#include +#include "cy_device_headers.h" +#include "syslib/cy_syslib.h" +#include "syspm/cy_syspm.h" + +#ifndef CY_IP_MXLPCOMP + #error "The LPCOMP driver is not supported on this device" +#endif + +/* C binding of definitions if building with C++ compiler */ +#ifdef __cplusplus +extern "C" +{ +#endif + +/** +* \addtogroup group_lpcomp_macros +* \{ +*/ + +/** Driver major version */ +#define CY_LPCOMP_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_LPCOMP_DRV_VERSION_MINOR 10 + +/****************************************************************************** +* API Constants +******************************************************************************/ + +/**< LPCOMP PDL ID */ +#define CY_LPCOMP_ID CY_PDL_DRV_ID(0x23u) + +/** The LPCOMP's number of channels. */ +#define CY_LPCOMP_MAX_CHANNEL_NUM (2u) + +/** LPCOMP's comparator 1 interrupt mask. */ +#define CY_LPCOMP_COMP0 (0x01u) +/** LPCOMP's comparator 2 interrupt mask. */ +#define CY_LPCOMP_COMP1 (0x02u) + +/** \cond INTERNAL_MACROS */ + + +/****************************************************************************** +* Registers Constants +******************************************************************************/ + +#define CY_LPCOMP_MODE_ULP_Pos (0x0uL) +#define CY_LPCOMP_MODE_ULP_Msk (0x1uL) + +#define CY_LPCOMP_INTR_Pos (LPCOMP_INTR_COMP0_Pos) +#define CY_LPCOMP_INTR_Msk (LPCOMP_INTR_COMP0_Msk | LPCOMP_INTR_COMP1_Msk) + +#define CY_LPCOMP_CMP0_SW_POS_Msk (LPCOMP_CMP0_SW_CMP0_IP0_Msk | \ + LPCOMP_CMP0_SW_CMP0_AP0_Msk | \ + LPCOMP_CMP0_SW_CMP0_BP0_Msk) +#define CY_LPCOMP_CMP0_SW_NEG_Msk (LPCOMP_CMP0_SW_CMP0_IN0_Msk | \ + LPCOMP_CMP0_SW_CMP0_AN0_Msk | \ + LPCOMP_CMP0_SW_CMP0_BN0_Msk | \ + LPCOMP_CMP0_SW_CMP0_VN0_Msk) +#define CY_LPCOMP_CMP1_SW_POS_Msk (LPCOMP_CMP1_SW_CMP1_IP1_Msk | \ + LPCOMP_CMP1_SW_CMP1_AP1_Msk | \ + LPCOMP_CMP1_SW_CMP1_BP1_Msk) +#define CY_LPCOMP_CMP1_SW_NEG_Msk (LPCOMP_CMP1_SW_CMP1_IN1_Msk | \ + LPCOMP_CMP1_SW_CMP1_AN1_Msk | \ + LPCOMP_CMP1_SW_CMP1_BN1_Msk | \ + LPCOMP_CMP1_SW_CMP1_VN1_Msk) + +#define CY_LPCOMP_CMP0_OUTPUT_CONFIG_Pos LPCOMP_CMP0_CTRL_DSI_BYPASS0_Pos +#define CY_LPCOMP_CMP1_OUTPUT_CONFIG_Pos LPCOMP_CMP1_CTRL_DSI_BYPASS1_Pos + +#define CY_LPCOMP_CMP0_OUTPUT_CONFIG_Msk (LPCOMP_CMP0_CTRL_DSI_BYPASS0_Msk | \ + LPCOMP_CMP0_CTRL_DSI_LEVEL0_Msk) + +#define CY_LPCOMP_CMP1_OUTPUT_CONFIG_Msk (LPCOMP_CMP1_CTRL_DSI_BYPASS1_Msk | \ + LPCOMP_CMP1_CTRL_DSI_LEVEL1_Msk) + +#define CY_HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SL_SR_Pos HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SL_Pos + +#define CY_HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SL_SR_Msk (HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SL_Msk | \ + HSIOM_AMUX_SPLIT_CTL_SWITCH_AA_SR_Msk) + +#define CY_HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SL_SR_Pos HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SL_Pos + +#define CY_HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SL_SR_Msk (HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SL_Msk | \ + HSIOM_AMUX_SPLIT_CTL_SWITCH_BB_SR_Msk) + +#define CY_LPCOMP_REF_CONNECTED (1u) + +#define CY_LPCOMP_WAKEUP_PIN0_Msk CY_SYSPM_WAKEUP_LPCOMP0 +#define CY_LPCOMP_WAKEUP_PIN1_Msk CY_SYSPM_WAKEUP_LPCOMP1 + +/** \endcond */ +/** \} group_lpcomp_macros */ + +/** +* \addtogroup group_lpcomp_enums +* \{ +*/ + +/****************************************************************************** + * Enumerations + *****************************************************************************/ +/** The LPCOMP output modes. */ +typedef enum +{ + CY_LPCOMP_OUT_PULSE = 0u, /**< The LPCOMP DSI output with the pulse option, no bypass. */ + CY_LPCOMP_OUT_DIRECT = 1u, /**< The LPCOMP bypass mode, the direct output of a comparator. */ + CY_LPCOMP_OUT_SYNC = 2u /**< The LPCOMP DSI output with the level option, it is similar + to the bypass mode but it is 1 cycle slow than the bypass. */ +} cy_en_lpcomp_out_t; + +/** The LPCOMP hysteresis modes. */ +typedef enum +{ + CY_LPCOMP_HYST_ENABLE = 1u, /**< The LPCOMP enable hysteresis. */ + CY_LPCOMP_HYST_DISABLE = 0u /**< The LPCOMP disable hysteresis. */ +} cy_en_lpcomp_hyst_t; + +/** The LPCOMP's channel number. */ +typedef enum +{ + CY_LPCOMP_CHANNEL_0 = 0x1u, /**< The LPCOMP Comparator 0. */ + CY_LPCOMP_CHANNEL_1 = 0x2u /**< The LPCOMP Comparator 1. */ +} cy_en_lpcomp_channel_t; + +/** The LPCOMP interrupt modes. */ +typedef enum +{ + CY_LPCOMP_INTR_DISABLE = 0u, /**< The LPCOMP interrupt disabled, no interrupt will be detected. */ + CY_LPCOMP_INTR_RISING = 1u, /**< The LPCOMP interrupt on the rising edge. */ + CY_LPCOMP_INTR_FALLING = 2u, /**< The LPCOMP interrupt on the falling edge. */ + CY_LPCOMP_INTR_BOTH = 3u /**< The LPCOMP interrupt on both rising and falling edges. */ +} cy_en_lpcomp_int_t; + +/** The LPCOMP power-mode selection. */ +typedef enum +{ + CY_LPCOMP_MODE_OFF = 0u, /**< The LPCOMP's channel power-off. */ + CY_LPCOMP_MODE_ULP = 1u, /**< The LPCOMP's channel ULP mode. */ + CY_LPCOMP_MODE_LP = 2u, /**< The LPCOMP's channel LP mode. */ + CY_LPCOMP_MODE_NORMAL = 3u /**< The LPCOMP's channel normal mode. */ +} cy_en_lpcomp_pwr_t; + +/** The LPCOMP inputs. */ +typedef enum +{ + CY_LPCOMP_SW_GPIO = 0x01u, /**< The LPCOMP input connects to GPIO pin. */ + CY_LPCOMP_SW_AMUXBUSA = 0x02u, /**< The LPCOMP input connects to AMUXBUSA. */ + CY_LPCOMP_SW_AMUXBUSB = 0x04u, /**< The LPCOMP input connects to AMUXBUSB. */ + CY_LPCOMP_SW_LOCAL_VREF = 0x08u /**< The LPCOMP input connects to local VREF. */ +} cy_en_lpcomp_inputs_t; + +/** The LPCOMP error codes. */ +typedef enum +{ + CY_LPCOMP_SUCCESS = 0x00u, /**< Successful */ + CY_LPCOMP_BAD_PARAM = CY_LPCOMP_ID | CY_PDL_STATUS_ERROR | 0x01u, /**< One or more invalid parameters */ + CY_LPCOMP_TIMEOUT = CY_LPCOMP_ID | CY_PDL_STATUS_ERROR | 0x02u, /**< Operation timed out */ + CY_LPCOMP_INVALID_STATE = CY_LPCOMP_ID | CY_PDL_STATUS_ERROR | 0x03u, /**< Operation not setup or is in an improper state */ + CY_LPCOMP_UNKNOWN = CY_LPCOMP_ID | CY_PDL_STATUS_ERROR | 0xFFu, /**< Unknown failure */ +} cy_en_lpcomp_status_t; + +/** \} group_lpcomp_enums */ + +/** +* \addtogroup group_lpcomp_data_structures +* \{ +*/ + +/****************************************************************************** + * Structures + *****************************************************************************/ + +/** The LPCOMP configuration structure. */ +typedef struct { + cy_en_lpcomp_out_t outputMode; /**< The LPCOMP's outputMode: Direct output, + Synchronized output or Pulse output */ + cy_en_lpcomp_hyst_t hysteresis; /**< Enables or disables the LPCOMP's hysteresis */ +} cy_stc_lpcomp_config_t; + +/** \} group_lpcomp_data_structures */ + +/** \cond INTERNAL_MACROS */ + +/****************************************************************************** + * Macros + *****************************************************************************/ +#define CY_LPCOMP_IS_CHANNEL_VALID(channel) (((channel) == CY_LPCOMP_CHANNEL_0) || \ + ((channel) == CY_LPCOMP_CHANNEL_1)) +#define CY_LPCOMP_IS_OUT_MODE_VALID(mode) (((mode) == CY_LPCOMP_OUT_PULSE) || \ + ((mode) == CY_LPCOMP_OUT_DIRECT) || \ + ((mode) == CY_LPCOMP_OUT_SYNC)) +#define CY_LPCOMP_IS_HYSTERESIS_VALID(hyst) (((hyst) == CY_LPCOMP_HYST_ENABLE) || \ + ((hyst) == CY_LPCOMP_HYST_DISABLE)) +#define CY_LPCOMP_IS_INTR_MODE_VALID(intr) (((intr) == CY_LPCOMP_INTR_DISABLE) || \ + ((intr) == CY_LPCOMP_INTR_RISING) || \ + ((intr) == CY_LPCOMP_INTR_FALLING) || \ + ((intr) == CY_LPCOMP_INTR_BOTH)) +#define CY_LPCOMP_IS_POWER_VALID(power) (((power) == CY_LPCOMP_MODE_OFF) || \ + ((power) == CY_LPCOMP_MODE_ULP) || \ + ((power) == CY_LPCOMP_MODE_LP) || \ + ((power) == CY_LPCOMP_MODE_NORMAL)) +#define CY_LPCOMP_IS_INTR_VALID(intr) (((intr) == CY_LPCOMP_COMP0) || \ + ((intr) == CY_LPCOMP_COMP1) || \ + ((intr) == (CY_LPCOMP_COMP0 | CY_LPCOMP_COMP1))) +#define CY_LPCOMP_IS_INPUT_P_VALID(input) (((input) == CY_LPCOMP_SW_GPIO) || \ + ((input) == CY_LPCOMP_SW_AMUXBUSA) || \ + ((input) == CY_LPCOMP_SW_AMUXBUSB)) +#define CY_LPCOMP_IS_INPUT_N_VALID(input) (((input) == CY_LPCOMP_SW_GPIO) || \ + ((input) == CY_LPCOMP_SW_AMUXBUSA) || \ + ((input) == CY_LPCOMP_SW_AMUXBUSB) || \ + ((input) == CY_LPCOMP_SW_LOCAL_VREF)) + +/** \endcond */ + +/** +* \addtogroup group_lpcomp_functions +* \{ +*/ + +/****************************************************************************** +* Functions +*******************************************************************************/ + +cy_en_lpcomp_status_t Cy_LPComp_Init(LPCOMP_Type *base, cy_en_lpcomp_channel_t channel, const cy_stc_lpcomp_config_t *config); +__STATIC_INLINE void Cy_LPComp_GlobalEnable(LPCOMP_Type *base); +__STATIC_INLINE void Cy_LPComp_GlobalDisable(LPCOMP_Type *base); +__STATIC_INLINE void Cy_LPComp_UlpReferenceEnable(LPCOMP_Type *base); +__STATIC_INLINE void Cy_LPComp_UlpReferenceDisable(LPCOMP_Type *base); +__STATIC_INLINE uint32_t Cy_LPComp_GetCompare(LPCOMP_Type const * base, cy_en_lpcomp_channel_t channel); +void Cy_LPComp_SetPower(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, cy_en_lpcomp_pwr_t power); +void Cy_LPComp_SetHysteresis(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, cy_en_lpcomp_hyst_t hysteresis); +void Cy_LPComp_SetInputs(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, cy_en_lpcomp_inputs_t inputP, cy_en_lpcomp_inputs_t inputN); +void Cy_LPComp_SetOutputMode(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, cy_en_lpcomp_out_t outType); +void Cy_LPComp_SetInterruptTriggerMode(LPCOMP_Type* base, cy_en_lpcomp_channel_t channel, cy_en_lpcomp_int_t intType); +__STATIC_INLINE uint32_t Cy_LPComp_GetInterruptStatus(LPCOMP_Type const * base); +__STATIC_INLINE void Cy_LPComp_ClearInterrupt(LPCOMP_Type* base, uint32_t interrupt); +__STATIC_INLINE void Cy_LPComp_SetInterrupt(LPCOMP_Type* base, uint32_t interrupt); +__STATIC_INLINE uint32_t Cy_LPComp_GetInterruptMask(LPCOMP_Type const * base); +__STATIC_INLINE void Cy_LPComp_SetInterruptMask(LPCOMP_Type* base, uint32_t interrupt); +__STATIC_INLINE uint32_t Cy_LPComp_GetInterruptStatusMasked(LPCOMP_Type const * base); +__STATIC_INLINE void Cy_LPComp_ConnectULPReference(LPCOMP_Type *base, cy_en_lpcomp_channel_t channel); +cy_en_syspm_status_t Cy_LPComp_DeepSleepCallback(cy_stc_syspm_callback_params_t *callbackParams); +cy_en_syspm_status_t Cy_LPComp_HibernateCallback(cy_stc_syspm_callback_params_t *callbackParams); + + +/******************************************************************************* +* Function Name: Cy_LPComp_GlobalEnable +****************************************************************************//** +* +* Activates the IP of the LPCOMP hardware block. This API should be enabled +* before operating any channel of comparators. +* Note: Interrupts can be enabled after the block is enabled and the appropriate +* start-up time has elapsed: +* 3 us for the normal power mode; +* 6 us for the LP mode; +* 50 us for the ULP mode. +* +* \param *base +* The structure of the channel pointer. +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_LPComp_GlobalEnable(LPCOMP_Type* base) +{ + base->CONFIG |= LPCOMP_CONFIG_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_GlobalDisable +****************************************************************************//** +* +* Deactivates the IP of the LPCOMP hardware block. +* (Analog in power down, open all switches, all clocks off). +* +* \param *base +* The structure of the channel pointer. +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_LPComp_GlobalDisable(LPCOMP_Type *base) +{ + base->CONFIG &= (uint32_t) ~LPCOMP_CONFIG_ENABLED_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_UlpReferenceEnable +****************************************************************************//** +* +* Enables the local reference-generator circuit. +* +* \param *base +* The structure of the channel pointer. +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_LPComp_UlpReferenceEnable(LPCOMP_Type *base) +{ + base->CONFIG |= LPCOMP_CONFIG_LPREF_EN_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_UlpReferenceDisable +****************************************************************************//** +* +* Disables the local reference-generator circuit. +* +* \param *base +* The structure of the channel pointer. +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_LPComp_UlpReferenceDisable(LPCOMP_Type *base) +{ + base->CONFIG &= (uint32_t) ~LPCOMP_CONFIG_LPREF_EN_Msk; +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_GetCompare +****************************************************************************//** +* +* This function returns a nonzero value when the voltage connected to the +* positive input is greater than the negative input voltage. +* This function reads the direct (unflopped) comparator output, which can +* also be metastable (since it may result in incorrect data). +* +* \param *base +* The LPComp register structure pointer. +* +* \param channel +* The LPComp channel index. +* +* \return LPComp compare result. +* The value is a nonzero value when the voltage connected to the positive +* input is greater than the negative input voltage. +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_LPComp_GetCompare(LPCOMP_Type const * base, cy_en_lpcomp_channel_t channel) +{ + uint32_t result; + + CY_ASSERT_L3(CY_LPCOMP_IS_CHANNEL_VALID(channel)); + + if (CY_LPCOMP_CHANNEL_0 == channel) + { + result = _FLD2VAL(LPCOMP_STATUS_OUT0, base->STATUS); + } + else + { + result = _FLD2VAL(LPCOMP_STATUS_OUT1, base->STATUS); + } + + return (result); +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_SetInterruptMask +****************************************************************************//** +* +* Configures which bits of the interrupt request register will trigger an +* interrupt event. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \param interrupt +* uint32_t interruptMask: Bit Mask of interrupts to set. +* Bit 0: COMP0 Interrupt Mask +* Bit 1: COMP1 Interrupt Mask +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_LPComp_SetInterruptMask(LPCOMP_Type* base, uint32_t interrupt) +{ + CY_ASSERT_L2(CY_LPCOMP_IS_INTR_VALID(interrupt)); + + base->INTR_MASK |= interrupt; +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_GetInterruptMask +****************************************************************************//** +* +* Returns an interrupt mask. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \return bit mapping information +* Bit 0: COMP0 Interrupt Mask +* Bit 1: COMP1 Interrupt Mask +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_LPComp_GetInterruptMask(LPCOMP_Type const * base) +{ + return (base->INTR_MASK); +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_GetInterruptStatusMasked +****************************************************************************//** +* +* Returns an interrupt request register masked by an interrupt mask. +* Returns the result of the bitwise AND operation between the corresponding +* interrupt request and mask bits. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \return bit mapping information +* Bit 0: COMP0 Interrupt Masked +* Bit 1: COMP1 Interrupt Masked +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_LPComp_GetInterruptStatusMasked(LPCOMP_Type const * base) +{ + return (base->INTR_MASKED); +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_GetInterruptStatus +****************************************************************************//** +* +* Returns the status of 2 different LPCOMP interrupt requests. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \return bit mapping information +* Bit 0: COMP0 Interrupt status +* Bit 1: COMP1 Interrupt status +* +*******************************************************************************/ +__STATIC_INLINE uint32_t Cy_LPComp_GetInterruptStatus(LPCOMP_Type const * base) +{ + return (_FLD2VAL(CY_LPCOMP_INTR, base->INTR)); +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_ClearInterrupt +****************************************************************************//** +* +* Clears LPCOMP interrupts by setting each bit. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \param interrupt +* Bit 0: COMP0 Interrupt status +* Bit 1: COMP1 Interrupt status +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_LPComp_ClearInterrupt(LPCOMP_Type* base, uint32_t interrupt) +{ + CY_ASSERT_L2(CY_LPCOMP_IS_INTR_VALID(interrupt)); + base->INTR |= interrupt; + (void) LPCOMP->INTR; +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_SetInterrupt +****************************************************************************//** +* +* Sets a software interrupt request. +* This function is used in the case of combined interrupt signal from the global +* signal reference. This function from either component instance can be used +* to trigger either or both software interrupts. It sets the INTR_SET interrupt mask. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \param interrupt +* Bit 0: COMP0 Interrupt status +* Bit 1: COMP1 Interrupt status +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_LPComp_SetInterrupt(LPCOMP_Type* base, uint32_t interrupt) +{ + CY_ASSERT_L2(CY_LPCOMP_IS_INTR_VALID(interrupt)); + base->INTR_SET = interrupt; +} + + +/******************************************************************************* +* Function Name: Cy_LPComp_ConnectULPReference +****************************************************************************//** +* +* Connects the local reference generator output to the comparator negative input. +* +* \param *base +* The LPCOMP register structure pointer. +* +* \param channel +* The LPCOMP channel index. +* +* \return None +* +*******************************************************************************/ +__STATIC_INLINE void Cy_LPComp_ConnectULPReference(LPCOMP_Type *base, cy_en_lpcomp_channel_t channel) +{ + CY_ASSERT_L3(CY_LPCOMP_IS_CHANNEL_VALID(channel)); + + if (CY_LPCOMP_CHANNEL_0 == channel) + { + base->CMP0_SW_CLEAR = CY_LPCOMP_CMP0_SW_NEG_Msk; + base->CMP0_SW = _CLR_SET_FLD32U(base->CMP0_SW, LPCOMP_CMP0_SW_CMP0_VN0, CY_LPCOMP_REF_CONNECTED); + } + else + { + base->CMP1_SW_CLEAR = CY_LPCOMP_CMP1_SW_NEG_Msk; + base->CMP1_SW = _CLR_SET_FLD32U(base->CMP1_SW, LPCOMP_CMP1_SW_CMP1_VN1, CY_LPCOMP_REF_CONNECTED); + } +} + +/** \} group_lpcomp_functions */ + +#ifdef __cplusplus +} +#endif + +#endif /* CY_LPCOMP_PDL_H */ + +/** \} group_lpcomp */ + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lvd/cy_lvd.c b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lvd/cy_lvd.c new file mode 100644 index 0000000000..ea524c97b5 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lvd/cy_lvd.c @@ -0,0 +1,64 @@ +/***************************************************************************//** +* \file cy_lvd.c +* \version 1.0 +* +* The source code file for the LVD driver. +* +******************************************************************************** +* \copyright +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_lvd.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/******************************************************************************* +* Function Name: Cy_LVD_DeepSleepCallback +****************************************************************************//** +* +* When this function is registered by \ref Cy_SysPm_RegisterCallback - it +* automatically enables the LVD after wake up from DeepSleep mode. +* +* \param callbackParams a pointer to the callback parameters structure, +* see \ref cy_stc_syspm_callback_params_t. +* +* \return the SysPm callback status \ref cy_en_syspm_status_t. +* +*******************************************************************************/ +cy_en_syspm_status_t Cy_LVD_DeepSleepCallback(cy_stc_syspm_callback_params_t * callbackParams) +{ + cy_en_syspm_status_t ret = CY_SYSPM_SUCCESS; + + switch(callbackParams->mode) + { + case CY_SYSPM_CHECK_READY: + case CY_SYSPM_CHECK_FAIL: + case CY_SYSPM_BEFORE_TRANSITION: + break; + + case CY_SYSPM_AFTER_TRANSITION: + Cy_LVD_Enable(); + break; + + default: + ret = CY_SYSPM_FAIL; + break; + } + + return(ret); +} + + +#ifdef __cplusplus +} +#endif + + +/* [] END OF FILE */ diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lvd/cy_lvd.h b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lvd/cy_lvd.h new file mode 100644 index 0000000000..4bef5308d4 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSoC6/device/drivers/peripheral/lvd/cy_lvd.h @@ -0,0 +1,423 @@ +/***************************************************************************//** +* \file cy_lvd.h +* \version 1.0 +* +* The header file of the LVD driver. +* +******************************************************************************** +* \copyright +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/** +* \addtogroup group_lvd +* \{ +* The LVD driver provides an API to manage the Low Voltage Detection block. +* The LVD block provides a status of currently observed VDDD voltage +* and triggers an interrupt when the observed voltage crosses an adjusted +* threshold. +* +* \section group_lvd_configuration_considerations Configuration Considerations +* To set up an LVD, configure the voltage threshold by the +* \ref Cy_LVD_SetThreshold function, ensure that the LVD block itself and LVD +* interrupt are disabled (by the \ref Cy_LVD_Disable and +* \ref Cy_LVD_ClearInterruptMask functions correspondingly) before changing the +* threshold to prevent propagating a false interrupt. +* Then configure interrupts by the \ref Cy_LVD_SetInterruptConfig function, do +* not forget to initialise an interrupt handler (the interrupt source number +* is srss_interrupt_IRQn). +* Then enable LVD by the \ref Cy_LVD_Enable function, then wait for at least 8us +* to get the circuit stabilized and clear the possible false interrupts by the +* \ref Cy_LVD_ClearInterrupt, and finally the LVD interrupt can be enabled by +* the \ref Cy_LVD_SetInterruptMask function. +* +* For example: +* \snippet lvd_1_0_sut_00.cydsn/main_cm4.c Cy_LVD_Snippet +* +* Note that the LVD circuit is available only in Active, LPACTIVE, Sleep, and +* LPSLEEP power modes. If an LVD is required in Deep-Sleep mode, then the device +* should be configured to periodically wake up from deep sleep using a +* Deep-Sleep wakeup source. This makes sure a LVD check is performed during +* Active/LPACTIVE mode. +* +* \section group_lvd_more_information More Information +* See the LVD chapter of the device technical reference manual (TRM). +* +* \section group_lvd_MISRA MISRA-C Compliance +* The LVD driver has the following specific deviations: +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
    MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
    10.3RA composite expression of 'essentially unsigned' type (%1s) is being +* cast to a different type category, '%2s'.The value got from the bitfield physically can't exceed the enumeration +* that describes this bitfield. So the code is safety by design.
    16.7AThe object addressed by the pointer parameter '%s' is not modified and +* so the pointer could be of type 'pointer to const'.The pointer parameter is not used or modified, as there is no need +* to do any actions with it. However, such parameter is +* required to be presented in the function, because the +* \ref Cy_LVD_DeepSleepCallback is a callback +* of \ref cy_en_syspm_status_t type. +* The SysPM driver callback function type requires implementing the +* function with the next parameters and return value:
    +* cy_en_syspm_status_t (*Cy_SysPmCallback) +* (cy_stc_syspm_callback_params_t *callbackParams);
    +* +* \section group_lvd_changelog Changelog +* +* +* +* +* +* +* +*
    VersionChangesReason of Change
    1.0Initial Version
    +* +* \defgroup group_lvd_macros Macros +* \defgroup group_lvd_functions Functions +* \defgroup group_lvd_enums Enumerated types +*/ + + +#if !defined CY_LVD_H +#define CY_LVD_H + +#include "syspm/cy_syspm.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \addtogroup group_lvd_macros +* \{ +*/ + +/** Driver major version */ +#define CY_LVD_DRV_VERSION_MAJOR 1 + +/** Driver minor version */ +#define CY_LVD_DRV_VERSION_MINOR 0 + +/** LVD driver identifier */ +#define CY_LVD_ID (CY_PDL_DRV_ID(0x39U)) + +/** Interrupt mask for \ref Cy_LVD_GetInterruptStatus(), + \ref Cy_LVD_GetInterruptMask() and + \ref Cy_LVD_GetInterruptStatusMasked() */ +#define CY_LVD_INTR (SRSS_SRSS_INTR_HVLVD1_Msk) + +/** \} group_lvd_macros */ + + +/** \addtogroup group_lvd_enums +* \{ +*/ + + +/** + * LVD reference voltage select. + */ +typedef enum +{ + CY_LVD_THRESHOLD_1_2_V = 0x0U, /**

  • ^IY^fs+=^~-Bu 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 literal 0 HcmV?d00001 diff --git a/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_uart_cm4.a b/targets/TARGET_Cypress/TARGET_PSoC6/TARGET_CY8C63XX/TARGET_CY8CKIT_062_BLE_M4/device/TOOLCHAIN_ARM_STD/cy_ble_stack_mdk_host_uart_cm4.a new file mode 100644 index 0000000000000000000000000000000000000000..8416822e6a14cf35704dada677028b6f68903b42 GIT binary patch literal 744146 zcmeFa3w&Hxc`v%=A!#Jbj{HdCIEpj2njv~j zW=4)2D3wz?*dgVnl+w`VP(y(WE$xj>Ovx#xh6W0hwsu0>kfay2hc#=9;Ju~vyaRT=oub;MNf9w0N_xoGlT6@(ku}nPqt2H---KNPR)w}&a9NxI)#v5;z zn4uaW0&f>0wf+1)zrRF?vw5CCJj#8Zev=UMJ+p^}comONJRp3b$o$XBmxZsKr)fg? z=6gEcBz$N4yk)!aosVbcv%**G`MpmG-)r&wGvZzB`3~~H`@H-P;rj(X{^q|IC7-vf z7yeSu)K`R`&x0%Ge}3-|gumS9FSZMRvFGpKBmA%76A1o5ye`je4~T&M#2*%cbfoY( za99M+*Yk1sU(WND?}$LD=iiY(=K0CXBA}mORljgOD_TYHT%PVPieR}<`XLc~dqf1^ zIq}*(f3s2qOFjSoSrPpI(Npn(N^w@tSFRNmzksK5O{H)>H-1)Bp6xUAK2iD0^!)Wt zMCEyUs;V9q=k(mvFRIS=dGiWUHQ$rnBC5R4!~b1W@p*qlJx{(>R2}+D#OKjBm3}^Utq7I#{PhDObgs`2ei0aqk`NM}qHJ^|D$Nx4@P0MN_pZ>Rsno`f?4@6C|=dquNno`db!=mPF zp69+IYRvP}9iqm17Kojqj3>Ukbu2NEi^cElOvKV6Pxg#vqOi{;M4JPlUDre^=dtR` zOvV%0EIjJim6*t7J?w$xRBmMQ{t0Cr-ImBPsGh|5WM+5XZu``DOFG>;wR2}8(>FOe zrhSPHOlEShO=KJkMi!p5O-}4gjrQd-@FUvV-4X4Whz*Y=+Q$-+L@YOzVZ<%_zU1y5 z=@F!-I5(5p6^rlo@DPg3n(owaCYITK2O^Q0WICk3I@wN|rKQAoOym-o?!F#_l$P*} zS)DbRnumj<16FBrIn()_M-O<>NOUyIOo^sO@S2Nd?~TS|V`Iax60L*Lu7UpEf!q5g zvpG_DZOb5o5}Gjfxg=~yqOn{q6HT#)HShlQjA7-W)g{L z5;ZTHMxC+gZ0Z5zMy_`Nb&^%DJ7uye0ypqTWfco>Dx%(j%;zHVdNLjzPmD(s(=y*= zP@u(dPM1tvW!Y3$V|V; z*D96s872#L0_vnm`73n~vZ7!o4aG{I-M4|U^ z;_g?hAXq)RQxo@g$95+&gRCa*F03=2>O-$mEFy|iG(g3=Gm|Rl61VTl#K!y4dOYDs zZ>)%*@}g%*<#ey-#F+V%0hRIQp=L~`JszjBlG8smF@eI9#j$fV%HAy|vbo7jY&6jm zo525!tox=;$hZ$qM#f^26Xm`X%rnM`aqDA}heVjR_U zGOHUh>ue$;Y&$eNjw`(b(VmvOqMaQrebJtdp5FeuX(eNZ->eyuv`aQvL2j?9gckvOfa*fE)aZCX<)xI zAmUS*3`T90$Et-3ncwbI(Ted(Wff9pnWQt(Yyty>8VsVjNy#VF1TQnE1V)Es5?+v` z4Wg%O`(U(nM~5nnQ(a|PgrzHuo5S?GZDh@0T~+PW8&ih*rhDk#*GVURO!CWqM3iXSc1Yvqj>78o?O?M|QUh#Ym%*DQZ83 zzM>dI22_-jO>iqhRZ%@v;!uNLcQ6y1$fnWtnvp0OPepUal3kHg)!m$t#8_$<`VQH{ zxmhwrZmav*M{8^@YEf!@MNb=-V=4xxyXCx!Jw-n{iNTI&d&eDJZD`n-2SqV9s*X3> ziOExYD$Dt$o~fDPn4B(WN-TkT{EVcC0KXcjjbh7BnNL56)y|AUBzogI*ponNd@ub`E>PV^fLT zQt^cD>_<{r z%#eSiz6S zkUpI?$g|88<~)eMlXH6fF33Diw@RgzyrOB93|Zb*2(&zN3W>6#&r-!~0YgMOmdapO znXfU3Jh{v{IgWCngIdHOjXix*nVy3OZhN;)I>9^zJhm&A8ndb?y^`Li%xu(HuzE)+ zKrlYri1buu6n(vFb7Poc8W6^($uZ27bn|0DTa|^OnJn-|d`gN5jGuBrtjbT032}-# zqT{(KRs`CpT+_jztg}*RqM6Jzg4DbUYtYGY<8eyXb216SbUBSIM82mfO&Njw!tIlp zKbv6Xd@4QSM1!d*;)%#6I3=7k%jQhpB9ldq>m?yk({WJ9Or%YgZ%Llp9jk%`_4qn9 zaqomIx{)bNK1LiQ)19ES$k<@kh|yJ!yD|qgH*cFS$gCNi$5Qbao3NzyLdLv1oubKM zS-B8d36R7{f;A~mJCyShQ>CpUWD-dacV@>?@G`qpc^gYr3>2@Ja0!(ul{RA=(JiS? zBR(u`CMI*Kox3^Na3v?r>6!`>9V7%2^v|}$!U-!Rw$?mL+DS4eMI}0j{1i)0hPXP= zbHRKa%a4?*I?ji{5X)+qcY-1S9iJQ@M>DgnX{Y87;JZgmy>>Fo4>`oRM@GYfR3$M% z$y+p&j=3Pt;zhM#HgL=ju-=Wf%O2r&t|B|VGb<0TD?fenaC#D0*5Bs}F{)OFy2DW` zI#ct!mQEFPG4iR2k71_FG|8UH9ZVjzQ%yZa64Rv+vbvTCgY{8mPI_t>eM@TBynzv3 zJVJ5};|hfJ#LD-1c+sgWI>w#ogxHAL@lK`PiJ@N{8ZmE|g;?O3#XPfbg&CsPB$hAk z@R@E_HyL^~w>zCECrJ^H3$JJB1}#R*cCZhb=4}+dVc3A-@)1D8`r`jwt@uSk3_Cv_{i%t&jGJ z&U`pEA&1=Pu2?3;5!?6=Z*+1w&P#_;YxR>sZBgM_mT}C13M`8vF{{u>M%T$%C#bZZ zJabG&kr*uIP^nQf!_bxx4`NoRaL5tJ8#Tj-tD?DSV*|&Sc*~&)Vn!9!G>3jvN=<5? zOg5;jRU@{-BUiBBk<;+pv|btRL^;79;|qpPOvP+>Xd7yRrJ&xu%vZGXv9d{*S$R5(o8ndgHM>G~qjL9XYj)BgV5mxZ2gxgX}NwuY1 z4QsgD4_073Ea+(w2b8gV9U{OTLp3#1>4V%-J4;~%N{vE7C8t#mw}iDC;^pY4pza`8 zy68Q0>?xm80xh&W3cH7sPP$^_*qfV%lzvKEnTDt4WXf~cq1<))<-U|{&obcBP6jiU zn8?TIeRVC5WLtpT1F!@a0J1MC53Bnk2kca)!b+?b zxu*TeDA^g{xOC&3HlU;D=5jTrQsh)acSoS$*m*$0boQyrU>dcoc5XL%%AjUAHcPgC zr?WHNmB&{1SISnd)l`F5)rDIH9BmkBr!Vs4MG^aabz%op5C!zWE^DXHRH1R_1=A~T zRUlBG2B{)B#9>RLo@l zl}elLIWvj3YBZN2>`S=>nuO@U9Ye#lE1e#=xWdR+f5$f|zO#9DzA`7Zm)Zej)sUBZ zEOljaBUQ2r;%}DB@o|%W9Vz3QE6OxP%6eHzQf;c~HT3AVSh`J*I(+Y!6YKWGE@P>t zZF!V6cZ20NM?s_Cnc~5^V0NhO+>UJu+7k(sp$ZLC6HUqa%C?riwrE>yBAysStSBHw z4x7o0Vmj8Pr$`dWAWQf$z-=%&5yS2Qw_WpLQ=nXo(+52g^xO`s2aU#Z2=;U;?_~jZ zhwMIEMs^LvV-xL^Oy>iQN>62CZQE^$i9`nVsCA@8Z>U;M4D+_cZp!mb{G-UuwnTSg zVl;;a`Nz;edg2a4POyK-WbVhI4o6Bxo=k{O2uVTgyL ziq_g4X?HeA5FV%ZiO%h`bmLJfnvGB+Ri|Ws2Qx-Xx7?(B8(pN*s zgVTN7!SaS&kXckZX_;adAQyJrAj61fyl20^E1_~a0?BiMbJRW*Skc6Q)rP%`$#GeQ zdbs(o%L1JC#LgHrg{*|Zk}X}QzYQHsHnr18XY&rb6UDr9`!g^W+m+}>lbVR{w!2pZ zQ7l_zKUO*qQrYfq4ttoRQ(sSacp{Z`wMW@eC>6j`9Uw(#vH0$28J%FCSDDb$D!goO zo4{5mwl2`5?RJ4$(alXd#bopIjuwerA2wI!;}`YVTT6<9koh_|$)4h9?Wk+X_yeKS z?J2Z;g!*$s_*l7sjt zA9b&3I)c6^D+^{e{fYEgzG0&0P?ac~#ZX(6r)ERO9|<48_z8GlhH6l{nzIv%q^2$3 zY>pYvQT=qn91jf(F_+oWw{i0p@37Ba30thLilI6^=>%peTAwJ(>5t%4REb^zT*i?!3lWkVli;S5sFTpEP z3b2(~Xo={uy%S@uu82i!aF|+o3&~=k&N#d6PR8j`ha=s1EKYsP@$?Q3;jjUSy#?Ox zK;4?mV2+{(IkY%g`N_tVqK%ui9hppQ$hm3lnHt!2^-|u9VrVm~ zfl-KzTXH$K)OZ^KMrcf;y%m0M*wUKH?by-Pu6-t>$htsT+Dif8JS19fBDZa9ayaIw zdeb+LbeL8~ccmva(Kj-M*`f&??sfPOHbdzzzg%Iv>}%fvpl)4*gPa%?N#a-v6Gl(e z+N5Q_t&GEf(8{rtx=)Vz1TU-IOL<%ZgmDUL8oLJ)8O}lH z3*C+Mc-Nsf%u%acLj&W(LhG7{k4>Tf(&2bqs|=R;Cs)~4{*mR*p_1t?grbr_!s^OP zg1Vtva29?R!ll1O(m<8*6xLpD&r6|YH|K^HmVH08{W!sq71t9an^^~%3(gRzdhN|T zs}0_n$|W%!R<+m4UoQPs`?M^jZ|<0t%=IGJBH1ocg&8@&uZ8$xSt-3X$xCSID?~l$ zq(-J%<<6e&WN3$;594brMP+e0O(^UKSx2cYE_cAxSc1M-S{8J5%DPBLo%QsAa<1P7 zfnzJ=(M3BwcPTR5d~fOQ_Z&%-8zB3=BD{RRSA?mWp6T040`hIs9WgqWwLU-I?6AJW0$-8mG4hMRo{EiXhJ)-5f6oQ`hqm+IwO z7$4mM1(1GG!d@R>DdfgRcHwwL3>rRb40>euA zUIpwf1ikK!r!dsWwV>HV>6BL3BO09U#p+KVcjU>S0wIF7vu32Q>B_>b@)7cKXMv3) zDTM*S$_gl%FCQ6WTX}{&-PUCeWZ5{eG3n%qe95=4>~0*B7~}pcs;L-7yp*_ZY8VQ< zkOf&*l=S8jw9Ai3Xbwh?1!v`CnNilOv{BqJmKs#pRjKi0-TmAx@gl7uLN#|QFznbP z0w`2xi!~pDu6h=FR7<9!?Vb0!;_NU~*;6tZg+3|L%kHe04@H4I4Fc`6q~)MgzX-Vn zq_g?RLRiF3z-)G@K?c1V1OaZ)h}xUrzMqHVj*`-aMeN}frax{^3LU4l_sfi@L}-*UZO3_0CzdKZ@!icV`?eA#4#_ zXtZXC6{E2P6fWXCjG#8!^4@s>g|);2lw>*;M)%KZa4U=k&qHBbCYna9& zkI9|x5^NMKk0{CUKxSSEoYM$cPHI!UAlVFWgj!tlg(wGY48iCji+Ygd7FKi&H355A zQthTVj_P1)wB6;5wWvipgVj*T@zt)L4io1^O7QfcFFOnBxKX2v(^2rCS!L5^|9 zLZop#l^r8)wNSk@a|?s2JY~<0-OfZ04X>@KC?-}WLlw@DZkWt+r9@>1qpZ!?>GD{y zII>tVl!tt9j)+X|*fK~3bPf%mX7QAgJ?mlt(oR-T=rGD&fELUsT`bN)KOV3%4#-#C zpGKkIlO3mV>?$4h=?)i)S@~WEhZv2Q=GcmwN~&>8&hQODwnWw_>Jj2s_vZ{zmYQlr zC_Csc88^-fY$}Ull!yCw#xN4=bgQ1$42Z^7>sIBfW&W&O9x_k*+2mE`B=lg$IAW;b zu^hW|-^C#aDi~y^FbP88WV5{a1A9)i%f^dZ$C8*a;&i1`D~Pp<)n3_1f7H2<{FrSj z8r`uZ<(h}ZtIm_L(Yjc$P#jqW49gW`jAH7Po}T!ih@Eqg(lc!@Ym+^HKn)nvT^c>M zVdiuxio3uI!!svOB_My&O*aEhmg#F+=d_wHxbh8o%q%FLm@GySW;50Qq({<1EwSjY zBstu3zO@tQ4>5- z(%QSdy`xtWMoG5$BOq#`zj;q)J2ZKGQvw`b zk%cUss9s^G%3xiT?v`WqMy{HnR7I70U5`pkE@ea%kWF`V0O6uunLJX<7g%m{Zd&5< zq~8$~gGCG1X?<f>csi7^uTGQDuUzGH0fT<|-Uy6L)cSmj0>&EuZ+prqcQsLqdS;v*mgj{!( z0GkWZ@(r&@u&zc}g0CB75iaD+sgXWs(OwvlJ~dFZsom^O)U+|FDeCo034h~Ptj5SrP&CJ;g%L`D0Qu2#=Au6LF$Z#^NNX3PhCPPuU#&;(U5T&w17?~O$ zcUlV1*VD4dFeST4(@7+CebVsJ1o}OF%Y}!f8Zg4oAJLbSKQ9ayp6IC!x;H9daF*i* z;Wh?2J%k9rpi4kJ)&{Np_IhmCYFHhHKv@nVrC^+VVMr{+mU5yJ5n%L7vD`Nkuoz6d zvPihcmDS5RcOMkXSWFGZ^0`$yZ-FzRmB=IuQDlrTHKzdOiMPc^r6@fn6!A}0rNXhG z2((xcSRw1oo7XG3h$~U4i}PfGsjFU`M8nPm=C0oP@?>*^T*Nu*qtC&x{8cSfTy>X( zw2enOZ&rnXrYFx|xTl#&Dt>y;L2XfBz zeVk2O)z@*t;h`EC&;ajFK{e~@!&S)Gf1rG7{p1a9CT~twH>h^1VV;QmCagMkS?H>7 zV6qKM12Xd4O;czxw9!i-wdI$VpqRdiM)#Fj!qhTYN(gaaf0t$DY^CSzT*qkh)^T`< zV=R_`*2z!8MiFxRuu)8*4F#B}zVhIujH0p3OP7sJl3QnNRjOR5RbW_o;kRwc>%lbM z219d$$FE#gQv8eFMa5nAgrP;+wq_THbo^1%K>vE=SUGgS*ugddoxsyXr4+#<2{P-9mp^2&ey z{FS=z)Cm9a_Swym*4fnu{`i4!%sujGICcM&{j=deB!COpm=JovTlEC<+IHzW)9yiIpITM zwlA_d(s-zPmcAW3On;W{QR60kBp4ClhpPg|eWwEc11qYp2;Fwz@bmjWuz$z$BdwLs zU6H)Def7}u`xm!=eI|X>-#3|H+P;um8@RZ{~xb-ZSSrwg=B0 zGY`V1x&GMUgRL(;3s)5%Y5jkn-S*V&PK^8~kQMvQ|`BCL<%3D2$W8=dK|f4KEK&%U|-U9JD) z*;7YFXL?&L{9*o^r=n}?q2?bf-mqt;VwEo~R<)$}q(hPPHkKVRbw~USEFtlfuOS?% zJ6aJ=Z>u{Z8X6DPtqydNLtB3*ON@Tg-Q1B%(R)gW-$wnbJRJ;H9S#{Pp3s9M_?nM0TiZ|jku4DZhn zUg&u2Ky^*UiP!^m*Z80N*WGp3_`Y7#x%KG5J*h}o$Kc?BqjRDz)P8VJ@I>9}Rgpj^ z)6p2&s{La+OucF8?+Lfv(01K*Va^{QC(f)3Z(iSYWBARjQ>n3$@J(BOUBoiu@p$<9 z>$$UrpDeEL;(SIPWX^`KS1fsNe10S2jT4g-iSYH4^Nb|$DxRKtV;gQsO-x_kvkCM_ zDu(O$a=XV8ZycSNax8G;B;`SGym|A6@bz8mZ&+{s@;8e^wWVbnE*0wPyJ4We?S{#0 zZ0v@_G;d(N;cT3wlqP$*ZZPc1@ee~;xlY;>!&A^rrtaAdXBk>IR3dt_$ghNPS!U7( zG4YnS(HeKy=^UnUA^0Zpa)D1Ua26})7##G*E>44xA)?9s-AX+*1n^s=k92v zYdi1tZRv)MR6N+z3tZsb(I07P>xk}XVctp0c3yw4BBO2k`n&FE!Hv8d zq8lyF4%~3n9f=Nf_tK@x05&&y)P{o z7K)Gv`9l6sAQTK$gepT-p-`wgR1;bdstqkt{T`f2lf|Kj7tA z`k~^nTtz|t--!P$OW(dXxG(UK|J}Zl{*{}q%CnA>N>^CMM*aIVep;8_zc;k6>Y>Va zR_qTR2s}Jr+~&)#dduHtytgcU+un+O!G{9xq>pEte=4pGmY-k6d+X9&du#SpKNNar z)&9x@6%PmB6*y0<6@IY(1@@hL zdDwZzndF)Cth_eLc%Do8&PN`-o_>_uw$HV^?eeKBqkPULKJd0f?zSLfj`mVEY2$}INq zmq&#?79}pLd|E6j7?E!JA*q_gA&^|HhqWxmKiw=mbE;=YKchME% zrxiLX(*H{FEf-xS{@z80#FH+%TD;dq*N9y%dV#pZMc0a7bI}V$ql;c7YF+e2;(PhZ zfb`ah=Uwz-@s}=oiFn*aFBP>GEzo{`98mKXwp$06#J@-^a`7(`{}TZ-ee4sK`0K=r znr0uc#J^Y^)im4u68{qM0ZlVom-v^8f71B{68R;>QHx#z`a>RikB1)i&;uU&jUIZn zhpzF^-(y6yVfg=G2>g=%8xQ^8J@lV@=*KOZ>6@`=`j@h3@`o*&{5N~(P7i&fhtBuS zD!x|oWZmZcrv`;H#NYcM@8B;A=K=nX3bCKRS>!u^Gpe4~ObGEA(nCTV$FKh_LVS(C zVIiL5?<&Y&@VoL}fgVcHh`Oj56N2@MIQHknZPGOHv|obXnm!>utbadE`*9VXe^Q8J zq@zNh+DJTp#L5`|<5y?a%DAStD_l(ie!{8-i8JBzw+5NLj=xDEn)#a(ki6ozM~J)l zJEHQxreBC_N$yt3`OTW%py?J(U$1E-Qu>d~k@z-E zBNHUuq3P>19nthPn%<`A8#LXi=_X{-dPvgNW3xaV3C)W2*<1$Ou=q`yw@hMe{RqWB zP&C6GsbW1WQtS1$r<5Z>LC*bs#6pPNSSqx}R^XXjc5oAi-)eNZ?o*$%?BK34Vr@rB zon*z$5cUTniy^!poGgOD2_+prCk*bE$yBRtO#O*VWJ`i%XpD0k-MXFIL19j4A7_~gkV*f<~+tL*M^S>oK166?7~ zggh1NhoRrM9^#hhuATC;j3e0UORXP9+_UQI1kkpUUlPk7zIE3MB$0vX?`b+bSjz}_ zzS&7W;P&T41t1L#Q0t_EdP4)^GM0k=u|8labpd&nCndL8)tOeq#5NbduBWzlp=X0l zR`aPb!UZP{T z6l2p(B{`c)ayFFW+*mT9H*PNJW@9PN#*&${v1I0KESWhQOJ>f7l6kP9WFBnT0A+91 z6levoV`Zb(2kp4616>k5PBk=y)5|CrI=ui{UhCCx$x*UlL^NQ)EMtF9 z=75QTOF<9;loT(v~679v_(`n`;4M;VO3AHf3a_gf0_SM-*Vq&z7@We zfz`f?07m~Pd{uZ^;={l4%=ZB$x>CbA_kYoH$~isFmp!;T(90A{{x`T!cyJA%!$olK z@!;A)bAD@#@$WtlZU%I%0pZu+dOWyCKtEjsN7(~dPI~)5H(NN6(%j(j?@=(g9x}#+ zyV!$!3^>Ch*7(OYs~zs+C2)W1!5u7tdn@d1|2_=5o&joO;_w7$8+WXPf4}F!Jq=u) z@eIEprP+=b+rO`s@DIyU7w$RW!paNz-^7n=XWPFy;L=5KY!@~z84zNy2<`??{5}I5 ztQ=$BuhclhI0l@F6Yb3V3gB4oU`z8fUW(;2yv1&hDW#N z9m`JVo%T-x*UlGhO5x_p#NC2K^%>9bTgtyjfGa25-!PXJd= zdCZmYFM#%eKgZm%P>3Pa>0a2}h9`)J{nB?(fGB#$JdVML_3t`7EL-B(ZolBc{RlX^ zCywD5+{Zk);KfQVMI76z!Euw>4!0gShC>`N1~=}(HCQ-^XB}LZ2e%HmM(rQRWaHm; z9^9biAHz4eg&y2J7LM^YxNqa#PREFaL)CV0f8)W8S-1rj?h_td&cdMx9shpEgL}J$ zTV&xTJh;8UnR4T=NynWY+gL}~mm-te+?^?La z=E42U!mXGGR|_GrN$=(J;OZ?L$E8y7TW8^}mXl8mAF2q8M{i43PX`Z54b-9LdTgvf&vxrkp16@dTkaMe5#fqee>NAY z6OaDc9CW@rQxPFGxEDclRhidXU)7zL7gSU)sHj@vhzlyJ=Sf9Xs%N{JTKt?e);OCm zh9gfo8hK}=mANA%!F4`}CYR$(2m|gw5iw=r^aM2awFI;q` z_@Ilf67P1=A#uNpt`?(1&7@9d(CJqmvS=SxV`DCQiRgFHOT|_f zy-cih(HD!Li@rpB#}oyAeb75R?xL5APr2yJ#N#e{h4?KOeUW&pi>?!wA^#a9YdZD9 zYBbHBk$PeO3+d1E1L7r3D}GR%aM2awDHmNS_2TGW;j08?%%oYzs3*4Dg|8OFF1ki^ zx#$IAqo!G>miTK0*T%+BK55Utska2x6339n(!epK85d(#gT|j&3B4KlyH&~mYqltN zHCS*nT>oaRUxG!=Eu^uI095#~c#-r{O=A%%X$*sskHw~>v7V4L7L}65B3aU5O{4pe z^eRmw(vn`SX{@g$y++em14tT~D*eM^U(#5_NxDwcS81Ay?Q_JwxZpD@LLME5}PdL;D*b@ zeY8v*b^pr=cRda%vf}N?eWFH6aAnF0-=s-AI(PK&;cp*Scesf6ch(1v`{~zQ zL!Eexw}PM#`1YxmDjC|$6$`q)co;h;k=kVKY;5}GL$Uo&wfdh8PpeRaCmOC8um9fR zBdw>N#jQ1a=o$vG0bkxzlRi=z33ZCK!DJ2GUvp@9e|UPy6=DtD8@E4rHvPKo!RT_m zu=#Rf^X0+o{s8yHHb7lWQ-I6A)CJmada6?s;< zui~NLI|KXA^)?MVUNue(?U#31lT7Xr?6+u+-upl^MauYuo9~x==AJTs4?iIJtO3dd zJp7>KGquVDJ^Ts}T`BP_ePt@e13JE}9RbWVbD9oGy2hb7p9+Wt4oz49Gu4E~g9Pmp zce-f5h`8v0xY0!i#ab6#A*x(-rMTZrSQr5E_t!1jCoU3gF1k)!)@e}Ef z`sWi1#lN`dMdFK^W_~R8SBob#&Gaw!*T^%dv{Li}!SyB$qrDh1@87~Nc?LfU2BW|_ zKpFnsnr4|(hTo}amNCzEZ`L%+lxMrI)--D$&vx^yIsIc9F7a22Bz}#d%=}hE;FmO8 zk}>7T*x9OAB6943aFko7qvjeF|C(!+?11*HAGBZ1-|Mst8}?YU!HU6wz zqjcVC)~fi^p6T`@Fp0y0LDE-f+Q`;X7?N*f=a@80+Q`fy)~@r#X9#tnkD`&5Htzi;FAf@U9NjKPh;!p0o~-HgW=gL@M!Y#a%W0mh(fmxleF zjjIKbpHHa%o4^+|j_)+w>o#GLHt)~io&Fhf3y7}<43+2o4XlVW@d!cgh;G_3#{P4# zAZj%Rh z3vebKNVCBlL*fkQ=h%^#NUUU^)prlGC2OC9Mi`A05YS~5coB?8#bC7(3M2-jPk@AZ&Fub zmvI;N6U`-FMsA6-x8-*tf;K4S+Qc#k`*g1o|X4oUoDm`tbg0B!aeIjnc2T&wD5C`O$zbEupmI!?}mi z8ZMsK<=^KVvhvKlR${<4hBC!~MRUY;(-^eDXC5iz_wd2QALFbHGAF83AUO`2vIP$o#3 zEB(h0=qmAV_%((yz!QeRFX>Nv=z|{mQ4c-kp?}>&M?CZm9-8~}#xQ&NMH-G_6=^gME18JjTcqZz zOP$VAkb1`HN1(lPZsJdSaCBt+Am6-I{l=tdsYMw;Rv#Yy9)#`pU%dp7U~KqO)b< z)}i8*6TdWY<%Ij068?P!X*Xpfv!eikB9Ms^vveQ$*tu>7T zIP*$3rmf*sT#U@mHIgnCG`F~H_U?Zlv`EU8>~%PGt4x1H7|+|5 zvraV&z*6T!iz}u4ViyXoJ9MoonO}t!`yyhIEN-EsLEo0T4zFjpE!EtW%JDy|IXO>8wjxI*tqrV#>TBp<$hyjr|)eo zrvg4-cCoK!^`W2s;IwZ@goWM>t>_d-W|BIUeuiBaF+6{#c-yfbHalr&iM`hI1^4>Z z`NZ{wNyCLngVjS{xJ2qaT_R<~PWeSpF?eT-P<>IomzWFx(hJT{!Es z!dsV$r@!#UzdtvBml;p-i{;%J_b6ZezT#`Y@5;5fF&wYYF24)EQ%hOFe14Skt=rP^ zIDh$37!UQWR=bR^LRwmu{-(U)>Fm-}=ohC8t!MPByxYwvyD1f)a_b!HZz(_KJGo=m z7y98f*Rt@m;X2`Ji{`Ad0W{;Uj8C}veh(e+&^XiJ@~^@}S4#ic=9Q`R@T)vD?!|KX zSM8x|JoEzTKl>$R7I^rzlFxdh4DQKt`M*%|^J}Mt9{wW9&*$qRaiwVM_6nD7jDsi)m4vBgf zT`jN$?HKOg^Dcd3cqYjH-XhNg+230XV1IqD3%^MG$SfA5C#PTerly%6yr=6c7T?-mH*WusA(0x(%)cw*oKz) z7fAgL(rh!l_v<4Fm^9nS68}Q+kfxRUMRH#rENQs^ztIr*CC#;~F{JZtP4VfsF_crV zzvn$)coj8z5xH`k{%+r`LfirSm2K)if8v<#m0fCGOPcYj0lyKyq?s<#lJ>EBRQ!OaE@vGzv@75FkkYY9#KQ^%C4u$W(SPHJ-@yPfbju zCPr=j1G$6B@7_qjKyETUA2*gU2dLcs_b2e#wC>czz1^|hiH!6L-y2Hhb{F+*`!0OH zsUKVXMY(D#*YXTkmsv^=PJ}U0?wZJD)CY%3BXDV1G1oXe!)O*B>YDd6ckWbo##4Rx zHqo7#6uwQS_mK0^Q%spNrI^kap3LN*1%Y%qpYSX2G&ZI@EH1<=dNCFbzVTyr){eRi z)}mDwZX25%mRXv}WTw*idg3tDP6j4-?&KHoaDWNdz2Vzi=kM6prjnog+H~QQXASt| zS={*oo@`L!7b~JI_N_B_bMSOB-nyIbU`lYG;xuT?XhfCiPjn<@yo zoTgmFk=3si<>tS1=5#ksf2NNAo!$4xO!qUN?BR9SR=E|E3eGDyH=x0=D93+E;2-Bg zG@LuyxNg{S{$LE}AT&IOXX7{rF@BJ5aD1_GoTC-PagJ=`-eUVpz?9$oXE!UoMc@Q+&f@ToH1Nun6PMP-gm=31UjIB)Fp1$ z@BA_OTntw%+%(+d&oT7xhsJZ*8s1wq&aj%XzhdG<$L8Iu>(dUL9Y5or7q=g{yPR0$ z!}a1`3tgXb;`byfb2+%VGI6(5mFM3~nYgEcW8Yy+seG$Ci0e`&(?;)X07RNPDA(iV>E@KXNGSU4<| zOX422a4eTn{vEV%+4=!xsR#`ajK7JE$m$9K~!?sD|-N)~OMTVK7jluC3?JsTY z{}Pp{(-8PIIJKUO4yWW-mdx40DgZ$R%-UF};^D_#lA{ORBQ>EF#XKYn>IcsVzl*&_rod#b7miXU9^ z)7hWSUOCkIjvtTzr+D9I!;hk~?Yk;iDQ@~_;ymUli{}2(QB;bk?7pN*!fpJ4d5wxg!6?3UA!{btpA+b5$81CofsvzW`mk zUqjK^Wyv|2H3T~E*aC3jxQ6@}42s4WKa5VE8E!9zXT`=!)-QvhA49+m;n&Px83)cS zy<_F|njTXZ2%kw`ee+G5 z%l>AfoOoDcIqwdhJA!KhBe>$vvX-*YW#13qJ6C&b zY4hV9SDm{<$B9#IYZX zsXu8I&s`iDN?sdT-cCI@(HJ-pKG4`6-g8ms+|jQ3FCPwG^W|qh^3;9fP2&ev5`mbA zfBN<^pRfJEO5bXA(=bj&pLpNgJ@U5V#)!IS*awLP?;5_cS6sDq{H{a0$GZ--E8$-Z{6X?%Rik5B&4o;IZM3<
    ^{1*Y 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

    X1g^;4lP9WI_BR* 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≻W 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